< Summary - Syki

Information
Class: Syki.Back.Features.Student.GetStudentClass.GetStudentClassService
Assembly: Back
File(s): /home/runner/work/syki/syki/Back/Features/Student/GetStudentClass/GetStudentClassService.cs
Tag: 4_16869239191
Line coverage
0%
Covered lines: 0
Uncovered lines: 31
Coverable lines: 31
Total lines: 55
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 8
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%210%
Get()0%2040%
GetAverage(...)0%620%
GetAverageNote(...)0%620%

File(s)

/home/runner/work/syki/syki/Back/Features/Student/GetStudentClass/GetStudentClassService.cs

#LineLine coverage
 1namespace Syki.Back.Features.Student.GetStudentClass;
 2
 03public class GetStudentClassService(SykiDbContext ctx) : IStudentService
 4{
 5    public async Task<OneOf<StudentClassOut, SykiError>> Get(Guid userId, Guid classId)
 6    {
 07        var classOk = await ctx.ClassesStudents.AnyAsync(x => x.ClassId == classId && x.SykiStudentId == userId);
 08        if (!classOk) return new ClassNotFound();
 9
 010        var @class = await ctx.Classes.AsNoTracking()
 011            .Include(t => t.Discipline)
 012            .Where(t => t.Id == classId)
 013            .FirstOrDefaultAsync();
 14
 015        var activities = await ctx.ClassActivities.Where(x => x.ClassId == classId)
 016            .Select(x => new ClassActivityDto(x.Id, x.Weight, x.Note))
 017            .ToListAsync();
 018        var works = await ctx.ClassActivityWorks.Where(x => x.SykiStudentId == userId)
 019            .Select(x => new ClassActivityWorkDto(x.ClassActivityId, x.Note))
 020            .ToListAsync();
 21
 022        var n1 = GetAverage(activities.Where(x => x.Note == ClassNoteType.N1).ToList(), works);
 023        var n2 = GetAverage(activities.Where(x => x.Note == ClassNoteType.N2).ToList(), works);
 024        var n3 = GetAverage(activities.Where(x => x.Note == ClassNoteType.N3).ToList(), works);
 025        var average = GetAverageNote(n1, n2, n3);
 26
 027        var attendances = await ctx.Attendances.Where(x => x.ClassId == classId && x.StudentId == userId).CountAsync();
 028        var presences = await ctx.Attendances.Where(x => x.ClassId == classId && x.StudentId == userId && x.Present).Cou
 029        var frequency = attendances == 0 ? 0 : Math.Round(100M*(1M * presences / (1M * attendances)), 2);
 30
 031        return @class.ToStudentClassOut(n1, n2, n3, average, frequency);
 032    }
 33
 34    private static decimal GetAverage(List<ClassActivityDto> activities, List<ClassActivityWorkDto> works)
 35    {
 036        var average = 0.00M;
 037        foreach (var activity in activities)
 38        {
 039            var work = works.First(x => x.ActivityId == activity.Id);
 040            average += activity.Weight * work.Note;
 41        }
 042        average /= 100.00M;
 043        return average;
 44    }
 45
 46    private static decimal GetAverageNote(params decimal[] notes)
 47    {
 048        if (notes.Length <= 2) return 0;
 049        var average = notes.OrderDescending().Take(2).Average();
 050        return Math.Round(average, 2);
 51    }
 52}
 53
 54internal record ClassActivityDto(Guid Id, int Weight, ClassNoteType Note);
 55internal record ClassActivityWorkDto(Guid ActivityId, decimal Note);