Files
PolyMPR/bugs.md
T

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: "..." }.