diff --git a/routes/(apps)/students/api/students/import-csv.ts b/routes/(apps)/students/api/students/import-csv.ts new file mode 100644 index 0000000..1e233a0 --- /dev/null +++ b/routes/(apps)/students/api/students/import-csv.ts @@ -0,0 +1,64 @@ +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" }, + }); + }, +};