45 lines
1.4 KiB
C#
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;
|
|
}
|
|
} |