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> ExecuteAsync(UserId userId, CancellationToken ct) { var rows = await _repo.ListForUserAsync(userId, ct); var result = new List(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; } }