diff --git a/Endpoint/Controllers/V1/FacultyController.cs b/Endpoint/Controllers/V1/FacultyController.cs new file mode 100644 index 0000000..fe0190d --- /dev/null +++ b/Endpoint/Controllers/V1/FacultyController.cs @@ -0,0 +1,73 @@ +using MediatR; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Mirea.Api.DataAccess.Application.Cqrs.Faculty.Queries.GetFacultyDetails; +using Mirea.Api.DataAccess.Application.Cqrs.Faculty.Queries.GetFacultyList; +using Mirea.Api.Dto.Responses; +using Mirea.Api.Endpoint.Common.Attributes; +using Swashbuckle.AspNetCore.Annotations; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace Mirea.Api.Endpoint.Controllers.V1 +{ + public class FacultyController(IMediator mediator) : BaseControllerV1 + { + /// + /// Gets a paginated list of faculties. + /// + /// Page number. Start from 0. + /// Number of items per page. + /// Paginated list of faculties. + [HttpGet] + [ProducesResponseType(StatusCodes.Status200OK)] + [BadRequestResponse] + public async Task>> Get( + [SwaggerDefault("0")][SwaggerSchema(Nullable = true)][FromQuery] int? page, + [SwaggerDefault("25")][SwaggerSchema(Nullable = true)][FromQuery] int? pageSize) + { + var result = await mediator.Send(new GetFacultyListQuery() + { + Page = page, + PageSize = pageSize + }); + + return Ok(result.Faculties + .Select(f => new FacultyResponse() + { + Id = f.Id, + Name = f.Name, + CampusId = f.CampusId + }) + ); + } + + /// + /// Gets details of a specific faculty by ID. + /// + /// Faculty ID. + /// Details of the specified faculty. + [HttpGet("{id:int}")] + [ProducesResponseType(StatusCodes.Status200OK)] + [BadRequestResponse] + [NotFoundResponse] + public async Task> GetDetails( + [SwaggerDefault("1")] int id) + { + var result = await mediator.Send(new GetFacultyInfoQuery() + { + Id = id + }); + + return Ok(new FacultyDetailsResponse() + { + Id = result.Id, + Name = result.Name, + CampusId = result.CampusId, + CampusCode = result.CampusCode, + CampusName = result.CampusName + }); + } + } +}