From 5178f18c7963c0dec3052b3c9d43358dc23c6331 Mon Sep 17 00:00:00 2001 From: Devin Zuczek Date: Fri, 25 Sep 2026 10:32:42 -0400 Subject: [PATCH] [api] fix progression stub --- apps/api/src/routes/progression.ts | 26 +++++++++++++---------- apps/api/src/test/integration/api.test.ts | 8 +++---- 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/apps/api/src/routes/progression.ts b/apps/api/src/routes/progression.ts index 347681a..9f665dd 100644 --- a/apps/api/src/routes/progression.ts +++ b/apps/api/src/routes/progression.ts @@ -16,6 +16,7 @@ import { NotificationType } from '../../../notify/src/notification-types' import { authedId, parseFormIds, queryIds, unauthorized } from '../http' import { AUTHED, + BareInteger, BulkIdsRequest, CheerPlayerRequest, CheerPlayerResponse, @@ -520,23 +521,26 @@ export const progressionRoutes = new Hono({ strict: false }) } ) - // The progression events running right now — the limited-time XP events the client shows + // The progression event running right now — the limited-time XP event the client shows // a banner and a progress track for. // - // STUB: an empty list, which the client reads as "no event on" and skips the event UI - // entirely. That is the honest answer (nothing here runs events) and the safe one: a - // fabricated event would draw a track that never fills. No auth — whether an event is - // running is the same fact for everybody, and the client asks while loading. + // STUB: a bare `-1`, the reference server's "no active event" value (the id of the + // active event, or -1 when there is none). The client reads it as "no event on" and + // skips the event UI entirely. That is the honest answer (nothing here runs events) and + // the safe one: a fabricated event would draw a track that never fills. No auth — + // whether an event is running is the same fact for everybody, and the client asks while + // loading. .get( '/api/progressionEvents/active', describeRoute({ tags: ['Progression'], - summary: 'Progression events currently running (stub)', + summary: 'Progression event currently running (stub)', description: - 'The limited-time XP events in progress. Always an empty list — nothing on this ' + - 'server runs one — which the client reads as “no event” and skips the event UI, ' + - 'where a 404 would stall the load. No auth: it is the same answer for every player.', - responses: { 200: json(JsonArray, 'Empty — no event is running') }, + 'The limited-time XP event in progress, as a bare event id. Always `-1` — the ' + + '“no active event” value; nothing on this server runs one — which the client reads ' + + 'as “no event” and skips the event UI, where a 404 would stall the load. No auth: ' + + 'it is the same answer for every player.', + responses: { 200: json(BareInteger, 'A bare `-1` — no event is running') }, }), - (c) => c.json([]) + (c) => c.json(-1) ) diff --git a/apps/api/src/test/integration/api.test.ts b/apps/api/src/test/integration/api.test.ts index 5abc501..01c3583 100644 --- a/apps/api/src/test/integration/api.test.ts +++ b/apps/api/src/test/integration/api.test.ts @@ -2055,12 +2055,12 @@ describe('public endpoints', () => { expect(res.status).toBe(400) }) - test('GET /api/progressionEvents/active is an empty list (no auth)', async () => { - // The client reads an empty list as "no event running" and skips the event UI; a 404 - // would stall its load instead. + test('GET /api/progressionEvents/active is a bare -1 (no auth)', async () => { + // -1 is the reference server's "no active event" value; the client reads it as "no event + // running" and skips the event UI. A 404 would stall its load instead. const res = await exports.default.fetch(`${ORIGIN}/api/progressionEvents/active`) expect(res.status).toBe(200) - expect(await res.json()).toEqual([]) + expect(await res.json()).toBe(-1) }) test('GET /api/rooms/v1/filters returns an object with filter arrays', async () => {