< Summary

Information
Class: Anichron.API.Services.AdminStorageConfigService
Assembly: Anichron.API
File(s): /home/runner/work/anichron/anichron/src/Anichron.API/Services/AdminStorageConfigService.cs
Tag: 228_36821334185
Line coverage
100%
Covered lines: 41
Uncovered lines: 0
Coverable lines: 41
Total lines: 67
Line coverage: 100%
Branch coverage
100%
Covered branches: 12
Total branches: 12
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%
GetByUserIdAsync()100%22100%
AddAsync()100%66100%
DeleteAsync()100%44100%

File(s)

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

#LineLine coverage
 1using Anichron.Core.Data;
 2using Anichron.Core.Data.Repository;
 3using Anichron.Core.Domain;
 4
 5namespace Anichron.API.Services;
 6
 7public interface IAdminStorageConfigService
 8{
 9    Task<AuthResult<List<UserStorageConfig>>> GetByUserIdAsync(Guid userId, CancellationToken ct);
 10    Task<AuthResult<UserStorageConfig>> AddAsync(Guid userId, string rootPath, CancellationToken ct);
 11    Task<AuthResult> DeleteAsync(Guid userId, Guid configId, CancellationToken ct);
 12}
 13
 1014public sealed class AdminStorageConfigService(
 1015    IUserRepository users,
 1016    IUserStorageConfigRepository storageConfigs,
 1017    IGuidFactory guidFactory,
 1018    IUnitOfWork unitOfWork) : IAdminStorageConfigService
 19{
 20    public async Task<AuthResult<List<UserStorageConfig>>> GetByUserIdAsync(Guid userId, CancellationToken ct)
 221    {
 222        var user = await users.FindByIdAsync(userId, ct);
 223        if (user is null)
 124            return AuthResult.Fail<List<UserStorageConfig>>(AuthError.UserNotFound);
 25
 126        var configs = await storageConfigs.GetByUserIdAsync(userId, ct);
 127        return AuthResult.Ok(configs);
 228    }
 29
 30    public async Task<AuthResult<UserStorageConfig>> AddAsync(Guid userId, string rootPath, CancellationToken ct)
 531    {
 532        ArgumentNullException.ThrowIfNull(rootPath);
 533        if (string.IsNullOrWhiteSpace(rootPath))
 234            return AuthResult.Fail<UserStorageConfig>(AuthError.PathInvalid);
 35
 336        var user = await users.FindByIdAsync(userId, ct);
 337        if (user is null)
 138            return AuthResult.Fail<UserStorageConfig>(AuthError.UserNotFound);
 39
 240        var existing = await storageConfigs.FindByRootPathAsync(rootPath, ct);
 241        if (existing is not null)
 142            return AuthResult.Fail<UserStorageConfig>(AuthError.PathAlreadyAssigned);
 43
 144        var config = new UserStorageConfig
 145        {
 146            Id = guidFactory.NewGuid(),
 147            UserId = userId,
 148            RootPath = rootPath,
 149            IsActive = true,
 150        };
 51
 152        storageConfigs.Add(config);
 153        await unitOfWork.SaveChangesAsync(ct);
 154        return AuthResult.Ok(config);
 555    }
 56
 57    public async Task<AuthResult> DeleteAsync(Guid userId, Guid configId, CancellationToken ct)
 358    {
 359        var config = await storageConfigs.FindByIdAsync(configId, ct);
 360        if (config is null || config.UserId != userId)
 261            return AuthResult.Fail(AuthError.StorageConfigNotFound);
 62
 163        storageConfigs.Remove(config);
 164        await unitOfWork.SaveChangesAsync(ct);
 165        return AuthResult.Ok();
 366    }
 67}