deadhead-space-freight-tycoon/packages/schema/src/routes.ts

174 lines
4.4 KiB
TypeScript

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,
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,
},
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<string, RouteDef>;
export type Routes = typeof routes;
export type RouteName = keyof Routes;
export type RouteRequest<N extends RouteName> = z.input<Routes[N]["request"]>;
export type RouteResponse<N extends RouteName> = z.output<Routes[N]["response"]>;