@page "/HttpTestClient" @using System.Text.Json @using ArcaneLibs @using ArcaneLibs.Blazor.Components @using ArcaneLibs.Extensions @using Spacebar.AdminApi.TestClient.Classes.OpenAPI @using Spacebar.AdminApi.TestClient.Pages.HttpTestClientParts @using Spacebar.AdminApi.TestClient.Services @inject Config Config

HttpTestClient

@if (OpenApiSchema is not null) {

Got OpenAPI schema with @OpenApiSchema.Paths.Count paths.

Server: var currentIndex = OpenApiSchema.Servers.IndexOf(Server!); @for (var index = 0; index < OpenApiSchema.Servers.Count; index++) { var server = OpenApiSchema.Servers[index]; var serverOptionName = $"{server.Description} ({server.Url})"; }

Path: @foreach (var method in OpenApiSchema.Paths.SelectMany(x => x.Value.GetAvailableMethods()).Distinct()) { } @if (!string.IsNullOrWhiteSpace(_methodKey)) { @foreach (var path in OpenApiSchema.Paths.Where(x => x.Value.HasMethod(_methodKey!)).OrderBy(x => x.Key)) { }
} if (Operation != null) { if (!string.IsNullOrWhiteSpace(Operation.Description)) {

@Operation.Description

} }
@AllKnownPathParameters.Count known path parameters @foreach (var (param, value) in AllKnownPathParameters) { var _key = param; // if (Operation?.Parameters?.Any(x => x.Name == param.Name && x.In == param.In) ?? false) // continue;
}
@AllKnownQueryParameters.Count known query parameters @foreach (var (param, value) in AllKnownQueryParameters) { var _key = param; // if (Operation?.Parameters?.Any(x => x.Name == param.Name && x.In == param.In) ?? false) // continue;
}
@if (Operation != null) { if (Operation.Parameters?.Any() ?? false) { var pathParams = Operation.Parameters.Where(x => x.In == "path").ToList(); if (pathParams.Any()) { Path parameters
foreach (var key in pathParams) { Path parameter
} } var queryParams = Operation.Parameters.Except(pathParams).Where(x => x.In == "query").ToList(); if (queryParams.Any()) { Query parameters
foreach (var key in queryParams) { Query parameter
} } var otherParams = Operation.Parameters.Except(pathParams).Except(queryParams).ToList(); if (otherParams.Any()) { Other parameters
foreach (var key in otherParams) { Other parameter
} } } if(Operation.RequestBody is not null) { Request body
@Operation.RequestBody.Content.ApplicationJson?.Schema.ToJson() } } Execute
@ResultContent
} @code { private string? _pathKey; private string? _methodKey; private OpenApiSchema? OpenApiSchema { get; set; } private OpenApiServer? Server { get; set; } private Dictionary AllKnownPathParameters { get; set; } = []; private Dictionary AllKnownQueryParameters { get; set; } = []; private OpenApiPath? Path => string.IsNullOrWhiteSpace(_pathKey) ? null : OpenApiSchema?.Paths.GetValueOrDefault(_pathKey); private OpenApiPath.OpenApiOperation? Operation => Path is null || string.IsNullOrWhiteSpace(_methodKey) ? null : Path.GetOperation(_methodKey); private string? ResultContent { get; set; } private readonly StreamingHttpClient _httpClient = new(); protected override async Task OnInitializedAsync() { _httpClient.DefaultRequestHeaders.Authorization = new("Bearer", Config.AccessToken); OpenApiSchema = await _httpClient.GetFromJsonAsync($"{Config.ApiUrl}/_spacebar/api/openapi.json"); OpenApiSchema!.Servers.Insert(0, Server = new() { Description = "Current server (config)", Url = Config.ApiUrl + "/api/v9" }); SetCurrentServer(0); AllKnownPathParameters = OpenApiSchema.Paths.Values .SelectMany(x => x.GetAvailableMethods().Select(y => x.GetOperation(y)!.Parameters ?? [])) .SelectMany(x => x) .Where(x => x.In == "path") .DistinctBy(x => x.ToJson()) .OrderBy(x => x.Name) .ToDictionary(x => x, _ => ""); AllKnownQueryParameters = OpenApiSchema.Paths.Values .SelectMany(x => x.GetAvailableMethods().Select(y => x.GetOperation(y)!.Parameters ?? [])) .SelectMany(x => x) .Where(x => x.In == "query") .DistinctBy(x => x.ToJson()) .OrderBy(x => x.Name) .ToDictionary(x => x, _ => ""); } protected override bool ShouldRender() { if (string.IsNullOrWhiteSpace(_methodKey)) _pathKey = null; return base.ShouldRender(); } private void SetCurrentServer(int index) { Server = OpenApiSchema!.Servers[index]; _httpClient.BaseAddress = new Uri(Server.Url); StateHasChanged(); } private async Task Execute() { var url = _pathKey!.TrimStart('/'); if (Operation?.Parameters?.Any(x => x.In == "path") ?? false) { foreach (var param in Operation.Parameters.Where(x => x.In == "path")) { if (!AllKnownPathParameters.TryGetValue(param, out var value) || string.IsNullOrWhiteSpace(value)) throw new Exception($"Path parameter {param.Name} not set"); url = url.Replace($"{{{param.Name}}}", value!); } } var request = new HttpRequestMessage(new HttpMethod(_methodKey!), url); try { var response = await _httpClient.SendAsync(request); ResultContent = response.Content.GetType().Name + "\n" + response.Content switch { { Headers: { ContentType: { MediaType: "application/json" } } } => (await response.Content.ReadFromJsonAsync()).ToJson(true), _ => await response.Content.ReadAsStringAsync() }; } catch (Exception ex) { ResultContent = ex.ToString(); } StateHasChanged(); } }