ActiveVersions { get; set; } = null!;
+
+ [JsonPropertyName("defaultVersion")]
+ public string DefaultVersion { get; set; } = null!;
+}
+
+public class CdnConfiguration : EndpointConfiguration {
+ [JsonPropertyName("resizeHeightMax")] public int ResizeHeightMax = 1000;
+ [JsonPropertyName("resizeWidthMax")] public int ResizeWidthMax = 1000;
+ [JsonPropertyName("imagorServerUrl")] public string? ImagorServerUrl = null;
+
+ [JsonPropertyName("proxyCacheHeaderSeconds")]
+ public int ProxyCacheHeaderSeconds = 60 * 60 * 24;
+
+ [JsonPropertyName("maxAttachmentSize")]
+ public int MaxAttachmentSize = 25 * 1024 * 1024; // 25 MB
+
+ // limits: CdnLimitsConfiguration = new CdnLimitsConfiguration();
+}
+
+public class CdnLimitsConfiguration {
+ // ordered by route register order in CDN...
+ [JsonPropertyName("icon")] public CdnImageLimitsConfiguration Icon = new CdnImageLimitsConfiguration();
+ [JsonPropertyName("roleIcon")] public CdnImageLimitsConfiguration RoleIcon = new CdnImageLimitsConfiguration();
+ [JsonPropertyName("emoji")] public CdnImageLimitsConfiguration Emoji = new CdnImageLimitsConfiguration();
+ [JsonPropertyName("sticker")] public CdnImageLimitsConfiguration Sticker = new CdnImageLimitsConfiguration();
+ [JsonPropertyName("banner")] public CdnImageLimitsConfiguration Banner = new CdnImageLimitsConfiguration();
+ [JsonPropertyName("splash")] public CdnImageLimitsConfiguration Splash = new CdnImageLimitsConfiguration();
+ [JsonPropertyName("avatar")] public CdnImageLimitsConfiguration Avatar = new CdnImageLimitsConfiguration();
+ [JsonPropertyName("discoverySplash")] public CdnImageLimitsConfiguration DiscoverySplash = new CdnImageLimitsConfiguration();
+ [JsonPropertyName("appIcon")] public CdnImageLimitsConfiguration AppIcon = new CdnImageLimitsConfiguration();
+ [JsonPropertyName("discoverSplash")] public CdnImageLimitsConfiguration DiscoverSplash = new CdnImageLimitsConfiguration(); //what even is this?
+ [JsonPropertyName("teamIcon")] public CdnImageLimitsConfiguration TeamIcon = new CdnImageLimitsConfiguration();
+ [JsonPropertyName("channelIcon")] public CdnImageLimitsConfiguration ChannelIcon = new CdnImageLimitsConfiguration(); // is this even used?
+ [JsonPropertyName("guildAvatar")] public CdnImageLimitsConfiguration GuildAvatar = new CdnImageLimitsConfiguration();
+}
+
+public class CdnImageLimitsConfiguration {
+ [JsonPropertyName("maxHeight")] public int MaxHeight = 8192;
+ [JsonPropertyName("maxWidth")] public int MaxWidth = 8192;
+
+ [JsonPropertyName("maxSize")] public int MaxSize = 10 * 1024 * 1024; // 10 MB
+
+ // "always" | "never" | "premium"
+ [JsonPropertyName("allowAnimated")] public string AllowAnimated = "always";
+}
\ No newline at end of file
diff --git a/extra/admin-api/Utilities/Spacebar.AdminApi.TestClient/Pages/ServerConfig.razor b/extra/admin-api/Utilities/Spacebar.AdminApi.TestClient/Pages/ServerConfig.razor
new file mode 100644
index 000000000..7a83bd52a
--- /dev/null
+++ b/extra/admin-api/Utilities/Spacebar.AdminApi.TestClient/Pages/ServerConfig.razor
@@ -0,0 +1,26 @@
+@page "/ServerConfig"
+@inject Config Config
+@using System.Net.Http.Headers
+@using System.Text.Json
+@using Spacebar.AdminApi.TestClient.Services
+@using Spacebar.ConfigModel.Extensions
+Server Config
+@if (CurrentServerConfig is null) {
+ Loading server config...
+} else {
+ @JsonSerializer.Serialize(CurrentServerConfig, new JsonSerializerOptions { WriteIndented = true })
+}
+
+@code {
+
+ private Spacebar.ConfigModel.ServerConfiguration? CurrentServerConfig { get; set; } = new();
+
+ protected override async Task OnInitializedAsync() {
+ var hc = new StreamingHttpClient();
+ hc.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", Config.AccessToken);
+ var cfgKv = await hc.GetFromJsonAsync>($"{Config.AdminUrl}/_spacebar/admin/config");
+ var cfg = cfgKv.ToNestedJsonObject();
+ CurrentServerConfig = cfg.Deserialize();
+ }
+
+}
\ No newline at end of file