protected virtual async Task InitializeRepositoryAsync(IMetadataRepository repository, CancellationToken cancellationToken) { var blob = await repository.GetBLOBAsync(cancellationToken); foreach (var entry in blob.Entries) { if (!string.IsNullOrEmpty(entry.AaGuid)) { if (_entries.TryAdd(Guid.Parse(entry.AaGuid), entry)) { //Load if it doesn't already exist await LoadEntryStatementAsync(repository, blob, entry, cancellationToken); } } } }
protected virtual async Task InitializeRepositoryAsync(IMetadataRepository repository, CancellationToken cancellationToken) { var blobCacheKey = GetTocCacheKey(repository); var cachedToc = await _cache.GetStringAsync(blobCacheKey, cancellationToken); MetadataBLOBPayload blob; DateTime?cacheUntil = null; if (cachedToc != null) { blob = JsonSerializer.Deserialize <MetadataBLOBPayload>(cachedToc); cacheUntil = GetCacheUntilTime(blob); } else { _log?.LogInformation($"BLOB for {repository.GetType().Name} not cached so loading from MDS..."); try { blob = await repository.GetBLOBAsync(cancellationToken); } catch (Exception ex) { _log?.LogError(ex, "Error getting BLOB from {0}", repository.GetType().Name); throw; } _log?.LogInformation($"BLOB for {repository.GetType().Name} not cached so loading from MDS... Done."); cacheUntil = GetCacheUntilTime(blob); if (cacheUntil.HasValue) { await _cache.SetStringAsync( blobCacheKey, JsonSerializer.Serialize(blob), new DistributedCacheEntryOptions() { AbsoluteExpiration = cacheUntil }, cancellationToken); } } foreach (var entry in blob.Entries) { if (!string.IsNullOrEmpty(entry.AaGuid)) //Only load FIDO2 entries { try { await LoadTocEntryStatement(repository, blob, entry, cacheUntil); } catch (Exception ex) { _log?.LogError(ex, "Error getting statement from {0} for AAGUID '{1}'.\nTOC entry:\n{2} ", repository.GetType().Name, entry.AaGuid, JsonSerializer.Serialize(entry, new JsonSerializerOptions { WriteIndented = true })); } } } }