| | 1 | | using Syki.Back.Features.Academic.CreateClass; |
| | 2 | |
|
| | 3 | | namespace Syki.Back.Features.Academic.AssignClassToClassroom; |
| | 4 | |
|
| 14 | 5 | | public class AssignClassToClassroomService(SykiDbContext ctx) : IAcademicService |
| | 6 | | { |
| | 7 | | public async Task<OneOf<SykiSuccess, SykiError>> Assign(Guid institutionId, Guid classroomId, AssignClassToClassroom |
| | 8 | | { |
| 14 | 9 | | var classroom = await ctx.Classrooms.FirstOrDefaultAsync(c => c.InstitutionId == institutionId && c.Id == classr |
| 16 | 10 | | if (classroom == null) return new ClassroomNotFound(); |
| | 11 | |
|
| 12 | 12 | | var @class = await ctx.Classes.FirstOrDefaultAsync(c => c.InstitutionId == institutionId && c.Id == data.ClassId |
| 14 | 13 | | if (@class == null) return new ClassNotFound(); |
| | 14 | |
|
| 10 | 15 | | if (@class.CampusId != classroom.CampusId) return new ClassAndClassroomShouldStayOnSameCampus(); |
| | 16 | |
|
| 12 | 17 | | if (@class.Vacancies > classroom.Capacity) return new ClassVacanciesGreaterThanClassroomCapacity(); |
| | 18 | |
|
| 8 | 19 | | if (data.Schedules == null || data.Schedules.Count == 0) return new InvalidScheduleForAssignClassToClassroom(); |
| | 20 | |
|
| 8 | 21 | | var ids = await ctx.ClassroomsClasses.Where(c => c.ClassroomId == classroomId && c.IsActive).Select(x => x.Class |
| 8 | 22 | | var currentSchedules = await ctx.Schedules.Where(x => x.ClassroomId == classroomId && x.ClassId != null && ids.C |
| | 23 | |
|
| 8 | 24 | | data.Schedules.AddRange(currentSchedules.ConvertAll(x => new ScheduleIn(x.Day, x.Start, x.End))); |
| | 25 | |
|
| 8 | 26 | | var schedulesResult = data.Schedules.ToHashSet().ToList().ToSchedules(); |
| 14 | 27 | | if (schedulesResult.IsError) return schedulesResult.Error; |
| | 28 | |
|
| 2 | 29 | | ctx.RemoveRange(currentSchedules); |
| | 30 | |
|
| 2 | 31 | | var newSchedules = schedulesResult.Success; |
| 2 | 32 | | newSchedules.ForEach(x => |
| 2 | 33 | | { |
| 2 | 34 | | x.ClassId = @class.Id; |
| 2 | 35 | | x.ClassroomId = classroom.Id; |
| 2 | 36 | | x.TeacherId = @class.TeacherId; |
| 4 | 37 | | }); |
| 2 | 38 | | ctx.AddRange(newSchedules); |
| | 39 | |
|
| 2 | 40 | | var assignExists = await ctx.ClassroomsClasses.AnyAsync(x => x.ClassroomId == classroom.Id && x.ClassId == @clas |
| 2 | 41 | | if (!assignExists) |
| | 42 | | { |
| 2 | 43 | | ctx.Add(new ClassroomClass(classroom.Id, @class.Id)); |
| | 44 | | } |
| | 45 | |
|
| 2 | 46 | | await ctx.SaveChangesAsync(); |
| | 47 | |
|
| 2 | 48 | | return new SykiSuccess(); |
| 14 | 49 | | } |
| | 50 | | } |