< Summary - Syki

Information
Class: Syki.Back.Features.Student.GetStudentClass.ClassActivityDto
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: 1
Coverable lines: 1
Total lines: 55
Line coverage: 0%
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_Id()100%210%

File(s)

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

#LineLine coverage
 1namespace Syki.Back.Features.Student.GetStudentClass;
 2
 3public class GetStudentClassService(SykiDbContext ctx) : IStudentService
 4{
 5    public async Task<OneOf<StudentClassOut, SykiError>> Get(Guid userId, Guid classId)
 6    {
 7        var classOk = await ctx.ClassesStudents.AnyAsync(x => x.ClassId == classId && x.SykiStudentId == userId);
 8        if (!classOk) return new ClassNotFound();
 9
 10        var @class = await ctx.Classes.AsNoTracking()
 11            .Include(t => t.Discipline)
 12            .Where(t => t.Id == classId)
 13            .FirstOrDefaultAsync();
 14
 15        var activities = await ctx.ClassActivities.Where(x => x.ClassId == classId)
 16            .Select(x => new ClassActivityDto(x.Id, x.Weight, x.Note))
 17            .ToListAsync();
 18        var works = await ctx.ClassActivityWorks.Where(x => x.SykiStudentId == userId)
 19            .Select(x => new ClassActivityWorkDto(x.ClassActivityId, x.Note))
 20            .ToListAsync();
 21
 22        var n1 = GetAverage(activities.Where(x => x.Note == ClassNoteType.N1).ToList(), works);
 23        var n2 = GetAverage(activities.Where(x => x.Note == ClassNoteType.N2).ToList(), works);
 24        var n3 = GetAverage(activities.Where(x => x.Note == ClassNoteType.N3).ToList(), works);
 25        var average = GetAverageNote(n1, n2, n3);
 26
 27        var attendances = await ctx.Attendances.Where(x => x.ClassId == classId && x.StudentId == userId).CountAsync();
 28        var presences = await ctx.Attendances.Where(x => x.ClassId == classId && x.StudentId == userId && x.Present).Cou
 29        var frequency = attendances == 0 ? 0 : Math.Round(100M*(1M * presences / (1M * attendances)), 2);
 30
 31        return @class.ToStudentClassOut(n1, n2, n3, average, frequency);
 32    }
 33
 34    private static decimal GetAverage(List<ClassActivityDto> activities, List<ClassActivityWorkDto> works)
 35    {
 36        var average = 0.00M;
 37        foreach (var activity in activities)
 38        {
 39            var work = works.First(x => x.ActivityId == activity.Id);
 40            average += activity.Weight * work.Note;
 41        }
 42        average /= 100.00M;
 43        return average;
 44    }
 45
 46    private static decimal GetAverageNote(params decimal[] notes)
 47    {
 48        if (notes.Length <= 2) return 0;
 49        var average = notes.OrderDescending().Take(2).Average();
 50        return Math.Round(average, 2);
 51    }
 52}
 53
 054internal record ClassActivityDto(Guid Id, int Weight, ClassNoteType Note);
 55internal record ClassActivityWorkDto(Guid ActivityId, decimal Note);

Methods/Properties

get_Id()