using System.Net; using System.Net.Http.Json; using System.Text.Json.Serialization; using EventSubscriber.Application; namespace EventSubscriber.Api; /// /// HTTP client to the ACL service. An Objecten notification carries only the object URL, so the /// subscriber reads the register record back through the ACL — the only code that may talk to /// Objecten (§8.1, ADR-0028/ADR-0030) — rather than reading Objecten itself. /// public sealed class AclHttpClient(HttpClient http) : IAclClient { public async Task GetRegisterRecordAsync(Uri objectUrl, CancellationToken ct = default) { ArgumentNullException.ThrowIfNull(objectUrl); using var response = await http.PostAsJsonAsync( new Uri(http.BaseAddress!, "register-records/read"), new ReadRequest(objectUrl.ToString()), ct); // The object holds no register record (deleted, or never one) — nothing to project (§8.6). if (response.StatusCode == HttpStatusCode.NotFound) return null; response.EnsureSuccessStatusCode(); return await response.Content.ReadFromJsonAsync(ct) ?? throw new InvalidOperationException("The ACL returned an empty register record response."); } private sealed record ReadRequest([property: JsonPropertyName("objectUrl")] string ObjectUrl); }