TypeScript 98.3%
CSS 0.9%
Shell 0.7%
1// Cahier d'erreurs : consultation et gestion des statuts.2import { NextResponse } from "next/server";3import { z } from "zod";4import { apiError, parseBody } from "@/lib/api.ts";5import { assertSameOrigin, requireUser } from "@/lib/auth/session.ts";6import { all, get, run } from "@/lib/db/index.ts";78export async function GET(req: Request) {9 try {10 const user = await requireUser();11 const url = new URL(req.url);12 const course = url.searchParams.get("course")?.toUpperCase() ?? null;13 const status = url.searchParams.get("status");14 const params: unknown[] = [user.id];15 let where = "e.user_id = ?";16 if (course) { where += " AND e.course_code = ?"; params.push(course); }17 if (status && ["comprise", "a-revoir", "maitrisee"].includes(status)) { where += " AND e.status = ?"; params.push(status); }18 const errors = all(19 `SELECT e.id, e.course_code, e.concept_id, c.name as concept_name, e.question, e.given_answer,20 e.correction, e.explanation, e.source, e.status, e.created_at21 FROM error_notebook e LEFT JOIN concepts c ON c.id = e.concept_id22 WHERE ${where} ORDER BY e.id DESC LIMIT 200`,23 ...params24 );25 return NextResponse.json({ errors });26 } catch (e) {27 return apiError(e);28 }29}3031const schema = z.object({32 id: z.number().int().positive(),33 status: z.enum(["comprise", "a-revoir", "maitrisee"]).optional(),34 remove: z.boolean().optional(),35});3637export async function PATCH(req: Request) {38 try {39 await assertSameOrigin();40 const user = await requireUser();41 const body = await parseBody(req, schema);42 const row = get("SELECT id FROM error_notebook WHERE id = ? AND user_id = ?", body.id, user.id);43 if (!row) return NextResponse.json({ error: "Entrée introuvable." }, { status: 404 });44 if (body.remove) run("DELETE FROM error_notebook WHERE id = ?", body.id);45 else if (body.status) run("UPDATE error_notebook SET status = ?, updated_at = datetime('now') WHERE id = ?", body.status, body.id);46 return NextResponse.json({ ok: true });47 } catch (e) {48 return apiError(e);49 }50}51