| | 1 | | namespace Syki.Back.Features.Academic.CreateCourseCurriculum; |
| | 2 | |
|
| 536 | 3 | | public class CreateCourseCurriculumService(SykiDbContext ctx, HybridCache cache) : IAcademicService |
| | 4 | | { |
| | 5 | | public async Task<OneOf<CourseCurriculumOut, SykiError>> Create(Guid institutionId, CreateCourseCurriculumIn data) |
| | 6 | | { |
| 536 | 7 | | var courseOk = await ctx.Courses |
| 536 | 8 | | .AnyAsync(c => c.InstitutionId == institutionId && c.Id == data.CourseId); |
| 540 | 9 | | if (!courseOk) return new CourseNotFound(); |
| | 10 | |
|
| 532 | 11 | | var disciplines = await ctx.CoursesDisciplines.AsNoTracking() |
| 532 | 12 | | .Where(x => x.CourseId == data.CourseId) |
| 532 | 13 | | .Select(x => x.DisciplineId) |
| 532 | 14 | | .ToListAsync(); |
| | 15 | |
|
| 4772 | 16 | | if (!data.Disciplines.ConvertAll(d => d.Id).IsSubsetOf(disciplines)) |
| 8 | 17 | | return new InvalidDisciplinesList(); |
| | 18 | |
|
| 524 | 19 | | var courseCurriculum = new CourseCurriculum(institutionId, data.CourseId, data.Name); |
| | 20 | |
|
| 524 | 21 | | courseCurriculum.AddDisciplines(data.Disciplines); |
| | 22 | |
|
| 524 | 23 | | ctx.Add(courseCurriculum); |
| 524 | 24 | | await ctx.SaveChangesAsync(); |
| | 25 | |
|
| 524 | 26 | | await cache.RemoveAsync($"courseCurriculums:{institutionId}"); |
| | 27 | |
|
| 524 | 28 | | courseCurriculum = await ctx.CourseCurriculums.AsNoTracking() |
| 524 | 29 | | .Include(x => x.Course) |
| 524 | 30 | | .Include(x => x.Disciplines) |
| 524 | 31 | | .Include(x => x.Links) |
| 524 | 32 | | .FirstAsync(x => x.Id == courseCurriculum.Id); |
| | 33 | |
|
| 524 | 34 | | return courseCurriculum.ToOut(); |
| 536 | 35 | | } |
| | 36 | | } |