| | | 1 | | namespace Syki.Back.Features.Campi.GetCampi; |
| | | 2 | | |
| | 2 | 3 | | public class GetCampiService(SykiDbContext ctx) : ISykiService |
| | | 4 | | { |
| | | 5 | | public async Task<GetCampiOut> Get() |
| | | 6 | | { |
| | 2 | 7 | | var institutionId = ctx.RequestUser.InstitutionId; |
| | | 8 | | |
| | 2 | 9 | | var campi = await ctx.Campi.AsNoTracking() |
| | 2 | 10 | | .Where(c => c.InstitutionId == institutionId) |
| | 2 | 11 | | .OrderBy(c => c.Name) |
| | 2 | 12 | | .ToListAsync(); |
| | | 13 | | |
| | 6 | 14 | | var ids = campi.Select(c => c.Id).ToHashSet(); |
| | | 15 | | |
| | 2 | 16 | | var courseOfferings = await ctx.CourseOfferings.AsNoTracking() |
| | 2 | 17 | | .Where(x => ids.Count == 0 || ids.Contains(x.CampusId)) |
| | 2 | 18 | | .ToListAsync(); |
| | 2 | 19 | | var courseOfferingsIds = courseOfferings.Select(co => co.Id).ToHashSet(); |
| | | 20 | | |
| | 2 | 21 | | var students = await ctx.StudentCourseEnrollments.AsNoTracking() |
| | 2 | 22 | | .Where(x => x.LeftAt == null && courseOfferingsIds.Contains(x.CourseOfferingId)) |
| | 2 | 23 | | .ToListAsync(); |
| | | 24 | | |
| | 2 | 25 | | var teachers = await ctx.TeachersCampi.AsNoTracking() |
| | 2 | 26 | | .Where(x => ids.Count == 0 || ids.Contains(x.CampusId)) |
| | 2 | 27 | | .ToListAsync(); |
| | | 28 | | |
| | 2 | 29 | | var items = campi.ConvertAll(x => |
| | 2 | 30 | | { |
| | 4 | 31 | | var teachersCount = teachers.Count(t => t.CampusId == x.Id); |
| | 4 | 32 | | var campusCourseOfferings = courseOfferings.Where(co => co.CampusId == x.Id).Select(x => x.Id).ToList(); |
| | 4 | 33 | | var studentsCount = students.Count(s => campusCourseOfferings.Contains(s.CourseOfferingId)); |
| | 4 | 34 | | return x.ToGetCampiItemOut(studentsCount, teachersCount); |
| | 2 | 35 | | }); |
| | | 36 | | |
| | 2 | 37 | | return new GetCampiOut() { Total = items.Count, Items = items }; |
| | 2 | 38 | | } |
| | | 39 | | } |