# Bug Report — PolyMPR > Généré le 2026-04-23 --- ## 🔴 Critique ### #1 — Schema mismatch : module mobility entièrement cassé **Fichier** : `routes/(apps)/mobility/api/insert_mobility.ts` Références à des colonnes inexistantes dans le schéma Drizzle : | Utilisé dans le code | Colonne réelle | | ---------------------- | ------------------ | | `students.userId` | `students.numEtud` | | `students.firstName` | `students.nom` | | `students.lastName` | `students.prenom` | | `students.promotionId` | `students.idPromo` | | `promotions.endyear` | `promotions.annee` | | `promotions.current` | _(n'existe pas)_ | Le module crashe à l'exécution. À corriger en alignant les noms de colonnes avec le schéma. --- ### #2 — Auth manquante sur de nombreux endpoints Les endpoints suivants n'ont aucune vérification `eduPersonPrimaryAffiliation` : - `routes/(apps)/notes/api/notes.ts` (GET, POST) - `routes/(apps)/notes/api/ue-modules.ts` (GET, POST) - `routes/(apps)/notes/api/ues.ts` (GET, POST) - `routes/(apps)/notes/api/ues/[idUE].ts` (GET, PUT, DELETE) - `routes/(apps)/admin/api/users.ts` (GET, POST) - `routes/(apps)/admin/api/users/[id].ts` (GET, PUT, DELETE) - `routes/(apps)/admin/api/modules/[idModule].ts` (GET, PUT, DELETE) - `routes/(apps)/admin/api/roles.ts` (GET, POST) - `routes/(apps)/admin/api/roles/[idRole].ts` (GET, PUT, DELETE) - `routes/(apps)/admin/api/permissions.ts` (GET) - `routes/(apps)/mobility/api/insert_mobility.ts` Tous ces endpoints exposent des données sensibles sans vérifier les permissions. --- ## 🟠 Haut ### #3 — Bug Drizzle ORM : `.where()` avec plusieurs `eq()` sans `and()` **Fichier** : `routes/(apps)/notes/api/ajustements/[numEtud]/[idUE].ts` — lignes 34, 72, 100 `.where()` n'accepte qu'un seul argument. Passer plusieurs `eq()` séparés par des virgules ne génère pas le SQL attendu (seule la première condition est prise en compte). ```ts // ❌ Incorrect .where(eq(ajustements.numEtud, numEtud), eq(ajustements.idUE, idUE)) // ✅ Correct .where(and(eq(ajustements.numEtud, numEtud), eq(ajustements.idUE, idUE))) ``` --- ### #4 — Bug Drizzle ORM : `.where()` à 3 conditions sans `and()` **Fichier** : `routes/(apps)/notes/api/ue-modules/[idModule]/[idUE]/[idPromo].ts` — handler GET (~ligne 41) Même problème que #3, mais avec 3 conditions. Les handlers PUT et DELETE ont déjà `and()`, seul le GET est affecté. ```ts // ❌ Incorrect .where( eq(ueModules.idModule, idModule), eq(ueModules.idUE, idUE), eq(ueModules.idPromo, idPromo), ) // ✅ Correct .where( and( eq(ueModules.idModule, idModule), eq(ueModules.idUE, idUE), eq(ueModules.idPromo, idPromo), ), ) ``` --- ## 🟡 Moyen ### #5 — `and()` passé avec des valeurs `undefined` **Fichier** : `routes/(apps)/notes/api/ue-modules.ts` ```ts and( idPromo ? eq(ueModules.idPromo, idPromo) : undefined, idUE ? eq(ueModules.idUE, idUE) : undefined, ); ``` Drizzle tolère les `undefined` dans `and()` dans certaines versions, mais ce n'est pas garanti. Mieux vaut construire les conditions dynamiquement avant de les passer. --- ### #6 — Validation `!numEtud` rejette faussement `0` **Fichier** : `routes/(apps)/notes/api/notes.ts` — handler POST ```ts // ❌ Rejette numEtud = 0 if (note === undefined || !numEtud || !idModule) // ✅ Correct if (note === undefined || numEtud === undefined || numEtud === null || !idModule) ``` --- ### #7 — `Number(idRole)` sans vérification `isNaN` **Fichier** : `routes/(apps)/admin/api/users.ts` Si `idRole` est une chaîne non numérique, `Number()` retourne `NaN` ce qui provoque une erreur SQL. ```ts // ❌ Pas de vérification const rows = idRole ? await db.select().from(users).where(eq(users.idRole, Number(idRole))) : await db.select().from(users); // ✅ Valider avant usage const role = Number(idRole); if (isNaN(role)) return new Response(..., { status: 400 }); ``` --- ### #8 — Réponses d'erreur en texte brut au lieu de JSON **Fichier** : `routes/(apps)/notes/api/notes.ts` Certaines réponses d'erreur retournent une string sans `content-type: application/json`, incohérent avec le reste de l'API qui retourne `{ error: "..." }`.