99 lines
3.7 KiB
C#
99 lines
3.7 KiB
C#
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<FileReferenceServiceClient> _logger;
|
|
private readonly JsonSerializerOptions _jsonOptions;
|
|
|
|
public FileReferenceServiceClient(HttpClient httpClient, ILogger<FileReferenceServiceClient> 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<CloudFileReference> 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<CloudFileReference>(stream, _jsonOptions);
|
|
return reference;
|
|
}
|
|
|
|
public async Task<CloudFileReference> 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<CloudFileReference>(stream, _jsonOptions);
|
|
return reference;
|
|
}
|
|
|
|
public async Task<IEnumerable<CloudFileReference>> 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<IEnumerable<CloudFileReference>>(stream, _jsonOptions);
|
|
return references ?? Array.Empty<CloudFileReference>();
|
|
}
|
|
|
|
public async Task DeleteReferenceAsync(string referenceId)
|
|
{
|
|
var response = await _httpClient.DeleteAsync($"api/filereferences/{referenceId}");
|
|
response.EnsureSuccessStatusCode();
|
|
}
|
|
|
|
public void Dispose()
|
|
{
|
|
_httpClient?.Dispose();
|
|
GC.SuppressFinalize(this);
|
|
}
|
|
}
|
|
}
|