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¶
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 ≠
verifiedet ≠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èrescountry,countryOfBirth— exactement 3 caractères (ISO 3166-1 alpha-3)city,cityOfBirth— max 140 caractères ;street— max 256 caractèrescitizenship— max 19 caractèrespostcode— max 10 caractèrescustomerType—individualoubusinessdateOfBirth—birthDateValidator(date majeure)phone—phoneValidator
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 Slackalerts-onboarding-v2-migration-prod)CustomerProfileexiste (étapePATCH /customers/profilefaite)- Statut KYC ≠
verifiedet ≠waitingForVerifier
Request body (multipart/form-data)¶
file— fichier binaire (taille max selonmulterFileOptions())type— un deidentityCard,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
InvestorIdentityDocumenten statutto_be_uploaded(sera uploadé chez Lemonway plus tard) - Pour
customerType: individual: appelleCustomerAuthService.finishKyc— upload immédiatement chez Lemonway et passe le statut KYC àwaitingForVerifier - Pour
customerType: business: marqueforms.documentscommecompleted, le finish KYC est déclenché parPOST /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 ≠
verifiedet ≠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¶
- Service auth :
customer-auth.service.ts - Service profil :
customer-profile.service.ts - Service Lemonway :
customers-lemonway.service.ts - Validators payload :
registration.payloads.ts - Auth investisseur (sign-up) :
auth.md