using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using UniVerse.Application.DTOs.Locations; using UniVerse.Application.Interfaces; namespace UniVerse.Api.Controllers; /// Управление локациями проведения лекций (аудитории, онлайн-площадки). [ApiController] [Route("api/v1/locations")] [Authorize] [Produces("application/json")] public class LocationsController : ControllerBase { private readonly ILocationService _locations; public LocationsController(ILocationService locations) => _locations = locations; /// Получить список всех локаций. /// Список локаций. /// Требуется аутентификация. [HttpGet] [ProducesResponseType(typeof(List), StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status401Unauthorized)] public async Task GetAll() => Ok(await _locations.GetAllAsync()); /// Получить локацию по ID. /// ID локации. /// Данные локации. /// Требуется аутентификация. /// Локация не найдена. [HttpGet("{id:int}")] [ProducesResponseType(typeof(LocationDto), StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status401Unauthorized)] [ProducesResponseType(StatusCodes.Status404NotFound)] public async Task> Get(int id) => Ok(await _locations.GetByIdAsync(id)); /// Создать новую локацию. /// Только Admin. Локации также создаются автоматически при синхронизации с Modeus. /// Название, корпус, аудитория и/или адрес. /// Локация создана. /// Требуется аутентификация. /// Требуется роль Admin. [Authorize(Roles = "Admin")] [HttpPost] [ProducesResponseType(typeof(LocationDto), StatusCodes.Status201Created)] [ProducesResponseType(StatusCodes.Status401Unauthorized)] [ProducesResponseType(StatusCodes.Status403Forbidden)] public async Task> Create([FromBody] CreateLocationRequest req) => CreatedAtAction(nameof(Get), new { id = 0 }, await _locations.CreateAsync(req)); /// Обновить локацию по ID. /// Только Admin. /// ID локации. /// Обновляемые поля: название, корпус, аудитория, адрес. /// Обновлённые данные локации. /// Требуется аутентификация. /// Требуется роль Admin. /// Локация не найдена. [Authorize(Roles = "Admin")] [HttpPut("{id:int}")] [ProducesResponseType(typeof(LocationDto), StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status401Unauthorized)] [ProducesResponseType(StatusCodes.Status403Forbidden)] [ProducesResponseType(StatusCodes.Status404NotFound)] public async Task> Update(int id, [FromBody] UpdateLocationRequest req) => Ok(await _locations.UpdateAsync(id, req)); /// Удалить локацию по ID. /// /// Только Admin. При удалении локации у связанных лекций поле `locationId` становится null. /// /// 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 _locations.DeleteAsync(id); return NoContent(); } }