import { Router } from "express"; import { db, timeEntriesTable } from "@workspace/db"; import { eq, and } from "drizzle-orm"; import { CreateTimeEntryBody, ListTimeEntriesQueryParams, DeleteTimeEntryParams, } from "@workspace/api-zod"; const router = Router(); router.get("/time-entries", async (req, res) => { const query = ListTimeEntriesQueryParams.safeParse(req.query); if (!query.success) { res.status(400).json({ error: query.error.message }); return; } const { projectId } = query.data; const entries = await db .select() .from(timeEntriesTable) .where(and(eq(timeEntriesTable.userId, req.user!.id), projectId !== undefined ? eq(timeEntriesTable.projectId, projectId) : undefined)) .orderBy(timeEntriesTable.createdAt); res.json(entries); }); router.post("/time-entries", async (req, res) => { const body = CreateTimeEntryBody.safeParse(req.body); if (!body.success) { res.status(400).json({ error: body.error.message }); return; } const [entry] = await db.insert(timeEntriesTable).values({ ...body.data, userId: req.user!.id }).returning(); res.status(201).json(entry); }); router.delete("/time-entries/:id", async (req, res) => { const params = DeleteTimeEntryParams.safeParse({ id: Number(req.params.id) }); if (!params.success) { res.status(400).json({ error: params.error.message }); return; } await db.delete(timeEntriesTable).where(and(eq(timeEntriesTable.id, params.data.id), eq(timeEntriesTable.userId, req.user!.id))); res.status(204).send(); }); export default router;