< Summary - Syki

Information
Class: Syki.Back.Features.Student.GetStudentAverageNote.GetStudentAverageNoteService
Assembly: Back
File(s): /home/runner/work/syki/syki/Back/Features/Student/GetStudentAverageNote/GetStudentAverageNoteService.cs
Tag: 4_16869239191
Line coverage
100%
Covered lines: 39
Uncovered lines: 0
Coverable lines: 39
Total lines: 68
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%
Get()100%44100%
GetAverage(...)100%22100%
GetAverageNote(...)50%22100%

File(s)

/home/runner/work/syki/syki/Back/Features/Student/GetStudentAverageNote/GetStudentAverageNoteService.cs

#LineLine coverage
 1namespace Syki.Back.Features.Student.GetStudentAverageNote;
 2
 123public class GetStudentAverageNoteService(SykiDbContext ctx) : IStudentService
 4{
 5    public async Task<decimal> Get(Guid userId)
 6    {
 127        var classesStudents = await ctx.ClassesStudents.AsNoTracking()
 128            .Where(x => x.SykiStudentId == userId)
 129            .ToListAsync();
 10
 7211        var classesIds = classesStudents.ConvertAll(x => x.ClassId);
 1212        var activities = await ctx.ClassActivities
 1213            .AsNoTrackingWithIdentityResolution()
 1214            .Where(x => classesIds.Contains(x.ClassId))
 1215            .ToListAsync();
 16
 1217        var works = await ctx.ClassActivityWorks
 1218            .AsNoTrackingWithIdentityResolution()
 1219            .Where(x => x.SykiStudentId == userId)
 1220            .ToListAsync();
 21
 1222        var notes = new List<ClassAverageDto>();
 14423        foreach (var classId in classesIds)
 24        {
 13225            var classActivities = activities.Where(x => x.ClassId == classId)
 1226                .Select(x => new ClassActivityDto(x.Id, x.Weight, x.Note))
 6027                .ToList();
 15828            var classWorks = works.Where(x => classActivities.Select(a => a.Id).Contains(x.ClassActivityId))
 1229                .Select(x => new ClassActivityWorkDto(x.ClassActivityId, x.Note))
 6030                .ToList();
 31
 7232            var n1 = GetAverage(classActivities.Where(x => x.Note == ClassNoteType.N1).ToList(), classWorks);
 7233            var n2 = GetAverage(classActivities.Where(x => x.Note == ClassNoteType.N2).ToList(), classWorks);
 7234            var n3 = GetAverage(classActivities.Where(x => x.Note == ClassNoteType.N3).ToList(), classWorks);
 35
 6036            var average = GetAverageNote(n1, n2, n3);
 6037            notes.Add(new ClassAverageDto(classId, average));
 38        }
 39
 7240        var values = notes.ConvertAll(x => x.Average);
 41
 1442        if (values.Count == 0) return 0;
 43
 1044        return Math.Round(values.Average(), 2);
 1245    }
 46
 47    private static decimal GetAverage(List<ClassActivityDto> activities, List<ClassActivityWorkDto> works)
 48    {
 18049        var average = 0.00M;
 38450        foreach (var activity in activities)
 51        {
 2652            var work = works.First(x => x.ActivityId == activity.Id);
 1253            average += activity.Weight * work.Note;
 54        }
 18055        average /= 100.00M;
 18056        return average;
 57    }
 58
 59    private static decimal GetAverageNote(params decimal[] notes)
 60    {
 6061        if (notes.Length <= 2) return 0;
 6062        var average = notes.OrderDescending().Take(2).Average();
 6063        return Math.Round(average, 2);
 64    }
 65}
 66internal record ClassActivityDto(Guid Id, int Weight, ClassNoteType Note);
 67internal record ClassActivityWorkDto(Guid ActivityId, decimal Note);
 68internal record ClassAverageDto(Guid ClassId, decimal Average);