< Summary - Syki

Information
Class: Syki.Back.Features.Student.GetStudentNotes.GetStudentNotesService
Assembly: Back
File(s): /home/runner/work/syki/syki/Back/Features/Student/GetStudentNotes/GetStudentNotesService.cs
Tag: 4_16869239191
Line coverage
100%
Covered lines: 59
Uncovered lines: 0
Coverable lines: 59
Total lines: 88
Line coverage: 100%
Branch coverage
83%
Covered branches: 5
Total branches: 6
Branch coverage: 83.3%
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%22100%
GetAverage(...)100%22100%
GetAverageNote(...)50%22100%

File(s)

/home/runner/work/syki/syki/Back/Features/Student/GetStudentNotes/GetStudentNotesService.cs

#LineLine coverage
 1namespace Syki.Back.Features.Student.GetStudentNotes;
 2
 43public class GetStudentNotesService(SykiDbContext ctx) : IStudentService
 4{
 5    public async Task<List<StudentNoteOut>> Get(Guid userId)
 6    {
 47        var classesStudents = await ctx.ClassesStudents.AsNoTracking()
 48            .Where(x => x.SykiStudentId == userId).ToListAsync();
 9
 2810        var classesIds = classesStudents.ConvertAll(x => x.ClassId);
 411        var classes = await ctx.Classes.AsNoTracking()
 412            .Include(x => x.Discipline)
 413            .Select(x => new { x.Id, x.DisciplineId, Discipline = x.Discipline.Name })
 414            .Where(x => classesIds.Contains(x.Id))
 415            .ToListAsync();
 16
 417        var activities = await ctx.ClassActivities
 418            .AsNoTrackingWithIdentityResolution()
 419            .Where(x => classesIds.Contains(x.ClassId))
 420            .ToListAsync();
 21
 422        var works = await ctx.ClassActivityWorks
 423            .AsNoTrackingWithIdentityResolution()
 424            .Where(x => x.SykiStudentId == userId)
 425            .ToListAsync();
 26
 2827        var disciplinesIds = classes.ConvertAll(x => x.DisciplineId);
 428        var periods = await ctx.CourseCurriculumDisciplines.AsNoTracking()
 429            .Select(x => new { x.DisciplineId, x.Period })
 430            .Where(x => disciplinesIds.Contains(x.DisciplineId))
 431            .ToListAsync();
 32
 433        var notes = new List<StudentNoteOut>();
 5634        foreach (var @class in classes)
 35        {
 16836            var classActivities = activities.Where(x => x.ClassId == @class.Id)
 2437                .Select(x => new ClassActivityDto(x.Id, x.Weight, x.Note))
 2438                .ToList();
 41839            var classWorks = works.Where(x => classActivities.Select(a => a.Id).Contains(x.ClassActivityId))
 2440                .Select(x => new ClassActivityWorkDto(x.ClassActivityId, x.Note))
 2441                .ToList();
 42
 4843            var n1 = GetAverage(classActivities.Where(x => x.Note == ClassNoteType.N1).ToList(), classWorks);
 4844            var n2 = GetAverage(classActivities.Where(x => x.Note == ClassNoteType.N2).ToList(), classWorks);
 4845            var n3 = GetAverage(classActivities.Where(x => x.Note == ClassNoteType.N3).ToList(), classWorks);
 46
 2447            var average = GetAverageNote(n1, n2, n3);
 2448            notes.Add(new StudentNoteOut
 2449            {
 2450                ClassId = @class.Id,
 2451                Discipline = @class.Discipline,
 2452                AverageNote = average,
 2453                Notes =
 2454                [
 2455                    new() { Type = ClassNoteType.N1, Note = n1 },
 2456                    new() { Type = ClassNoteType.N2, Note = n2 },
 2457                    new() { Type = ClassNoteType.N3, Note = n3 },
 2458                ],
 8459                Period = periods.First(p => p.DisciplineId == @class.DisciplineId).Period,
 8460                StudentDisciplineStatus = classesStudents.First(s => s.ClassId == @class.Id).StudentDisciplineStatus,
 2461            });
 62        }
 63
 5264        return notes.OrderBy(x => x.Period).ThenBy(x => x.Discipline).ToList();
 465    }
 66
 67    private static decimal GetAverage(List<ClassActivityDto> activities, List<ClassActivityWorkDto> works)
 68    {
 7269        var average = 0.00M;
 19270        foreach (var activity in activities)
 71        {
 8672            var work = works.First(x => x.ActivityId == activity.Id);
 2473            average += activity.Weight * work.Note;
 74        }
 7275        average /= 100.00M;
 7276        return average;
 77    }
 78
 79    private static decimal GetAverageNote(params decimal[] notes)
 80    {
 2481        if (notes.Length <= 2) return 0;
 2482        var average = notes.OrderDescending().Take(2).Average();
 2483        return Math.Round(average, 2);
 84    }
 85}
 86
 87internal record ClassActivityDto(Guid Id, int Weight, ClassNoteType Note);
 88internal record ClassActivityWorkDto(Guid ActivityId, decimal Note);