< Summary

Information
Class: Anichron.API.Services.AdminResetService
Assembly: Anichron.API
File(s): /home/runner/work/anichron/anichron/src/Anichron.API/Services/AdminResetService.cs
Tag: 228_36821334185
Line coverage
100%
Covered lines: 21
Uncovered lines: 0
Coverable lines: 21
Total lines: 41
Line coverage: 100%
Branch coverage
100%
Covered branches: 2
Total branches: 2
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%
ResetUserPasswordAsync()100%22100%

File(s)

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

#LineLine coverage
 1using Anichron.API.Security;
 2using Anichron.Core.Data;
 3using Anichron.Core.Data.Repository;
 4using System.Security.Cryptography;
 5
 6namespace Anichron.API.Services;
 7
 8public sealed record AdminUserPasswordReset(string TemporaryPassword);
 9
 10public interface IAdminResetService
 11{
 12    Task<AdminUserPasswordReset?> ResetUserPasswordAsync(Guid userId, CancellationToken ct);
 13}
 14
 615public sealed class AdminResetService(
 616    IUserRepository users,
 617    IUnitOfWork unitOfWork,
 618    IClock clock,
 619    IPasswordHasher passwordHasher,
 620    ITokenService tokenService) : IAdminResetService
 21{
 22    public async Task<AdminUserPasswordReset?> ResetUserPasswordAsync(Guid userId, CancellationToken ct)
 623    {
 624        var user = await users.FindByIdAsync(userId, ct);
 625        if (user is null)
 126            return null;
 27
 528        var temporaryPassword = Convert.ToBase64String(RandomNumberGenerator.GetBytes(12));
 529        user.PasswordHash = passwordHasher.Hash(temporaryPassword);
 530        user.MustChangePassword = true;
 531        var now = clock.GetCurrentInstant();
 32
 533        await unitOfWork.ExecuteInTransactionAsync(async () =>
 534        {
 535            await tokenService.MarkAllSessionsRevokedAsync(userId, now, ct);
 536            await unitOfWork.SaveChangesAsync(ct);
 537        }, ct);
 38
 539        return new AdminUserPasswordReset(temporaryPassword);
 640    }
 41}