using System.Collections.Concurrent; namespace StellaOps.Policy.Engine.Attestation; /// /// In-memory implementation of verification policy store per CONTRACT-VERIFICATION-POLICY-006. /// internal sealed class InMemoryVerificationPolicyStore : IVerificationPolicyStore { private readonly ConcurrentDictionary _policies = new(StringComparer.OrdinalIgnoreCase); public Task GetAsync(string policyId, CancellationToken cancellationToken = default) { ArgumentException.ThrowIfNullOrWhiteSpace(policyId); _policies.TryGetValue(policyId, out var policy); return Task.FromResult(policy); } public Task> ListAsync( string? tenantScope = null, CancellationToken cancellationToken = default) { IEnumerable policies = _policies.Values; if (!string.IsNullOrWhiteSpace(tenantScope)) { policies = policies.Where(p => p.TenantScope == "*" || p.TenantScope.Equals(tenantScope, StringComparison.OrdinalIgnoreCase)); } var result = policies .OrderBy(p => p.PolicyId) .ToList() as IReadOnlyList; return Task.FromResult(result); } public Task CreateAsync( VerificationPolicy policy, CancellationToken cancellationToken = default) { ArgumentNullException.ThrowIfNull(policy); if (!_policies.TryAdd(policy.PolicyId, policy)) { throw new InvalidOperationException($"Policy '{policy.PolicyId}' already exists."); } return Task.FromResult(policy); } public Task UpdateAsync( string policyId, Func update, CancellationToken cancellationToken = default) { ArgumentException.ThrowIfNullOrWhiteSpace(policyId); ArgumentNullException.ThrowIfNull(update); if (!_policies.TryGetValue(policyId, out var existing)) { return Task.FromResult(null); } var updated = update(existing); _policies[policyId] = updated; return Task.FromResult(updated); } public Task DeleteAsync(string policyId, CancellationToken cancellationToken = default) { ArgumentException.ThrowIfNullOrWhiteSpace(policyId); return Task.FromResult(_policies.TryRemove(policyId, out _)); } public Task ExistsAsync(string policyId, CancellationToken cancellationToken = default) { ArgumentException.ThrowIfNullOrWhiteSpace(policyId); return Task.FromResult(_policies.ContainsKey(policyId)); } }