using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using UniVerse.Application.DTOs.Sync; using UniVerse.Application.Interfaces; namespace UniVerse.Api.Controllers; /// Синхронизация данных из внешней системы расписания Modeus (только Admin). [ApiController] [Route("api/v1/sync")] [Authorize(Roles = "Admin")] [Produces("application/json")] public class SyncController : ControllerBase { private readonly IScheduleSyncService _sync; public SyncController(IScheduleSyncService sync) => _sync = sync; /// Запустить синхронизацию расписания лекций из Modeus. /// /// Только Admin. Выполняет upsert лекций и связанных курсов на основе данных /// из внешнего API `schedule.rdcenter.ru`. Поддерживает фильтрацию по периоду, /// размеру выборки, аудиториям, участникам, реализациям курсов/циклов, /// специальностям, годам набора, профилям, учебным планам и типам занятий. /// /// Параметры поиска событий во внешнем сервисе расписания. /// Результат синхронизации: кол-во созданных, обновлённых и пропущенных записей. /// Требуется аутентификация. /// Требуется роль Admin. [HttpPost("schedule")] [ProducesResponseType(typeof(SyncResultDto), StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status401Unauthorized)] [ProducesResponseType(StatusCodes.Status403Forbidden)] public async Task> SyncSchedule([FromBody] SyncScheduleRequest req) => Ok(await _sync.SyncScheduleAsync(req)); /// Получить статус последней синхронизации. /// Только Admin. Возвращает время и результат последней успешной синхронизации. /// Статус синхронизации. /// Требуется аутентификация. /// Требуется роль Admin. [HttpGet("status")] [ProducesResponseType(typeof(SyncStatusDto), StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status401Unauthorized)] [ProducesResponseType(StatusCodes.Status403Forbidden)] public async Task> Status() => Ok(await _sync.GetLastSyncStatusAsync()); /// Синхронизировать аудитории (локации) из Modeus. /// /// Только Admin. Импортирует аудитории из `schedule.rdcenter.ru` и создаёт /// соответствующие записи в таблице locations. /// /// Результат синхронизации аудиторий. /// Требуется аутентификация. /// Требуется роль Admin. [HttpPost("rooms")] [ProducesResponseType(typeof(SyncResultDto), StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status401Unauthorized)] [ProducesResponseType(StatusCodes.Status403Forbidden)] public async Task> SyncRooms() => Ok(await _sync.SyncRoomsAsync()); /// Поиск преподавателей в Modeus по ФИО. /// /// Только Admin. Ищет преподавателей через внешнее API и возвращает список /// для ручного импорта. Найденные преподаватели не создаются автоматически. /// /// Полное имя или часть имени преподавателя для поиска. /// Список найденных преподавателей. /// Требуется аутентификация. /// Требуется роль Admin. [HttpPost("employees")] [ProducesResponseType(typeof(List), StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status401Unauthorized)] [ProducesResponseType(StatusCodes.Status403Forbidden)] public async Task SearchEmployees([FromQuery] string fullname) => Ok(await _sync.SearchEmployeesAsync(fullname)); }