import type { z } from "zod"; import { playerStateSchema, serverTimeSchema } from "./entities"; import { acknowledgeSummariesRequestSchema, acknowledgeSummariesResponseSchema, assignPilotRequestSchema, bayResponseSchema, buyShipRequestSchema, claimGoalRequestSchema, companyResponseSchema, contractBoardRequestSchema, contractBoardResponseSchema, createDispatchRequestSchema, createGuestResponseSchema, dispatchResponseSchema, emptyRequestSchema, hirePilotRequestSchema, leaseBayRequestSchema, pilotResponseSchema, backupCodeResponseSchema, devAddCreditsRequestSchema, devAdvanceClockRequestSchema, devAdvanceClockResponseSchema, backupCodeStatusSchema, renameCompanyRequestSchema, restoreRequestSchema, repayLoanRequestSchema, shipResponseSchema, spendSkillPointRequestSchema, restPilotRequestSchema, startUpgradeRequestSchema, unassignPilotRequestSchema, } from "./requests"; export interface RouteDef { method: "GET" | "POST"; /** Under `/api` (decision 0.5.20). `:name` segments are path parameters. */ path: string; /** Path parameters plus body: every `:name` in the path is a field here. */ request: z.ZodType; /** Body of the 2xx response. Errors always use `errorResponseSchema`. */ response: z.ZodType; /** Whether a session is required. */ auth: boolean; } /** Every endpoint of the base game: the contract between server and client. */ export const routes = { getServerTime: { method: "GET", path: "/api/time", request: emptyRequestSchema, response: serverTimeSchema, auth: false, }, createGuest: { method: "POST", path: "/api/guest", request: emptyRequestSchema, response: createGuestResponseSchema, auth: false, }, getPlayerState: { method: "GET", path: "/api/state", request: emptyRequestSchema, response: playerStateSchema, auth: true, }, getContractBoard: { method: "GET", path: "/api/locations/:locationId/board", request: contractBoardRequestSchema, response: contractBoardResponseSchema, auth: true, }, getTutorialBoard: { method: "GET", path: "/api/tutorial/board", request: emptyRequestSchema, response: contractBoardResponseSchema, auth: true, }, createDispatch: { method: "POST", path: "/api/dispatches", request: createDispatchRequestSchema, response: dispatchResponseSchema, auth: true, }, buyShip: { method: "POST", path: "/api/ships", request: buyShipRequestSchema, response: shipResponseSchema, auth: true, }, startUpgrade: { method: "POST", path: "/api/ships/:shipId/upgrades", request: startUpgradeRequestSchema, response: shipResponseSchema, auth: true, }, leaseBay: { method: "POST", path: "/api/bays", request: leaseBayRequestSchema, response: bayResponseSchema, auth: true, }, hirePilot: { method: "POST", path: "/api/pilots", request: hirePilotRequestSchema, response: pilotResponseSchema, auth: true, }, assignPilot: { method: "POST", path: "/api/pilots/:pilotId/assign", request: assignPilotRequestSchema, response: pilotResponseSchema, auth: true, }, unassignPilot: { method: "POST", path: "/api/pilots/:pilotId/unassign", request: unassignPilotRequestSchema, response: pilotResponseSchema, auth: true, }, restPilot: { method: "POST", path: "/api/pilots/:pilotId/rest", request: restPilotRequestSchema, response: pilotResponseSchema, auth: true, }, spendSkillPoint: { method: "POST", path: "/api/pilots/:pilotId/skills", request: spendSkillPointRequestSchema, response: pilotResponseSchema, auth: true, }, acknowledgeSummaries: { method: "POST", path: "/api/summaries/acknowledge", request: acknowledgeSummariesRequestSchema, response: acknowledgeSummariesResponseSchema, auth: true, }, acceptDeal: { method: "POST", path: "/api/deal/accept", request: emptyRequestSchema, response: playerStateSchema, auth: true, }, getBackupCode: { method: "GET", path: "/api/backup-code", request: emptyRequestSchema, response: backupCodeStatusSchema, auth: true, }, createBackupCode: { method: "POST", path: "/api/backup-code", request: emptyRequestSchema, response: backupCodeResponseSchema, auth: true, }, restoreCompany: { method: "POST", path: "/api/restore", request: restoreRequestSchema, response: createGuestResponseSchema, auth: false, }, /** Non-production only (CR-011): not registered when NODE_ENV is production. */ devAdvanceClock: { method: "POST", path: "/api/test/advance-clock", request: devAdvanceClockRequestSchema, response: devAdvanceClockResponseSchema, auth: true, }, devAddCredits: { method: "POST", path: "/api/test/add-credits", request: devAddCreditsRequestSchema, response: companyResponseSchema, auth: true, }, newCompany: { method: "POST", path: "/api/company/new", request: emptyRequestSchema, response: playerStateSchema, auth: true, }, renameCompany: { method: "POST", path: "/api/company/name", request: renameCompanyRequestSchema, response: companyResponseSchema, auth: true, }, repayLoan: { method: "POST", path: "/api/loan/repay", request: repayLoanRequestSchema, response: companyResponseSchema, auth: true, }, claimGoal: { method: "POST", path: "/api/goals/:goalId/claim", request: claimGoalRequestSchema, response: companyResponseSchema, auth: true, }, } as const satisfies Record; export type Routes = typeof routes; export type RouteName = keyof Routes; export type RouteRequest = z.input; export type RouteResponse = z.output;