< Summary - Syki

Information
Class: Syki.Back.Features.Disciplines.AddDisciplineCourses.AddDisciplineCoursesService
Assembly: Back
File(s): /home/runner/work/syki/syki/Back/Features/Disciplines/AddDisciplineCourses/AddDisciplineCoursesService.cs
Tag: 56_26538939494
Line coverage
100%
Covered lines: 21
Uncovered lines: 0
Coverable lines: 21
Total lines: 40
Line coverage: 100%
Branch coverage
87%
Covered branches: 7
Total branches: 8
Branch coverage: 87.5%
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()50%22100%
.cctor()100%11100%
Add()100%66100%

File(s)

/home/runner/work/syki/syki/Back/Features/Disciplines/AddDisciplineCourses/AddDisciplineCoursesService.cs

#LineLine coverage
 1using Syki.Back.Domain.Courses;
 2
 3namespace Syki.Back.Features.Disciplines.AddDisciplineCourses;
 4
 125public class AddDisciplineCoursesService(SykiDbContext ctx) : ISykiService
 6{
 7    private class Validator : AbstractValidator<AddDisciplineCoursesIn>
 8    {
 29        public Validator()
 10        {
 211            RuleFor(x => x.Courses).NotEmpty().WithError(InvalidCoursesList.I);
 1412            RuleFor(x => x.Courses).Must(x => x != null && x.IsAllDistinct()).WithError(InvalidCoursesList.I);
 213        }
 14    }
 215    private static readonly Validator V = new();
 16
 17    public async Task<OneOf<AddDisciplineCoursesOut, SykiError>> Add(AddDisciplineCoursesIn data)
 18    {
 1619        if (V.Run(data, out var error)) return error;
 20
 821        var discipline = await ctx.Disciplines.Include(d => d.Links)
 822            .FirstOrDefaultAsync(x => x.InstitutionId == ctx.RequestUser.InstitutionId && x.Id == data.DisciplineId);
 1023        if (discipline == null) return DisciplineNotFound.I;
 24
 625        var validCourseIds = await ctx.Courses
 626            .Where(c => c.InstitutionId == ctx.RequestUser.InstitutionId && data.Courses.Contains(c.Id))
 627            .Select(c => c.Id)
 628            .ToListAsync();
 29
 830        if (validCourseIds.Count != data.Courses.Count) return InvalidCoursesList.I;
 31
 432        var existingCourseIds = discipline.Links.Select(l => l.CourseId).ToHashSet();
 1033        validCourseIds.Where(id => !existingCourseIds.Contains(id)).ToList()
 1034            .ForEach(id => discipline.Links.Add(new CourseDiscipline { CourseId = id }));
 35
 436        await ctx.SaveChangesAsync();
 37
 438        return new AddDisciplineCoursesOut { Id = discipline.Id };
 1239    }
 40}