Add controllers for the Get method #9
							
								
								
									
										23
									
								
								ApiDto/ApiDto.csproj
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								ApiDto/ApiDto.csproj
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | ||||
| <Project Sdk="Microsoft.NET.Sdk"> | ||||
|  | ||||
| 	<PropertyGroup> | ||||
| 		<TargetFramework>net8.0</TargetFramework> | ||||
| 		<ImplicitUsings>disable</ImplicitUsings> | ||||
| 		<Nullable>enable</Nullable> | ||||
| 		<Company>Winsomnia</Company> | ||||
| 		<Version>1.0.0-a0</Version> | ||||
| 		<AssemblyVersion>1.0.0.0</AssemblyVersion> | ||||
| 		<FileVersion>1.0.0.0</FileVersion> | ||||
| 		<AssemblyName>Mirea.Api.Dto</AssemblyName> | ||||
| 		<RootNamespace>$(AssemblyName)</RootNamespace> | ||||
| 		<GenerateDocumentationFile>True</GenerateDocumentationFile> | ||||
| 		<DocumentationFile>ApiDtoDocs.xml</DocumentationFile> | ||||
| 	</PropertyGroup> | ||||
|  | ||||
| 	<ItemGroup> | ||||
| 	  <None Update="ApiDtoDocs.xml"> | ||||
| 	    <CopyToOutputDirectory>Always</CopyToOutputDirectory> | ||||
| 	  </None> | ||||
| 	</ItemGroup> | ||||
|  | ||||
| </Project> | ||||
							
								
								
									
										37
									
								
								ApiDto/Requests/ScheduleRequest.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								ApiDto/Requests/ScheduleRequest.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,37 @@ | ||||
| namespace Mirea.Api.Dto.Requests; | ||||
|  | ||||
| /// <summary> | ||||
| /// Represents a request object for retrieving schedules based on various filters. | ||||
| /// </summary> | ||||
| public class ScheduleRequest | ||||
| { | ||||
|     /// <summary> | ||||
|     /// Gets or sets an array of group IDs. | ||||
|     /// </summary> | ||||
|     /// <remarks>This array can contain null values.</remarks> | ||||
|     public int[]? Groups { get; set; } = null; | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets a value indicating whether to retrieve schedules for even weeks. | ||||
|     /// </summary> | ||||
|     /// <remarks>This property can contain null.</remarks> | ||||
|     public bool? IsEven { get; set; } = null; | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets an array of discipline IDs. | ||||
|     /// </summary> | ||||
|     /// <remarks>This array can contain null values.</remarks> | ||||
|     public int[]? Disciplines { get; set; } = null; | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets an array of professor IDs. | ||||
|     /// </summary> | ||||
|     /// <remarks>This array can contain null values.</remarks> | ||||
|     public int[]? Professors { get; set; } = null; | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets an array of lecture hall IDs. | ||||
|     /// </summary> | ||||
|     /// <remarks>This array can contain null values.</remarks> | ||||
|     public int[]? LectureHalls { get; set; } = null; | ||||
| } | ||||
							
								
								
									
										26
									
								
								ApiDto/Responses/CampusBasicInfoResponse.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								ApiDto/Responses/CampusBasicInfoResponse.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,26 @@ | ||||
| using System.ComponentModel.DataAnnotations; | ||||
|  | ||||
| namespace Mirea.Api.Dto.Responses; | ||||
|  | ||||
| /// <summary> | ||||
| /// Represents basic information about a campus. | ||||
| /// </summary> | ||||
| public class CampusBasicInfoResponse | ||||
| { | ||||
|     /// <summary> | ||||
|     /// Gets or sets the unique identifier of the campus. | ||||
|     /// </summary> | ||||
|     [Required] | ||||
|     public int Id { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the code name of the campus. | ||||
|     /// </summary> | ||||
|     [Required] | ||||
|     public required string CodeName { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the full name of the campus (optional). | ||||
|     /// </summary> | ||||
|     public string? FullName { get; set; } | ||||
| } | ||||
							
								
								
									
										31
									
								
								ApiDto/Responses/CampusDetailsResponse.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								ApiDto/Responses/CampusDetailsResponse.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,31 @@ | ||||
| using System.ComponentModel.DataAnnotations; | ||||
|  | ||||
| namespace Mirea.Api.Dto.Responses; | ||||
|  | ||||
| /// <summary> | ||||
| /// Represents detailed information about a campus. | ||||
| /// </summary> | ||||
| public class CampusDetailsResponse | ||||
| { | ||||
|     /// <summary> | ||||
|     /// Gets or sets the unique identifier of the campus. | ||||
|     /// </summary> | ||||
|     [Required] | ||||
|     public int Id { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the code name of the campus. | ||||
|     /// </summary> | ||||
|     [Required] | ||||
|     public required string CodeName { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the full name of the campus (optional). | ||||
|     /// </summary> | ||||
|     public string? FullName { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the address of the campus (optional). | ||||
|     /// </summary> | ||||
|     public string? Address { get; set; } | ||||
| } | ||||
							
								
								
									
										21
									
								
								ApiDto/Responses/DisciplineResponse.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								ApiDto/Responses/DisciplineResponse.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,21 @@ | ||||
| using System.ComponentModel.DataAnnotations; | ||||
|  | ||||
| namespace Mirea.Api.Dto.Responses; | ||||
|  | ||||
| /// <summary> | ||||
| /// Represents information about a discipline. | ||||
| /// </summary> | ||||
| public class DisciplineResponse | ||||
| { | ||||
|     /// <summary> | ||||
|     /// Gets or sets the unique identifier of the discipline. | ||||
|     /// </summary> | ||||
|     [Required] | ||||
|     public int Id { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the name of the discipline. | ||||
|     /// </summary> | ||||
|     [Required] | ||||
|     public required string Name { get; set; } | ||||
| } | ||||
							
								
								
									
										22
									
								
								ApiDto/Responses/ErrorResponse.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								ApiDto/Responses/ErrorResponse.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,22 @@ | ||||
| using System.ComponentModel.DataAnnotations; | ||||
|  | ||||
| namespace Mirea.Api.Dto.Responses; | ||||
|  | ||||
| /// <summary> | ||||
| /// A class for providing information about an error | ||||
| /// </summary> | ||||
| public class ErrorResponse | ||||
| { | ||||
|     /// <summary> | ||||
|     /// The text or translation code of the error. This field may not contain information in specific scenarios. | ||||
|     /// For example, it might be empty for HTTP 204 responses where no content is returned or if the validation texts have not been configured. | ||||
|     /// </summary> | ||||
|     [Required] | ||||
|     public required string Error { get; set; } | ||||
|     /// <summary> | ||||
|     /// In addition to returning the response code in the header, it is also duplicated in this field. | ||||
|     /// Represents the HTTP response code. | ||||
|     /// </summary> | ||||
|     [Required] | ||||
|     public required int Code { get; set; } | ||||
| } | ||||
							
								
								
									
										36
									
								
								ApiDto/Responses/FacultyDetailsResponse.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								ApiDto/Responses/FacultyDetailsResponse.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,36 @@ | ||||
| using System.ComponentModel.DataAnnotations; | ||||
|  | ||||
| namespace Mirea.Api.Dto.Responses; | ||||
|  | ||||
| /// <summary> | ||||
| /// Represents detailed information about a faculty. | ||||
| /// </summary> | ||||
| public class FacultyDetailsResponse | ||||
| { | ||||
|     /// <summary> | ||||
|     /// Gets or sets the unique identifier of the faculty. | ||||
|     /// </summary> | ||||
|     [Required] | ||||
|     public int Id { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the name of the faculty. | ||||
|     /// </summary> | ||||
|     [Required] | ||||
|     public required string Name { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the unique identifier of the campus to which the faculty belongs (optional). | ||||
|     /// </summary> | ||||
|     public int? CampusId { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the name of the campus to which the faculty belongs (optional). | ||||
|     /// </summary> | ||||
|     public string? CampusName { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the code name of the campus to which the faculty belongs (optional). | ||||
|     /// </summary> | ||||
|     public string? CampusCode { get; set; } | ||||
| } | ||||
							
								
								
									
										26
									
								
								ApiDto/Responses/FacultyResponse.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								ApiDto/Responses/FacultyResponse.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,26 @@ | ||||
| using System.ComponentModel.DataAnnotations; | ||||
|  | ||||
| namespace Mirea.Api.Dto.Responses; | ||||
|  | ||||
| /// <summary> | ||||
| /// Represents basic information about a faculty. | ||||
| /// </summary> | ||||
| public class FacultyResponse | ||||
| { | ||||
|     /// <summary> | ||||
|     /// Gets or sets the unique identifier of the faculty. | ||||
|     /// </summary> | ||||
|     [Required] | ||||
|     public int Id { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the name of the faculty. | ||||
|     /// </summary> | ||||
|     [Required] | ||||
|     public required string Name { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the unique identifier of the campus to which the faculty belongs (optional). | ||||
|     /// </summary> | ||||
|     public int? CampusId { get; set; } | ||||
| } | ||||
							
								
								
									
										37
									
								
								ApiDto/Responses/GroupDetailsResponse.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								ApiDto/Responses/GroupDetailsResponse.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,37 @@ | ||||
| using System.ComponentModel.DataAnnotations; | ||||
|  | ||||
| namespace Mirea.Api.Dto.Responses; | ||||
|  | ||||
| /// <summary> | ||||
| /// Represents detailed information about a group. | ||||
| /// </summary> | ||||
| public class GroupDetailsResponse | ||||
| { | ||||
|     /// <summary> | ||||
|     /// Gets or sets the unique identifier of the group. | ||||
|     /// </summary> | ||||
|     [Required] | ||||
|     public int Id { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the name of the group. | ||||
|     /// </summary> | ||||
|     [Required] | ||||
|     public required string Name { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the course number of the group. | ||||
|     /// </summary> | ||||
|     [Required] | ||||
|     public int CourseNumber { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the unique identifier of the faculty to which the group belongs (optional). | ||||
|     /// </summary> | ||||
|     public int? FacultyId { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the name of the faculty to which the group belongs (optional). | ||||
|     /// </summary> | ||||
|     public string? FacultyName { get; set; } | ||||
| } | ||||
							
								
								
									
										32
									
								
								ApiDto/Responses/GroupResponse.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								ApiDto/Responses/GroupResponse.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,32 @@ | ||||
| using System.ComponentModel.DataAnnotations; | ||||
|  | ||||
| namespace Mirea.Api.Dto.Responses; | ||||
|  | ||||
| /// <summary> | ||||
| /// Represents basic information about a group. | ||||
| /// </summary> | ||||
| public class GroupResponse | ||||
| { | ||||
|     /// <summary> | ||||
|     /// Gets or sets the unique identifier of the group. | ||||
|     /// </summary> | ||||
|     [Required] | ||||
|     public int Id { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the name of the group. | ||||
|     /// </summary> | ||||
|     [Required] | ||||
|     public required string Name { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the course number of the group. | ||||
|     /// </summary> | ||||
|     [Required] | ||||
|     public int CourseNumber { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the unique identifier of the faculty to which the group belongs (optional). | ||||
|     /// </summary> | ||||
|     public int? FacultyId { get; set; } | ||||
| } | ||||
							
								
								
									
										37
									
								
								ApiDto/Responses/LectureHallDetailsResponse.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								ApiDto/Responses/LectureHallDetailsResponse.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,37 @@ | ||||
| using System.ComponentModel.DataAnnotations; | ||||
|  | ||||
| namespace Mirea.Api.Dto.Responses; | ||||
|  | ||||
| /// <summary> | ||||
| /// Represents the detailed response model for a lecture hall. | ||||
| /// </summary> | ||||
| public class LectureHallDetailsResponse | ||||
| { | ||||
|     /// <summary> | ||||
|     /// Gets or sets the ID of the lecture hall. | ||||
|     /// </summary> | ||||
|     [Required] | ||||
|     public int Id { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the name of the lecture hall. | ||||
|     /// </summary> | ||||
|     [Required] | ||||
|     public required string Name { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the ID of the campus to which the lecture hall belongs. | ||||
|     /// </summary> | ||||
|     [Required] | ||||
|     public int CampusId { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the name of the campus. | ||||
|     /// </summary> | ||||
|     public string? CampusName { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the code of the campus. | ||||
|     /// </summary> | ||||
|     public string? CampusCode { get; set; } | ||||
| } | ||||
							
								
								
									
										27
									
								
								ApiDto/Responses/LectureHallResponse.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								ApiDto/Responses/LectureHallResponse.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,27 @@ | ||||
| using System.ComponentModel.DataAnnotations; | ||||
|  | ||||
| namespace Mirea.Api.Dto.Responses; | ||||
|  | ||||
| /// <summary> | ||||
| /// Represents the response model for a lecture hall. | ||||
| /// </summary> | ||||
| public class LectureHallResponse | ||||
| { | ||||
|     /// <summary> | ||||
|     /// Gets or sets the ID of the lecture hall. | ||||
|     /// </summary> | ||||
|     [Required] | ||||
|     public int Id { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the name of the lecture hall. | ||||
|     /// </summary> | ||||
|     [Required] | ||||
|     public required string Name { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the ID of the campus to which the lecture hall belongs. | ||||
|     /// </summary> | ||||
|     [Required] | ||||
|     public int CampusId { get; set; } | ||||
| } | ||||
							
								
								
									
										26
									
								
								ApiDto/Responses/ProfessorResponse.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								ApiDto/Responses/ProfessorResponse.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,26 @@ | ||||
| using System.ComponentModel.DataAnnotations; | ||||
|  | ||||
| namespace Mirea.Api.Dto.Responses; | ||||
|  | ||||
| /// <summary> | ||||
| /// Represents information about a professor. | ||||
| /// </summary> | ||||
| public class ProfessorResponse | ||||
| { | ||||
|     /// <summary> | ||||
|     /// Gets or sets the unique identifier of the professor. | ||||
|     /// </summary> | ||||
|     [Required] | ||||
|     public int Id { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the name of the professor. | ||||
|     /// </summary> | ||||
|     [Required] | ||||
|     public required string Name { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the alternate name of the professor (optional). | ||||
|     /// </summary> | ||||
|     public string? AltName { get; set; } | ||||
| } | ||||
							
								
								
									
										106
									
								
								ApiDto/Responses/Schedule/DisciplineScheduleResponse.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										106
									
								
								ApiDto/Responses/Schedule/DisciplineScheduleResponse.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,106 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.ComponentModel.DataAnnotations; | ||||
|  | ||||
| namespace Mirea.Api.Dto.Responses.Schedule; | ||||
|  | ||||
| /// <summary> | ||||
| /// Represents information about a specific schedule entry for a professor. | ||||
| /// </summary> | ||||
| public class DisciplineScheduleInfo | ||||
| { | ||||
|     /// <summary> | ||||
|     /// Gets or sets the day of the week for the schedule entry. | ||||
|     /// </summary> | ||||
|     [Required] | ||||
|     public DayOfWeek DayOfWeek { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the pair number for the schedule entry. | ||||
|     /// </summary> | ||||
|     [Required] | ||||
|     public int PairNumber { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets a value indicating whether the pair is on an even week. | ||||
|     /// </summary> | ||||
|     [Required] | ||||
|     public bool IsEven { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the type of occupation for the schedule entry. | ||||
|     /// </summary> | ||||
|     [Required] | ||||
|     public required string TypeOfOccupation { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the names of the group for the schedule entry. | ||||
|     /// </summary> | ||||
|     [Required] | ||||
|  | ||||
|     public required string Group { get; set; } | ||||
|     /// <summary> | ||||
|     /// Gets or sets the IDs of the group for the schedule entry. | ||||
|     /// </summary> | ||||
|     [Required] | ||||
|     public required int GroupId { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the names of the lecture halls for the schedule entry. | ||||
|     /// </summary> | ||||
|     public required IEnumerable<string?> LectureHalls { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the IDs of the lecture halls for the schedule entry. | ||||
|     /// </summary> | ||||
|     public required IEnumerable<int?> LectureHallsId { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the names of the professors for the schedule entry. | ||||
|     /// </summary> | ||||
|     public required IEnumerable<string?> Professors { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the IDs of the professors for the schedule entry. | ||||
|     /// </summary> | ||||
|     public required IEnumerable<int?> ProfessorsId { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the names of the campuses for the schedule entry. | ||||
|     /// </summary> | ||||
|     public required IEnumerable<string?> Campus { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the IDs of the campuses for the schedule entry. | ||||
|     /// </summary> | ||||
|     public required IEnumerable<int?> CampusId { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the links to online meetings for the schedule entry. | ||||
|     /// </summary> | ||||
|     public required IEnumerable<string?> LinkToMeet { get; set; } | ||||
| } | ||||
|  | ||||
| /// <summary> | ||||
| /// Represents a response containing schedule information for a professor. | ||||
| /// </summary> | ||||
| public class DisciplineScheduleResponse | ||||
| { | ||||
|     /// <summary> | ||||
|     /// Gets or sets the name of the discipline. | ||||
|     /// </summary> | ||||
|     [Required] | ||||
|     public required string Discipline { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the ID of the discipline. | ||||
|     /// </summary> | ||||
|     [Required] | ||||
|     public required int DisciplineId { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the schedules for the professor. | ||||
|     /// </summary> | ||||
|     [Required] | ||||
|     public required IEnumerable<DisciplineScheduleInfo> Schedules { get; set; } | ||||
| } | ||||
							
								
								
									
										106
									
								
								ApiDto/Responses/Schedule/GroupScheduleResponse.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										106
									
								
								ApiDto/Responses/Schedule/GroupScheduleResponse.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,106 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.ComponentModel.DataAnnotations; | ||||
|  | ||||
| namespace Mirea.Api.Dto.Responses.Schedule; | ||||
|  | ||||
| /// <summary> | ||||
| /// Represents information about a specific schedule entry for a group. | ||||
| /// </summary> | ||||
| public class GroupScheduleInfo | ||||
| { | ||||
|     /// <summary> | ||||
|     /// Gets or sets the day of the week for the schedule entry. | ||||
|     /// </summary> | ||||
|     [Required] | ||||
|     public DayOfWeek DayOfWeek { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the pair number for the schedule entry. | ||||
|     /// </summary> | ||||
|     [Required] | ||||
|     public int PairNumber { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets a value indicating whether the pair is on an even week. | ||||
|     /// </summary> | ||||
|     [Required] | ||||
|     public bool IsEven { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the name of the discipline for the schedule entry. | ||||
|     /// </summary> | ||||
|     [Required] | ||||
|     public required string Discipline { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the ID of the discipline for the schedule entry. | ||||
|     /// </summary> | ||||
|     [Required] | ||||
|     public required int DisciplineId { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the type of occupation for the schedule entry. | ||||
|     /// </summary> | ||||
|     [Required] | ||||
|     public required string TypeOfOccupation { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the names of the lecture halls for the schedule entry. | ||||
|     /// </summary> | ||||
|     public required IEnumerable<string?> LectureHalls { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the IDs of the lecture halls for the schedule entry. | ||||
|     /// </summary> | ||||
|     public required IEnumerable<int?> LectureHallsId { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the names of the professors for the schedule entry. | ||||
|     /// </summary> | ||||
|     public required IEnumerable<string?> Professors { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the IDs of the professors for the schedule entry. | ||||
|     /// </summary> | ||||
|     public required IEnumerable<int?> ProfessorsId { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the names of the campuses for the schedule entry. | ||||
|     /// </summary> | ||||
|     public required IEnumerable<string?> Campus { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the IDs of the campuses for the schedule entry. | ||||
|     /// </summary> | ||||
|     public required IEnumerable<int?> CampusId { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the links to online meetings for the schedule entry. | ||||
|     /// </summary> | ||||
|     public required IEnumerable<string?> LinkToMeet { get; set; } | ||||
| } | ||||
|  | ||||
| /// <summary> | ||||
| /// Represents a response containing schedule information for a group. | ||||
| /// </summary> | ||||
| public class GroupScheduleResponse | ||||
| { | ||||
|     /// <summary> | ||||
|     /// Gets or sets the name of the group. | ||||
|     /// </summary> | ||||
|     [Required] | ||||
|     public required string Group { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the ID of the group. | ||||
|     /// </summary> | ||||
|     [Required] | ||||
|     public required int GroupId { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the schedules for the group. | ||||
|     /// </summary> | ||||
|     [Required] | ||||
|     public required IEnumerable<GroupScheduleInfo> Schedules { get; set; } | ||||
| } | ||||
							
								
								
									
										105
									
								
								ApiDto/Responses/Schedule/LectureHallScheduleResponse.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										105
									
								
								ApiDto/Responses/Schedule/LectureHallScheduleResponse.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,105 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.ComponentModel.DataAnnotations; | ||||
|  | ||||
| namespace Mirea.Api.Dto.Responses.Schedule; | ||||
|  | ||||
| /// <summary> | ||||
| /// Represents information about a specific schedule entry for a lecture hall. | ||||
| /// </summary> | ||||
| public class LectureHallScheduleInfo | ||||
| { | ||||
|     /// <summary> | ||||
|     /// Gets or sets the day of the week for the schedule entry. | ||||
|     /// </summary> | ||||
|     [Required] | ||||
|     public DayOfWeek DayOfWeek { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the pair number for the schedule entry. | ||||
|     /// </summary> | ||||
|     [Required] | ||||
|     public int PairNumber { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets a value indicating whether the pair is on an even week. | ||||
|     /// </summary> | ||||
|     [Required] | ||||
|     public bool IsEven { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the name of the discipline for the schedule entry. | ||||
|     /// </summary> | ||||
|     [Required] | ||||
|     public required string Discipline { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the ID of the discipline for the schedule entry. | ||||
|     /// </summary> | ||||
|     [Required] | ||||
|     public required int DisciplineId { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the type of occupation for the schedule entry. | ||||
|     /// </summary> | ||||
|     [Required] | ||||
|     public required string TypeOfOccupation { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the names of the group for the schedule entry. | ||||
|     /// </summary> | ||||
|     [Required] | ||||
|     public required string Group { get; set; } | ||||
|     /// <summary> | ||||
|     /// Gets or sets the IDs of the group for the schedule entry. | ||||
|     /// </summary> | ||||
|     [Required] | ||||
|     public required int GroupId { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the names of the campuses for the schedule entry. | ||||
|     /// </summary> | ||||
|     public required IEnumerable<string?> Campus { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the IDs of the campuses for the schedule entry. | ||||
|     /// </summary> | ||||
|     public required IEnumerable<int?> CampusId { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the names of the professors for the schedule entry. | ||||
|     /// </summary> | ||||
|     public required IEnumerable<string?> Professors { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the IDs of the professors for the schedule entry. | ||||
|     /// </summary> | ||||
|     public required IEnumerable<int?> ProfessorsId { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the links to online meetings for the schedule entry. | ||||
|     /// </summary> | ||||
|     public required IEnumerable<string?> LinkToMeet { get; set; } | ||||
| } | ||||
|  | ||||
| /// <summary> | ||||
| /// Represents a response containing schedule information for a lecture hall. | ||||
| /// </summary> | ||||
| public class LectureHallScheduleResponse | ||||
| { | ||||
|     /// <summary> | ||||
|     /// Gets or sets the names of the lecture halls. | ||||
|     /// </summary> | ||||
|     public required string LectureHalls { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the IDs of the lecture halls. | ||||
|     /// </summary> | ||||
|     public required int LectureHallsId { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the schedules for the lecture hall. | ||||
|     /// </summary> | ||||
|     [Required] | ||||
|     public required IEnumerable<LectureHallScheduleInfo> Schedules { get; set; } | ||||
| } | ||||
							
								
								
									
										108
									
								
								ApiDto/Responses/Schedule/ProfessorScheduleResponse.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										108
									
								
								ApiDto/Responses/Schedule/ProfessorScheduleResponse.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,108 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.ComponentModel.DataAnnotations; | ||||
|  | ||||
| namespace Mirea.Api.Dto.Responses.Schedule; | ||||
|  | ||||
| /// <summary> | ||||
| /// Represents information about a specific schedule entry for a professor. | ||||
| /// </summary> | ||||
| public class ProfessorScheduleInfo | ||||
| { | ||||
|     /// <summary> | ||||
|     /// Gets or sets the day of the week for the schedule entry. | ||||
|     /// </summary> | ||||
|     [Required] | ||||
|     public DayOfWeek DayOfWeek { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the pair number for the schedule entry. | ||||
|     /// </summary> | ||||
|     [Required] | ||||
|     public int PairNumber { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets a value indicating whether the pair is on an even week. | ||||
|     /// </summary> | ||||
|     [Required] | ||||
|     public bool IsEven { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the name of the discipline for the schedule entry. | ||||
|     /// </summary> | ||||
|     [Required] | ||||
|     public required string Discipline { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the ID of the discipline for the schedule entry. | ||||
|     /// </summary> | ||||
|     [Required] | ||||
|     public required int DisciplineId { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the type of occupation for the schedule entry. | ||||
|     /// </summary> | ||||
|     [Required] | ||||
|     public required string TypeOfOccupation { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the names of the group for the schedule entry. | ||||
|     /// </summary> | ||||
|     [Required] | ||||
|  | ||||
|     public required string Group { get; set; } | ||||
|     /// <summary> | ||||
|     /// Gets or sets the IDs of the group for the schedule entry. | ||||
|     /// </summary> | ||||
|     [Required] | ||||
|     public required int GroupId { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the names of the lecture halls for the schedule entry. | ||||
|     /// </summary> | ||||
|     public required IEnumerable<string?> LectureHalls { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the IDs of the lecture halls for the schedule entry. | ||||
|     /// </summary> | ||||
|     public required IEnumerable<int?> LectureHallsId { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the names of the campuses for the schedule entry. | ||||
|     /// </summary> | ||||
|     public required IEnumerable<string?> Campus { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the IDs of the campuses for the schedule entry. | ||||
|     /// </summary> | ||||
|     public required IEnumerable<int?> CampusId { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the links to online meetings for the schedule entry. | ||||
|     /// </summary> | ||||
|     public required IEnumerable<string?> LinkToMeet { get; set; } | ||||
| } | ||||
|  | ||||
| /// <summary> | ||||
| /// Represents a response containing schedule information for a professor. | ||||
| /// </summary> | ||||
| public class ProfessorScheduleResponse | ||||
| { | ||||
|     /// <summary> | ||||
|     /// Gets or sets the name of the professor. | ||||
|     /// </summary> | ||||
|     [Required] | ||||
|     public required string Professor { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the ID of the professor. | ||||
|     /// </summary> | ||||
|     [Required] | ||||
|     public required int ProfessorId { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the schedules for the professor. | ||||
|     /// </summary> | ||||
|     [Required] | ||||
|     public required IEnumerable<ProfessorScheduleInfo> Schedules { get; set; } | ||||
| } | ||||
							
								
								
									
										94
									
								
								ApiDto/Responses/Schedule/ScheduleResponse.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										94
									
								
								ApiDto/Responses/Schedule/ScheduleResponse.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,94 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.ComponentModel.DataAnnotations; | ||||
|  | ||||
| namespace Mirea.Api.Dto.Responses.Schedule; | ||||
|  | ||||
| /// <summary> | ||||
| /// Represents a response object containing schedule information. | ||||
| /// </summary> | ||||
| public class ScheduleResponse | ||||
| { | ||||
|     /// <summary> | ||||
|     /// Gets or sets the day of the week for the schedule entry. | ||||
|     /// </summary> | ||||
|     [Required] | ||||
|     public DayOfWeek DayOfWeek { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the pair number for the schedule entry. | ||||
|     /// </summary> | ||||
|     [Required] | ||||
|     public int PairNumber { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets a value indicating whether the pair is on an even week. | ||||
|     /// </summary> | ||||
|     [Required] | ||||
|     public bool IsEven { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the name of the discipline for the schedule entry. | ||||
|     /// </summary> | ||||
|     [Required] | ||||
|     public required string Discipline { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the ID of the discipline for the schedule entry. | ||||
|     /// </summary> | ||||
|     [Required] | ||||
|     public required int DisciplineId { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the type of occupation for the schedule entry. | ||||
|     /// </summary> | ||||
|     [Required] | ||||
|     public required string TypeOfOccupation { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the name of the group for the schedule entry. | ||||
|     /// </summary> | ||||
|     [Required] | ||||
|     public required string Group { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the ID of the group for the schedule entry. | ||||
|     /// </summary> | ||||
|     [Required] | ||||
|     public required int GroupId { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the names of the lecture halls for the schedule entry. | ||||
|     /// </summary> | ||||
|     public required IEnumerable<string?> LectureHalls { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the IDs of the lecture halls for the schedule entry. | ||||
|     /// </summary> | ||||
|     public required IEnumerable<int?> LectureHallsId { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the names of the professors for the schedule entry. | ||||
|     /// </summary> | ||||
|     public required IEnumerable<string?> Professors { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the IDs of the professors for the schedule entry. | ||||
|     /// </summary> | ||||
|     public required IEnumerable<int?> ProfessorsId { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the names of the campuses for the schedule entry. | ||||
|     /// </summary> | ||||
|     public required IEnumerable<string?> Campus { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the IDs of the campuses for the schedule entry. | ||||
|     /// </summary> | ||||
|     public required IEnumerable<int?> CampusId { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the links to online meetings for the schedule entry. | ||||
|     /// </summary> | ||||
|     public required IEnumerable<string?> LinkToMeet { get; set; } | ||||
| } | ||||
| @@ -0,0 +1,12 @@ | ||||
| using MediatR; | ||||
|  | ||||
| namespace Mirea.Api.DataAccess.Application.Cqrs.Schedule.Queries.GetScheduleList; | ||||
|  | ||||
| public class GetScheduleListQuery : IRequest<ScheduleListVm> | ||||
| { | ||||
|     public int[]? GroupIds { get; set; } | ||||
|     public int[]? DisciplineIds { get; set; } | ||||
|     public int[]? LectureHallIds { get; set; } | ||||
|     public int[]? ProfessorIds { get; set; } | ||||
|     public bool? IsEven { get; set; } | ||||
| } | ||||
| @@ -0,0 +1,87 @@ | ||||
| using MediatR; | ||||
| using Microsoft.EntityFrameworkCore; | ||||
| using Mirea.Api.DataAccess.Application.Interfaces.DbContexts.Schedule; | ||||
| using System.Linq; | ||||
| using System.Threading; | ||||
| using System.Threading.Tasks; | ||||
|  | ||||
| namespace Mirea.Api.DataAccess.Application.Cqrs.Schedule.Queries.GetScheduleList; | ||||
|  | ||||
| public class GetScheduleListQueryHandler(ILessonDbContext dbContext) : IRequestHandler<GetScheduleListQuery, ScheduleListVm> | ||||
| { | ||||
|     public async Task<ScheduleListVm> Handle(GetScheduleListQuery request, CancellationToken cancellationToken) | ||||
|     { | ||||
|         var query = dbContext.Lessons.Include(l => l.LessonAssociations) | ||||
|             .ThenInclude(la => la.LectureHall) | ||||
|             .ThenInclude(lh => lh!.Campus) | ||||
|             .Include(l => l.LessonAssociations) | ||||
|             .ThenInclude(la => la.Professor) | ||||
|             .Include(l => l.Group) | ||||
|             .Include(l => l.TypeOfOccupation) | ||||
|             .Include(l => l.Discipline) | ||||
|             .AsQueryable(); | ||||
|  | ||||
|         if (request.IsEven != null) | ||||
|             query = query.Where(l => l.IsEven == request.IsEven); | ||||
|  | ||||
|         if (request.GroupIds != null && request.GroupIds.Length != 0) | ||||
|             query = query.Where(l => request.GroupIds.Contains(l.GroupId)); | ||||
|  | ||||
|         if (request.DisciplineIds != null && request.DisciplineIds.Length != 0) | ||||
|             query = query.Where(l => request.DisciplineIds.Contains(l.DisciplineId)); | ||||
|  | ||||
|         if (request.LectureHallIds != null && request.LectureHallIds.Length != 0) | ||||
|             query = query.Where(l => l.LessonAssociations!.Any(la => | ||||
|                 la.LectureHallId != null && request.LectureHallIds.Contains(la.LectureHallId.Value))); | ||||
|  | ||||
|         if (request.ProfessorIds != null && request.ProfessorIds.Length != 0) | ||||
|             query = query.Where(l => | ||||
|                 l.LessonAssociations!.Any(la => | ||||
|                     la.ProfessorId != null && request.ProfessorIds.Contains(la.ProfessorId.Value))); | ||||
|  | ||||
|         var data = await query.ToArrayAsync(cancellationToken); | ||||
|  | ||||
|         var result = data.Select(l => new ScheduleLookupDto() | ||||
|         { | ||||
|             DayOfWeek = l.DayOfWeek, | ||||
|             PairNumber = l.PairNumber, | ||||
|             IsEven = l.IsEven, | ||||
|             TypeOfOccupation = l.TypeOfOccupation!.ShortName, | ||||
|  | ||||
|             Discipline = l.Discipline!.Name, | ||||
|             DisciplineId = l.DisciplineId, | ||||
|  | ||||
|             Group = l.Group!.Name, | ||||
|             GroupId = l.GroupId, | ||||
|  | ||||
|             LectureHalls = l.LessonAssociations! | ||||
|                 .Where(la => !string.IsNullOrEmpty(la.LectureHall?.Name)) | ||||
|                 .Select(la => la.LectureHall?.Name), | ||||
|             LectureHallsId = l.LessonAssociations! | ||||
|                 .Where(la => la.LectureHallId != null) | ||||
|                 .Select(la => la.LectureHallId), | ||||
|  | ||||
|             Campus = l.LessonAssociations! | ||||
|                 .Where(la => !string.IsNullOrEmpty(la.LectureHall?.Campus?.CodeName)) | ||||
|                 .Select(la => la.LectureHall?.Campus?.CodeName), | ||||
|             CampusId = l.LessonAssociations! | ||||
|                 .Where(la => la.LectureHall?.Campus != null) | ||||
|                 .Select(la => la.LectureHall?.CampusId), | ||||
|  | ||||
|  | ||||
|             Professors = l.LessonAssociations! | ||||
|                 .Where(la => !string.IsNullOrEmpty(la.Professor?.Name)) | ||||
|                 .Select(la => la.Professor?.Name), | ||||
|             ProfessorsId = l.LessonAssociations! | ||||
|                 .Where(la => la.ProfessorId != null) | ||||
|                 .Select(la => la.ProfessorId), | ||||
|  | ||||
|             LinkToMeet = l.LessonAssociations!.Select(la => la.LinkToMeet) | ||||
|         }).ToList(); | ||||
|  | ||||
|         return new ScheduleListVm | ||||
|         { | ||||
|             Schedules = result | ||||
|         }; | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,14 @@ | ||||
| using System.Collections.Generic; | ||||
|  | ||||
| namespace Mirea.Api.DataAccess.Application.Cqrs.Schedule.Queries.GetScheduleList; | ||||
|  | ||||
| /// <summary> | ||||
| /// Represents a view model for a list of schedules. | ||||
| /// </summary> | ||||
| public class ScheduleListVm | ||||
| { | ||||
|     /// <summary> | ||||
|     /// Gets or sets the list of schedules. | ||||
|     /// </summary> | ||||
|     public IList<ScheduleLookupDto> Schedules { get; set; } = new List<ScheduleLookupDto>(); | ||||
| } | ||||
| @@ -0,0 +1,85 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
|  | ||||
| namespace Mirea.Api.DataAccess.Application.Cqrs.Schedule.Queries.GetScheduleList; | ||||
|  | ||||
| /// <summary> | ||||
| /// Represents a data transfer object for schedule lookup. | ||||
| /// </summary> | ||||
| public class ScheduleLookupDto | ||||
| { | ||||
|     /// <summary> | ||||
|     /// Gets or sets the day of the week. | ||||
|     /// </summary> | ||||
|     public DayOfWeek DayOfWeek { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the pair number. | ||||
|     /// </summary> | ||||
|     public int PairNumber { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets a value indicating whether the pair is on an even week. | ||||
|     /// </summary> | ||||
|     public bool IsEven { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the name of the discipline. | ||||
|     /// </summary> | ||||
|     public required string Discipline { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the ID of the discipline. | ||||
|     /// </summary> | ||||
|     public required int DisciplineId { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the type of occupation. | ||||
|     /// </summary> | ||||
|     public required string TypeOfOccupation { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the name of the group. | ||||
|     /// </summary> | ||||
|     public required string Group { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the ID of the group. | ||||
|     /// </summary> | ||||
|     public required int GroupId { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the names of the lecture halls. | ||||
|     /// </summary> | ||||
|     public required IEnumerable<string?> LectureHalls { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the IDs of the lecture halls. | ||||
|     /// </summary> | ||||
|     public required IEnumerable<int?> LectureHallsId { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the names of the professors. | ||||
|     /// </summary> | ||||
|     public required IEnumerable<string?> Professors { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the IDs of the professors. | ||||
|     /// </summary> | ||||
|     public required IEnumerable<int?> ProfessorsId { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the names of the campuses. | ||||
|     /// </summary> | ||||
|     public required IEnumerable<string?> Campus { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the IDs of the campuses. | ||||
|     /// </summary> | ||||
|     public required IEnumerable<int?> CampusId { get; set; } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Gets or sets the links to online meetings. | ||||
|     /// </summary> | ||||
|     public required IEnumerable<string?> LinkToMeet { get; set; } | ||||
| } | ||||
| @@ -0,0 +1,9 @@ | ||||
| using Microsoft.AspNetCore.Http; | ||||
| using Microsoft.AspNetCore.Mvc; | ||||
| using Mirea.Api.Dto.Responses; | ||||
| using System; | ||||
|  | ||||
| namespace Mirea.Api.Endpoint.Common.Attributes; | ||||
|  | ||||
| [AttributeUsage(AttributeTargets.Method, Inherited = false, AllowMultiple = true)] | ||||
| public class BadRequestResponseAttribute() : ProducesResponseTypeAttribute(typeof(ErrorResponse), StatusCodes.Status400BadRequest); | ||||
							
								
								
									
										9
									
								
								Endpoint/Common/Attributes/NotFoundResponseAttribute.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								Endpoint/Common/Attributes/NotFoundResponseAttribute.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | ||||
| using Microsoft.AspNetCore.Http; | ||||
| using Microsoft.AspNetCore.Mvc; | ||||
| using Mirea.Api.Dto.Responses; | ||||
| using System; | ||||
|  | ||||
| namespace Mirea.Api.Endpoint.Common.Attributes; | ||||
|  | ||||
| [AttributeUsage(AttributeTargets.Method, Inherited = false, AllowMultiple = true)] | ||||
| public class NotFoundResponseAttribute() : ProducesResponseTypeAttribute(typeof(ErrorResponse), StatusCodes.Status404NotFound); | ||||
| @@ -5,7 +5,7 @@ using Microsoft.OpenApi.Models; | ||||
| using Swashbuckle.AspNetCore.SwaggerGen; | ||||
| using System; | ||||
| 
 | ||||
| namespace Mirea.Api.Endpoint; | ||||
| namespace Mirea.Api.Endpoint.Configuration; | ||||
| 
 | ||||
| public class ConfigureSwaggerOptions(IApiVersionDescriptionProvider provider) : IConfigureOptions<SwaggerGenOptions> | ||||
| { | ||||
| @@ -1,7 +1,7 @@ | ||||
| using System; | ||||
| using System.IO; | ||||
| 
 | ||||
| namespace Mirea.Api.Endpoint; | ||||
| namespace Mirea.Api.Endpoint.Configuration; | ||||
| 
 | ||||
| internal static class EnvironmentManager | ||||
| { | ||||
| @@ -6,7 +6,7 @@ using System; | ||||
| using System.Linq; | ||||
| using System.Text.Json; | ||||
| 
 | ||||
| namespace Mirea.Api.Endpoint; | ||||
| namespace Mirea.Api.Endpoint.Configuration; | ||||
| 
 | ||||
| public class SwaggerDefaultValues : IOperationFilter | ||||
| { | ||||
| @@ -38,7 +38,7 @@ public class SwaggerDefaultValues : IOperationFilter | ||||
|         { | ||||
|             var description = apiDescription.ParameterDescriptions.First(p => p.Name == parameter.Name); | ||||
| 
 | ||||
|             parameter.Description ??= description.ModelMetadata?.Description; | ||||
|             parameter.Description ??= description.ModelMetadata.Description; | ||||
| 
 | ||||
|             if (parameter.Schema.Default == null && | ||||
|                 description.DefaultValue != null && | ||||
							
								
								
									
										7
									
								
								Endpoint/Controllers/BaseController.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								Endpoint/Controllers/BaseController.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| using Microsoft.AspNetCore.Mvc; | ||||
|  | ||||
| namespace Mirea.Api.Endpoint.Controllers; | ||||
|  | ||||
| [ApiController] | ||||
| [Route("api/[controller]/[action]")] | ||||
| public class BaseController : ControllerBase; | ||||
							
								
								
									
										8
									
								
								Endpoint/Controllers/V1/BaseControllerV1.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								Endpoint/Controllers/V1/BaseControllerV1.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | ||||
| using Microsoft.AspNetCore.Mvc; | ||||
|  | ||||
| namespace Mirea.Api.Endpoint.Controllers.V1; | ||||
|  | ||||
| [ApiVersion("1.0")] | ||||
| [Produces("application/json")] | ||||
| [Route("api/v{version:apiVersion}/[controller]/[action]")] | ||||
| public class BaseControllerV1 : BaseController; | ||||
							
								
								
									
										61
									
								
								Endpoint/Controllers/V1/CampusController.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								Endpoint/Controllers/V1/CampusController.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,61 @@ | ||||
| using MediatR; | ||||
| using Microsoft.AspNetCore.Http; | ||||
| using Microsoft.AspNetCore.Mvc; | ||||
| using Mirea.Api.DataAccess.Application.Cqrs.Campus.Queries.GetCampusBasicInfoList; | ||||
| using Mirea.Api.DataAccess.Application.Cqrs.Campus.Queries.GetCampusDetails; | ||||
| using Mirea.Api.Dto.Responses; | ||||
| 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 CampusController(IMediator mediator) : BaseControllerV1 | ||||
|     { | ||||
|         /// <summary> | ||||
|         /// Gets basic information about campuses. | ||||
|         /// </summary> | ||||
|         /// <returns>Basic information about campuses.</returns> | ||||
|         [HttpGet] | ||||
|         [ProducesResponseType(StatusCodes.Status200OK)] | ||||
|         public async Task<ActionResult<List<CampusBasicInfoResponse>>> Get() | ||||
|         { | ||||
|             var result = await mediator.Send(new GetCampusBasicInfoListQuery()); | ||||
|  | ||||
|             return Ok(result.Campuses | ||||
|                 .Select(c => new CampusBasicInfoResponse() | ||||
|                 { | ||||
|                     Id = c.Id, | ||||
|                     CodeName = c.CodeName, | ||||
|                     FullName = c.FullName | ||||
|                 }) | ||||
|             ); | ||||
|         } | ||||
|  | ||||
|         /// <summary> | ||||
|         /// Gets details of a specific campus by ID. | ||||
|         /// </summary> | ||||
|         /// <param name="id">Campus ID.</param> | ||||
|         /// <returns>Details of the specified campus.</returns> | ||||
|         [HttpGet("{id:int}")] | ||||
|         [ProducesResponseType(StatusCodes.Status200OK)] | ||||
|         [BadRequestResponse] | ||||
|         [NotFoundResponse] | ||||
|         public async Task<ActionResult<CampusDetailsResponse>> GetDetails(int id) | ||||
|         { | ||||
|             var result = await mediator.Send(new GetCampusDetailsQuery() | ||||
|             { | ||||
|                 Id = id | ||||
|             }); | ||||
|  | ||||
|             return Ok(new CampusDetailsResponse() | ||||
|             { | ||||
|                 Id = result.Id, | ||||
|                 CodeName = result.CodeName, | ||||
|                 FullName = result.FullName, | ||||
|                 Address = result.Address | ||||
|             }); | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										65
									
								
								Endpoint/Controllers/V1/DisciplineController.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								Endpoint/Controllers/V1/DisciplineController.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,65 @@ | ||||
| using MediatR; | ||||
| using Microsoft.AspNetCore.Http; | ||||
| using Microsoft.AspNetCore.Mvc; | ||||
| using Mirea.Api.DataAccess.Application.Cqrs.Discipline.Queries.GetDisciplineDetails; | ||||
| using Mirea.Api.DataAccess.Application.Cqrs.Discipline.Queries.GetDisciplineList; | ||||
| using Mirea.Api.Dto.Responses; | ||||
| 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 DisciplineController(IMediator mediator) : BaseControllerV1 | ||||
|     { | ||||
|         /// <summary> | ||||
|         /// Gets a paginated list of disciplines. | ||||
|         /// </summary> | ||||
|         /// <param name="page">Page number. Start from 0.</param> | ||||
|         /// <param name="pageSize">Number of items per page.</param> | ||||
|         /// <returns>Paginated list of disciplines.</returns> | ||||
|         [HttpGet] | ||||
|         [ProducesResponseType(StatusCodes.Status200OK)] | ||||
|         [BadRequestResponse] | ||||
|         public async Task<ActionResult<List<DisciplineResponse>>> Get([FromQuery] int? page, [FromQuery] int? pageSize) | ||||
|         { | ||||
|             var result = await mediator.Send(new GetDisciplineListQuery() | ||||
|             { | ||||
|                 Page = page, | ||||
|                 PageSize = pageSize | ||||
|             }); | ||||
|  | ||||
|             return Ok(result.Disciplines | ||||
|                 .Select(d => new DisciplineResponse() | ||||
|                 { | ||||
|                     Id = d.Id, | ||||
|                     Name = d.Name | ||||
|                 }) | ||||
|             ); | ||||
|         } | ||||
|  | ||||
|         /// <summary> | ||||
|         /// Gets details of a specific discipline by ID. | ||||
|         /// </summary> | ||||
|         /// <param name="id">Discipline ID.</param> | ||||
|         /// <returns>Details of the specified discipline.</returns> | ||||
|         [HttpGet("{id:int}")] | ||||
|         [ProducesResponseType(StatusCodes.Status200OK)] | ||||
|         [BadRequestResponse] | ||||
|         [NotFoundResponse] | ||||
|         public async Task<ActionResult<DisciplineResponse>> GetDetails(int id) | ||||
|         { | ||||
|             var result = await mediator.Send(new GetDisciplineInfoQuery() | ||||
|             { | ||||
|                 Id = id | ||||
|             }); | ||||
|  | ||||
|             return Ok(new DisciplineResponse() | ||||
|             { | ||||
|                 Id = result.Id, | ||||
|                 Name = result.Name | ||||
|             }); | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										69
									
								
								Endpoint/Controllers/V1/FacultyController.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										69
									
								
								Endpoint/Controllers/V1/FacultyController.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,69 @@ | ||||
| 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 System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Threading.Tasks; | ||||
|  | ||||
| namespace Mirea.Api.Endpoint.Controllers.V1 | ||||
| { | ||||
|     public class FacultyController(IMediator mediator) : BaseControllerV1 | ||||
|     { | ||||
|         /// <summary> | ||||
|         /// Gets a paginated list of faculties. | ||||
|         /// </summary> | ||||
|         /// <param name="page">Page number. Start from 0.</param> | ||||
|         /// <param name="pageSize">Number of items per page.</param> | ||||
|         /// <returns>Paginated list of faculties.</returns> | ||||
|         [HttpGet] | ||||
|         [ProducesResponseType(StatusCodes.Status200OK)] | ||||
|         [BadRequestResponse] | ||||
|         public async Task<ActionResult<List<FacultyResponse>>> Get([FromQuery] int? page, [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 | ||||
|                 }) | ||||
|             ); | ||||
|         } | ||||
|  | ||||
|         /// <summary> | ||||
|         /// Gets details of a specific faculty by ID. | ||||
|         /// </summary> | ||||
|         /// <param name="id">Faculty ID.</param> | ||||
|         /// <returns>Details of the specified faculty.</returns> | ||||
|         [HttpGet("{id:int}")] | ||||
|         [ProducesResponseType(StatusCodes.Status200OK)] | ||||
|         [BadRequestResponse] | ||||
|         [NotFoundResponse] | ||||
|         public async Task<ActionResult<FacultyDetailsResponse>> GetDetails(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 | ||||
|             }); | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										108
									
								
								Endpoint/Controllers/V1/GroupController.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										108
									
								
								Endpoint/Controllers/V1/GroupController.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,108 @@ | ||||
| using MediatR; | ||||
| using Microsoft.AspNetCore.Http; | ||||
| using Microsoft.AspNetCore.Mvc; | ||||
| using Mirea.Api.DataAccess.Application.Cqrs.Group.Queries.GetGroupDetails; | ||||
| using Mirea.Api.DataAccess.Application.Cqrs.Group.Queries.GetGroupList; | ||||
| using Mirea.Api.Dto.Responses; | ||||
| using Mirea.Api.Endpoint.Common.Attributes; | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Threading.Tasks; | ||||
|  | ||||
| namespace Mirea.Api.Endpoint.Controllers.V1 | ||||
| { | ||||
|     public class GroupController(IMediator mediator) : BaseControllerV1 | ||||
|     { | ||||
|         private static int GetCourseNumber(string groupName) | ||||
|         { | ||||
|             var current = DateTime.Now; | ||||
|             if (!int.TryParse(groupName[2..], out var yearOfGroup) | ||||
|                 && !int.TryParse(groupName.Split('-')[^1][..2], out yearOfGroup)) | ||||
|                 return -1; | ||||
|  | ||||
|             // Convert a two-digit year to a four-digit one | ||||
|             yearOfGroup += current.Year / 100 * 100; | ||||
|  | ||||
|             return current.Year - yearOfGroup + (current.Month < 9 ? 0 : 1); | ||||
|         } | ||||
|  | ||||
|         /// <summary> | ||||
|         /// Retrieves a list of groups. | ||||
|         /// </summary> | ||||
|         /// <param name="page">The page number for pagination (optional).</param> | ||||
|         /// <param name="pageSize">The page size for pagination (optional).</param> | ||||
|         /// <returns>A list of groups.</returns> | ||||
|         [HttpGet] | ||||
|         [ProducesResponseType(StatusCodes.Status200OK)] | ||||
|         [BadRequestResponse] | ||||
|         public async Task<ActionResult<List<GroupResponse>>> Get([FromQuery] int? page, [FromQuery] int? pageSize) | ||||
|         { | ||||
|             var result = await mediator.Send(new GetGroupListQuery() | ||||
|             { | ||||
|                 Page = page, | ||||
|                 PageSize = pageSize | ||||
|             }); | ||||
|  | ||||
|             return Ok(result.Groups | ||||
|                 .Select(g => new GroupResponse() | ||||
|                 { | ||||
|                     Id = g.Id, | ||||
|                     Name = g.Name, | ||||
|                     FacultyId = g.FacultyId, | ||||
|                     CourseNumber = GetCourseNumber(g.Name) | ||||
|                 }) | ||||
|             ); | ||||
|         } | ||||
|  | ||||
|         /// <summary> | ||||
|         /// Retrieves detailed information about a specific group. | ||||
|         /// </summary> | ||||
|         /// <param name="id">The ID of the group to retrieve.</param> | ||||
|         /// <returns>Detailed information about the group.</returns> | ||||
|         [HttpGet("{id:int}")] | ||||
|         [ProducesResponseType(StatusCodes.Status200OK)] | ||||
|         [BadRequestResponse] | ||||
|         [NotFoundResponse] | ||||
|         public async Task<ActionResult<GroupDetailsResponse>> GetDetails(int id) | ||||
|         { | ||||
|             var result = await mediator.Send(new GetGroupInfoQuery() | ||||
|             { | ||||
|                 Id = id | ||||
|             }); | ||||
|  | ||||
|             return Ok(new GroupDetailsResponse() | ||||
|             { | ||||
|                 Id = result.Id, | ||||
|                 Name = result.Name, | ||||
|                 FacultyId = result.FacultyId, | ||||
|                 FacultyName = result.Faculty, | ||||
|                 CourseNumber = GetCourseNumber(result.Name) | ||||
|             }); | ||||
|         } | ||||
|  | ||||
|         /// <summary> | ||||
|         /// Retrieves a list of groups by faculty ID. | ||||
|         /// </summary> | ||||
|         /// <param name="id">The ID of the faculty.</param> | ||||
|         /// <returns>A list of groups belonging to the specified faculty.</returns> | ||||
|         [HttpGet("{id:int}")] | ||||
|         [ProducesResponseType(StatusCodes.Status200OK)] | ||||
|         [BadRequestResponse] | ||||
|         [NotFoundResponse] | ||||
|         public async Task<ActionResult<List<GroupResponse>>> GetByFaculty(int id) | ||||
|         { | ||||
|             var result = await mediator.Send(new GetGroupListQuery()); | ||||
|  | ||||
|             return Ok(result.Groups | ||||
|                 .Where(g => g.FacultyId == id) | ||||
|                 .Select(g => new GroupResponse() | ||||
|                 { | ||||
|                     Id = g.Id, | ||||
|                     Name = g.Name, | ||||
|                     CourseNumber = GetCourseNumber(g.Name), | ||||
|                     FacultyId = g.FacultyId | ||||
|                 })); | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										84
									
								
								Endpoint/Controllers/V1/LectureHallController.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										84
									
								
								Endpoint/Controllers/V1/LectureHallController.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,84 @@ | ||||
| using MediatR; | ||||
| using Microsoft.AspNetCore.Http; | ||||
| using Microsoft.AspNetCore.Mvc; | ||||
| using Mirea.Api.DataAccess.Application.Cqrs.LectureHall.Queries.GetLectureHallDetails; | ||||
| using Mirea.Api.DataAccess.Application.Cqrs.LectureHall.Queries.GetLectureHallList; | ||||
| using Mirea.Api.Dto.Responses; | ||||
| 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 LectureHallController(IMediator mediator) : BaseControllerV1 | ||||
|     { | ||||
|         /// <summary> | ||||
|         /// Retrieves a list of all lecture halls. | ||||
|         /// </summary> | ||||
|         /// <returns>A list of lecture halls.</returns> | ||||
|         [HttpGet] | ||||
|         [ProducesResponseType(StatusCodes.Status200OK)] | ||||
|         public async Task<ActionResult<List<LectureHallResponse>>> Get() | ||||
|         { | ||||
|             var result = await mediator.Send(new GetLectureHallListQuery()); | ||||
|  | ||||
|             return Ok(result.LectureHalls | ||||
|                 .Select(l => new LectureHallResponse() | ||||
|                 { | ||||
|                     Id = l.Id, | ||||
|                     Name = l.Name, | ||||
|                     CampusId = l.CampusId | ||||
|                 }) | ||||
|             ); | ||||
|         } | ||||
|  | ||||
|         /// <summary> | ||||
|         /// Retrieves details of a specific lecture hall by its ID. | ||||
|         /// </summary> | ||||
|         /// <param name="id">The ID of the lecture hall to retrieve.</param> | ||||
|         /// <returns>The details of the specified lecture hall.</returns> | ||||
|         [HttpGet("{id:int}")] | ||||
|         [ProducesResponseType(StatusCodes.Status200OK)] | ||||
|         [BadRequestResponse] | ||||
|         [NotFoundResponse] | ||||
|         public async Task<ActionResult<LectureHallDetailsResponse>> GetDetails(int id) | ||||
|         { | ||||
|             var result = await mediator.Send(new GetLectureHallInfoQuery() | ||||
|             { | ||||
|                 Id = id | ||||
|             }); | ||||
|  | ||||
|             return Ok(new LectureHallDetailsResponse() | ||||
|             { | ||||
|                 Id = result.Id, | ||||
|                 Name = result.Name, | ||||
|                 CampusId = result.CampusId, | ||||
|                 CampusCode = result.CampusCode, | ||||
|                 CampusName = result.CampusName | ||||
|             }); | ||||
|         } | ||||
|  | ||||
|         /// <summary> | ||||
|         /// Retrieves a list of lecture halls by campus ID. | ||||
|         /// </summary> | ||||
|         /// <param name="id">The ID of the campus.</param> | ||||
|         /// <returns>A list of lecture halls in the specified campus.</returns> | ||||
|         [HttpGet("{id:int}")] | ||||
|         [ProducesResponseType(StatusCodes.Status200OK)] | ||||
|         [BadRequestResponse] | ||||
|         [NotFoundResponse] | ||||
|         public async Task<ActionResult<List<LectureHallResponse>>> GetByCampus(int id) | ||||
|         { | ||||
|             var result = await mediator.Send(new GetLectureHallListQuery()); | ||||
|  | ||||
|             return Ok(result.LectureHalls.Where(l => l.CampusId == id) | ||||
|                 .Select(l => new LectureHallResponse() | ||||
|                 { | ||||
|                     Id = l.Id, | ||||
|                     Name = l.Name, | ||||
|                     CampusId = l.CampusId | ||||
|                 })); | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										66
									
								
								Endpoint/Controllers/V1/ProfessorController.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										66
									
								
								Endpoint/Controllers/V1/ProfessorController.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,66 @@ | ||||
| using MediatR; | ||||
| using Microsoft.AspNetCore.Http; | ||||
| using Microsoft.AspNetCore.Mvc; | ||||
| using Mirea.Api.DataAccess.Application.Cqrs.Professor.Queries.GetProfessorDetails; | ||||
| using Mirea.Api.DataAccess.Application.Cqrs.Professor.Queries.GetProfessorList; | ||||
| using Mirea.Api.Dto.Responses; | ||||
| 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 ProfessorController(IMediator mediator) : BaseControllerV1 | ||||
| { | ||||
|     /// <summary> | ||||
|     /// Retrieves a list of professors. | ||||
|     /// </summary> | ||||
|     /// <param name="page">The page number for pagination (optional).</param> | ||||
|     /// <param name="pageSize">The page size for pagination (optional).</param> | ||||
|     /// <returns>A list of professors.</returns> | ||||
|     [HttpGet] | ||||
|     [ProducesResponseType(StatusCodes.Status200OK)] | ||||
|     [BadRequestResponse] | ||||
|     public async Task<ActionResult<List<ProfessorResponse>>> Get([FromQuery] int? page, [FromQuery] int? pageSize) | ||||
|     { | ||||
|         var result = await mediator.Send(new GetProfessorListQuery() | ||||
|         { | ||||
|             Page = page, | ||||
|             PageSize = pageSize | ||||
|         }); | ||||
|  | ||||
|         return Ok(result.Professors | ||||
|             .Select(p => new ProfessorResponse() | ||||
|             { | ||||
|                 Id = p.Id, | ||||
|                 Name = p.Name, | ||||
|                 AltName = p.AltName | ||||
|             }) | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Retrieves detailed information about a specific professor. | ||||
|     /// </summary> | ||||
|     /// <param name="id">The ID of the professor to retrieve.</param> | ||||
|     /// <returns>Detailed information about the professor.</returns> | ||||
|     [HttpGet("{id:int}")] | ||||
|     [ProducesResponseType(StatusCodes.Status200OK)] | ||||
|     [BadRequestResponse] | ||||
|     [NotFoundResponse] | ||||
|     public async Task<ActionResult<ProfessorResponse>> GetDetails(int id) | ||||
|     { | ||||
|         var result = await mediator.Send(new GetProfessorInfoQuery() | ||||
|         { | ||||
|             Id = id | ||||
|         }); | ||||
|  | ||||
|         return Ok(new ProfessorResponse() | ||||
|         { | ||||
|             Id = result.Id, | ||||
|             Name = result.Name, | ||||
|             AltName = result.AltName | ||||
|         }); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										304
									
								
								Endpoint/Controllers/V1/ScheduleController.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										304
									
								
								Endpoint/Controllers/V1/ScheduleController.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,304 @@ | ||||
| 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 | ||||
| { | ||||
|     /// <summary> | ||||
|     /// Retrieves schedules based on various filters. | ||||
|     /// </summary> | ||||
|     /// <param name="request">The request object containing filter criteria.</param> | ||||
|     /// <returns>A list of schedules matching the filter criteria.</returns> | ||||
|     [HttpPost] | ||||
|     [ProducesResponseType(StatusCodes.Status200OK)] | ||||
|     [ProducesResponseType(StatusCodes.Status204NoContent)] | ||||
|     [BadRequestResponse] | ||||
|     [NotFoundResponse] | ||||
|     public async Task<ActionResult<List<ScheduleResponse>>> Get([FromBody] ScheduleRequest request) | ||||
|  | ||||
|     { | ||||
|         if ((request.Groups == null || !request.Groups.Any()) && | ||||
|             (request.Disciplines == null || !request.Disciplines.Any()) && | ||||
|             (request.Professors == null || !request.Professors.Any()) && | ||||
|             (request.LectureHalls == null || !request.LectureHalls.Any())) | ||||
|         { | ||||
|             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, | ||||
|             TypeOfOccupation = s.TypeOfOccupation, | ||||
|             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 | ||||
|         })); | ||||
|  | ||||
|     } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Retrieves schedules for a specific group based on various filters. | ||||
|     /// </summary> | ||||
|     /// <param name="id">The ID of the group.</param> | ||||
|     /// <param name="isEven">A value indicating whether to retrieve schedules for even weeks.</param> | ||||
|     /// <param name="disciplines">An array of discipline IDs.</param> | ||||
|     /// <param name="professors">An array of professor IDs.</param> | ||||
|     /// <param name="lectureHalls">An array of lecture hall IDs.</param> | ||||
|     /// <returns>A response containing schedules for the specified group.</returns> | ||||
|     [HttpGet("{id:int}")] | ||||
|     [ProducesResponseType(StatusCodes.Status200OK)] | ||||
|     [ProducesResponseType(StatusCodes.Status204NoContent)] | ||||
|     [BadRequestResponse] | ||||
|     [NotFoundResponse] | ||||
|     public async Task<ActionResult<GroupScheduleResponse>> 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, | ||||
|                 TypeOfOccupation = g.TypeOfOccupation, | ||||
|                 LectureHalls = g.LectureHalls, | ||||
|                 LectureHallsId = g.LectureHallsId, | ||||
|                 Professors = g.Professors, | ||||
|                 ProfessorsId = g.ProfessorsId, | ||||
|                 Campus = g.Campus, | ||||
|                 CampusId = g.CampusId, | ||||
|                 LinkToMeet = g.LinkToMeet | ||||
|             }) | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Retrieves schedules for a specific professor based on various filters. | ||||
|     /// </summary> | ||||
|     /// <param name="id">The ID of the professor.</param> | ||||
|     /// <param name="isEven">A value indicating whether to retrieve schedules for even weeks.</param> | ||||
|     /// <param name="disciplines">An array of discipline IDs.</param> | ||||
|     /// <param name="groups">An array of group IDs.</param> | ||||
|     /// <param name="lectureHalls">An array of lecture hall IDs.</param> | ||||
|     /// <returns>A response containing schedules for the specified professor.</returns> | ||||
|     [HttpGet("{id:int}")] | ||||
|     [ProducesResponseType(StatusCodes.Status200OK)] | ||||
|     [ProducesResponseType(StatusCodes.Status204NoContent)] | ||||
|     [BadRequestResponse] | ||||
|     [NotFoundResponse] | ||||
|     public async Task<ActionResult<ProfessorScheduleResponse>> 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, | ||||
|                 TypeOfOccupation = p.TypeOfOccupation, | ||||
|                 Group = p.Group, | ||||
|                 GroupId = p.GroupId, | ||||
|                 LectureHalls = p.LectureHalls, | ||||
|                 LectureHallsId = p.LectureHallsId, | ||||
|                 Campus = p.Campus, | ||||
|                 CampusId = p.CampusId, | ||||
|                 LinkToMeet = p.LinkToMeet | ||||
|             }) | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Retrieves schedules for a specific lecture hall based on various filters. | ||||
|     /// </summary> | ||||
|     /// <param name="id">The ID of the lecture hall.</param> | ||||
|     /// <param name="isEven">A value indicating whether to retrieve schedules for even weeks.</param> | ||||
|     /// <param name="disciplines">An array of discipline IDs.</param> | ||||
|     /// <param name="professors">An array of professor IDs.</param> | ||||
|     /// <param name="groups">An array of group IDs.</param> | ||||
|     /// <returns>A response containing schedules for the specified lecture hall.</returns> | ||||
|     [HttpGet("{id:int}")] | ||||
|     [ProducesResponseType(StatusCodes.Status200OK)] | ||||
|     [ProducesResponseType(StatusCodes.Status204NoContent)] | ||||
|     [BadRequestResponse] | ||||
|     [NotFoundResponse] | ||||
|     public async Task<ActionResult<LectureHallScheduleResponse>> 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, | ||||
|                 TypeOfOccupation = l.TypeOfOccupation, | ||||
|                 Group = l.Group, | ||||
|                 GroupId = l.GroupId, | ||||
|                 Professors = l.Professors, | ||||
|                 ProfessorsId = l.ProfessorsId, | ||||
|                 Campus = l.Campus, | ||||
|                 CampusId = l.CampusId, | ||||
|                 LinkToMeet = l.LinkToMeet | ||||
|             }) | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Retrieves schedules for a specific discipline based on various filters. | ||||
|     /// </summary> | ||||
|     /// <param name="id">The ID of the discipline.</param> | ||||
|     /// <param name="isEven">A value indicating whether to retrieve schedules for even weeks.</param> | ||||
|     /// <param name="groups">An array of group IDs.</param> | ||||
|     /// <param name="professors">An array of professor IDs.</param> | ||||
|     /// <param name="lectureHalls">An array of lecture hall IDs.</param> | ||||
|     /// <returns>A response containing schedules for the specified discipline.</returns> | ||||
|     [HttpGet("{id:int}")] | ||||
|     [ProducesResponseType(StatusCodes.Status200OK)] | ||||
|     [ProducesResponseType(StatusCodes.Status204NoContent)] | ||||
|     [BadRequestResponse] | ||||
|     [NotFoundResponse] | ||||
|     public async Task<ActionResult<DisciplineScheduleResponse>> 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 = [id], | ||||
|             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.TypeOfOccupation, | ||||
|                 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 | ||||
|             }) | ||||
|         }); | ||||
|     } | ||||
| } | ||||
| @@ -28,6 +28,7 @@ | ||||
| 	</ItemGroup> | ||||
|  | ||||
| 	<ItemGroup> | ||||
| 		<ProjectReference Include="..\ApiDto\ApiDto.csproj" /> | ||||
| 		<ProjectReference Include="..\Domain\Domain.csproj" /> | ||||
| 		<ProjectReference Include="..\Persistence\Persistence.csproj" /> | ||||
| 	</ItemGroup> | ||||
|   | ||||
| @@ -8,6 +8,7 @@ using Microsoft.Extensions.Hosting; | ||||
| using Microsoft.Extensions.Options; | ||||
| using Mirea.Api.DataAccess.Application; | ||||
| using Mirea.Api.DataAccess.Persistence; | ||||
| using Mirea.Api.Endpoint.Configuration; | ||||
| using Mirea.Api.Endpoint.Properties; | ||||
| using Swashbuckle.AspNetCore.SwaggerGen; | ||||
| using System; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user