Some checks failed
AOC Guard CI / aoc-guard (push) Has been cancelled
AOC Guard CI / aoc-verify (push) Has been cancelled
Concelier Attestation Tests / attestation-tests (push) Has been cancelled
Docs CI / lint-and-preview (push) Has been cancelled
Policy Lint & Smoke / policy-lint (push) Has been cancelled
113 lines
4.1 KiB
C#
113 lines
4.1 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Net.Http;
|
|
using System.Net.Http.Json;
|
|
using System.Text.Json;
|
|
using System.Threading;
|
|
using System.Threading.Tasks;
|
|
using StellaOps.Cli.Services.Models;
|
|
|
|
namespace StellaOps.Cli.Services;
|
|
|
|
/// <summary>
|
|
/// HTTP client for Authority console endpoints (CLI-TEN-47-001, CLI-TEN-49-001).
|
|
/// </summary>
|
|
internal sealed class AuthorityConsoleClient : IAuthorityConsoleClient
|
|
{
|
|
private readonly HttpClient _httpClient;
|
|
private static readonly JsonSerializerOptions JsonOptions = new(JsonSerializerDefaults.Web);
|
|
|
|
public AuthorityConsoleClient(HttpClient httpClient)
|
|
{
|
|
_httpClient = httpClient ?? throw new ArgumentNullException(nameof(httpClient));
|
|
}
|
|
|
|
public async Task<IReadOnlyList<TenantInfo>> ListTenantsAsync(string tenant, CancellationToken cancellationToken)
|
|
{
|
|
using var request = new HttpRequestMessage(HttpMethod.Get, "console/tenants");
|
|
|
|
if (!string.IsNullOrWhiteSpace(tenant))
|
|
{
|
|
request.Headers.Add("X-StellaOps-Tenant", tenant.Trim().ToLowerInvariant());
|
|
}
|
|
|
|
using var response = await _httpClient.SendAsync(request, cancellationToken).ConfigureAwait(false);
|
|
response.EnsureSuccessStatusCode();
|
|
|
|
var result = await response.Content
|
|
.ReadFromJsonAsync<TenantListResponse>(cancellationToken: cancellationToken)
|
|
.ConfigureAwait(false);
|
|
|
|
return result?.Tenants ?? Array.Empty<TenantInfo>();
|
|
}
|
|
|
|
public async Task<TokenMintResponse> MintTokenAsync(TokenMintRequest request, CancellationToken cancellationToken)
|
|
{
|
|
ArgumentNullException.ThrowIfNull(request);
|
|
|
|
using var httpRequest = new HttpRequestMessage(HttpMethod.Post, "console/token/mint")
|
|
{
|
|
Content = JsonContent.Create(request, options: JsonOptions)
|
|
};
|
|
|
|
if (!string.IsNullOrWhiteSpace(request.Tenant))
|
|
{
|
|
httpRequest.Headers.Add("X-StellaOps-Tenant", request.Tenant.Trim().ToLowerInvariant());
|
|
}
|
|
|
|
using var response = await _httpClient.SendAsync(httpRequest, cancellationToken).ConfigureAwait(false);
|
|
response.EnsureSuccessStatusCode();
|
|
|
|
var result = await response.Content
|
|
.ReadFromJsonAsync<TokenMintResponse>(JsonOptions, cancellationToken)
|
|
.ConfigureAwait(false);
|
|
|
|
return result ?? throw new InvalidOperationException("Token mint response was empty.");
|
|
}
|
|
|
|
public async Task<TokenDelegateResponse> DelegateTokenAsync(TokenDelegateRequest request, CancellationToken cancellationToken)
|
|
{
|
|
ArgumentNullException.ThrowIfNull(request);
|
|
|
|
using var httpRequest = new HttpRequestMessage(HttpMethod.Post, "console/token/delegate")
|
|
{
|
|
Content = JsonContent.Create(request, options: JsonOptions)
|
|
};
|
|
|
|
if (!string.IsNullOrWhiteSpace(request.Tenant))
|
|
{
|
|
httpRequest.Headers.Add("X-StellaOps-Tenant", request.Tenant.Trim().ToLowerInvariant());
|
|
}
|
|
|
|
using var response = await _httpClient.SendAsync(httpRequest, cancellationToken).ConfigureAwait(false);
|
|
response.EnsureSuccessStatusCode();
|
|
|
|
var result = await response.Content
|
|
.ReadFromJsonAsync<TokenDelegateResponse>(JsonOptions, cancellationToken)
|
|
.ConfigureAwait(false);
|
|
|
|
return result ?? throw new InvalidOperationException("Token delegation response was empty.");
|
|
}
|
|
|
|
public async Task<TokenIntrospectionResponse?> IntrospectTokenAsync(string? tenant, CancellationToken cancellationToken)
|
|
{
|
|
using var httpRequest = new HttpRequestMessage(HttpMethod.Post, "console/token/introspect");
|
|
|
|
if (!string.IsNullOrWhiteSpace(tenant))
|
|
{
|
|
httpRequest.Headers.Add("X-StellaOps-Tenant", tenant.Trim().ToLowerInvariant());
|
|
}
|
|
|
|
using var response = await _httpClient.SendAsync(httpRequest, cancellationToken).ConfigureAwait(false);
|
|
|
|
if (!response.IsSuccessStatusCode)
|
|
{
|
|
return null;
|
|
}
|
|
|
|
return await response.Content
|
|
.ReadFromJsonAsync<TokenIntrospectionResponse>(JsonOptions, cancellationToken)
|
|
.ConfigureAwait(false);
|
|
}
|
|
}
|