From 9896376b4100e37d4dcc5deec6f635714b832131 Mon Sep 17 00:00:00 2001 From: Rory& Date: Mon, 23 Feb 2026 02:26:58 +0100 Subject: [PATCH] Discovery fixes, nix updates --- extra/admin-api/Spacebar.UApi/Program.cs | 24 +++++++++++++--- .../Pages/GuildDiscovery.razor | 3 +- flake.lock | Bin 1497 -> 1489 bytes flake.nix | 4 +-- nix/modules/default/cs/admin-api.nix | 11 +------ .../cs/assert-has-connection-string.nix | 7 +++++ nix/modules/default/cs/gateway-offload-cs.nix | 15 +++------- nix/modules/default/cs/uapi.nix | 27 ++++++------------ nix/modules/default/default.nix | 1 + nix/modules/default/integration-nginx.nix | 3 +- nix/testVm/configuration.nix | 4 +++ package-lock.json | Bin 336617 -> 337777 bytes package.json | 18 ++++++------ src/api/routes/discoverable-guilds.ts | 7 ++++- 14 files changed, 66 insertions(+), 58 deletions(-) create mode 100644 nix/modules/default/cs/assert-has-connection-string.nix diff --git a/extra/admin-api/Spacebar.UApi/Program.cs b/extra/admin-api/Spacebar.UApi/Program.cs index 0a2a1b326..326d0a9c8 100644 --- a/extra/admin-api/Spacebar.UApi/Program.cs +++ b/extra/admin-api/Spacebar.UApi/Program.cs @@ -11,8 +11,10 @@ using Spacebar.Models.Db.Contexts; using Spacebar.UApi.Services; var builder = WebApplication.CreateBuilder(args); -if (!string.IsNullOrWhiteSpace(Environment.GetEnvironmentVariable("APPSETTINGS_PATH"))) +if (!string.IsNullOrWhiteSpace(Environment.GetEnvironmentVariable("APPSETTINGS_PATH"))) { + Console.WriteLine("Loading appsettings from path: " + Environment.GetEnvironmentVariable("APPSETTINGS_PATH")); builder.Configuration.AddJsonFile(Environment.GetEnvironmentVariable("APPSETTINGS_PATH")!); +} // Add services to the container. @@ -70,9 +72,23 @@ app.UseAuthorization(); app.MapControllers(); StreamingHttpClient.LogRequests = false; app.Use((context, next) => { - context.Response.Headers["Access-Control-Allow-Origin"] = "*"; - context.Response.Headers["Access-Control-Allow-Methods"] = "GET, POST, PUT, DELETE, OPTIONS"; - context.Response.Headers["Access-Control-Allow-Headers"] = "*, Authorization"; + context.Response.Headers["Access-Control-Allow-Origin"] = + string.IsNullOrWhiteSpace(context.Request.Headers.Origin) + ? "*" + : context.Request.Headers.Origin; + + context.Response.Headers["Access-Control-Allow-Methods"] = + string.IsNullOrWhiteSpace(context.Request.Headers.AccessControlRequestMethod) + ? "GET, POST, PUT, DELETE, OPTIONS" + : context.Request.Headers.AccessControlRequestMethod.ToString(); + + context.Response.Headers["Access-Control-Allow-Headers"] = + string.IsNullOrWhiteSpace(context.Request.Headers.AccessControlRequestHeaders) + ? "*, Authorization" + : context.Request.Headers.AccessControlRequestHeaders.ToString(); + + context.Response.Headers.AccessControlAllowCredentials = "true"; + if (context.Request.Method == "OPTIONS") { context.Response.StatusCode = 200; return Task.CompletedTask; diff --git a/extra/admin-api/Utilities/Spacebar.AdminApi.TestClient/Pages/GuildDiscovery.razor b/extra/admin-api/Utilities/Spacebar.AdminApi.TestClient/Pages/GuildDiscovery.razor index 7e388fbc5..ff233731e 100644 --- a/extra/admin-api/Utilities/Spacebar.AdminApi.TestClient/Pages/GuildDiscovery.razor +++ b/extra/admin-api/Utilities/Spacebar.AdminApi.TestClient/Pages/GuildDiscovery.razor @@ -16,8 +16,7 @@
@guild.Name @if (guild.Banner is not null) { - @guild.Name + @guild.Name }

@guild.Name

@guild.Description

diff --git a/flake.lock b/flake.lock index 3c3a5a856d290a1f1db334114345b3bb05de2309..abb78335e65354a4c858d9d6471a1e9ab111f249 100644 GIT binary patch delta 134 zcmcb~eUW>E789F=fw`rD<-`fH+OD2XUO6ri6@`%nxuGs)QTiT+#!gY?K_$LPiQa`? zkuFI^k$&#k-tKAHljpODP3~hd)<`uJH?vGhHcd`4 mFf>dwvPer#Hk*8aQF$^CvjbahVsS}o(d31UBAfG=vzY)sl`2{Q delta 156 zcmcb}eUp2G789GXnWc%j!Ndu&dIo+@Ij&CL*?z`3rD>IAZmH>!CLxh!rn%039!Z&| z{<%&rMOB#@Nlw0jwn{pa6`9p0uV-YNyqrl&!@$tODACx=(Adbt*vup`)i@1ECz=@> z7?@g^o12-NB&V5}rluuLKES9vnTOedH!rgyzgV|4uec;JDQEHmMp2+K!jsQ1s%)Oi HY{CQpfM_px diff --git a/flake.nix b/flake.nix index 2ad5e94f0..59bae2440 100644 --- a/flake.nix +++ b/flake.nix @@ -2,7 +2,7 @@ description = "Spacebar server, written in Typescript."; inputs = { - nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; + nixpkgs.url = "github:NixOS/nixpkgs/master"; # temp hack because unstable is frozen flake-utils.url = "github:numtide/flake-utils"; }; @@ -118,4 +118,4 @@ inherit self nixpkgs flake-utils; } ); -} +} \ No newline at end of file diff --git a/nix/modules/default/cs/admin-api.nix b/nix/modules/default/cs/admin-api.nix index 132a746cb..a7b7ca05b 100644 --- a/nix/modules/default/cs/admin-api.nix +++ b/nix/modules/default/cs/admin-api.nix @@ -119,16 +119,7 @@ in in { assertions = [ - { - assertion = - cfg.adminApi.extraConfiguration ? ConnectionStrings - && cfg.adminApi.extraConfiguration.ConnectionStrings ? Spacebar - && cfg.adminApi.extraConfiguration.ConnectionStrings.Spacebar != null; - message = '' - Admin API: Setting a database connection string in extraConfiguration (`extraConfiguration.ConnectionStrings.Spacebar`) is required when using C# services. - Example: Host=127.0.0.1; Username=Spacebar; Password=SuperSecurePassword12; Database=spacebar; Port=5432; Include Error Detail=true; Maximum Pool Size=1000; Command Timeout=6000; Timeout=600; - ''; - } + (import ./assert-has-connection-string.nix "Admin API" cfg.adminApi.extraConfiguration) ]; services.spacebarchat-server.settings.admin = { diff --git a/nix/modules/default/cs/assert-has-connection-string.nix b/nix/modules/default/cs/assert-has-connection-string.nix new file mode 100644 index 000000000..4066c8938 --- /dev/null +++ b/nix/modules/default/cs/assert-has-connection-string.nix @@ -0,0 +1,7 @@ +name: extraConfig: { + assertion = extraConfig ? ConnectionStrings && extraConfig.ConnectionStrings ? Spacebar && extraConfig.ConnectionStrings.Spacebar != null; + message = '' + ${name}: Setting a database connection string in extraConfiguration (`extraConfiguration.ConnectionStrings.Spacebar`) is required when using C# services. + Example: Host=127.0.0.1; Username=Spacebar; Password=SuperSecurePassword12; Database=spacebar; Port=5432; Include Error Detail=true; Maximum Pool Size=1000; Command Timeout=6000; Timeout=600; + ''; +} diff --git a/nix/modules/default/cs/gateway-offload-cs.nix b/nix/modules/default/cs/gateway-offload-cs.nix index 28def43ac..4e56a566f 100644 --- a/nix/modules/default/cs/gateway-offload-cs.nix +++ b/nix/modules/default/cs/gateway-offload-cs.nix @@ -127,16 +127,7 @@ in in { assertions = [ - { - assertion = - cfg.gatewayOffload.extraConfiguration ? ConnectionStrings - && cfg.gatewayOffload.extraConfiguration.ConnectionStrings ? Spacebar - && cfg.gatewayOffload.extraConfiguration.ConnectionStrings.Spacebar != null; - message = '' - Gateway Offload: Setting a database connection string in extraConfiguration (`extraConfiguration.ConnectionStrings.Spacebar`) is required when using C# services. - Example: Host=127.0.0.1; Username=Spacebar; Password=SuperSecurePassword12; Database=spacebar; Port=5432; Include Error Detail=true; Maximum Pool Size=1000; Command Timeout=6000; Timeout=600; - ''; - } + (import ./assert-has-connection-string.nix "Gateway Offload" cfg.gatewayOffload.extraConfiguration) ]; services.spacebarchat-server.settings.offload = { @@ -162,7 +153,9 @@ in CONFIG_READONLY = 1; ASPNETCORE_URLS = "http://0.0.0.0:${toString cfg.gatewayOffload.listenPort}"; STORAGE_LOCATION = cfg.cdnPath; - APPSETTINGS_PATH = jsonFormat.generate "appsettings.spacebar-gateway-offload.json" (lib.recursiveUpdate (import ./default-appsettings-json.nix) cfg.gatewayOffload.extraConfiguration); + APPSETTINGS_PATH = jsonFormat.generate "appsettings.spacebar-gateway-offload.json" ( + lib.recursiveUpdate (import ./default-appsettings-json.nix) cfg.gatewayOffload.extraConfiguration + ); } ); serviceConfig = { diff --git a/nix/modules/default/cs/uapi.nix b/nix/modules/default/cs/uapi.nix index 262ce6baf..1486ef266 100644 --- a/nix/modules/default/cs/uapi.nix +++ b/nix/modules/default/cs/uapi.nix @@ -20,6 +20,11 @@ in type = lib.types.submodule { options = { enable = lib.mkEnableOption "Enable C# API overlay."; + listenPort = lib.mkOption { + type = lib.types.port; + default = 3012; + description = "Port for the gateway offload daemon to listen on."; + }; extraConfiguration = lib.mkOption { type = jsonFormat.type; default = import ./default-appsettings-json.nix; @@ -119,25 +124,11 @@ in in { assertions = [ - { - assertion = - cfg.adminApi.extraConfiguration ? ConnectionStrings - && cfg.adminApi.extraConfiguration.ConnectionStrings ? Spacebar - && cfg.adminApi.extraConfiguration.ConnectionStrings.Spacebar != null; - message = '' - Admin API: Setting a database connection string in extraConfiguration (`extraConfiguration.ConnectionStrings.Spacebar`) is required when using C# services. - Example: Host=127.0.0.1; Username=Spacebar; Password=SuperSecurePassword12; Database=spacebar; Port=5432; Include Error Detail=true; Maximum Pool Size=1000; Command Timeout=6000; Timeout=600; - ''; - } + (import ./assert-has-connection-string.nix "uAPI" cfg.uApi.extraConfiguration) ]; - services.spacebarchat-server.settings.admin = { - endpointPublic = "http${if cfg.adminApiEndpoint.useSsl then "s" else ""}://${cfg.adminApiEndpoint.host}:${toString cfg.adminApiEndpoint.publicPort}"; - endpointPrivate = "http://127.0.0.1:${builtins.toString cfg.adminApiEndpoint.localPort}"; - }; - - systemd.services.spacebar-admin-api = makeServerTsService { - description = "Spacebar Server - Admin API"; + systemd.services.spacebar-uapi = makeServerTsService { + description = "Spacebar Server - C# API overlay"; environment = builtins.mapAttrs (_: val: builtins.toString val) ( { # things we set by default... @@ -149,7 +140,7 @@ in # things we force... # CONFIG_PATH = configFile; CONFIG_READONLY = 1; - ASPNETCORE_URLS = "http://0.0.0.0:${toString cfg.uApi.localPort}"; + ASPNETCORE_URLS = "http://0.0.0.0:${toString cfg.uApi.listenPort}"; STORAGE_LOCATION = cfg.cdnPath; APPSETTINGS_PATH = jsonFormat.generate "appsettings.spacebar-uapi.json" (lib.recursiveUpdate (import ./default-appsettings-json.nix) cfg.uApi.extraConfiguration); } diff --git a/nix/modules/default/default.nix b/nix/modules/default/default.nix index 8306aba6e..07cb7d2ec 100644 --- a/nix/modules/default/default.nix +++ b/nix/modules/default/default.nix @@ -212,6 +212,7 @@ in # message = "You cannot set CONFIG_PATH, CONFIG_READONLY, PORT or STORAGE_LOCATION in extraEnvironment, these are managed by the NixOS module."; # } ]; + services.spacebarchat-server.uApi.extraConfiguration.Spacebar.UApi.FallbackApiEndpoint = "http://127.0.0.1:${toString cfg.apiEndpoint.localPort}"; systemd.services.spacebar-api = makeServerTsService { description = "Spacebar Server - API"; diff --git a/nix/modules/default/integration-nginx.nix b/nix/modules/default/integration-nginx.nix index 718e57286..d80016bf1 100644 --- a/nix/modules/default/integration-nginx.nix +++ b/nix/modules/default/integration-nginx.nix @@ -15,12 +15,13 @@ in config = lib.mkIf (cfg.enable && cfg.nginx.enable) { services.nginx = { + recommendedProxySettings = true; virtualHosts = lib.mkIf cfg.enable { "${cfg.apiEndpoint.host}" = { enableACME = cfg.apiEndpoint.useSsl; forceSSL = cfg.apiEndpoint.useSsl; locations."/" = { - proxyPass = "http://127.0.0.1:${toString cfg.apiEndpoint.localPort}/"; + proxyPass = if cfg.uApi.enable then "http://127.0.0.1:${toString cfg.uApi.listenPort}/" else "http://127.0.0.1:${toString cfg.apiEndpoint.localPort}/"; }; }; "${cfg.gatewayEndpoint.host}" = { diff --git a/nix/testVm/configuration.nix b/nix/testVm/configuration.nix index 71c2451f7..e8de371aa 100644 --- a/nix/testVm/configuration.nix +++ b/nix/testVm/configuration.nix @@ -57,6 +57,10 @@ in enable = true; extraConfiguration.ConnectionStrings.Spacebar = csConnectionString; }; + uApi = { + enable = true; + extraConfiguration.ConnectionStrings.Spacebar = csConnectionString; + }; extraEnvironment = { DATABASE = "postgres://postgres:postgres@127.0.0.1/spacebar"; #WEBRTC_PORT_RANGE=60000-61000; diff --git a/package-lock.json b/package-lock.json index 286a077880cb764e568e30d98411260cf927f724..c4869bfa575078b10e7b4cc5350c35b2ae2c8a66 100644 GIT binary patch delta 6455 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 delta 6118 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 diff --git a/package.json b/package.json index e3bc55e2b..c86c976a3 100644 --- a/package.json +++ b/package.json @@ -60,14 +60,14 @@ "@types/multer": "^2.0.0", "@types/murmurhash-js": "^1.0.6", "@types/node": "^24.10.13", - "@types/nodemailer": "^7.0.9", + "@types/nodemailer": "^7.0.11", "@types/probe-image-size": "^7.2.5", "@types/sharp": "^0.31.1", "@types/ws": "^8.18.1", - "@typescript-eslint/eslint-plugin": "^8.55.0", - "@typescript-eslint/parser": "^8.55.0", + "@typescript-eslint/eslint-plugin": "^8.56.0", + "@typescript-eslint/parser": "^8.56.0", "@typescript/native-preview": "^7.0.0-dev.20260119.1", - "eslint": "^9.39.2", + "eslint": "^9.39.3", "globals": "^16.5.0", "husky": "^9.1.7", "patch-package": "^8.0.1", @@ -78,9 +78,9 @@ "typescript-json-schema": "^0.65.1" }, "dependencies": { - "@spacebarchat/medooze-webrtc": "^1.0.10", + "@spacebarchat/medooze-webrtc": "^1.0.11", "@toondepauw/node-zstd": "^1.2.0", - "ajv": "^8.17.1", + "ajv": "^8.18.0", "ajv-formats": "^3.0.1", "amqplib": "^0.10.9", "badge-maker": "^5.0.2", @@ -90,15 +90,15 @@ "cheerio": "^1.2.0", "cookie-parser": "^1.4.7", "discord-protos": "^1.2.102", - "dotenv": "^17.2.4", + "dotenv": "^17.3.1", "email-providers": "^2.21.0", "exif-be-gone": "^1.5.1", "express": "^5.2.1", "fast-zlib": "^2.0.1", - "fido2-lib": "^3.5.6", + "fido2-lib": "^3.5.7", "file-type": "^21.3.0", "form-data": "^4.0.5", - "i18next": "^25.8.6", + "i18next": "^25.8.13", "i18next-fs-backend": "^2.6.1", "i18next-http-middleware": "^3.9.2", "image-size": "^2.0.2", diff --git a/src/api/routes/discoverable-guilds.ts b/src/api/routes/discoverable-guilds.ts index 87de37a3b..2df44c16b 100644 --- a/src/api/routes/discoverable-guilds.ts +++ b/src/api/routes/discoverable-guilds.ts @@ -21,6 +21,7 @@ import { Config, Guild, Member } from "@spacebar/util"; import { route } from "@spacebar/api"; import { Request, Response, Router } from "express"; import { In, Like, Not } from "typeorm"; +import { DiscoverableGuildsResponse } from "@spacebar/schemas"; const router = Router({ mergeParams: true }); @@ -64,7 +65,11 @@ router.get( res.send({ total: total, - guilds: guilds, + guilds: guilds.map((g) => ({ + ...g, + discovery_weight: undefined, + discovery_splash: undefined, + })), offset: Number(offset || Config.get().guild.discovery.offset), limit: Number(limit || configLimit), });