aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/server/routes/decks.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/routes/decks.ts')
-rw-r--r--src/server/routes/decks.ts82
1 files changed, 82 insertions, 0 deletions
diff --git a/src/server/routes/decks.ts b/src/server/routes/decks.ts
new file mode 100644
index 0000000..4604ea9
--- /dev/null
+++ b/src/server/routes/decks.ts
@@ -0,0 +1,82 @@
+import { zValidator } from "@hono/zod-validator";
+import { Hono } from "hono";
+import { z } from "zod";
+import { authMiddleware, Errors, getAuthUser } from "../middleware/index.js";
+import { type DeckRepository, deckRepository } from "../repositories/index.js";
+import { createDeckSchema, updateDeckSchema } from "../schemas/index.js";
+
+export interface DeckDependencies {
+ deckRepo: DeckRepository;
+}
+
+const deckIdParamSchema = z.object({
+ id: z.string().uuid(),
+});
+
+export function createDecksRouter(deps: DeckDependencies) {
+ const { deckRepo } = deps;
+
+ return new Hono()
+ .use("*", authMiddleware)
+ .get("/", async (c) => {
+ const user = getAuthUser(c);
+ const decks = await deckRepo.findByUserId(user.id);
+ return c.json({ decks }, 200);
+ })
+ .post("/", zValidator("json", createDeckSchema), async (c) => {
+ const user = getAuthUser(c);
+ const data = c.req.valid("json");
+
+ const deck = await deckRepo.create({
+ userId: user.id,
+ name: data.name,
+ description: data.description,
+ newCardsPerDay: data.newCardsPerDay,
+ });
+
+ return c.json({ deck }, 201);
+ })
+ .get("/:id", zValidator("param", deckIdParamSchema), async (c) => {
+ const user = getAuthUser(c);
+ const { id } = c.req.valid("param");
+
+ const deck = await deckRepo.findById(id, user.id);
+ if (!deck) {
+ throw Errors.notFound("Deck not found", "DECK_NOT_FOUND");
+ }
+
+ return c.json({ deck }, 200);
+ })
+ .put(
+ "/:id",
+ zValidator("param", deckIdParamSchema),
+ zValidator("json", updateDeckSchema),
+ async (c) => {
+ const user = getAuthUser(c);
+ const { id } = c.req.valid("param");
+ const data = c.req.valid("json");
+
+ const deck = await deckRepo.update(id, user.id, data);
+ if (!deck) {
+ throw Errors.notFound("Deck not found", "DECK_NOT_FOUND");
+ }
+
+ return c.json({ deck }, 200);
+ },
+ )
+ .delete("/:id", zValidator("param", deckIdParamSchema), async (c) => {
+ const user = getAuthUser(c);
+ const { id } = c.req.valid("param");
+
+ const deleted = await deckRepo.softDelete(id, user.id);
+ if (!deleted) {
+ throw Errors.notFound("Deck not found", "DECK_NOT_FOUND");
+ }
+
+ return c.json({ success: true }, 200);
+ });
+}
+
+export const decks = createDecksRouter({
+ deckRepo: deckRepository,
+});