summary refs log tree commit diff
diff options
context:
space:
mode:
authorRory& <root@rory.gay>2026-06-05 15:47:25 +0200
committerRory& <root@rory.gay>2026-06-05 15:47:25 +0200
commit2597118ba47210f8591959ae69e76121b286c5c9 (patch)
tree53c61193da0bcdb56db5b9b17c9073069d82fcef
parentClean up import in Monitoring, close webrtc connection on IPC failure, add LO... (diff)
downloadserver-ts-2597118ba47210f8591959ae69e76121b286c5c9.tar.xz
More C# models, split basic client SDK from client
-rw-r--r--extra/admin-api/Models/Spacebar.Models.Api/CreateChannelRequest.cs19
-rw-r--r--extra/admin-api/Models/Spacebar.Models.Api/CreateGuildRequest.cs54
-rw-r--r--extra/admin-api/Models/Spacebar.Models.Api/RegisterRequest.cs46
-rw-r--r--extra/admin-api/Models/Spacebar.Models.Api/SpacebarApiError.cs32
-rw-r--r--extra/admin-api/SpacebarAdminAPI.slnx1
-rw-r--r--extra/admin-api/Utilities/Spacebar.Client/Components/ChannelMessageList.razor2
-rw-r--r--extra/admin-api/Utilities/Spacebar.Client/Components/ClientManager.razor2
-rw-r--r--extra/admin-api/Utilities/Spacebar.Client/Pages/Auth/Login.razor3
-rw-r--r--extra/admin-api/Utilities/Spacebar.Client/Pages/Channels/@me.razor2
-rw-r--r--extra/admin-api/Utilities/Spacebar.Client/Pages/Home.razor2
-rw-r--r--extra/admin-api/Utilities/Spacebar.Client/Program.cs2
-rw-r--r--extra/admin-api/Utilities/Spacebar.Client/Spacebar.Client.csproj9
-rw-r--r--extra/admin-api/Utilities/Spacebar.Sdk/Core/MarkdownEnumerator.cs (renamed from extra/admin-api/Utilities/Spacebar.Client/Core/MarkdownEnumerator.cs)2
-rw-r--r--extra/admin-api/Utilities/Spacebar.Sdk/Core/SpacebarClient.cs (renamed from extra/admin-api/Utilities/Spacebar.Client/Core/SpacebarClient.cs)51
-rw-r--r--extra/admin-api/Utilities/Spacebar.Sdk/Core/SpacebarClientProviderService.cs (renamed from extra/admin-api/Utilities/Spacebar.Client/Core/SpacebarClientProviderService.cs)4
-rw-r--r--extra/admin-api/Utilities/Spacebar.Sdk/Core/SpacebarClientWellKnownResolver.cs (renamed from extra/admin-api/Utilities/Spacebar.Client/Core/SpacebarClientWellKnownResolver.cs)18
-rw-r--r--extra/admin-api/Utilities/Spacebar.Sdk/Spacebar.Sdk.csproj19
17 files changed, 241 insertions, 27 deletions
diff --git a/extra/admin-api/Models/Spacebar.Models.Api/CreateChannelRequest.cs b/extra/admin-api/Models/Spacebar.Models.Api/CreateChannelRequest.cs
new file mode 100644

index 00000000..abd280c1 --- /dev/null +++ b/extra/admin-api/Models/Spacebar.Models.Api/CreateChannelRequest.cs
@@ -0,0 +1,19 @@ +using System.Text.Json.Serialization; + +namespace Spacebar.Models.Api; + +public class CreateChannelRequest { + [JsonPropertyName("name")] + public required string Name { get; set; } + + [JsonPropertyName("position")] + public int? Position { get; set; } + + [JsonPropertyName("type")] + public int? Type { get; set; } // TODO enum + + // + [JsonPropertyName("parent_id"), JsonNumberHandling(JsonNumberHandling.AllowReadingFromString | JsonNumberHandling.WriteAsString)] + public long? ParentId { get; set; } + // TODO: rest of schema +} \ No newline at end of file diff --git a/extra/admin-api/Models/Spacebar.Models.Api/CreateGuildRequest.cs b/extra/admin-api/Models/Spacebar.Models.Api/CreateGuildRequest.cs new file mode 100644
index 00000000..1bb8079a --- /dev/null +++ b/extra/admin-api/Models/Spacebar.Models.Api/CreateGuildRequest.cs
@@ -0,0 +1,54 @@ +using System.Text.Json.Nodes; +using System.Text.Json.Serialization; + +namespace Spacebar.Models.Api; + +public class CreateGuildRequest { + [JsonPropertyName("name")] + public string? Name { get; set; } + + [JsonPropertyName("description")] + public string? Description { get; set; } + + [JsonPropertyName("region")] + public string? Region { get; set; } // deprecated? + + [JsonPropertyName("icon")] + public string? IconData { get; set; } + + [JsonPropertyName("verification_level")] + public int? VerificationLevel { get; set; } // TODO enum + + [JsonPropertyName("default_message_notifications")] + public int? DefaultMessageNotifications { get; set; } // TODO enum + + [JsonPropertyName("explicit_content_filter")] + public int? ExplicitContentFilter { get; set; } // TODO enum + + [JsonPropertyName("preferred_locale")] + public string? PreferredLocale { get; set; } + + [JsonPropertyName("roles")] + public List<JsonObject> Roles { get; set; } // TODO type + + [JsonPropertyName("channels")] + public List<JsonObject> Channels { get; set; } // TODO type + + [JsonPropertyName("afk_channel_id"), JsonNumberHandling(JsonNumberHandling.AllowReadingFromString | JsonNumberHandling.WriteAsString)] + public long? AfkChannelId { get; set; } + + [JsonPropertyName("afk_timeout")] + public int? AfkTimeout { get; set; } + + [JsonPropertyName("system_channel_id"), JsonNumberHandling(JsonNumberHandling.AllowReadingFromString | JsonNumberHandling.WriteAsString)] + public long? SystemChannelId { get; set; } + + [JsonPropertyName("system_channel_flags")] + public int? SystemChannelFlags { get; set; } // TODO enum + + [JsonPropertyName("guild_template_code")] + public string? GuildTemplateCode { get; set; } + + [JsonPropertyName("staff_only")] + public bool? StaffOnly { get; set; } +} \ No newline at end of file diff --git a/extra/admin-api/Models/Spacebar.Models.Api/RegisterRequest.cs b/extra/admin-api/Models/Spacebar.Models.Api/RegisterRequest.cs new file mode 100644
index 00000000..232f5f83 --- /dev/null +++ b/extra/admin-api/Models/Spacebar.Models.Api/RegisterRequest.cs
@@ -0,0 +1,46 @@ +using System.Text.Json.Serialization; + +namespace Spacebar.Models.Api; + +public class RegisterRequest { + [JsonPropertyName("username")] + public string Username { get; set; } + + [JsonPropertyName("password")] + public string? Password { get; set; } + + [JsonPropertyName("consent")] + public bool Consent { get; set; } + + [JsonPropertyName("email")] + public string? Email { get; set; } + + [JsonPropertyName("fingerprint")] + public string? Fingerprint { get; set; } + + [JsonPropertyName("invite")] + public string? Invite { get; set; } + + [JsonPropertyName("date_of_birth")] + public DateTimeOffset? DateOfBirth { get; set; } + + [JsonPropertyName("gift_code_sku_id")] + public string? GiftCodeSkuId { get; set; } + + [JsonPropertyName("promotional_email_opt_in")] + public bool? PromotionalEmailOptIn { get; set; } + + [JsonPropertyName("unique_username_registration")] + public bool? UniqueUsernameRegistration { get; set; } + + [JsonPropertyName("global_name")] + public bool? GlobalName { get; set; } +} + +public class RegisterResponse { + [JsonPropertyName("token")] + public string Token { get; set; } + + [JsonPropertyName("show_verification_form")] + public bool? ShowVerificationForm { get; set; } +} \ No newline at end of file diff --git a/extra/admin-api/Models/Spacebar.Models.Api/SpacebarApiError.cs b/extra/admin-api/Models/Spacebar.Models.Api/SpacebarApiError.cs
index 03bf9264..27ef7d14 100644 --- a/extra/admin-api/Models/Spacebar.Models.Api/SpacebarApiError.cs +++ b/extra/admin-api/Models/Spacebar.Models.Api/SpacebarApiError.cs
@@ -1,29 +1,51 @@ +using System.Text.Json; using System.Text.Json.Nodes; namespace Spacebar.Models.Api; public class SpacebarApiException : Exception { public int Code { get; set; } + + public string ErrorMessage { get; set; } + public string? Request { get; set; } // Spacebar extension + // public Dictionary<string, FieldErrorList> Errors { get; set; } public JsonObject? Errors { get; set; } + + public JsonObject?[]? AjvErrors { get; set; } public class FieldErrorList { // public } - public SpacebarApiException(string? message) : base(message) { - - } + public SpacebarApiException(string? message) : base(message) { } // TODO: abstract out to HTTP layer public static SpacebarApiException FromJson(JsonObject resp) { - var ex = new SpacebarApiException(resp["message"]!.GetValue<string>()) { + var msg = resp["code"]!.GetValue<int>() + " " + resp["message"]!.GetValue<string>(); + + if (resp.ContainsKey("_ajvErrors") && resp["_ajvErrors"]!.AsArray().Any()) { + msg = msg + " " + resp["_ajvErrors"]!.ToJsonString(new() { WriteIndented = true }); + } else if (resp.ContainsKey("errors") && resp["errors"]!.AsObject().Any()) { + msg = msg + " " + resp["errors"]!.ToJsonString(new() { WriteIndented = true }); + } + + var ex = new SpacebarApiException(msg) { Code = resp["code"]!.GetValue<int>(), + ErrorMessage = resp["message"]!.GetValue<string>(), Request = resp["request"]?.GetValue<string>(), - Errors = resp["errors"]?.AsObject() + Errors = resp["errors"]?.AsObject(), + AjvErrors = resp["_ajvErrors"]?.Deserialize<JsonObject?[]>(), }; return ex; } + + public JsonObject AsJsonObject() => new() { + { "message", Message }, + { "code", Code }, + { "request", Request }, + { "errors", Errors } + }; } \ No newline at end of file diff --git a/extra/admin-api/SpacebarAdminAPI.slnx b/extra/admin-api/SpacebarAdminAPI.slnx
index 9a6115ee..44498b0f 100644 --- a/extra/admin-api/SpacebarAdminAPI.slnx +++ b/extra/admin-api/SpacebarAdminAPI.slnx
@@ -35,6 +35,7 @@ <Project Path="Utilities/Spacebar.Cdn.Migration/Spacebar.Cdn.Migration.csproj" /> <Project Path="Utilities/Spacebar.CleanSettingsRows/Spacebar.CleanSettingsRows.csproj" /> <Project Path="Utilities/Spacebar.Client/Spacebar.Client.csproj" /> + <Project Path="Utilities/Spacebar.Sdk/Spacebar.Sdk.csproj" /> </Folder> <Project Path="Spacebar.AdminApi/Spacebar.AdminApi.csproj" /> <Project Path="Spacebar.Cdn.Worker/Spacebar.Cdn.Worker.Q16-HDRI.x86_64.csproj" /> diff --git a/extra/admin-api/Utilities/Spacebar.Client/Components/ChannelMessageList.razor b/extra/admin-api/Utilities/Spacebar.Client/Components/ChannelMessageList.razor
index 6ac95c62..7fb0024a 100644 --- a/extra/admin-api/Utilities/Spacebar.Client/Components/ChannelMessageList.razor +++ b/extra/admin-api/Utilities/Spacebar.Client/Components/ChannelMessageList.razor
@@ -3,8 +3,8 @@ @using System.Text.RegularExpressions @using ArcaneLibs.Blazor.Components.Services @using ArcaneLibs.Extensions -@using Spacebar.Client.Core @using Spacebar.Models.Generic +@using Spacebar.Sdk.Core @inject JsConsoleService jsConsole @foreach (var message in Messages) { diff --git a/extra/admin-api/Utilities/Spacebar.Client/Components/ClientManager.razor b/extra/admin-api/Utilities/Spacebar.Client/Components/ClientManager.razor
index 353d8637..2021b8d2 100644 --- a/extra/admin-api/Utilities/Spacebar.Client/Components/ClientManager.razor +++ b/extra/admin-api/Utilities/Spacebar.Client/Components/ClientManager.razor
@@ -1,9 +1,9 @@ @using ArcaneLibs.Blazor.Components.Services @using ArcaneLibs.Extensions -@using Spacebar.Client.Core @using Spacebar.Client.WebCore @using Spacebar.Client.WebCore.Client @using Spacebar.Models.Gateway +@using Spacebar.Sdk.Core @inject SessionStore sessionStore @inject SpacebarClientProviderService clientProvider @inject JsConsoleService jsConsole diff --git a/extra/admin-api/Utilities/Spacebar.Client/Pages/Auth/Login.razor b/extra/admin-api/Utilities/Spacebar.Client/Pages/Auth/Login.razor
index a7ab1828..63b0c0c7 100644 --- a/extra/admin-api/Utilities/Spacebar.Client/Pages/Auth/Login.razor +++ b/extra/admin-api/Utilities/Spacebar.Client/Pages/Auth/Login.razor
@@ -1,8 +1,7 @@ @page "/login" @using ArcaneLibs.Blazor.Components -@using ArcaneLibs.Extensions -@using Spacebar.Client.Core @using Spacebar.Client.WebCore +@using Spacebar.Sdk.Core @inject SpacebarClientWellKnownResolverService clientWellKnownResolver @inject SessionStore sessionStore @inject SpacebarClientProviderService clientProvider diff --git a/extra/admin-api/Utilities/Spacebar.Client/Pages/Channels/@me.razor b/extra/admin-api/Utilities/Spacebar.Client/Pages/Channels/@me.razor
index 3a47c7bf..1939eda9 100644 --- a/extra/admin-api/Utilities/Spacebar.Client/Pages/Channels/@me.razor +++ b/extra/admin-api/Utilities/Spacebar.Client/Pages/Channels/@me.razor
@@ -1,7 +1,7 @@ @* Workaround for Rider "Bad compile constant value" bug *@ @attribute [Route(PageUri)] @using ArcaneLibs.Blazor.Components.Services -@using Spacebar.Client.Core +@using Spacebar.Sdk.Core @inject JsConsoleService jsConsole <h3>@@me</h3> diff --git a/extra/admin-api/Utilities/Spacebar.Client/Pages/Home.razor b/extra/admin-api/Utilities/Spacebar.Client/Pages/Home.razor
index fd39d3fc..84ab85a3 100644 --- a/extra/admin-api/Utilities/Spacebar.Client/Pages/Home.razor +++ b/extra/admin-api/Utilities/Spacebar.Client/Pages/Home.razor
@@ -2,8 +2,8 @@ @page "/app" @using ArcaneLibs.Blazor.Components @using ArcaneLibs.Extensions -@using Spacebar.Client.Core @using Spacebar.Client.WebCore +@using Spacebar.Sdk.Core @inject SpacebarClientWellKnownResolverService cswkrs @inject SessionStore sessionStore diff --git a/extra/admin-api/Utilities/Spacebar.Client/Program.cs b/extra/admin-api/Utilities/Spacebar.Client/Program.cs
index 7d7d88e1..6a435b88 100644 --- a/extra/admin-api/Utilities/Spacebar.Client/Program.cs +++ b/extra/admin-api/Utilities/Spacebar.Client/Program.cs
@@ -2,8 +2,8 @@ using ArcaneLibs.Blazor.Components.Services; using Microsoft.AspNetCore.Components.Web; using Microsoft.AspNetCore.Components.WebAssembly.Hosting; using Spacebar.Client; -using Spacebar.Client.Core; using Spacebar.Client.WebCore; +using Spacebar.Sdk.Core; var builder = WebAssemblyHostBuilder.CreateDefault(args); builder.RootComponents.Add<App>("#app"); diff --git a/extra/admin-api/Utilities/Spacebar.Client/Spacebar.Client.csproj b/extra/admin-api/Utilities/Spacebar.Client/Spacebar.Client.csproj
index 1df6e636..95953aca 100644 --- a/extra/admin-api/Utilities/Spacebar.Client/Spacebar.Client.csproj +++ b/extra/admin-api/Utilities/Spacebar.Client/Spacebar.Client.csproj
@@ -28,14 +28,15 @@ </ItemGroup> <ItemGroup> - <ServiceWorker Include="wwwroot\service-worker.js" PublishedContent="wwwroot\service-worker.published.js"/> - </ItemGroup> - - <ItemGroup> <ProjectReference Include="..\..\Models\Spacebar.Models.AdminApi\Spacebar.Models.AdminApi.csproj"/> <ProjectReference Include="..\..\Models\Spacebar.Models.Api\Spacebar.Models.Api.csproj"/> <ProjectReference Include="..\..\Models\Spacebar.Models.Gateway\Spacebar.Models.Gateway.csproj"/> <ProjectReference Include="..\..\Models\Spacebar.Models.Generic\Spacebar.Models.Generic.csproj"/> + <ProjectReference Include="..\Spacebar.Sdk\Spacebar.Sdk.csproj" /> + </ItemGroup> + + <ItemGroup> + <ServiceWorker Include="wwwroot\service-worker.js" PublishedContent="wwwroot\service-worker.published.js"/> </ItemGroup> </Project> diff --git a/extra/admin-api/Utilities/Spacebar.Client/Core/MarkdownEnumerator.cs b/extra/admin-api/Utilities/Spacebar.Sdk/Core/MarkdownEnumerator.cs
index 60068135..041d7156 100644 --- a/extra/admin-api/Utilities/Spacebar.Client/Core/MarkdownEnumerator.cs +++ b/extra/admin-api/Utilities/Spacebar.Sdk/Core/MarkdownEnumerator.cs
@@ -1,4 +1,4 @@ -namespace Spacebar.Client.Core; +namespace Spacebar.Sdk.Core; public class MarkdownEnumerator { public IEnumerable<BaseMarkdownNode> EnumerateMarkdownComponents(string text) { diff --git a/extra/admin-api/Utilities/Spacebar.Client/Core/SpacebarClient.cs b/extra/admin-api/Utilities/Spacebar.Sdk/Core/SpacebarClient.cs
index cd624e5d..5843b271 100644 --- a/extra/admin-api/Utilities/Spacebar.Client/Core/SpacebarClient.cs +++ b/extra/admin-api/Utilities/Spacebar.Sdk/Core/SpacebarClient.cs
@@ -1,15 +1,17 @@ -using System.Data.Common; using System.Diagnostics; using System.Net.Http.Json; using System.Net.WebSockets; using System.Text.Json; using System.Text.Json.Nodes; +using System.Text.Json.Serialization; using ArcaneLibs.Extensions; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; using Spacebar.Models.Api; using Spacebar.Models.Gateway; using Spacebar.Models.Generic; -namespace Spacebar.Client.Core; +namespace Spacebar.Sdk.Core; public class UnauthenticatedSpacebarClient(ILogger<UnauthenticatedSpacebarClient> logger, SpacebarClientWellKnown wellKnown) { public async Task<LoginResponse> LoginAsync(LoginRequest request) { @@ -20,6 +22,15 @@ public class UnauthenticatedSpacebarClient(ILogger<UnauthenticatedSpacebarClient if (!resp.IsSuccessStatusCode) throw SpacebarApiException.FromJson((await resp.Content.ReadFromJsonAsync<JsonObject>())!); return (await resp.Content.ReadFromJsonAsync<LoginResponse>())!; } + + public async Task<RegisterResponse> RegisterAsync(RegisterRequest request) { + // TODO: rebase + using var hc = new HttpClient(); + var resp = await hc.PostAsJsonAsync(new Uri(wellKnown.Api.GetApiBaseUrl(), "auth/register"), request); + // TODO: abstract out + if (!resp.IsSuccessStatusCode) throw SpacebarApiException.FromJson((await resp.Content.ReadFromJsonAsync<JsonObject>())!); + return (await resp.Content.ReadFromJsonAsync<RegisterResponse>())!; + } } public class AuthenticatedSpacebarClient { @@ -51,8 +62,16 @@ public class AuthenticatedSpacebarClient { ApiHttpClient.Dispose(); } - public SpacebarClientChannel GetChannel(long channelId) { - return new(this, channelId); + public SpacebarClientChannel GetChannel(long channelId) => new(this, channelId); + public SpacebarClientGuild GetGuild(long guildId) => new(this, guildId); + + public async Task<Guild> CreateGuild(CreateGuildRequest req) { + var resp = await ApiHttpClient.PostAsJsonAsync("guilds", req, new JsonSerializerOptions() { + DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull + }); + // TODO: abstract out + if (!resp.IsSuccessStatusCode) throw SpacebarApiException.FromJson((await resp.Content.ReadFromJsonAsync<JsonObject>())!); + return (await resp.Content.ReadFromJsonAsync<Guild>())!; } } @@ -74,6 +93,30 @@ public class SpacebarClientChannel(AuthenticatedSpacebarClient client, long chan } } +public class SpacebarClientGuild(AuthenticatedSpacebarClient client, long guildId) { + public long Id => guildId; + + public async Task<List<Channel>> GetChannelsAsync() { + var uri = $"guilds/{guildId}/channels"; + + var resp = await client.ApiHttpClient.GetAsync(uri); + // TODO: abstract out + if (!resp.IsSuccessStatusCode) throw SpacebarApiException.FromJson((await resp.Content.ReadFromJsonAsync<JsonObject>())!); + var data = await resp.Content.ReadFromJsonAsync<List<JsonObject>>(); + Console.WriteLine(data.ToJson(indent: false, ignoreNull: true)); + return data.Select(x => x.Deserialize<Channel>()).ToList(); + } + + public async Task<Channel> CreateChannelAsync(CreateChannelRequest req) { + var resp = await client.ApiHttpClient.PostAsJsonAsync($"guilds/{guildId}/channels", req, new JsonSerializerOptions() { + DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull + }); + // TODO: abstract out + if (!resp.IsSuccessStatusCode) throw SpacebarApiException.FromJson((await resp.Content.ReadFromJsonAsync<JsonObject>())!); + return (await resp.Content.ReadFromJsonAsync<Channel>())!; + } +} + public class AuthenticatedSpacebarGatewayClient(ILogger<AuthenticatedSpacebarGatewayClient> logger, SpacebarClientWellKnown wellKnown, string token) { public ClientWebSocket RawClientWebSocket = new(); public int Sequence; diff --git a/extra/admin-api/Utilities/Spacebar.Client/Core/SpacebarClientProviderService.cs b/extra/admin-api/Utilities/Spacebar.Sdk/Core/SpacebarClientProviderService.cs
index a732c9a5..5f6ab094 100644 --- a/extra/admin-api/Utilities/Spacebar.Client/Core/SpacebarClientProviderService.cs +++ b/extra/admin-api/Utilities/Spacebar.Sdk/Core/SpacebarClientProviderService.cs
@@ -1,6 +1,8 @@ using ArcaneLibs.Collections; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; -namespace Spacebar.Client.Core; +namespace Spacebar.Sdk.Core; public class SpacebarClientProviderService(ILogger<SpacebarClientProviderService> logger, IServiceProvider serviceProvider, SpacebarClientWellKnownResolverService clientWellKnownResolver) { private static readonly SemaphoreCache<UnauthenticatedSpacebarClient> UnauthenticatedClientCache = new(); diff --git a/extra/admin-api/Utilities/Spacebar.Client/Core/SpacebarClientWellKnownResolver.cs b/extra/admin-api/Utilities/Spacebar.Sdk/Core/SpacebarClientWellKnownResolver.cs
index a106435b..1530f922 100644 --- a/extra/admin-api/Utilities/Spacebar.Client/Core/SpacebarClientWellKnownResolver.cs +++ b/extra/admin-api/Utilities/Spacebar.Sdk/Core/SpacebarClientWellKnownResolver.cs
@@ -1,13 +1,21 @@ using System.Net.Http.Json; using System.Text.Json.Serialization; +using ArcaneLibs.Extensions; +using Microsoft.Extensions.Logging; -namespace Spacebar.Client.Core; +namespace Spacebar.Sdk.Core; public class SpacebarClientWellKnownResolverService(ILogger<SpacebarClientWellKnownResolverService> logger) { + private static string _getBaseUrl(string input) { + if (input.StartsWithAnyOf("https://", "http://")) return input; + return "https://" + input; + } + public async Task<SpacebarClientWellKnown> ResolveClientWellKnown(string serverName) { using var hc = new HttpClient(); - logger.LogInformation("Resolving .well-known for {serverName}", serverName); - return await hc.GetFromJsonAsync<SpacebarClientWellKnown>($"https://{serverName}/.well-known/spacebar/client")!; + var filtered = _getBaseUrl(serverName); + logger.LogInformation("Resolving .well-known for {serverName} ({filtered})", serverName, filtered); + return await hc.GetFromJsonAsync<SpacebarClientWellKnown>($"{filtered}/.well-known/spacebar/client")!; } } @@ -23,7 +31,7 @@ public class SpacebarClientWellKnown { [JsonPropertyName("gateway")] public required GatewayWellKnownData Gateway { get; set; } - + public class GenericUrlWellKnownData { [JsonPropertyName("baseUrl")] public required string BaseUrl { get; set; } @@ -32,7 +40,7 @@ public class SpacebarClientWellKnown { public class ApiWellKnownData : GenericUrlWellKnownData { [JsonPropertyName("apiVersions")] public required ApiVersionsData ApiVersions { get; set; } - + // Utility methods public Uri GetApiBaseUrl(string? version = null) { return new Uri(BaseUrl + "/api/v" + (version ?? ApiVersions.Default)); diff --git a/extra/admin-api/Utilities/Spacebar.Sdk/Spacebar.Sdk.csproj b/extra/admin-api/Utilities/Spacebar.Sdk/Spacebar.Sdk.csproj new file mode 100644
index 00000000..859f42ef --- /dev/null +++ b/extra/admin-api/Utilities/Spacebar.Sdk/Spacebar.Sdk.csproj
@@ -0,0 +1,19 @@ +<Project Sdk="Microsoft.NET.Sdk"> + + <PropertyGroup> + <TargetFramework>net10.0</TargetFramework> + <ImplicitUsings>enable</ImplicitUsings> + <Nullable>enable</Nullable> + </PropertyGroup> + + <ItemGroup> + <PackageReference Include="ArcaneLibs.Blazor.Components" Version="1.0.1-preview.20260505-124817"/> + </ItemGroup> + + <ItemGroup> + <ProjectReference Include="..\..\Models\Spacebar.Models.AdminApi\Spacebar.Models.AdminApi.csproj"/> + <ProjectReference Include="..\..\Models\Spacebar.Models.Api\Spacebar.Models.Api.csproj"/> + <ProjectReference Include="..\..\Models\Spacebar.Models.Gateway\Spacebar.Models.Gateway.csproj"/> + <ProjectReference Include="..\..\Models\Spacebar.Models.Generic\Spacebar.Models.Generic.csproj"/> + </ItemGroup> +</Project>