ENGAGEMENT.md Phase 7. `user_notifications`, the in-app DeliveryChannel, the
four inbox routes, and the web surface — plus the two pieces earlier phases
assigned here that Phase 7's own acceptance line omits.
Four decisions settled by the org lead before any code:
1. `inapp` defaults to `instant` — the only channel that does. Push wakes a
device somebody is holding and email leaves the building, so both are asked
for; an inbox item is a row on a page the user chose to open. Left `off` the
channel ships dead.
2. The phase takes push's `deliver` (§2603) and the web per-channel preferences
screen (Phase 3's as-built), neither of which its own bullets mention.
3. The inbox takes `/auth/me/notifications` and `/account/notifications`; the
preferences screen moves to `…/settings`. The plain word belongs to the
content, which is what the bell opens.
4. `ctx.inbox.push` honours the user's in-app preference when `triggerId` names
a registered trigger, and writes when it does not.
Server
- `user_notifications` + `model/userNotifications/`. The dedupe UNIQUE is scoped
to the USER, narrower than the outbox's `(rule, user, channel)`: an inbox has
no channel dimension, so two rows for one event would be one item shown twice.
- `engagement/inappChannel.js` — renders by block ROLE (first heading → title,
first button → url, the rest → body) and inserts. `pushChannel.js` — a
content-free `{stream, ref}` tickle whose ref deep-links the inbox row.
- `engine.liveChannels` orders `inapp` first (`CHANNEL_ORDER`) so that ref
resolves on the first sweep. An ordering, not a dependency.
- `templates.renderInappByKey` + `resolveTemplate` extracted from `renderByKey`,
so both channels take the same fallback chain.
- `inapp.event` seed → seedVersion 2: it named `body`/`url`, which nothing
supplies. Renamed to the structural vocabulary the projection fills in.
- `utils/userNotificationsPrune.js` — nightly, READ items only, horizon in
`settings.user_notifications_retain_days` (default 90).
- `GET /auth/me/notifications`, `…/unread-count`, `POST …/:id/read`,
`POST …/read-all`. Swagger + route manifest + four component schemas.
Web
- `NotificationBell` in all three headers, polling its badge once a minute and
pausing while the tab is hidden. `PlayerInbox` at `/account/notifications`.
- The preferences screen becomes a channel matrix over
`/auth/me/notifications/channels` — a strict superset of the push-only stream
list it replaces. The two legacy endpoints are untouched, so the shipped
Android app keeps its wire shape.
- Staff get the same two screens at `/admin/notifications…`: `RequirePlayer`
keeps them out of `/account`, so without this the inbox was unreachable for
every non-player account. `lib/notificationPaths.js` is the one mapping.
Verified: 28 new server tests (5 of them against a real MariaDB, for the three
index/statement properties that are a server contract rather than a reading of
this code) + 3 client. Server suite green, client 327 green. A live rig walked
the whole path: two rules on one event produced three outbox rows and exactly
one inbox item, the tickle carried `ref: notification:2`, and the retention
sweep dropped an aged read row while keeping an equally aged unread one.
Docs: RunicGateway/docs#TBD, RunicGateway/runicgateway.com#TBD
Co-Authored-By: Claude <noreply@anthropic.com>
2315 lines
44 KiB
JSON
2315 lines
44 KiB
JSON
{
|
|
"$comment": "Generated review aid, NOT a gated contract - per route, the middleware handler count and the *named* middleware collected along the mount chain. Anonymous handlers (e.g. the arrow returned by requireRole(...)) cannot be named, so this is a hint for reviewers, never a security check. Regenerate with `npm run routes:manifest`.",
|
|
"public": [
|
|
{
|
|
"method": "GET",
|
|
"path": "/.well-known/assetlinks.json",
|
|
"handlers": 1,
|
|
"gates": []
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/csp-report",
|
|
"handlers": 6,
|
|
"gates": [
|
|
"jsonParser"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/docs.json",
|
|
"handlers": 1,
|
|
"gates": []
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/health",
|
|
"handlers": 1,
|
|
"gates": []
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/admin/activity",
|
|
"handlers": 1,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/admin/auth/providers",
|
|
"handlers": 2,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/v1/admin/auth/providers",
|
|
"handlers": 14,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "DELETE",
|
|
"path": "/api/v1/admin/auth/providers/:id",
|
|
"handlers": 4,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "PUT",
|
|
"path": "/api/v1/admin/auth/providers/:id",
|
|
"handlers": 13,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/admin/bot-activity",
|
|
"handlers": 2,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/v1/admin/bot-activity/unban",
|
|
"handlers": 4,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/admin/dashboard",
|
|
"handlers": 1,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/admin/discord-bot/config",
|
|
"handlers": 2,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "PUT",
|
|
"path": "/api/v1/admin/discord-bot/config",
|
|
"handlers": 6,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/admin/email/config",
|
|
"handlers": 2,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "PUT",
|
|
"path": "/api/v1/admin/email/config",
|
|
"handlers": 9,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/v1/admin/email/disconnect",
|
|
"handlers": 2,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/v1/admin/email/test",
|
|
"handlers": 4,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/admin/engagement/audience-preview",
|
|
"handlers": 2,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/admin/engagement/audiences",
|
|
"handlers": 2,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/admin/engagement/channels",
|
|
"handlers": 2,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/admin/engagement/rules",
|
|
"handlers": 2,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/v1/admin/engagement/rules",
|
|
"handlers": 2,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "DELETE",
|
|
"path": "/api/v1/admin/engagement/rules/:id",
|
|
"handlers": 2,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/admin/engagement/rules/:id",
|
|
"handlers": 2,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "PUT",
|
|
"path": "/api/v1/admin/engagement/rules/:id",
|
|
"handlers": 2,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "PATCH",
|
|
"path": "/api/v1/admin/engagement/rules/:id/enabled",
|
|
"handlers": 2,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/admin/engagement/segments",
|
|
"handlers": 2,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/v1/admin/engagement/segments",
|
|
"handlers": 2,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "DELETE",
|
|
"path": "/api/v1/admin/engagement/segments/:id",
|
|
"handlers": 2,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "PUT",
|
|
"path": "/api/v1/admin/engagement/segments/:id",
|
|
"handlers": 2,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/admin/engagement/sends",
|
|
"handlers": 2,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/admin/engagement/templates",
|
|
"handlers": 2,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "DELETE",
|
|
"path": "/api/v1/admin/engagement/templates/:id",
|
|
"handlers": 2,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/admin/engagement/templates/:id",
|
|
"handlers": 2,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "PUT",
|
|
"path": "/api/v1/admin/engagement/templates/:id",
|
|
"handlers": 2,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/v1/admin/engagement/templates/:id/duplicate",
|
|
"handlers": 2,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/v1/admin/engagement/templates/:id/preview",
|
|
"handlers": 2,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/v1/admin/engagement/templates/:id/test-send",
|
|
"handlers": 2,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/admin/engagement/triggers",
|
|
"handlers": 2,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/admin/invites",
|
|
"handlers": 2,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/v1/admin/invites",
|
|
"handlers": 5,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "DELETE",
|
|
"path": "/api/v1/admin/invites/:id",
|
|
"handlers": 4,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/admin/moderation/appeals",
|
|
"handlers": 1,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/admin/moderation/appeals/:id",
|
|
"handlers": 3,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/v1/admin/moderation/appeals/:id/claim",
|
|
"handlers": 3,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/v1/admin/moderation/appeals/:id/resolve",
|
|
"handlers": 5,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/admin/moderation/filter-hits",
|
|
"handlers": 1,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/admin/moderation/members",
|
|
"handlers": 1,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/admin/moderation/recent",
|
|
"handlers": 1,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/admin/moderation/reports",
|
|
"handlers": 1,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/v1/admin/moderation/reports/:id/handle",
|
|
"handlers": 5,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/admin/moderation/search",
|
|
"handlers": 1,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/admin/moderation/spam-hits",
|
|
"handlers": 1,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/admin/moderation/stats/summary",
|
|
"handlers": 1,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/admin/moderation/user/:discordId",
|
|
"handlers": 3,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/admin/moderation/user/:discordId/actions",
|
|
"handlers": 3,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/admin/moderation/user/:discordId/appeals",
|
|
"handlers": 3,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/admin/moderation/user/:discordId/notes",
|
|
"handlers": 3,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/v1/admin/moderation/user/:discordId/notes",
|
|
"handlers": 5,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/admin/modules",
|
|
"handlers": 2,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/v1/admin/modules",
|
|
"handlers": 4,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "DELETE",
|
|
"path": "/api/v1/admin/modules/:id",
|
|
"handlers": 5,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/v1/admin/modules/:id/disable",
|
|
"handlers": 4,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/v1/admin/modules/:id/enable",
|
|
"handlers": 4,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/v1/admin/modules/:id/purge",
|
|
"handlers": 4,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/v1/admin/modules/restart",
|
|
"handlers": 2,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "PUT",
|
|
"path": "/api/v1/admin/modules/sources",
|
|
"handlers": 4,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/admin/pages",
|
|
"handlers": 1,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/v1/admin/pages",
|
|
"handlers": 4,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "DELETE",
|
|
"path": "/api/v1/admin/pages/:id",
|
|
"handlers": 3,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/admin/pages/:id",
|
|
"handlers": 3,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "PATCH",
|
|
"path": "/api/v1/admin/pages/:id",
|
|
"handlers": 3,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/v1/admin/pages/:id/preview",
|
|
"handlers": 3,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/v1/admin/pages/:id/unprotect",
|
|
"handlers": 4,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/admin/posts",
|
|
"handlers": 1,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/v1/admin/posts",
|
|
"handlers": 4,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "DELETE",
|
|
"path": "/api/v1/admin/posts/:id",
|
|
"handlers": 3,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/admin/posts/:id",
|
|
"handlers": 3,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "PUT",
|
|
"path": "/api/v1/admin/posts/:id",
|
|
"handlers": 3,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/admin/posts/:id/announce",
|
|
"handlers": 3,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/v1/admin/posts/:id/announce/retry",
|
|
"handlers": 4,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "PATCH",
|
|
"path": "/api/v1/admin/posts/:id/publish",
|
|
"handlers": 4,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/v1/admin/posts/upload",
|
|
"handlers": 2,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"multerMiddleware"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/admin/settings",
|
|
"handlers": 2,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "PUT",
|
|
"path": "/api/v1/admin/settings",
|
|
"handlers": 2,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "DELETE",
|
|
"path": "/api/v1/admin/settings/:key",
|
|
"handlers": 2,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/v1/admin/settings/brand-asset/:slot",
|
|
"handlers": 3,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"multerMiddleware"
|
|
]
|
|
},
|
|
{
|
|
"method": "PUT",
|
|
"path": "/api/v1/admin/site-mode",
|
|
"handlers": 4,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/admin/teams",
|
|
"handlers": 3,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/admin/teams/:id",
|
|
"handlers": 3,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/v1/admin/teams/:id/archive",
|
|
"handlers": 4,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/v1/admin/teams/:id/display-name",
|
|
"handlers": 5,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/admin/teams/:id/forum/moderation",
|
|
"handlers": 3,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/admin/teams/:id/grants",
|
|
"handlers": 3,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/v1/admin/teams/:id/hide",
|
|
"handlers": 4,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/v1/admin/teams/:id/leader-override",
|
|
"handlers": 6,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "DELETE",
|
|
"path": "/api/v1/admin/teams/:id/leader-override/:memberKey",
|
|
"handlers": 4,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/v1/admin/teams/:id/unhide",
|
|
"handlers": 4,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/admin/teams/forum/settings",
|
|
"handlers": 1,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/admin/teams/forum/uploads",
|
|
"handlers": 5,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/admin/teams/integrations",
|
|
"handlers": 2,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "PUT",
|
|
"path": "/api/v1/admin/teams/integrations",
|
|
"handlers": 8,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "DELETE",
|
|
"path": "/api/v1/admin/teams/integrations/:teamId",
|
|
"handlers": 4,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/admin/teams/requests",
|
|
"handlers": 3,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/v1/admin/teams/requests/:id/decide",
|
|
"handlers": 5,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/v1/admin/teams/resync",
|
|
"handlers": 1,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/admin/teams/review",
|
|
"handlers": 1,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/admin/teams/voice",
|
|
"handlers": 2,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "PUT",
|
|
"path": "/api/v1/admin/teams/voice",
|
|
"handlers": 7,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "DELETE",
|
|
"path": "/api/v1/admin/teams/voice/:teamId",
|
|
"handlers": 4,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/v1/admin/teams/voice/sync",
|
|
"handlers": 2,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/v1/admin/uploads",
|
|
"handlers": 2,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"multerMiddleware"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/admin/users",
|
|
"handlers": 1,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/v1/admin/users",
|
|
"handlers": 7,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "DELETE",
|
|
"path": "/api/v1/admin/users/:id",
|
|
"handlers": 3,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/admin/users/:id",
|
|
"handlers": 3,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "PUT",
|
|
"path": "/api/v1/admin/users/:id",
|
|
"handlers": 8,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/v1/admin/users/:id/mfa/reset",
|
|
"handlers": 3,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "DELETE",
|
|
"path": "/api/v1/admin/users/:id/trusted-devices",
|
|
"handlers": 3,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/admin/users/:id/trusted-devices",
|
|
"handlers": 3,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "DELETE",
|
|
"path": "/api/v1/admin/users/:id/trusted-devices/:deviceId",
|
|
"handlers": 4,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/admin/users/email-dedupe-report",
|
|
"handlers": 1,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/v1/admin/users/email-dedupe-report/acknowledge",
|
|
"handlers": 1,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/admin/wiki",
|
|
"handlers": 1,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/v1/admin/wiki",
|
|
"handlers": 8,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "DELETE",
|
|
"path": "/api/v1/admin/wiki/:slug",
|
|
"handlers": 1,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/admin/wiki/:slug",
|
|
"handlers": 1,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "PUT",
|
|
"path": "/api/v1/admin/wiki/:slug",
|
|
"handlers": 8,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "PATCH",
|
|
"path": "/api/v1/admin/wiki/:slug/publish",
|
|
"handlers": 3,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/admin/wiki/:slug/revisions",
|
|
"handlers": 1,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/admin/wiki/:slug/revisions/:id",
|
|
"handlers": 3,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/v1/admin/wiki/:slug/revisions/:id/restore",
|
|
"handlers": 3,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/admin/wiki/categories",
|
|
"handlers": 1,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/v1/admin/wiki/categories",
|
|
"handlers": 6,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "DELETE",
|
|
"path": "/api/v1/admin/wiki/categories/:id",
|
|
"handlers": 3,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "PUT",
|
|
"path": "/api/v1/admin/wiki/categories/:id",
|
|
"handlers": 7,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/admin/wiki/tags",
|
|
"handlers": 1,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/auth/email/verify/:token",
|
|
"handlers": 3,
|
|
"gates": [
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/v1/auth/email/verify/:token",
|
|
"handlers": 4,
|
|
"gates": [
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/auth/invite/:token",
|
|
"handlers": 3,
|
|
"gates": [
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/v1/auth/invite/:token/accept",
|
|
"handlers": 10,
|
|
"gates": [
|
|
"backoffGuard",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/v1/auth/login",
|
|
"handlers": 8,
|
|
"gates": [
|
|
"backoffGuard",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/v1/auth/login/totp",
|
|
"handlers": 10,
|
|
"gates": [
|
|
"backoffGuard",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/v1/auth/logout",
|
|
"handlers": 2,
|
|
"gates": [
|
|
"attachSession"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/auth/me",
|
|
"handlers": 2,
|
|
"gates": [
|
|
"requireAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/auth/me/account",
|
|
"handlers": 1,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "PATCH",
|
|
"path": "/api/v1/auth/me/account/email",
|
|
"handlers": 5,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "DELETE",
|
|
"path": "/api/v1/auth/me/account/email/pending",
|
|
"handlers": 1,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/v1/auth/me/account/email/resend",
|
|
"handlers": 2,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/auth/me/account/identities",
|
|
"handlers": 1,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "DELETE",
|
|
"path": "/api/v1/auth/me/account/identities/:provider",
|
|
"handlers": 3,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "PATCH",
|
|
"path": "/api/v1/auth/me/account/password",
|
|
"handlers": 5,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/v1/auth/me/account/recovery-codes/generate",
|
|
"handlers": 6,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"backoffGuard",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/auth/me/account/recovery-codes/status",
|
|
"handlers": 1,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/v1/auth/me/account/totp/disable",
|
|
"handlers": 3,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/v1/auth/me/account/totp/enable",
|
|
"handlers": 3,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/v1/auth/me/account/totp/setup",
|
|
"handlers": 1,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "PATCH",
|
|
"path": "/api/v1/auth/me/account/username",
|
|
"handlers": 4,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/auth/me/devices",
|
|
"handlers": 1,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/v1/auth/me/devices",
|
|
"handlers": 5,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "DELETE",
|
|
"path": "/api/v1/auth/me/devices/:id",
|
|
"handlers": 3,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/auth/me/notifications",
|
|
"handlers": 5,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/v1/auth/me/notifications/:id/read",
|
|
"handlers": 3,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/auth/me/notifications/channels",
|
|
"handlers": 1,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "PUT",
|
|
"path": "/api/v1/auth/me/notifications/channels",
|
|
"handlers": 6,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/v1/auth/me/notifications/read-all",
|
|
"handlers": 1,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/auth/me/notifications/streams",
|
|
"handlers": 1,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/auth/me/notifications/subscriptions",
|
|
"handlers": 1,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "PUT",
|
|
"path": "/api/v1/auth/me/notifications/subscriptions",
|
|
"handlers": 4,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/auth/me/notifications/teams",
|
|
"handlers": 1,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "PUT",
|
|
"path": "/api/v1/auth/me/notifications/teams",
|
|
"handlers": 6,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/auth/me/notifications/unread-count",
|
|
"handlers": 1,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/auth/me/sessions",
|
|
"handlers": 1,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "DELETE",
|
|
"path": "/api/v1/auth/me/sessions/:id",
|
|
"handlers": 3,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "DELETE",
|
|
"path": "/api/v1/auth/me/trusted-devices",
|
|
"handlers": 1,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/auth/me/trusted-devices",
|
|
"handlers": 1,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/v1/auth/me/trusted-devices",
|
|
"handlers": 4,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "DELETE",
|
|
"path": "/api/v1/auth/me/trusted-devices/:id",
|
|
"handlers": 3,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/v1/auth/mobile/login",
|
|
"handlers": 11,
|
|
"gates": [
|
|
"backoffGuard",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/v1/auth/mobile/logout",
|
|
"handlers": 5,
|
|
"gates": [
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/v1/auth/mobile/refresh",
|
|
"handlers": 4,
|
|
"gates": [
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/v1/auth/mobile/sso/exchange",
|
|
"handlers": 6,
|
|
"gates": [
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/auth/mobile/sso/start",
|
|
"handlers": 7,
|
|
"gates": [
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/v1/auth/password/forgot",
|
|
"handlers": 4,
|
|
"gates": [
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/auth/password/reset/:token",
|
|
"handlers": 3,
|
|
"gates": [
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/v1/auth/password/reset/:token",
|
|
"handlers": 5,
|
|
"gates": [
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/auth/providers",
|
|
"handlers": 1,
|
|
"gates": []
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/v1/auth/register",
|
|
"handlers": 10,
|
|
"gates": [
|
|
"backoffGuard",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/auth/sso/:provider/callback",
|
|
"handlers": 1,
|
|
"gates": []
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/auth/sso/:provider/link",
|
|
"handlers": 2,
|
|
"gates": [
|
|
"requireAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/auth/sso/:provider/start",
|
|
"handlers": 2,
|
|
"gates": []
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/v1/auth/sso/totp",
|
|
"handlers": 8,
|
|
"gates": [
|
|
"backoffGuard",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/player/appeals",
|
|
"handlers": 1,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/v1/player/appeals",
|
|
"handlers": 5,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/v1/player/appeals/:id/withdraw",
|
|
"handlers": 3,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/player/appeals/eligible",
|
|
"handlers": 1,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/player/teams",
|
|
"handlers": 1,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/player/teams/:slug/access",
|
|
"handlers": 1,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "PATCH",
|
|
"path": "/api/v1/player/teams/:slug/forum/posts/:id",
|
|
"handlers": 5,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/v1/player/teams/:slug/forum/posts/:id/moderate",
|
|
"handlers": 5,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/v1/player/teams/:slug/forum/report",
|
|
"handlers": 7,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/player/teams/:slug/forum/threads",
|
|
"handlers": 1,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/v1/player/teams/:slug/forum/threads",
|
|
"handlers": 7,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/player/teams/:slug/forum/threads/:id",
|
|
"handlers": 3,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/v1/player/teams/:slug/forum/threads/:id/moderate",
|
|
"handlers": 5,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/v1/player/teams/:slug/forum/threads/:id/posts",
|
|
"handlers": 5,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/v1/player/teams/:slug/forum/uploads",
|
|
"handlers": 3,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"multerMiddleware"
|
|
]
|
|
},
|
|
{
|
|
"method": "DELETE",
|
|
"path": "/api/v1/player/teams/:slug/forum/uploads/:id",
|
|
"handlers": 3,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/player/teams/:slug/grants",
|
|
"handlers": 1,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/v1/player/teams/:slug/grants",
|
|
"handlers": 6,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "DELETE",
|
|
"path": "/api/v1/player/teams/:slug/grants/:userId",
|
|
"handlers": 5,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth",
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/v1/public/contact",
|
|
"handlers": 6,
|
|
"gates": [
|
|
"middleware",
|
|
"validate"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/public/engagement/unsubscribe/:token",
|
|
"handlers": 1,
|
|
"gates": []
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/v1/public/engagement/unsubscribe/:token",
|
|
"handlers": 1,
|
|
"gates": []
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/public/modules",
|
|
"handlers": 1,
|
|
"gates": []
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/public/pages/:id/preview/:token",
|
|
"handlers": 1,
|
|
"gates": []
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/public/pages/:slug",
|
|
"handlers": 2,
|
|
"gates": [
|
|
"siteMode"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/public/posts/:category",
|
|
"handlers": 2,
|
|
"gates": [
|
|
"siteMode"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/public/posts/:category/:idOrSlug",
|
|
"handlers": 2,
|
|
"gates": [
|
|
"siteMode"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/public/settings",
|
|
"handlers": 1,
|
|
"gates": []
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/public/status",
|
|
"handlers": 1,
|
|
"gates": []
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/public/teams",
|
|
"handlers": 2,
|
|
"gates": [
|
|
"siteMode"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/public/teams/:slug",
|
|
"handlers": 2,
|
|
"gates": [
|
|
"siteMode"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/public/teams/:slug/activity",
|
|
"handlers": 3,
|
|
"gates": [
|
|
"siteMode",
|
|
"optionalAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/public/teams/:slug/members",
|
|
"handlers": 3,
|
|
"gates": [
|
|
"siteMode",
|
|
"optionalAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/public/teams/by-external/:moduleId/:externalId",
|
|
"handlers": 2,
|
|
"gates": [
|
|
"siteMode"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/public/teams/unsubscribe/:token",
|
|
"handlers": 1,
|
|
"gates": []
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/api/v1/public/teams/unsubscribe/:token",
|
|
"handlers": 1,
|
|
"gates": []
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/public/version",
|
|
"handlers": 1,
|
|
"gates": []
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/public/wiki",
|
|
"handlers": 2,
|
|
"gates": [
|
|
"siteMode"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/public/wiki/:slug",
|
|
"handlers": 2,
|
|
"gates": [
|
|
"siteMode"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/public/wiki/categories",
|
|
"handlers": 2,
|
|
"gates": [
|
|
"siteMode"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/public/wiki/tags",
|
|
"handlers": 2,
|
|
"gates": [
|
|
"siteMode"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/settings/nav",
|
|
"handlers": 1,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/api/v1/settings/theme/options",
|
|
"handlers": 1,
|
|
"gates": [
|
|
"noindex",
|
|
"requireAuth"
|
|
]
|
|
}
|
|
],
|
|
"internal": [
|
|
{
|
|
"method": "GET",
|
|
"path": "/health",
|
|
"handlers": 1,
|
|
"gates": []
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/internal/bot-config",
|
|
"handlers": 1,
|
|
"gates": [
|
|
"requireInternalKey"
|
|
]
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/internal/commands",
|
|
"handlers": 1,
|
|
"gates": [
|
|
"requireInternalKey"
|
|
]
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/internal/commands/dispatch",
|
|
"handlers": 1,
|
|
"gates": [
|
|
"requireInternalKey"
|
|
]
|
|
}
|
|
]
|
|
}
|