- Migrations 'organizations' (id, name, siret, monthly_volume_bucket, rubis_count, onboarding_completed_at) + alter users (organization_id FK + signature).
- Modèle Organization avec relation hasMany Users, User étendu avec belongsTo Organization.
- Signup transactionnel : crée une org vide ('') puis l'user, puis émet le access token. Le nom de l'org reste vide tant que l'utilisateur n'a pas franchi la première étape de l'onboarding (PATCH /organizations/me).
- Réponses /auth/* alignées sur le contrat SPA AuthSession : { data: { accessToken, expiresAt, user } }. Drop passwordConfirmation (le SPA n'envoie pas ce champ).
- Endpoints :
- GET /account/profile (déjà), PATCH /account/profile (nouveau, fullName/email/signature).
- GET /organizations/me + PATCH /organizations/me (name/siret/monthlyVolumeBucket).
- Pose automatique d'onboardingCompletedAt à la première mise en place du nom de l'org — remplace l'astuce 'signature !== null' utilisée côté MSW.
- Transformers convertissent les IDs en string (pour matcher packages/shared/src/types).
- HMR boundaries élargies : transformers/validators/services se rechargent maintenant à chaud (sinon les modifs ne sont pas vues sans restart manuel).
36 lines
1.0 KiB
TypeScript
36 lines
1.0 KiB
TypeScript
import vine from '@vinejs/vine'
|
|
|
|
/**
|
|
* Shared rules for email and password.
|
|
*/
|
|
const email = () => vine.string().email().maxLength(254)
|
|
const password = () => vine.string().minLength(8).maxLength(72)
|
|
|
|
/**
|
|
* Validator pour /auth/signup. Contrat aligné sur le SPA (Zod
|
|
* `registerSchema` dans packages/shared). Pas de passwordConfirmation
|
|
* côté API : la confirmation visuelle est une affaire de formulaire.
|
|
*/
|
|
export const signupValidator = vine.create({
|
|
email: email().unique({ table: 'users', column: 'email' }),
|
|
password: password(),
|
|
fullName: vine.string().minLength(2).maxLength(120),
|
|
})
|
|
|
|
/**
|
|
* Validator pour /auth/login.
|
|
*/
|
|
export const loginValidator = vine.create({
|
|
email: email(),
|
|
password: vine.string(),
|
|
})
|
|
|
|
/**
|
|
* Validator pour /account/profile (PATCH). Tous les champs optionnels.
|
|
*/
|
|
export const updateProfileValidator = vine.create({
|
|
fullName: vine.string().minLength(2).maxLength(120).optional(),
|
|
email: email().optional(),
|
|
signature: vine.string().maxLength(500).optional(),
|
|
})
|