< 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: 21_17346963026
Line coverage
100%
Covered lines: 28
Uncovered lines: 0
Coverable lines: 28
Total lines: 45
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%
.ctor()100%11100%
.cctor()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
 5283public class CreateCourseOfferingService(SykiDbContext ctx, HybridCache cache) : IAcademicService
 4{
 5    private class Validator : AbstractValidator<CreateCourseOfferingIn>
 6    {
 27        public Validator()
 8        {
 29            RuleFor(x => x.Shift).NotNull().WithError(InvalidShift.I);
 210            RuleFor(x => x.Shift).IsInEnum().WithError(InvalidShift.I);
 211        }
 12    }
 213    private static readonly Validator V = new();
 14
 15    public async Task<OneOf<CourseOfferingOut, SykiError>> Create(CreateCourseOfferingIn data)
 16    {
 53217        if (V.Run(data, out var error)) return error;
 18
 52819        if (await ctx.CampusNotFound(data.CampusId)) return CampusNotFound.I;
 52420        if (await ctx.CourseNotFound(data.CourseId)) return CourseNotFound.I;
 52021        if (await ctx.CourseCurriculumNotFound(data.CourseCurriculumId, data.CourseId)) return CourseCurriculumNotFound.
 51622        if (await ctx.AcademicPeriodNotFound(data.Period)) return AcademicPeriodNotFound.I;
 23
 50824        var courseOffering = new CourseOffering(
 50825            ctx.InstitutionId,
 50826            data.CampusId,
 50827            data.CourseId,
 50828            data.CourseCurriculumId,
 50829            data.Period!,
 50830            data.Shift!.Value
 50831        );
 32
 50833        await ctx.SaveChangesAsync(courseOffering);
 34
 50835        await cache.RemoveAsync($"courseOfferings:{ctx.InstitutionId}");
 36
 50837        courseOffering = await ctx.CourseOfferings.AsNoTracking()
 50838            .Include(x => x.Campus)
 50839            .Include(x => x.Course)
 50840            .Include(x => x.CourseCurriculum)
 50841            .FirstAsync(x => x.Id == courseOffering.Id);
 42
 50843        return courseOffering.ToOut();
 52844    }
 45}