using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using UniVerse.Application.DTOs.Achievements; using UniVerse.Application.Interfaces; namespace UniVerse.Api.Controllers; /// Управление определениями достижений системы геймификации. [ApiController] [Route("api/v1/achievements")] [Authorize] [Produces("application/json")] public class AchievementsController : ControllerBase { private readonly IAchievementService _achievements; public AchievementsController(IAchievementService achievements) => _achievements = achievements; /// Получить список всех достижений. /// Возвращает определения достижений (без информации о получении конкретным пользователем). /// Для достижений конкретного пользователя используйте GET /api/v1/users/{id}/achievements. /// Список достижений. /// Требуется аутентификация. [HttpGet] [ProducesResponseType(typeof(List), StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status401Unauthorized)] public async Task GetAll() => Ok(await _achievements.GetAllAsync()); /// Получить достижение по ID. /// ID достижения. /// Данные достижения. /// Требуется аутентификация. /// Достижение не найдено. [HttpGet("{id:int}")] [ProducesResponseType(typeof(AchievementDto), StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status401Unauthorized)] [ProducesResponseType(StatusCodes.Status404NotFound)] public async Task> Get(int id) => Ok(await _achievements.GetByIdAsync(id)); /// Создать новое достижение. /// Только Admin. Достижения автоматически присваиваются студентам при выполнении условий. /// Название, описание, иконка, награда в XP/монетах и условие получения. /// Достижение создано. /// Требуется аутентификация. /// Требуется роль Admin. [Authorize(Roles = "Admin")] [HttpPost] [ProducesResponseType(typeof(AchievementDto), StatusCodes.Status201Created)] [ProducesResponseType(StatusCodes.Status401Unauthorized)] [ProducesResponseType(StatusCodes.Status403Forbidden)] public async Task> Create([FromBody] CreateAchievementRequest req) => CreatedAtAction(nameof(Get), new { id = 0 }, await _achievements.CreateAsync(req)); /// Обновить достижение по ID. /// Только Admin. /// ID достижения. /// Обновляемые поля достижения. /// Обновлённые данные достижения. /// Требуется аутентификация. /// Требуется роль Admin. /// Достижение не найдено. [Authorize(Roles = "Admin")] [HttpPut("{id:int}")] [ProducesResponseType(typeof(AchievementDto), StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status401Unauthorized)] [ProducesResponseType(StatusCodes.Status403Forbidden)] [ProducesResponseType(StatusCodes.Status404NotFound)] public async Task> Update(int id, [FromBody] UpdateAchievementRequest req) => Ok(await _achievements.UpdateAsync(id, req)); /// Удалить достижение по ID. /// /// Только Admin. Удаление не отзывает достижение у уже получивших его пользователей. /// /// ID достижения. /// Достижение удалено. /// Требуется аутентификация. /// Требуется роль Admin. /// Достижение не найдено. [Authorize(Roles = "Admin")] [HttpDelete("{id:int}")] [ProducesResponseType(StatusCodes.Status204NoContent)] [ProducesResponseType(StatusCodes.Status401Unauthorized)] [ProducesResponseType(StatusCodes.Status403Forbidden)] [ProducesResponseType(StatusCodes.Status404NotFound)] public async Task Delete(int id) { await _achievements.DeleteAsync(id); return NoContent(); } }