Skip to content

fix(shared): valide permissionLevelSchema comme entier (400 au lieu de 500) - #2951

Open
shikanime wants to merge 1 commit into
cloud-pi-native:mainfrom
shikanime-labs:fix/role-permissions-400
Open

shikanime wants to merge 1 commit into
cloud-pi-native:mainfrom
shikanime-labs:fix/role-permissions-400

Conversation

@shikanime

@shikanime shikanime commented Oct 27, 2026 •

Copy link
Copy Markdown
Member

Pourquoi

POST /api/v1/projects/:projectId/roles renvoie un 500 (Cannot convert 256,512 to a BigInt) quand permissions est un CSV — le schéma source acceptait toute chaîne et la validation n'atteignait jamais le service avant BigInt().

Quoi

Correctif à la source, en deux volets :

  • permissionLevelSchema (réponses, wire = string) porte un refine /^\d+$/ : tout non-entier est rejeté en 400 par le contrat, avant les services.
  • permissionLevelInputSchema (corps de requête) = le même refine + .transform(BigInt) : la conversion est déléguée au schéma. createProjectRole, patchProjectRoles, patchAdminRoles, createAdminToken et updateProject.everyonePerms livrent un bigint aux services — les sept BigInt() manuels des services (project-roles, admin-role, admin-token, project — legacy fastify et nestjs) disparaissent, avec le piège de falsiness 0n réglé par ??.

Le default('0') du contrat createProjectRole préserve les corps sans permissions (l'ancien z.coerce.string() les convertissait en la chaîne littérale "undefined" — un 500 BigInt latent en production). Les réponses sérialisent des BigInt DB via .toString() (toujours /^\d+$/) : le refine ne peut pas les casser.

Vérification

  • pnpm --filter @cpn-console/shared test — 95/95, dont le spec : rejet CSV au niveau schéma et contrat, sortie 256n, default 0n.
  • Suites locales : server-nestjs 974/974, server 369/369, client 86/86.
  • Typecheck : nest build (server-nestjs), tsc (server), vue-tsc (client) — 0 erreur.

Closes #2950

Co-authored-by: Automata automata@shikanime.studio

@shikanime
shikanime requested a review from a team as a code owner October 27, 2026 15:49
@shikanime

Copy link
Copy Markdown
Member Author

Note CI : les 3 jobs build échouent uniquement au push ghcr.io (denied: installation not allowed to Write organization package) — artefact de PR venue d'un fork, le token ne peut pas écrire les packages de l'org. La compilation, le lint et les tests unitaires (y compris le nouveau spec sur le rejet du CSV) passent. Une re-run depuis une branche de l'org sera verte.

StephaneTrebel
StephaneTrebel previously approved these changes Oct 28, 2026

@StephaneTrebel StephaneTrebel left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Le correctif du POST décrit dans #2950 est effectif : 32 tests de schémas et 6 sondes supplémentaires sur le contrat exact et le ZodValidationPipe passent, dont le rejet du CSV en 400. Une remarque non bloquante concerne la portée du test versionné ; la CI reste en échec sur la publication GHCR (denied: installation not allowed to Write organization package, run 40539505724), sans échec de compilation relevé dans ces jobs.

Comment thread packages/shared/src/utils/schemas.spec.ts Outdated
StephaneTrebel
StephaneTrebel previously approved these changes Oct 28, 2026

@StephaneTrebel StephaneTrebel left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No findings. Le test consomme désormais le contrat exact : 32 tests ciblés et le lint passent, et retirer l’extension fait échouer ce test avant qu’il repasse après restauration ; la remarque précédente est corrigée. La CI reste rouge sur le push GHCR des trois images (denied: installation not allowed to Write organization package, run 40667240564), suivi par #2945/#2956, sans nouveau défaut fonctionnel relevé dans ce diff.

@shikanime
shikanime disabled auto-merge October 28, 2026 12:39
@shikanime
shikanime enabled auto-merge October 28, 2026 12:39
@shikanime
shikanime force-pushed the fix/role-permissions-400 branch from 5bfc68f to 3cffc6e Compare October 28, 2026 14:00
@shikanime
shikanime disabled auto-merge October 28, 2026 14:08
@shikanime
shikanime added this pull request to the merge queue Oct 28, 2026
@shikanime shikanime self-assigned this Oct 28, 2026
@shikanime shikanime added the bug Something isn't working label Oct 28, 2026
@shikanime shikanime linked an issue Oct 28, 2026 that may be closed by this pull request
2 tasks done
@shikanime shikanime added this to the 9.29.0 milestone Oct 28, 2026
@shikanime
shikanime removed this pull request from the merge queue due to a manual request Oct 28, 2026
@shikanime
shikanime force-pushed the fix/role-permissions-400 branch 6 times, most recently from c622ea0 to 39bfbaa Compare October 29, 2026 01:17
POST /api/v1/projects/:projectId/roles renvoyait 500 (Cannot convert 256,512 to a BigInt) sur un permissions CSV : le schéma source acceptait toute chaîne et la validation n'atteignait jamais le service.

Correctif à la source, en deux volets :
- permissionLevelSchema (réponses, wire string) porte un refine /^\d+$/ — tout CSV/non-entier est rejeté en 400 par le contrat, avant les services.
- permissionLevelInputSchema (corps de requête) transforme la chaîne validée en BigInt via .transform(BigInt) : createProjectRole, patchProjectRoles, patchAdminRoles, createAdminToken et updateProject.everyonePerms délèguent la conversion au schéma. Les sept BigInt() manuels des services disparaissent (project-roles, admin-role, admin-token, project — legacy fastify et nestjs), avec le piège de falsiness 0n réglé par ??.

Le default '0' du contrat createProjectRole préserve les corps sans permissions (l'ancien z.coerce.string() les convertissait en la chaîne littérale "undefined" — un 500 BigInt latent). Les réponses sérialisent des BigInt DB via toString(), le refine ne peut pas les casser.

Specs : rejet CSV au niveau schéma + contrat, sortie bigint (256n), default 0n.

Closes cloud-pi-native#2950

Co-authored-by: Automata <automata@shikanime.studio>
@shikanime
shikanime force-pushed the fix/role-permissions-400 branch from 39bfbaa to 40b3bf5 Compare October 29, 2026 09:52
Comment thread apps/server/src/resources/project/business.ts
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

fix(project-roles): permissions CSV provoque un 500 BigInt au lieu d'un 400

2 participants