diff --git a/routes/(apps)/students/api/students.ts b/routes/(apps)/students/api/students.ts index b71e8e6..2c09757 100644 --- a/routes/(apps)/students/api/students.ts +++ b/routes/(apps)/students/api/students.ts @@ -1,122 +1,57 @@ import { FreshContext, Handlers } from "$fresh/server.ts"; import { db } from "$root/databases/db.ts"; -import { promotions, students } from "$root/databases/schema.ts"; +import { students } from "$root/databases/schema.ts"; import { AuthenticatedState } from "$root/defaults/interfaces.ts"; -import { eq, lt } from "npm:drizzle-orm"; - -async function getItself( - userId: string, -): Promise<{ student: Student | null; promo: Promotion | null }> { - const student = await db - .select() - .from(students) - .where(eq(students.userId, userId)) - .limit(1) - .then((rows) => rows[0] ?? null); - - if (!student) { - return { student: null, promo: null }; - } - - const promo = await db - .select() - .from(promotions) - .where(eq(promotions.id, student.promotionId!)) - .limit(1) - .then((rows) => rows[0] ?? null); - - return { student, promo }; -} - -async function getAll(): Promise< - { students: Student[]; promos: Promotion[] } -> { - const rows = await db - .select({ - userId: students.userId, - firstName: students.firstName, - lastName: students.lastName, - mail: students.mail, - promotionId: students.promotionId, - }) - .from(students) - .innerJoin(promotions, eq(students.promotionId, promotions.id)) - .where(lt(promotions.current, 6)); - - const promos = await db - .select() - .from(promotions) - .where(lt(promotions.current, 6)); - - return { students: rows as Student[], promos }; -} - -async function addStudents( - studentList: Student[], - promoId: number, -): Promise { - for (const student of studentList) { - await db - .insert(students) - .values({ - userId: student.userId, - firstName: student.firstName, - lastName: student.lastName, - mail: student.mail, - promotionId: promoId, - }) - .onConflictDoNothing(); - } -} +import { eq } from "npm:drizzle-orm"; export const handler: Handlers = { + // #7 GET /students async GET( - _request: Request, + request: Request, context: FreshContext, ): Promise { - if (context.state.session.eduPersonPrimaryAffiliation == "student") { - return new Response( - JSON.stringify(await getItself(context.state.session.uid)), - { headers: { "content-type": "application/json" } }, - ); + if (context.state.session.eduPersonPrimaryAffiliation !== "employee") { + return new Response(JSON.stringify([]), { + headers: { "content-type": "application/json" }, + }); } - return new Response( - JSON.stringify(await getAll()), - { headers: { "content-type": "application/json" } }, - ); + const url = new URL(request.url); + const idPromo = url.searchParams.get("idPromo"); + + const rows = idPromo + ? await db.select().from(students).where(eq(students.idPromo, idPromo)) + : await db.select().from(students); + + return new Response(JSON.stringify(rows), { + headers: { "content-type": "application/json" }, + }); }, + // #8 POST /students async POST( request: Request, - _context: FreshContext, + context: FreshContext, ): Promise { - const { students: studentList, promo }: { - students: Student[]; - promo: string; - } = await request.json(); + if (context.state.session.eduPersonPrimaryAffiliation !== "employee") { + return new Response(null, { status: 403 }); + } - if (!promo || !promo.match(/^\d{4}-\dA$/) || !Array.isArray(studentList)) { + const body: { numEtud: number; nom: string; prenom: string; idPromo: string } = + await request.json(); + + if (!body.nom || !body.prenom || !body.idPromo) { return new Response(null, { status: 400 }); } - const { endyear, current } = promo.match( - /^(?\d{4})-(?\d)A$/, - )?.groups!; + const [created] = await db + .insert(students) + .values({ nom: body.nom, prenom: body.prenom, idPromo: body.idPromo }) + .returning(); - await db - .insert(promotions) - .values({ endyear: Number(endyear), current: Number(current) }) - .onConflictDoNothing(); - - const promo_row = await db - .select() - .from(promotions) - .where(eq(promotions.endyear, Number(endyear))) - .then((rows) => rows.find((r) => r.current === Number(current))!); - - await addStudents(studentList, promo_row.id); - - return new Response(null, { status: 201 }); + return new Response(JSON.stringify(created), { + status: 201, + headers: { "content-type": "application/json" }, + }); }, };