Aller au contenu

Register

Contrôleur HTTP du flux post-signup investisseur : validation du référant, complétion du profil et upload des documents d'identité (KYC). Source : register.controller.ts.

Le sign-up email/mot de passe et la vérification d'email initiale passent par Better Auth (POST /api/auth/sign-up/email, plugin emailOTP) — voir auth.md.

GET /customers/referral-code-exists est public. Les autres endpoints requièrent une session investisseur Better Auth (JwtAuthGuard) et le rôle CUSTOMER (UserRoleGuard).

GET /customers/referral-code-exists

Vérifie l'existence d'un code de parrainage. Public — utilisé pendant le sign-up pour valider le code en temps réel.

Décorateur : @Get('referral-code-exists'). Endpoint public.

Query param

  • referralCode — code de parrainage à vérifier (trim, lowercase, sans diacritiques)

Validé via getReferralExistsEndpoint.request.body.

Response

{
  "referralCodeExists": true
}

Type retour : getReferralExistsEndpoint.response.T.

GET /customers/email/send-code

Re-envoie le code de validation d'email à l'investisseur courant (action MFA email-validation).

Décorateur : @Get('email/send-code').

Pré-conditions

  • Session investisseur Better Auth valide
  • Rôle CUSTOMER

Response

204 No Content.

Erreurs

Code Statut Cause
2fa.too-many-attempts 403 L'investisseur a dépassé le nombre de renvois autorisés

PATCH /customers/profile

Sauvegarde et valide les informations personnelles de l'investisseur (étape KYC : profil). Marque forms.information comme completed.

Décorateur : @Patch('profile').

Pré-conditions

  • Session investisseur Better Auth valide
  • Rôle CUSTOMER
  • Statut KYC ≠ verified et ≠ waitingForVerifier (sinon 403)

Request body

{
  "customerType": "individual",
  "firstName": "Alice",
  "lastName": "Martin",
  "citizenship": "FR",
  "city": "Paris",
  "cityOfBirth": "Lyon",
  "country": "FRA",
  "countryOfBirth": "FRA",
  "dateOfBirth": "1990-01-15",
  "phone": "+33612345678",
  "postcode": "75001",
  "sex": "F",
  "street": "1 rue de la Paix"
}

Validé via registrationProfile (registration.payloads.ts). Contraintes :

  • firstName, lastName — 2 à 256 caractères
  • country, countryOfBirth — exactement 3 caractères (ISO 3166-1 alpha-3)
  • city, cityOfBirth — max 140 caractères ; street — max 256 caractères
  • citizenship — max 19 caractères
  • postcode — max 10 caractères
  • customerTypeindividual ou business
  • dateOfBirthbirthDateValidator (date majeure)
  • phonephoneValidator

Response

CustomerProfileService.getMe — vue investisseur enrichie (cf. customers.md).

Erreurs

Code Statut Cause
(générique) 403 KYC déjà verified ou waitingForVerifier

POST /customers/investor-identity-document

Upload d'un document d'identité KYC (carte d'identité, passeport, permis de conduire, titre de séjour). Endpoint legacy onboarding v1 uniquement.

Décorateur : @Post('investor-identity-document'). Utilise FileInterceptor('file').

Pré-conditions

  • Session investisseur Better Auth valide
  • Rôle CUSTOMER
  • customer.lemonway.onboardingVersion === 'v1' (sinon 403 avec alerte Slack alerts-onboarding-v2-migration-prod)
  • CustomerProfile existe (étape PATCH /customers/profile faite)
  • Statut KYC ≠ verified et ≠ waitingForVerifier

Request body (multipart/form-data)

  • file — fichier binaire (taille max selon multerFileOptions())
  • type — un de identityCard, passportEU, residencePermit, drivingLicence

Response

CustomerProfileService.getMe — vue investisseur enrichie.

Effet

  • Stocke le document dans Azure Storage (replace si un document du même type existe)
  • Insère un InvestorIdentityDocument en statut to_be_uploaded (sera uploadé chez Lemonway plus tard)
  • Pour customerType: individual : appelle CustomerAuthService.finishKyc — upload immédiatement chez Lemonway et passe le statut KYC à waitingForVerifier
  • Pour customerType: business : marque forms.documents comme completed, le finish KYC est déclenché par POST /customers/investor-business-document

Erreurs

Code Statut Cause
onboarding.v1-is-not-enabled 403 Customer en onboarding v2 (V1 désactivée) — alerte Slack envoyée
(générique) 403 Pas de CustomerProfile ou KYC verified / waitingForVerifier
register.profile.required 404 Pas de CustomerProfile (depuis finishKyc)
register.documents.required 400 Aucun document à uploader chez Lemonway (depuis finishKyc)

POST /customers/investor-business-document

Finalise le KYC pour les comptes business après upload manuel des documents business par le support (typeform). Aucun upload ici — juste un trigger pour passer en waitingForVerifier.

Décorateur : @Post('investor-business-document').

Pré-conditions

  • Session investisseur Better Auth valide
  • Rôle CUSTOMER
  • customer.lemonway.onboardingVersion === 'v1'
  • customerType === 'business'
  • Statut KYC ≠ verified et ≠ waitingForVerifier

Response

CustomerProfileService.getMe — vue investisseur enrichie.

Effet

Appelle CustomerAuthService.finishKyc — upload des documents d'identité chez Lemonway et passe le statut KYC à waitingForVerifier.

Erreurs

Code Statut Cause
onboarding.v1-is-not-enabled 403 Customer en onboarding v2
(générique) 403 Pas de CustomerProfile, customerType individual, ou KYC verified / waitingForVerifier
register.profile.required 404 Pas de CustomerProfile (depuis finishKyc)
register.documents.required 400 Aucun document chez Bricks (depuis finishKyc)

GET /customers/investor-identity-document

Liste les documents d'identité Lemonway de l'investisseur courant (extraction du champ lemonway des investor_identity_document).

Décorateur : @Get('investor-identity-document').

Pré-conditions

  • Session investisseur Better Auth valide
  • Rôle CUSTOMER

Response

[
  {
    "status": "uploaded",
    "type": "identityCard",
    "lemonwayId": 123,
    "name": "abc123_passport.pdf"
  }
]

Tableau de InvestorIdentityDocument['lemonway'] validé par manyInvestorIdentityDocumentPG. Requête PG directe sur investor_identity_document filtré par investorId.

Liens