Files
2026-10-16 23:43:29 -07:00

87 lines
4.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Server
ASP.NET Core 9 (`net9.0`) implementation of the RecNet API surface that archived
2023 Rec Room clients call. Root namespace `RadicadeServer`; one process serves both
the game API and the public web/share endpoints.
## Running
```bash
dotnet run --project Server
```
Development listens on `https://localhost:3030` and `http://127.0.0.1:3031` (see
`appsettings.Development.json`); Production defaults to `http://0.0.0.0:3030` for a
TLS-terminating proxy in front (see the repo-level `Caddyfile`).
`Program.cs` builds the host, loads configuration into `DBConfig`, then:
- fails fast in Production if `AdminApiKey`, `JwtKey` or `SteamApiKey` are blank;
- registers the EF Core `RecDBContext` (SQL Server, retry-on-failure, pending-model
warnings ignored);
- wires JWT bearer auth (signing key from `Radicade:JwtKey`; the `access_token` query
parameter is accepted on notify-hub paths for WebSocket clients) plus a token
version check that revokes sessions;
- configures ImageSharp (with a `cropSquare` command used by avatar images);
- applies migrations and idempotent schema fix-ups at startup;
- maps controllers and the `NotifyHub` SignalR hubs.
## Layout
| Folder | Contents |
| --- | --- |
| `Program.cs` | Host, DI, auth, middleware pipeline and startup schema work. |
| `DB/` | `DBConfig` (all runtime configuration + paths), `RecDBContext`, `Defaults`, factory and bootstrap helpers. |
| `Migrations/` | EF Core migrations. |
| `NameServer/` | `GET /`, `/ns`, `/nameserver` — the document that tells a client where every service lives. |
| `Auth/`, `AccountCreation/` | Login, token issuance, onboarding flows, platform identity proofing. |
| `Players/`, `PlayersBanned/`, `Relationships/`, `Messages/`, `Chat/`, `Notifications/` | Player records, presence, friends, direct messages, chat and notifications. |
| `Rooms/`, `Clubs/`, `Board/`, `PlayerEvents/`, `Inventions/`, `Keepsakes/`, `Studio/`, `Royale/` | User-generated and social content surfaces. |
| `Avatars/`, `CustomAvatarItems/`, `Images/`, `CDN/`, `Storage/`, `LoadingScreens/`, `Launcher/` | Cosmetics, image/video CDN routes, stored blobs, launcher manifest. |
| `Commerce/`, `Storefront/`, `Gift/`, `Promotions/`, `PlayerCheer/`, `ProgressionEvents/` | Economy: storefronts, purchases, gifts, promotions, progression rewards. |
| `Matchmaking/`, `Activities/`, `Leaderboards/`, `Compatibility/`, `Health/` | Session/matchmaking, activity feed, leaderboards, version compatibility checks, health endpoints. |
| `Moderation/`, `PlayerReporting/`, `PlayerWarnings/`, `PlayerReputation/`, `BanAppeal/` | Moderation and safety tooling. |
| `Config/` | Client configuration/split-test endpoints and player settings. |
| `Analytics/`, `BugReporting/` | Game log ingestion and bug reports. |
| `Admin/` | Admin panel API. Endpoints authenticate with `AdminApiKey`/`SupportApiKey` (see `AdminUtils`). |
| `Web/` | Public web/share API (`/web/...`). |
| `Discord/` | Discord webhook config (`webhooks.json` git-ignored, `webhooks.example.json` tracked). |
| `RecNet/`, `Radicade/` | Shared response/enum models and RecNet-shaped DTOs. |
| `RadicadeServer-Config/` | Catalogs served to clients (storefronts, avatars, equipment, keepsakes, level-up rewards, Steam whitelist). |
| `Middleware/`, `Extensions/`, `Utils/` | Cross-cutting plumbing and helpers. |
| `Tooling/` | Debug and test-case management endpoints. |
## Routing and multi-version support
Routes are declared with controller attributes and many endpoints deliberately expose
several paths for the same handler, because different 2023 builds call slightly
different URLs (for example `~/clubs/club/home/me`, `~/club/home/me` and
`~/api/clubs/v1/home/me`). Supported client versions are listed in
`DBConfig.SupportedGameVersions`, with **`20230831`** (September 2023) as the primary
target and `20230301`–`20231207` plus a couple of 2025 builds also accepted.
CORS is wide open (`AllowAllOrigins`), which is appropriate for a self-hosted server
serving the game client and local tooling.
## Data
`DBConfig.PublicData` defaults to `./RadicadeServer-Data/` and is split into:
- `CDN/Images`, `CDN/Videos`, `CDN/Storage`, `CDN/Custom` — served content and uploads;
- `Persistent/Logs` — rotating logs and generated `debugkey.txt`;
- `Persistent/DataProtection-Keys` — Data Protection key ring;
- `Persistent/localhost-rsa-aes-devcert.pfx` — the Development HTTPS certificate.
## Configuration
See the configuration table in the [root README](../README.md#configuration). The
checked-in `appsettings.*.json` files contain `USEYOURS` placeholders; override real
values with user secrets or environment variables (`Radicade__JwtKey`,
`ConnectionStrings__DefaultConnection`, …). Production startup validates the three
required secrets.
## Tests
Covered by [`ServerTests/`](../ServerTests) — see that README for how to run them and
which helpers they use.