aegis-api/Aegis.Application/DataStores/ListDataStores/ListDatastoresUseCase.cs

45 lines
1.4 KiB
C#

using Aegis.Application.Abstractions;
using Aegis.Domain;
namespace Aegis.Application.DataStores.ListDataStores;
public sealed class ListDataStoresUseCase
{
private readonly IDataStoreReadRepository _repo;
private readonly ILabelCrypto _labelCrypto;
private readonly IUnlockedDataStoreCache _unlockedCache;
public ListDataStoresUseCase(
IDataStoreReadRepository repo,
ILabelCrypto labelCrypto,
IUnlockedDataStoreCache unlockedCache)
{
_repo = repo;
_labelCrypto = labelCrypto;
_unlockedCache = unlockedCache;
}
public async Task<IReadOnlyList<DataStoreSummary>> ExecuteAsync(UserId userId, CancellationToken ct)
{
var rows = await _repo.ListForUserAsync(userId, ct);
var result = new List<DataStoreSummary>(rows.Count);
foreach (var row in rows)
{
var aad = $"aegis:datastore-name:{row.DataStoreId.Value}";
var name = _labelCrypto.DecryptDatastoreName(
row.NameEnc,
row.NameNonce,
row.LkKid,
row.LkVersion,
aad
);
var unlocked = _unlockedCache.IsUnlocked(userId, row.DataStoreId);
result.Add(new DataStoreSummary(row.DataStoreId, name, row.Role, Locked: !unlocked));
}
result.Sort((a, b) => string.Compare(a.Name, b.Name, StringComparison.OrdinalIgnoreCase));
return result;
}
}