< Summary - Syki

Information
Class: Syki.Back.Features.Teacher.GetTeacherClassStudents.GetTeacherClassStudentsService
Assembly: Back
File(s): /home/runner/work/syki/syki/Back/Features/Teacher/GetTeacherClassStudents/GetTeacherClassStudentsService.cs
Tag: 4_16869239191
Line coverage
100%
Covered lines: 42
Uncovered lines: 0
Coverable lines: 42
Total lines: 70
Line coverage: 100%
Branch coverage
78%
Covered branches: 11
Total branches: 14
Branch coverage: 78.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()83.33%66100%
GetAverage(...)100%22100%
GetAverageNote(...)50%22100%

File(s)

/home/runner/work/syki/syki/Back/Features/Teacher/GetTeacherClassStudents/GetTeacherClassStudentsService.cs

#LineLine coverage
 1namespace Syki.Back.Features.Teacher.GetTeacherClassStudents;
 2
 203public class GetTeacherClassStudentsService(SykiDbContext ctx) : ITeacherService
 4{
 5    public async Task<OneOf<List<TeacherClassStudentOut>, SykiError>> Get(Guid teacherId, Guid classId)
 6    {
 187        var @class = await ctx.Classes.AsNoTracking()
 188            .Include(x => x.Students)
 189            .FirstOrDefaultAsync(x => x.Id == classId && x.TeacherId == teacherId);
 1810        if (@class == null) return new ClassNotFound();
 11
 2212        var students = @class.Students.OrderBy(x => x.Name)
 413            .Select(x => new TeacherClassStudentOut { Id = x.Id, Name = x.Name })
 1814            .ToList();
 1815        var classAttendances = await ctx.Attendances.AsNoTracking().Where(x => x.ClassId == classId).ToListAsync();
 16
 1817        var classActivities = await ctx.ClassActivities
 1818            .AsNoTrackingWithIdentityResolution()
 1819            .Where(x => x.ClassId == classId)
 1820            .Include(x => x.Works)
 1821            .ToListAsync();
 1822        var activities = classActivities
 623            .Select(x => new ClassActivityDto(x.Id, x.Weight, x.Note))
 1824            .ToList();
 25
 4426        foreach (var student in students)
 27        {
 1028            var attendances = classAttendances.Count(x => x.StudentId == student.Id);
 1029            var presences = classAttendances.Count(x => x.StudentId == student.Id && x.Present);
 430            student.Frequency = attendances > 0 ? Math.Round(100M*(1M * presences / (1M * attendances)), 2) : 0;
 31
 1632            var works = classActivities.SelectMany(x => x.Works.Where(w => w.SykiStudentId == student.Id))
 633                .Select(x => new ClassActivityWorkDto(x.ClassActivityId, x.Note))
 434                .ToList();
 35
 1036            var n1 = GetAverage(activities.Where(x => x.Note == ClassNoteType.N1).ToList(), works);
 1037            var n2 = GetAverage(activities.Where(x => x.Note == ClassNoteType.N2).ToList(), works);
 1038            var n3 = GetAverage(activities.Where(x => x.Note == ClassNoteType.N3).ToList(), works);
 39
 440            student.Notes.Add(new() { Type = ClassNoteType.N1, Note = n1 });
 441            student.Notes.Add(new() { Type = ClassNoteType.N2, Note = n2 });
 442            student.Notes.Add(new() { Type = ClassNoteType.N3, Note = n3 });
 443            student.AverageNote = GetAverageNote(n1, n2, n3);
 44        }
 45
 1846        return students;
 1847    }
 48
 49    private static decimal GetAverage(List<ClassActivityDto> activities, List<ClassActivityWorkDto> works)
 50    {
 1251        var average = 0.00M;
 3652        foreach (var activity in activities)
 53        {
 1854            var work = works.First(x => x.ActivityId == activity.Id);
 655            average += activity.Weight * work.Note;
 56        }
 1257        average /= 100.00M;
 1258        return average;
 59    }
 60
 61    private static decimal GetAverageNote(params decimal[] notes)
 62    {
 463        if (notes.Length <= 2) return 0;
 464        var average = notes.OrderDescending().Take(2).Average();
 465        return Math.Round(average, 2);
 66    }
 67}
 68
 69internal record ClassActivityDto(Guid Id, int Weight, ClassNoteType Note);
 70internal record ClassActivityWorkDto(Guid ActivityId, decimal Note);