< Summary - Syki

Line coverage
96%
Covered lines: 158
Uncovered lines: 5
Coverable lines: 163
Total lines: 407
Line coverage: 96.9%
Branch coverage
81%
Covered branches: 13
Total branches: 16
Branch coverage: 81.2%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
File 1: ConfigureAudit(...)100%11100%
File 2: get_Campi()100%11100%
File 2: ConfigureCampi(...)100%11100%
File 3: get_HasPendingCommands()100%11100%
File 3: get_CommandLogs()100%11100%
File 3: get_Commands()100%11100%
File 3: ConfigureCommands(...)100%11100%
File 3: AddCommand(...)50%22100%
File 3: AddCommand(...)50%22100%
File 4: get_CourseCurriculums()100%11100%
File 4: get_CourseCurriculumDisciplines()100%11100%
File 4: ConfigureCourseCurriculums(...)100%11100%
File 5: get_CourseOfferings()100%11100%
File 5: ConfigureCourseOfferings(...)100%11100%
File 6: get_Courses()100%11100%
File 6: get_CoursesDisciplines()100%11100%
File 6: ConfigureCourses(...)100%11100%
File 7: .ctor(...)100%11100%
File 7: get_Cache()100%11100%
File 7: get_RequestUser()100%11100%
File 7: get_ActivityId()100%11100%
File 7: get_Operation()100%11100%
File 7: get_DataProtectionKeys()100%11100%
File 7: OnConfiguring(...)100%11100%
File 7: OnModelCreating(...)100%11100%
File 7: ConfigureDatabaseNames(...)91.66%1212100%
File 7: GetOpenConnectionAsync()100%210%
File 7: SaveChangesAsync()100%11100%
File 8: get_Disciplines()100%11100%
File 8: ConfigureDisciplines(...)100%11100%
File 9: get_WebMagicLinks()100%11100%
File 9: get_ResetPasswordTokens()100%11100%
File 9: get_WebSsoConfigurations()100%11100%
File 9: get_WebSsoAllowedDomains()100%11100%
File 9: ConfigureIdentity(...)100%11100%
File 9: GetUserRole()100%11100%
File 9: GetDirectorRole()100%11100%
File 9: <GetDirectorRole()100%11100%
File 9: GetTeacherRole()100%11100%
File 9: <GetTeacherRole()100%11100%
File 9: GetActiveSsoConfigForSchemeAsync()100%210%
File 10: get_Institutions()100%11100%
File 10: ConfigureInstitutions(...)100%11100%
File 11: get_AcademicPeriods()100%11100%
File 11: ConfigurePeriods(...)100%11100%
File 12: get_Students()100%11100%
File 12: get_StudentCourseEnrollments()100%11100%
File 12: ConfigureStudents(...)100%11100%
File 13: get_Teachers()100%11100%
File 13: get_TeachersDisciplines()100%11100%
File 13: ConfigureTeachers(...)100%11100%

File(s)

/home/runner/work/syki/syki/Back/Database/SykiDbContext.Audit.cs

#LineLine coverage
 1using Syki.Back.Audit;
 2
 3namespace Syki.Back.Database;
 4
 5public partial class SykiDbContext
 6{
 7    private static void ConfigureAudit(ModelBuilder modelBuilder)
 8    {
 49        modelBuilder.ApplyConfiguration(new AuditTrailDbConfig());
 410    }
 11}

/home/runner/work/syki/syki/Back/Database/SykiDbContext.Campi.cs

#LineLine coverage
 1using Syki.Back.Domain.Campi;
 2using Syki.Back.Database.Campi;
 3
 4namespace Syki.Back.Database;
 5
 6public partial class SykiDbContext
 7{
 21348    public DbSet<Campus> Campi { get; set; }
 9
 10    private static void ConfigureCampi(ModelBuilder modelBuilder)
 11    {
 412        modelBuilder.ApplyConfiguration(new CampusDbConfig());
 413    }
 14}

/home/runner/work/syki/syki/Back/Database/SykiDbContext.Commands.cs

#LineLine coverage
 1using System.Diagnostics;
 2using Syki.Back.Domain.Enums;
 3using Syki.Back.Database.Commands;
 4using Syki.Back.Domain.Institutions;
 5using Syki.Back.Commands.Domain.Commands;
 6
 7namespace Syki.Back.Database;
 8
 9public partial class SykiDbContext
 10{
 165411    public bool HasPendingCommands { get; set; }
 273212    public List<string> CommandLogs { get; set; } = [];
 13
 277614    public DbSet<Command> Commands { get; set; }
 15
 16    private static void ConfigureCommands(ModelBuilder modelBuilder)
 17    {
 418        modelBuilder.ApplyConfiguration(new CommandDbConfig());
 419        modelBuilder.ApplyConfiguration(new CommandBatchDbConfig());
 420    }
 21
 22    public Command AddCommand(
 23        Institution institution,
 24        ICommand command,
 25        int? parentId = null,
 26        int? originalId = null,
 27        int? batchId = null,
 28        int? delaySeconds = null,
 29        int maxRetries = 0,
 30        int baseDelaySeconds = 5,
 31        BackoffStrategy backoffStrategy = BackoffStrategy.None)
 32    {
 26833        var activityId = Activity.Current?.Id;
 34
 26835        HasPendingCommands = true;
 36
 26837        return Add(
 26838            new Command(
 26839                institution,
 26840                command,
 26841                parentId: parentId,
 26842                originalId: originalId,
 26843                batchId: batchId,
 26844                delaySeconds: delaySeconds,
 26845                activityId: activityId,
 26846                maxRetries: maxRetries,
 26847                backoffStrategy: backoffStrategy,
 26848                baseDelaySeconds: baseDelaySeconds
 26849            )
 26850        ).Entity;
 51    }
 52
 53    public Command AddCommand(
 54        int institutionId,
 55        ICommand command,
 56        int? parentId = null,
 57        int? originalId = null,
 58        int? batchId = null,
 59        int? delaySeconds = null,
 60        int maxRetries = 0,
 61        int baseDelaySeconds = 5,
 62        BackoffStrategy backoffStrategy = BackoffStrategy.None)
 63    {
 3664        var activityId = Activity.Current?.Id;
 65
 3666        HasPendingCommands = true;
 67
 3668        return Add(
 3669            new Command(
 3670                institutionId,
 3671                command,
 3672                parentId: parentId,
 3673                originalId: originalId,
 3674                batchId: batchId,
 3675                delaySeconds: delaySeconds,
 3676                activityId: activityId,
 3677                maxRetries: maxRetries,
 3678                backoffStrategy: backoffStrategy,
 3679                baseDelaySeconds: baseDelaySeconds
 3680            )
 3681        ).Entity;
 82    }
 83}

/home/runner/work/syki/syki/Back/Database/SykiDbContext.CourseCurriculums.cs

#LineLine coverage
 1using Syki.Back.Domain.CourseCurriculums;
 2using Syki.Back.Database.CourseCurriculums;
 3
 4namespace Syki.Back.Database;
 5
 6public partial class SykiDbContext
 7{
 21308    public DbSet<CourseCurriculum> CourseCurriculums { get; set; }
 21289    public DbSet<CourseCurriculumDiscipline> CourseCurriculumDisciplines { get; set; }
 10
 11    private static void ConfigureCourseCurriculums(ModelBuilder modelBuilder)
 12    {
 413        modelBuilder.ApplyConfiguration(new CourseCurriculumDbConfig());
 414        modelBuilder.ApplyConfiguration(new CourseCurriculumDisciplineDbConfig());
 415    }
 16}

/home/runner/work/syki/syki/Back/Database/SykiDbContext.CourseOfferings.cs

#LineLine coverage
 1using Syki.Back.Domain.CourseOfferings;
 2using Syki.Back.Database.CourseOfferings;
 3
 4namespace Syki.Back.Database;
 5
 6public partial class SykiDbContext
 7{
 21288    public DbSet<CourseOffering> CourseOfferings { get; set; }
 9
 10    private static void ConfigureCourseOfferings(ModelBuilder modelBuilder)
 11    {
 412        modelBuilder.ApplyConfiguration(new CourseOfferingDbConfig());
 413    }
 14}

/home/runner/work/syki/syki/Back/Database/SykiDbContext.Courses.cs

#LineLine coverage
 1using Syki.Back.Domain.Courses;
 2using Syki.Back.Database.Courses;
 3
 4namespace Syki.Back.Database;
 5
 6public partial class SykiDbContext
 7{
 21748    public DbSet<Course> Courses { get; set; }
 21309    public DbSet<CourseDiscipline> CoursesDisciplines { get; set; }
 10
 11    private static void ConfigureCourses(ModelBuilder modelBuilder)
 12    {
 413        modelBuilder.ApplyConfiguration(new CourseDbConfig());
 414        modelBuilder.ApplyConfiguration(new CourseDisciplineDbConfig());
 415    }
 16}

/home/runner/work/syki/syki/Back/Database/SykiDbContext.cs

#LineLine coverage
 1using Npgsql;
 2using System.Data.Common;
 3using Syki.Back.Auth.Users;
 4using Audit.EntityFramework;
 5using Syki.Back.Domain.Identity;
 6using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
 7using Microsoft.AspNetCore.DataProtection.EntityFrameworkCore;
 8
 9namespace Syki.Back.Database;
 10
 11public partial class SykiDbContext(DbContextOptions<SykiDbContext> options, NpgsqlDataSource npgsqlDataSource, HybridCac
 212412    : IdentityDbContext<SykiUser, SykiRole, int, SykiUserClaim, SykiUserRole, SykiUserLogin, SykiRoleClaim, SykiUserToke
 13{
 241614    public HybridCache Cache { get; set; } = cache;
 15
 831616    public RequestUser RequestUser { get; set; } = new();
 17
 357018    public string ActivityId { get; set; }
 357019    public string Operation { get; set; }
 20
 213021    public DbSet<DataProtectionKey> DataProtectionKeys { get; set; }
 22
 23    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
 24    {
 179825        optionsBuilder.UseSnakeCaseNamingConvention();
 359626        optionsBuilder.UseNpgsql(npgsqlDataSource, x => x.MigrationsHistoryTable("migrations", DbSchemas.Syki));
 27
 179828        optionsBuilder.AddInterceptors(new AuditSaveChangesInterceptor());
 179829    }
 30
 31    protected override void OnModelCreating(ModelBuilder modelBuilder)
 32    {
 433        base.OnModelCreating(modelBuilder);
 34
 435        ConfigureAudit(modelBuilder);
 436        ConfigureCampi(modelBuilder);
 437        ConfigureCourses(modelBuilder);
 438        ConfigureCourseCurriculums(modelBuilder);
 439        ConfigureCourseOfferings(modelBuilder);
 440        ConfigurePeriods(modelBuilder);
 441        ConfigureTeachers(modelBuilder);
 442        ConfigureStudents(modelBuilder);
 443        ConfigureCommands(modelBuilder);
 444        ConfigureIdentity(modelBuilder);
 445        ConfigureDisciplines(modelBuilder);
 446        ConfigureInstitutions(modelBuilder);
 47
 448        ConfigureDatabaseNames(modelBuilder);
 449    }
 50
 51    private static void ConfigureDatabaseNames(ModelBuilder modelBuilder)
 52    {
 26453        foreach (var entity in modelBuilder.Model.GetEntityTypes())
 54        {
 12855            if (entity.GetTableName().IsEmpty()) continue;
 56
 12857            entity.SetTableName(entity.GetTableName().ToSnakeCase().Replace("asp_net_", ""));
 58
 60059            foreach (var fk in entity.GetForeignKeys())
 60            {
 17261                if (fk.GetConstraintName().HasValue())
 62                {
 17263                    fk.SetConstraintName(fk.GetConstraintName()!.Replace("~", "").Replace("1", ""));
 64                }
 65            }
 66
 58467            foreach (var index in entity.GetIndexes())
 68            {
 16469                index.SetDatabaseName(index.GetDatabaseName()?.ToSnakeCase());
 70            }
 71        }
 472    }
 73
 74    public async Task<DbConnection> GetOpenConnectionAsync(CancellationToken ct = default)
 75    {
 076        await Database.OpenConnectionAsync(ct);
 077        return Database.GetDbConnection();
 078    }
 79
 80    public async Task<int> SaveChangesAsync<TEntity>(TEntity entity)
 81    {
 12482        Add(entity);
 12483        return await SaveChangesAsync();
 12484    }
 85}

/home/runner/work/syki/syki/Back/Database/SykiDbContext.Disciplines.cs

#LineLine coverage
 1using Syki.Back.Domain.Disciplines;
 2using Syki.Back.Database.Disciplines;
 3
 4namespace Syki.Back.Database;
 5
 6public partial class SykiDbContext
 7{
 21488    public DbSet<Discipline> Disciplines { get; set; }
 9
 10    private static void ConfigureDisciplines(ModelBuilder modelBuilder)
 11    {
 412        modelBuilder.ApplyConfiguration(new DisciplineDbConfig());
 413    }
 14}

/home/runner/work/syki/syki/Back/Database/SykiDbContext.Identity.cs

#LineLine coverage
 1using Dapper;
 2using Syki.Back.Cache;
 3using Syki.Back.Auth.Roles;
 4using Syki.Back.Domain.Identity;
 5using Syki.Back.Database.Identity;
 6
 7namespace Syki.Back.Database;
 8
 9public partial class SykiDbContext
 10{
 260211    public DbSet<MagicLink> WebMagicLinks { get; set; }
 219612    public DbSet<ResetPasswordToken> ResetPasswordTokens { get; set; }
 13
 212414    public DbSet<SsoConfiguration> WebSsoConfigurations { get; set; }
 212415    public DbSet<SsoAllowedDomain> WebSsoAllowedDomains { get; set; }
 16
 17    private static void ConfigureIdentity(ModelBuilder modelBuilder)
 18    {
 419        modelBuilder.ApplyConfiguration(new MagicLinkDbConfig());
 420        modelBuilder.ApplyConfiguration(new ResetPasswordTokenDbConfig());
 21
 422        modelBuilder.ApplyConfiguration(new SykiRoleDbConfig());
 423        modelBuilder.ApplyConfiguration(new SykiUserDbConfig());
 424        modelBuilder.ApplyConfiguration(new SykiUserRoleDbConfig());
 425        modelBuilder.ApplyConfiguration(new SykiRoleClaimDbConfig());
 426        modelBuilder.ApplyConfiguration(new SykiUserClaimDbConfig());
 427        modelBuilder.ApplyConfiguration(new SykiUserTokenDbConfig());
 428        modelBuilder.ApplyConfiguration(new SykiUserLoginDbConfig());
 29
 430        modelBuilder.ApplyConfiguration(new InstitutionRoleDbConfig());
 31
 432        modelBuilder.ApplyConfiguration(new SsoConfigurationDbConfig());
 433        modelBuilder.ApplyConfiguration(new SsoAllowedDomainDbConfig());
 434    }
 35
 36    public async Task<SykiRole> GetUserRole(int userId, int institutionId)
 37    {
 25238        var userRole = await UserRoles.Where(x => x.UserId == userId && x.InstitutionId == institutionId).FirstAsync();
 39
 25240        return await Roles.Where(x => x.Id == userRole.RoleId).FirstAsync();
 25241    }
 42
 43    public async Task<SykiRole> GetDirectorRole()
 44    {
 26845        return await Cache.GetOrCreateAsync(
 26846            key: $"{CacheKeys.GetDirectorRole}",
 26847            state: this,
 26848            options: new() { Expiration = TimeSpan.FromDays(100) },
 26849            factory: async (state, ct) =>
 26850            {
 251                return await state.Roles.AsNoTracking()
 252                    .Where(x => x.OwnerId == null && x.NormalizedName == SykiDefaultRoles.Director.NormalizedName)
 253                    .FirstAsync(ct);
 254            }
 26855        );
 26856    }
 57
 58    public async Task<SykiRole> GetTeacherRole()
 59    {
 2460        return await Cache.GetOrCreateAsync(
 2461            key: $"{CacheKeys.GetTeacherRole}",
 2462            state: this,
 2463            options: new() { Expiration = TimeSpan.FromDays(100) },
 2464            factory: async (state, ct) =>
 2465            {
 266                return await state.Roles.AsNoTracking()
 267                    .Where(x => x.OwnerId == null && x.NormalizedName == SykiDefaultRoles.Teacher.NormalizedName)
 268                    .FirstAsync(ct);
 269            }
 2470        );
 2471    }
 72
 73    public async Task<SsoConfiguration?> GetActiveSsoConfigForSchemeAsync(Guid publicId)
 74    {
 75        const string sql = @"
 76            SELECT
 77                id,
 78                external_id,
 79                authority,
 80                client_id,
 81                client_secret,
 82                updated_at
 83            FROM
 84                syki.sso_configurations
 85            WHERE
 86                public_id = @PublicId AND is_active = true
 87            LIMIT 1
 88        ";
 89
 090        return await Database.GetDbConnection().QueryFirstOrDefaultAsync<SsoConfiguration?>(sql, new { PublicId = public
 091    }
 92}

/home/runner/work/syki/syki/Back/Database/SykiDbContext.Institutions.cs

#LineLine coverage
 1using Syki.Back.Domain.Institutions;
 2using Syki.Back.Database.Institutions;
 3
 4namespace Syki.Back.Database;
 5
 6public partial class SykiDbContext
 7{
 21488    public DbSet<Institution> Institutions { get; set; }
 9
 10    private static void ConfigureInstitutions(ModelBuilder modelBuilder)
 11    {
 412        modelBuilder.ApplyConfiguration(new InstitutionDbConfig());
 413    }
 14}

/home/runner/work/syki/syki/Back/Database/SykiDbContext.Periods.cs

#LineLine coverage
 1using Syki.Back.Domain.Periods;
 2using Syki.Back.Database.Periods;
 3
 4namespace Syki.Back.Database;
 5
 6public partial class SykiDbContext
 7{
 21408    public DbSet<AcademicPeriod> AcademicPeriods { get; set; }
 9
 10    private static void ConfigurePeriods(ModelBuilder modelBuilder)
 11    {
 412        modelBuilder.ApplyConfiguration(new AcademicPeriodDbConfig());
 413        modelBuilder.ApplyConfiguration(new EnrollmentPeriodDbConfig());
 414    }
 15}

/home/runner/work/syki/syki/Back/Database/SykiDbContext.Students.cs

#LineLine coverage
 1using Syki.Back.Domain.Students;
 2using Syki.Back.Database.Students;
 3
 4namespace Syki.Back.Database;
 5
 6public partial class SykiDbContext
 7{
 21268    public DbSet<SykiStudent> Students { get; set; }
 21269    public DbSet<StudentCourseEnrollment> StudentCourseEnrollments { get; set; }
 10
 11    private static void ConfigureStudents(ModelBuilder modelBuilder)
 12    {
 413        modelBuilder.ApplyConfiguration(new SykiStudentDbConfig());
 414        modelBuilder.ApplyConfiguration(new StudentCourseEnrollmentDbConfig());
 415    }
 16}

/home/runner/work/syki/syki/Back/Database/SykiDbContext.Teachers.cs

#LineLine coverage
 1using Syki.Back.Domain.Teachers;
 2using Syki.Back.Database.Teachers;
 3
 4namespace Syki.Back.Database;
 5
 6public partial class SykiDbContext
 7{
 21268    public DbSet<SykiTeacher> Teachers { get; set; }
 21269    public DbSet<TeacherDiscipline> TeachersDisciplines { get; set; }
 10
 11    private static void ConfigureTeachers(ModelBuilder modelBuilder)
 12    {
 413        modelBuilder.ApplyConfiguration(new SykiTeacherDbConfig());
 414        modelBuilder.ApplyConfiguration(new TeacherCampusDbConfig());
 415        modelBuilder.ApplyConfiguration(new TeacherDisciplineDbConfig());
 416    }
 17}

Methods/Properties

ConfigureAudit(Microsoft.EntityFrameworkCore.ModelBuilder)
get_Campi()
ConfigureCampi(Microsoft.EntityFrameworkCore.ModelBuilder)
get_HasPendingCommands()
get_CommandLogs()
get_Commands()
ConfigureCommands(Microsoft.EntityFrameworkCore.ModelBuilder)
AddCommand(Syki.Back.Domain.Institutions.Institution,Syki.Back.Commands.ICommand,System.Nullable`1<System.Int32>,System.Nullable`1<System.Int32>,System.Nullable`1<System.Int32>,System.Nullable`1<System.Int32>,System.Int32,System.Int32,Syki.Back.Domain.Enums.BackoffStrategy)
AddCommand(System.Int32,Syki.Back.Commands.ICommand,System.Nullable`1<System.Int32>,System.Nullable`1<System.Int32>,System.Nullable`1<System.Int32>,System.Nullable`1<System.Int32>,System.Int32,System.Int32,Syki.Back.Domain.Enums.BackoffStrategy)
get_CourseCurriculums()
get_CourseCurriculumDisciplines()
ConfigureCourseCurriculums(Microsoft.EntityFrameworkCore.ModelBuilder)
get_CourseOfferings()
ConfigureCourseOfferings(Microsoft.EntityFrameworkCore.ModelBuilder)
get_Courses()
get_CoursesDisciplines()
ConfigureCourses(Microsoft.EntityFrameworkCore.ModelBuilder)
.ctor(Microsoft.EntityFrameworkCore.DbContextOptions`1<Syki.Back.Database.SykiDbContext>,Npgsql.NpgsqlDataSource,Microsoft.Extensions.Caching.Hybrid.HybridCache)
get_Cache()
get_RequestUser()
get_ActivityId()
get_Operation()
get_DataProtectionKeys()
OnConfiguring(Microsoft.EntityFrameworkCore.DbContextOptionsBuilder)
OnModelCreating(Microsoft.EntityFrameworkCore.ModelBuilder)
ConfigureDatabaseNames(Microsoft.EntityFrameworkCore.ModelBuilder)
GetOpenConnectionAsync()
SaveChangesAsync()
get_Disciplines()
ConfigureDisciplines(Microsoft.EntityFrameworkCore.ModelBuilder)
get_WebMagicLinks()
get_ResetPasswordTokens()
get_WebSsoConfigurations()
get_WebSsoAllowedDomains()
ConfigureIdentity(Microsoft.EntityFrameworkCore.ModelBuilder)
GetUserRole()
GetDirectorRole()
<GetDirectorRole()
GetTeacherRole()
<GetTeacherRole()
GetActiveSsoConfigForSchemeAsync()
get_Institutions()
ConfigureInstitutions(Microsoft.EntityFrameworkCore.ModelBuilder)
get_AcademicPeriods()
ConfigurePeriods(Microsoft.EntityFrameworkCore.ModelBuilder)
get_Students()
get_StudentCourseEnrollments()
ConfigureStudents(Microsoft.EntityFrameworkCore.ModelBuilder)
get_Teachers()
get_TeachersDisciplines()
ConfigureTeachers(Microsoft.EntityFrameworkCore.ModelBuilder)