< Summary - Syki

Information
Class: Syki.Back.Features.Academic.CreateCourseOffering.CreateCourseOfferingService
Assembly: Back
File(s): /home/runner/work/syki/syki/Back/Features/Academic/CreateCourseOffering/CreateCourseOfferingService.cs
Tag: 4_16869239191
Line coverage
100%
Covered lines: 29
Uncovered lines: 0
Coverable lines: 29
Total lines: 44
Line coverage: 100%
Branch coverage
100%
Covered branches: 10
Total branches: 10
Branch coverage: 100%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
Create()100%1010100%

File(s)

/home/runner/work/syki/syki/Back/Features/Academic/CreateCourseOffering/CreateCourseOfferingService.cs

#LineLine coverage
 1namespace Syki.Back.Features.Academic.CreateCourseOffering;
 2
 5163public class CreateCourseOfferingService(SykiDbContext ctx, HybridCache cache) : IAcademicService
 4{
 5    public async Task<OneOf<CourseOfferingOut, SykiError>> Create(Guid institutionId, CreateCourseOfferingIn data)
 6    {
 5167        var campusOk = await ctx.Campi.AnyAsync(c => c.InstitutionId == institutionId && c.Id == data.CampusId);
 5208        if (!campusOk) return new CampusNotFound();
 9
 51210        var courseOk = await ctx.Courses.AnyAsync(c => c.InstitutionId == institutionId && c.Id == data.CourseId);
 51611        if (!courseOk) return new CourseNotFound();
 12
 50813        var courseCurriculumOk = await ctx.CourseCurriculums
 50814            .AnyAsync(g => g.InstitutionId == institutionId && g.Id == data.CourseCurriculumId && g.CourseId == data.Cou
 51215        if (!courseCurriculumOk) return new CourseCurriculumNotFound();
 16
 50417        var periodExists = await ctx.AcademicPeriodExists(institutionId, data.Period);
 50818        if (!periodExists) return new AcademicPeriodNotFound();
 19
 50220        if (!data.Shift.IsValid()) return new InvalidShift();
 21
 49822        var courseOffering = new CourseOffering(
 49823            institutionId,
 49824            data.CampusId,
 49825            data.CourseId,
 49826            data.CourseCurriculumId,
 49827            data.Period!,
 49828            data.Shift
 49829        );
 30
 49831        ctx.CourseOfferings.Add(courseOffering);
 49832        await ctx.SaveChangesAsync();
 33
 49834        await cache.RemoveAsync($"courseOfferings:{institutionId}");
 35
 49836        courseOffering = await ctx.CourseOfferings.AsNoTracking()
 49837            .Include(x => x.Campus)
 49838            .Include(x => x.Course)
 49839            .Include(x => x.CourseCurriculum)
 49840            .FirstAsync(x => x.Id == courseOffering.Id);
 41
 49842        return courseOffering.ToOut();
 51643    }
 44}