using MediatR; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Mirea.Api.DataAccess.Application.Cqrs.Schedule.Queries.GetScheduleList; using Mirea.Api.Dto.Requests; using Mirea.Api.Dto.Responses; using Mirea.Api.Dto.Responses.Schedule; using Mirea.Api.Endpoint.Common.Attributes; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace Mirea.Api.Endpoint.Controllers.V1; public class ScheduleController(IMediator mediator) : BaseControllerV1 { /// /// Retrieves schedules based on various filters. /// /// The request object containing filter criteria. /// A list of schedules matching the filter criteria. [HttpPost] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status204NoContent)] [BadRequestResponse] [NotFoundResponse] public async Task>> Get([FromBody] ScheduleRequest request) { if ((request.Groups == null || request.Groups.Length == 0) && (request.Disciplines == null || request.Disciplines.Length == 0) && (request.Professors == null || request.Professors.Length == 0) && (request.LectureHalls == null || request.LectureHalls.Length == 0)) { return BadRequest(new ErrorResponse() { Error = "At least one of the arguments must be selected." + (request.IsEven.HasValue ? $" \"{nameof(request.IsEven)}\" is not a strong argument" : string.Empty), Code = StatusCodes.Status400BadRequest }); } var result = (await mediator.Send(new GetScheduleListQuery() { IsEven = request.IsEven, DisciplineIds = request.Disciplines, GroupIds = request.Groups, LectureHallIds = request.LectureHalls, ProfessorIds = request.Professors })).Schedules; if (result.Count == 0) NoContent(); return Ok(result.Select(s => new ScheduleResponse() { DayOfWeek = s.DayOfWeek, PairNumber = s.PairNumber, IsEven = s.IsEven, Discipline = s.Discipline, DisciplineId = s.DisciplineId, TypeOfOccupations = s.TypeOfOccupations, Group = s.Group, GroupId = s.GroupId, LectureHalls = s.LectureHalls, LectureHallsId = s.LectureHallsId, Professors = s.Professors, ProfessorsId = s.ProfessorsId, Campus = s.Campus, CampusId = s.CampusId, LinkToMeet = s.LinkToMeet })); } /// /// Retrieves schedules for a specific group based on various filters. /// /// The ID of the group. /// A value indicating whether to retrieve schedules for even weeks. /// An array of discipline IDs. /// An array of professor IDs. /// An array of lecture hall IDs. /// A response containing schedules for the specified group. [HttpGet("{id:int}")] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status204NoContent)] [BadRequestResponse] [NotFoundResponse] public async Task> GetByGroup(int id, [FromQuery] bool? isEven = null, [FromQuery] int[]? disciplines = null, [FromQuery] int[]? professors = null, [FromQuery] int[]? lectureHalls = null) { var result = (await mediator.Send(new GetScheduleListQuery() { IsEven = isEven, DisciplineIds = disciplines, GroupIds = [id], LectureHallIds = lectureHalls, ProfessorIds = professors })).Schedules; if (result.Count == 0) NoContent(); return Ok(new GroupScheduleResponse() { Group = result[0].Group, GroupId = result[0].GroupId, Schedules = result.Select(g => new GroupScheduleInfo() { DayOfWeek = g.DayOfWeek, PairNumber = g.PairNumber, IsEven = g.IsEven, Discipline = g.Discipline, DisciplineId = g.DisciplineId, TypeOfOccupations = g.TypeOfOccupations, LectureHalls = g.LectureHalls, LectureHallsId = g.LectureHallsId, Professors = g.Professors, ProfessorsId = g.ProfessorsId, Campus = g.Campus, CampusId = g.CampusId, LinkToMeet = g.LinkToMeet }) }); } /// /// Retrieves schedules for a specific professor based on various filters. /// /// The ID of the professor. /// A value indicating whether to retrieve schedules for even weeks. /// An array of discipline IDs. /// An array of group IDs. /// An array of lecture hall IDs. /// A response containing schedules for the specified professor. [HttpGet("{id:int}")] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status204NoContent)] [BadRequestResponse] [NotFoundResponse] public async Task> GetByProfessor(int id, [FromQuery] bool? isEven = null, [FromQuery] int[]? disciplines = null, [FromQuery] int[]? groups = null, [FromQuery] int[]? lectureHalls = null) { var result = (await mediator.Send(new GetScheduleListQuery() { IsEven = isEven, DisciplineIds = disciplines, GroupIds = groups, LectureHallIds = lectureHalls, ProfessorIds = [id] })).Schedules; if (result.Count == 0) NoContent(); return Ok(new ProfessorScheduleResponse() { Professor = result.Select(professor => professor.Professors.FirstOrDefault(x => !string.IsNullOrEmpty(x)) ).First()!, ProfessorId = result.Select(professor => professor.ProfessorsId.FirstOrDefault(x => x != null) ).First()!.Value, Schedules = result.Select(p => new ProfessorScheduleInfo() { DayOfWeek = p.DayOfWeek, PairNumber = p.PairNumber, IsEven = p.IsEven, Discipline = p.Discipline, DisciplineId = p.DisciplineId, TypeOfOccupations = p.TypeOfOccupations, Group = p.Group, GroupId = p.GroupId, LectureHalls = p.LectureHalls, LectureHallsId = p.LectureHallsId, Campus = p.Campus, CampusId = p.CampusId, LinkToMeet = p.LinkToMeet }) }); } /// /// Retrieves schedules for a specific lecture hall based on various filters. /// /// The ID of the lecture hall. /// A value indicating whether to retrieve schedules for even weeks. /// An array of discipline IDs. /// An array of professor IDs. /// An array of group IDs. /// A response containing schedules for the specified lecture hall. [HttpGet("{id:int}")] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status204NoContent)] [BadRequestResponse] [NotFoundResponse] public async Task> GetByLectureHall(int id, [FromQuery] bool? isEven = null, [FromQuery] int[]? disciplines = null, [FromQuery] int[]? groups = null, [FromQuery] int[]? professors = null) { var result = (await mediator.Send(new GetScheduleListQuery() { IsEven = isEven, DisciplineIds = disciplines, GroupIds = groups, LectureHallIds = [id], ProfessorIds = professors })).Schedules; if (result.Count == 0) NoContent(); return Ok(new LectureHallScheduleResponse() { LectureHalls = result.Select(lectureHall => lectureHall.LectureHalls.FirstOrDefault(x => !string.IsNullOrEmpty(x)) ).First()!, LectureHallsId = result.Select(lectureHall => lectureHall.LectureHallsId.FirstOrDefault(x => x != null) ).First()!.Value, Schedules = result.Select(l => new LectureHallScheduleInfo() { DayOfWeek = l.DayOfWeek, PairNumber = l.PairNumber, IsEven = l.IsEven, Discipline = l.Discipline, DisciplineId = l.DisciplineId, TypeOfOccupations = l.TypeOfOccupations, Group = l.Group, GroupId = l.GroupId, Professors = l.Professors, ProfessorsId = l.ProfessorsId, Campus = l.Campus, CampusId = l.CampusId, LinkToMeet = l.LinkToMeet }) }); } /// /// Retrieves schedules for a specific discipline based on various filters. /// /// The ID of the discipline. /// A value indicating whether to retrieve schedules for even weeks. /// An array of group IDs. /// An array of professor IDs. /// An array of lecture hall IDs. /// A response containing schedules for the specified discipline. [HttpGet("{id:int}")] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status204NoContent)] [BadRequestResponse] [NotFoundResponse] public async Task> GetByDiscipline(int id, [FromQuery] bool? isEven = null, [FromQuery] int[]? groups = null, [FromQuery] int[]? professors = null, [FromQuery] int[]? lectureHalls = null) { var result = (await mediator.Send(new GetScheduleListQuery() { IsEven = isEven, DisciplineIds = [id], GroupIds = groups, LectureHallIds = lectureHalls, ProfessorIds = professors })).Schedules; if (result.Count == 0) NoContent(); return Ok(new DisciplineScheduleResponse() { Discipline = result[0].Discipline, DisciplineId = result[0].DisciplineId, Schedules = result.Select(d => new DisciplineScheduleInfo() { DayOfWeek = d.DayOfWeek, PairNumber = d.PairNumber, IsEven = d.IsEven, TypeOfOccupation = d.TypeOfOccupations, Group = d.Group, GroupId = d.GroupId, LectureHalls = d.LectureHalls, LectureHallsId = d.LectureHallsId, Professors = d.Professors, ProfessorsId = d.ProfessorsId, Campus = d.Campus, CampusId = d.CampusId, LinkToMeet = d.LinkToMeet }) }); } }