< Summary

Information
Class: Anichron.API.Services.BootstrapSeeder
Assembly: Anichron.API
File(s): /home/runner/work/anichron/anichron/src/Anichron.API/Services/BootstrapSeeder.cs
Tag: 228_36821334185
Line coverage
100%
Covered lines: 33
Uncovered lines: 0
Coverable lines: 33
Total lines: 65
Line coverage: 100%
Branch coverage
100%
Covered branches: 6
Total branches: 6
Branch coverage: 100%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
SeedAsync()100%66100%

File(s)

/home/runner/work/anichron/anichron/src/Anichron.API/Services/BootstrapSeeder.cs

#LineLine coverage
 1using Anichron.API.Security;
 2using Anichron.API.Settings;
 3using Anichron.Core.Data;
 4using Anichron.Core.Data.Repository;
 5using Anichron.Core.Domain;
 6using Microsoft.EntityFrameworkCore;
 7using Npgsql;
 8
 9namespace Anichron.API.Services;
 10
 11public interface IBootstrapSeeder
 12{
 13    Task SeedAsync(CancellationToken ct);
 14}
 15
 1016public sealed partial class BootstrapSeeder(
 1017    IUserRepository users,
 1018    IUnitOfWork unitOfWork,
 1019    IGuidFactory guidFactory,
 1020    IPasswordHasher passwordHasher,
 1021    IConfiguration configuration,
 1022    ILogger<BootstrapSeeder> logger) : IBootstrapSeeder
 23{
 24    public async Task SeedAsync(CancellationToken ct)
 1025    {
 1026        if (await users.AnyAsync(ct))
 127            return;
 28
 929        var rawUsername = configuration["BOOTSTRAP_ADMIN_USERNAME"];
 930        var username = string.IsNullOrWhiteSpace(rawUsername) ? AppDefaults.Startup.AdminDefaultUsername : rawUsername;
 931        var rawPassword = configuration["BOOTSTRAP_ADMIN_PASSWORD"];
 932        var password = string.IsNullOrWhiteSpace(rawPassword) ? AppDefaults.Startup.AdminDefaultPassword : rawPassword;
 33
 934        Log.CreatingBootstrapAdmin(logger);
 35
 936        var user = new User
 937        {
 938            Id = guidFactory.NewGuid(),
 939            Username = username.Trim().ToLowerInvariant(),
 940            Email = AppDefaults.Startup.AdminDefaultMail,
 941            PasswordHash = passwordHasher.Hash(password),
 942            IsAdmin = true,
 943            MustChangePassword = true,
 944        };
 45
 946        users.Add(user);
 47        try
 948        {
 949            await unitOfWork.SaveChangesAsync(ct);
 750        }
 251        catch (DbUpdateException ex) when (ex.InnerException is PostgresException { SqlState: "23505" })
 152        {
 153            Log.BootstrapAdminAlreadyExists(logger, ex);
 154        }
 955    }
 56
 57    private static partial class Log
 58    {
 59        [LoggerMessage(Level = LogLevel.Warning, Message = "No users exist. Creating bootstrap admin.")]
 60        public static partial void CreatingBootstrapAdmin(ILogger logger);
 61
 62        [LoggerMessage(Level = LogLevel.Information, Message = "Bootstrap admin already exists (concurrent seed). Skippi
 63        public static partial void BootstrapAdminAlreadyExists(ILogger logger, Exception ex);
 64    }
 65}