4.1 KiB
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).
// ❌ 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é.
// ❌ 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
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
// ❌ 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.
// ❌ 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: "..." }.