wip version of the api
This commit is contained in:
parent
c24967dc74
commit
7d80b20390
8 changed files with 61 additions and 3 deletions
|
|
@ -1,12 +1,11 @@
|
||||||
import express from "express";
|
import express from "express";
|
||||||
import type { Express } from "express";
|
import type { Express } from "express";
|
||||||
|
import { apiRouter } from "./routes/apiRouter.js";
|
||||||
|
|
||||||
export function createApp() {
|
export function createApp() {
|
||||||
const app: Express = express();
|
const app: Express = express();
|
||||||
|
|
||||||
app.get("/api/health", (_req, res) => {
|
app.use("/api/v1", apiRouter);
|
||||||
res.json({ status: "ok" });
|
|
||||||
});
|
|
||||||
|
|
||||||
return app;
|
return app;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
8
apps/api/src/controllers/gameController.ts
Normal file
8
apps/api/src/controllers/gameController.ts
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
import type { Request, Response } from "express";
|
||||||
|
import { prepareQuestions } from "../services/gameService.js";
|
||||||
|
|
||||||
|
export const getGame = async (req: Request, res: Response) => {
|
||||||
|
const query = gameRequestSchema.parse(req.query);
|
||||||
|
const questions = await prepareQuestions(query);
|
||||||
|
res.json({ success: true, data: questions });
|
||||||
|
};
|
||||||
9
apps/api/src/routes/apiRouter.ts
Normal file
9
apps/api/src/routes/apiRouter.ts
Normal file
|
|
@ -0,0 +1,9 @@
|
||||||
|
import express from "express";
|
||||||
|
import { Router } from "express";
|
||||||
|
import { healthRouter } from "./healthRouter.js";
|
||||||
|
import { gameRouter } from "./gameRouter.js";
|
||||||
|
|
||||||
|
export const apiRouter: Router = express.Router();
|
||||||
|
|
||||||
|
apiRouter.use("/health", healthRouter);
|
||||||
|
apiRouter.use("/game", gameRouter);
|
||||||
7
apps/api/src/routes/gameRouter.ts
Normal file
7
apps/api/src/routes/gameRouter.ts
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
import express from "express";
|
||||||
|
import type { Router } from "express";
|
||||||
|
import { createGame } from "../controllers/gameController.js";
|
||||||
|
|
||||||
|
export const gameRouter: Router = express.Router();
|
||||||
|
|
||||||
|
gameRouter.get("/", createGame);
|
||||||
11
apps/api/src/routes/healthRouter.ts
Normal file
11
apps/api/src/routes/healthRouter.ts
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
import type { Request, Response } from "express";
|
||||||
|
|
||||||
|
export const healthRouter = (_req: Request, res: Response) => {
|
||||||
|
res
|
||||||
|
.status(200)
|
||||||
|
.json({
|
||||||
|
status: "ok",
|
||||||
|
uptime: process.uptime(),
|
||||||
|
timestamp: new Date().toISOString(),
|
||||||
|
});
|
||||||
|
};
|
||||||
3
apps/api/src/services/gameService.ts
Normal file
3
apps/api/src/services/gameService.ts
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
export const prepareQuestions = async (params: object) => {
|
||||||
|
console.log(params);
|
||||||
|
};
|
||||||
|
|
@ -1,3 +1,5 @@
|
||||||
export const SUPPORTED_LANGUAGE_CODES = ["en", "it"] as const;
|
export const SUPPORTED_LANGUAGE_CODES = ["en", "it"] as const;
|
||||||
|
|
||||||
export const SUPPORTED_POS = ["noun"] as const;
|
export const SUPPORTED_POS = ["noun"] as const;
|
||||||
|
|
||||||
|
export const GAME_ROUNDS = ["3", "10"] as const;
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,11 @@
|
||||||
import * as z from "zod";
|
import * as z from "zod";
|
||||||
|
|
||||||
|
import {
|
||||||
|
SUPPORTED_LANGUAGE_CODES,
|
||||||
|
SUPPORTED_POS,
|
||||||
|
GAME_ROUNDS,
|
||||||
|
} from "./constants.js";
|
||||||
|
|
||||||
export const Term = z.object({
|
export const Term = z.object({
|
||||||
id: z.uuid(),
|
id: z.uuid(),
|
||||||
synset_id: z.string(),
|
synset_id: z.string(),
|
||||||
|
|
@ -70,3 +76,16 @@ export const DeckTerm = z.object({
|
||||||
});
|
});
|
||||||
|
|
||||||
export type DeckTerm = z.infer<typeof DeckTerm>;
|
export type DeckTerm = z.infer<typeof DeckTerm>;
|
||||||
|
|
||||||
|
export const GameRequestSchema = z
|
||||||
|
.object({
|
||||||
|
source_language: z.enum(SUPPORTED_LANGUAGE_CODES),
|
||||||
|
target_language: z.enum(SUPPORTED_LANGUAGE_CODES),
|
||||||
|
pos: z.enum(SUPPORTED_POS),
|
||||||
|
rounds: z.enum(GAME_ROUNDS).transform(Number),
|
||||||
|
})
|
||||||
|
.refine((game) => game.target_language !== game.source_language, {
|
||||||
|
error: "source and target language must be different",
|
||||||
|
});
|
||||||
|
|
||||||
|
export type GameRequestSchema = z.infer<typeof GameRequestSchema>;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue