SPB Git forge

spb/immbot-ai

Public
1commits 1branches 0releases
1.5 MBsize
maindefault branch
20 days agolast push
TypeScript 98.3% CSS 0.9% Shell 0.7%
2.1 KB · 51 lines typescript
Raw Blame History
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