< Summary - Syki

Information
Class: Syki.Back.Features.Student.GetStudentNotes.ClassActivityDto
Assembly: Back
File(s): /home/runner/work/syki/syki/Back/Features/Student/GetStudentNotes/GetStudentNotesService.cs
Tag: 4_16869239191
Line coverage
100%
Covered lines: 1
Uncovered lines: 0
Coverable lines: 1
Total lines: 88
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_Id()100%11100%

File(s)

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

#LineLine coverage
 1namespace Syki.Back.Features.Student.GetStudentNotes;
 2
 3public class GetStudentNotesService(SykiDbContext ctx) : IStudentService
 4{
 5    public async Task<List<StudentNoteOut>> Get(Guid userId)
 6    {
 7        var classesStudents = await ctx.ClassesStudents.AsNoTracking()
 8            .Where(x => x.SykiStudentId == userId).ToListAsync();
 9
 10        var classesIds = classesStudents.ConvertAll(x => x.ClassId);
 11        var classes = await ctx.Classes.AsNoTracking()
 12            .Include(x => x.Discipline)
 13            .Select(x => new { x.Id, x.DisciplineId, Discipline = x.Discipline.Name })
 14            .Where(x => classesIds.Contains(x.Id))
 15            .ToListAsync();
 16
 17        var activities = await ctx.ClassActivities
 18            .AsNoTrackingWithIdentityResolution()
 19            .Where(x => classesIds.Contains(x.ClassId))
 20            .ToListAsync();
 21
 22        var works = await ctx.ClassActivityWorks
 23            .AsNoTrackingWithIdentityResolution()
 24            .Where(x => x.SykiStudentId == userId)
 25            .ToListAsync();
 26
 27        var disciplinesIds = classes.ConvertAll(x => x.DisciplineId);
 28        var periods = await ctx.CourseCurriculumDisciplines.AsNoTracking()
 29            .Select(x => new { x.DisciplineId, x.Period })
 30            .Where(x => disciplinesIds.Contains(x.DisciplineId))
 31            .ToListAsync();
 32
 33        var notes = new List<StudentNoteOut>();
 34        foreach (var @class in classes)
 35        {
 36            var classActivities = activities.Where(x => x.ClassId == @class.Id)
 37                .Select(x => new ClassActivityDto(x.Id, x.Weight, x.Note))
 38                .ToList();
 39            var classWorks = works.Where(x => classActivities.Select(a => a.Id).Contains(x.ClassActivityId))
 40                .Select(x => new ClassActivityWorkDto(x.ClassActivityId, x.Note))
 41                .ToList();
 42
 43            var n1 = GetAverage(classActivities.Where(x => x.Note == ClassNoteType.N1).ToList(), classWorks);
 44            var n2 = GetAverage(classActivities.Where(x => x.Note == ClassNoteType.N2).ToList(), classWorks);
 45            var n3 = GetAverage(classActivities.Where(x => x.Note == ClassNoteType.N3).ToList(), classWorks);
 46
 47            var average = GetAverageNote(n1, n2, n3);
 48            notes.Add(new StudentNoteOut
 49            {
 50                ClassId = @class.Id,
 51                Discipline = @class.Discipline,
 52                AverageNote = average,
 53                Notes =
 54                [
 55                    new() { Type = ClassNoteType.N1, Note = n1 },
 56                    new() { Type = ClassNoteType.N2, Note = n2 },
 57                    new() { Type = ClassNoteType.N3, Note = n3 },
 58                ],
 59                Period = periods.First(p => p.DisciplineId == @class.DisciplineId).Period,
 60                StudentDisciplineStatus = classesStudents.First(s => s.ClassId == @class.Id).StudentDisciplineStatus,
 61            });
 62        }
 63
 64        return notes.OrderBy(x => x.Period).ThenBy(x => x.Discipline).ToList();
 65    }
 66
 67    private static decimal GetAverage(List<ClassActivityDto> activities, List<ClassActivityWorkDto> works)
 68    {
 69        var average = 0.00M;
 70        foreach (var activity in activities)
 71        {
 72            var work = works.First(x => x.ActivityId == activity.Id);
 73            average += activity.Weight * work.Note;
 74        }
 75        average /= 100.00M;
 76        return average;
 77    }
 78
 79    private static decimal GetAverageNote(params decimal[] notes)
 80    {
 81        if (notes.Length <= 2) return 0;
 82        var average = notes.OrderDescending().Take(2).Average();
 83        return Math.Round(average, 2);
 84    }
 85}
 86
 43287internal record ClassActivityDto(Guid Id, int Weight, ClassNoteType Note);
 88internal record ClassActivityWorkDto(Guid ActivityId, decimal Note);

Methods/Properties

get_Id()