using System; using System.Collections.Generic; using System.Net.Http; using System.Text; using System.Text.Json; using System.Threading.Tasks; using DysonNetwork.Common.Interfaces; using DysonNetwork.Common.Models; using Microsoft.Extensions.Logging; using NodaTime; using NodaTime.Serialization.SystemTextJson; namespace DysonNetwork.Common.Clients { public class FileReferenceServiceClient : IFileReferenceServiceClient, IDisposable { private readonly HttpClient _httpClient; private readonly ILogger _logger; private readonly JsonSerializerOptions _jsonOptions; public FileReferenceServiceClient(HttpClient httpClient, ILogger logger) { _httpClient = httpClient ?? throw new ArgumentNullException(nameof(httpClient)); _logger = logger ?? throw new ArgumentNullException(nameof(logger)); _jsonOptions = new JsonSerializerOptions() .ConfigureForNodaTime(DateTimeZoneProviders.Tzdb); _jsonOptions.PropertyNameCaseInsensitive = true; } public async Task CreateReferenceAsync( string fileId, string usage, string resourceId, Instant? expiredAt = null, Duration? duration = null) { var request = new { FileId = fileId, Usage = usage, ResourceId = resourceId, ExpiredAt = expiredAt, Duration = duration }; var content = new StringContent( JsonSerializer.Serialize(request, _jsonOptions), Encoding.UTF8, "application/json"); var response = await _httpClient.PostAsync("api/filereferences", content); response.EnsureSuccessStatusCode(); await using var stream = await response.Content.ReadAsStreamAsync(); var reference = await JsonSerializer.DeserializeAsync(stream, _jsonOptions); return reference; } public async Task GetReferenceAsync(string referenceId) { var response = await _httpClient.GetAsync($"api/filereferences/{referenceId}"); response.EnsureSuccessStatusCode(); await using var stream = await response.Content.ReadAsStreamAsync(); var reference = await JsonSerializer.DeserializeAsync(stream, _jsonOptions); return reference; } public async Task> GetReferencesForResourceAsync(string resourceId, string? usage = null) { var url = $"api/filereferences/resource/{resourceId}"; if (!string.IsNullOrEmpty(usage)) { url += $"?usage={Uri.EscapeDataString(usage)}"; } var response = await _httpClient.GetAsync(url); response.EnsureSuccessStatusCode(); await using var stream = await response.Content.ReadAsStreamAsync(); var references = await JsonSerializer.DeserializeAsync>(stream, _jsonOptions); return references ?? Array.Empty(); } public async Task DeleteReferenceAsync(string referenceId) { var response = await _httpClient.DeleteAsync($"api/filereferences/{referenceId}"); response.EnsureSuccessStatusCode(); } public void Dispose() { _httpClient?.Dispose(); GC.SuppressFinalize(this); } } }