import { FreshContext, Handlers } from "$fresh/server.ts"; import { db } from "$root/databases/db.ts"; import { students } from "$root/databases/schema.ts"; import { AuthenticatedState } from "$root/defaults/interfaces.ts"; // #9 POST /students/import-csv export const handler: Handlers = { async POST( request: Request, context: FreshContext, ): Promise { if (context.state.session.eduPersonPrimaryAffiliation !== "employee") { return new Response(null, { status: 403 }); } const formData = await request.formData(); const file = formData.get("file") as File | null; const idPromo = formData.get("idPromo") as string | null; if (!file || !idPromo) { return new Response(null, { status: 400 }); } const text = await file.text(); const lines = text.trim().split("\n"); let imported = 0; const errors: { line: number; message: string }[] = []; for (let i = 0; i < lines.length; i++) { const lineNum = i + 1; const cols = lines[i].split(",").map((c) => c.trim()); const [numEtudStr, nom, prenom] = cols; if (!numEtudStr) { errors.push({ line: lineNum, message: "Numéro étudiant manquant" }); continue; } const numEtud = Number(numEtudStr); if (isNaN(numEtud)) { errors.push({ line: lineNum, message: "Numéro étudiant invalide" }); continue; } if (!nom || !prenom) { errors.push({ line: lineNum, message: "Nom ou prénom manquant" }); continue; } await db .insert(students) .values({ nom, prenom, idPromo }) .onConflictDoNothing(); imported++; } return new Response(JSON.stringify({ imported, errors }), { headers: { "content-type": "application/json" }, }); }, };