< Summary - Syki

Information
Class: Syki.Back.Features.Student.GetStudentAverageNote.ClassAverageDto
Assembly: Back
File(s): /home/runner/work/syki/syki/Back/Features/Student/GetStudentAverageNote/GetStudentAverageNoteService.cs
Tag: 4_16869239191
Line coverage
100%
Covered lines: 1
Uncovered lines: 0
Coverable lines: 1
Total lines: 68
Line coverage: 100%
Branch coverage
N/A
Covered branches: 0
Total branches: 0
Branch coverage: N/A
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
get_ClassId()100%11100%

File(s)

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

#LineLine coverage
 1namespace Syki.Back.Features.Student.GetStudentAverageNote;
 2
 3public class GetStudentAverageNoteService(SykiDbContext ctx) : IStudentService
 4{
 5    public async Task<decimal> Get(Guid userId)
 6    {
 7        var classesStudents = await ctx.ClassesStudents.AsNoTracking()
 8            .Where(x => x.SykiStudentId == userId)
 9            .ToListAsync();
 10
 11        var classesIds = classesStudents.ConvertAll(x => x.ClassId);
 12        var activities = await ctx.ClassActivities
 13            .AsNoTrackingWithIdentityResolution()
 14            .Where(x => classesIds.Contains(x.ClassId))
 15            .ToListAsync();
 16
 17        var works = await ctx.ClassActivityWorks
 18            .AsNoTrackingWithIdentityResolution()
 19            .Where(x => x.SykiStudentId == userId)
 20            .ToListAsync();
 21
 22        var notes = new List<ClassAverageDto>();
 23        foreach (var classId in classesIds)
 24        {
 25            var classActivities = activities.Where(x => x.ClassId == classId)
 26                .Select(x => new ClassActivityDto(x.Id, x.Weight, x.Note))
 27                .ToList();
 28            var classWorks = works.Where(x => classActivities.Select(a => a.Id).Contains(x.ClassActivityId))
 29                .Select(x => new ClassActivityWorkDto(x.ClassActivityId, x.Note))
 30                .ToList();
 31
 32            var n1 = GetAverage(classActivities.Where(x => x.Note == ClassNoteType.N1).ToList(), classWorks);
 33            var n2 = GetAverage(classActivities.Where(x => x.Note == ClassNoteType.N2).ToList(), classWorks);
 34            var n3 = GetAverage(classActivities.Where(x => x.Note == ClassNoteType.N3).ToList(), classWorks);
 35
 36            var average = GetAverageNote(n1, n2, n3);
 37            notes.Add(new ClassAverageDto(classId, average));
 38        }
 39
 40        var values = notes.ConvertAll(x => x.Average);
 41
 42        if (values.Count == 0) return 0;
 43
 44        return Math.Round(values.Average(), 2);
 45    }
 46
 47    private static decimal GetAverage(List<ClassActivityDto> activities, List<ClassActivityWorkDto> works)
 48    {
 49        var average = 0.00M;
 50        foreach (var activity in activities)
 51        {
 52            var work = works.First(x => x.ActivityId == activity.Id);
 53            average += activity.Weight * work.Note;
 54        }
 55        average /= 100.00M;
 56        return average;
 57    }
 58
 59    private static decimal GetAverageNote(params decimal[] notes)
 60    {
 61        if (notes.Length <= 2) return 0;
 62        var average = notes.OrderDescending().Take(2).Average();
 63        return Math.Round(average, 2);
 64    }
 65}
 66internal record ClassActivityDto(Guid Id, int Weight, ClassNoteType Note);
 67internal record ClassActivityWorkDto(Guid ActivityId, decimal Note);
 12068internal record ClassAverageDto(Guid ClassId, decimal Average);

Methods/Properties

get_ClassId()