Account¶
Contrôleur HTTP de gestion du compte investisseur : lecture / mise à jour du profil, changement d'email et de mot de passe, suppression de compte. Source : account.controller.ts.
Sauf mention contraire, les endpoints requièrent une session investisseur Better Auth (JwtAuthGuard) et le rôle CUSTOMER (UserRoleGuard).
Le forgot/reset password investisseur passe par Better Auth (/api/auth/request-password-reset, /api/auth/reset-password) — voir auth.md.
GET /customers/account¶
Retourne les informations de compte de l'investisseur courant : profil, préférences de contact (Customer.io) et statut MFA.
Décorateur : @Get('account').
Pré-conditions¶
- Session investisseur Better Auth valide
- Rôle
CUSTOMER
Response¶
{
"profile": { "...": "CustomerProfile (firstName, lastName, address, phone, etc.)" },
"contactPreferences": { "...": "EmailSubscriptionPreference par topic" },
"mfaMethod": "none",
"mfaEnabled": false,
"leaderboardVisibility": "public"
}
leaderboardVisibility : public (défaut, visible sur le classement vitrine bricks.co) ou private (exclu de /internal/leaderboard/top et /investor). Voir leaderboard.md.
Construit via InvestorAccountService.getAccount.
DELETE /customers/account¶
Supprime le compte investisseur après vérification d'éligibilité (pas de balance, pas de bricks, pas d'investissement entreprise, pas de wallet transactions en attente). Optionnellement, enregistre les raisons du départ.
Décorateur : @Delete('/account').
Pré-conditions¶
- Session investisseur Better Auth valide
- Rôle
CUSTOMER - Aucun bricks détenu, aucun investissement entreprise actif, aucune wallet transaction en attente, balance Lemonway nulle
Request body¶
{
"reasons": ["financial_constraints", "lack_of_trust"],
"description": "Texte libre (max 250 caractères, nullable)"
}
Body nullable — peut être null pour ne pas fournir de raisons. Validé via deleteCustomerReasonsBody (depuis @bricks-common/api-communication). Raisons possibles : better_alternative, project_characteristics, financial_constraints, poor_user_experience, lack_of_trust, other.
Response¶
204 No Content — pas de body.
Erreurs¶
| Code | Statut | Cause |
|---|---|---|
customer-still-has-balance |
412 | L'investisseur a encore une balance Lemonway > 0 |
customer-still-has-bricks |
412 | L'investisseur détient encore des bricks sur des properties non remboursées |
customer-still-has-company-investment |
412 | Investissement entreprise (CompanyCustomerInvestment) confirmé |
customer-still-has-waiting-wts |
412 | Wallet transactions en attente |
PATCH /customers/email¶
Initie un changement d'email — déclenche une vérification MFA par email avant application effective.
Décorateur : @Patch('email').
Pré-conditions¶
- Session investisseur Better Auth valide
- Rôle
CUSTOMER - Le nouvel email ne doit pas déjà exister chez Bricks (incluant comptes désactivés) ni chez Lemonway
Request body¶
Validé via emailUpdatePayload (account-update.payload.ts). Trim + lowercase appliqués.
Response¶
204 No Content. L'email n'est pas immédiatement appliqué : MFAService.handleMfaVerification envoie un code à valider via le flow MFA (action: 'email-update'). Confirmation effective via InvestorAccountService.emailUpdateConfirmed (déclenché par MFA).
Erreurs¶
| Code | Statut | Cause |
|---|---|---|
customer.EMAIL_ALREADY_EXIST |
400 | Email déjà utilisé chez Bricks ou chez Lemonway |
PATCH /customers/account¶
Met à jour partiellement le profil investisseur. Discriminated union sur le champ type : phone ou address. Chaque type sync également Lemonway.
Décorateur : @Patch('account').
Pré-conditions¶
- Session investisseur Better Auth valide
- Rôle
CUSTOMER - Pour
address: statut KYCverifiedrequis
Request body — type phone¶
Request body — type address¶
{
"type": "address",
"address": {
"street": "1 rue de la Paix",
"city": "Paris",
"postcode": "75001"
}
}
Validé via profilePatchValidator (validators.ts).
Response¶
Renvoie le résultat de InvestorAccountService.getAccount (cf. GET /customers/account). Le cache Redis du profil est invalidé après update.
Erreurs¶
| Code | Statut | Cause |
|---|---|---|
customer.account-update-not-allowed |
403 | Update d'adresse refusée car KYC non verified |
customer.account-update-failed |
500 | Échec sync Lemonway (autre raison) |
PATCH /customers/password¶
Initie un changement de mot de passe — déclenche une vérification MFA par email avant application effective.
Décorateur : @Patch('password').
Pré-conditions¶
- Session investisseur Better Auth valide
- Rôle
CUSTOMER - Mot de passe respectant la policy (
8 caractères minimum, 1 majuscule, 1 chiffre, 1 minuscule ou caractère spécial)
Request body¶
Validé via passwordUpdatePayload (account-update.payload.ts).
Response¶
204 No Content. Le mot de passe n'est pas immédiatement appliqué : MFAService.handleMfaVerification envoie un code à valider (action: 'password-update'). Confirmation via InvestorAccountService.passwordUpdateConfirmed (déclenché par MFA) qui révoque toutes les sessions sauf la session courante.
Erreurs¶
| Code | Statut | Cause |
|---|---|---|
password-too-weak |
400 | Le mot de passe ne respecte pas la regex de complexité |
PATCH /customers/leaderboard/visibility¶
Met à jour la visibilité du classement investisseur sur le site vitrine bricks.co (opt-out).
Décorateur : @Patch('leaderboard/visibility').
Pré-conditions¶
- Session investisseur Better Auth valide
- Rôle
CUSTOMER
Request body¶
Validé via patchLeaderboardVisibilityRequestBody (public | private). Défaut à la création du compte : public.
Response¶
200 OK — pas de body. L'effet est immédiat côté /internal/leaderboard/* (filtre lecture, pas besoin d'attendre le cron).
Comportement¶
private: l'investisseur disparaît de/internal/leaderboard/topet/internal/leaderboard/investorrenvoie 404 pour sonpublicInvestorIdpublic: réapparition immédiate dans le classement (données déjà dans le snapshot)
Liens¶
- Service principal :
investor-account.service.ts - Service suppression :
investor-deletion.service.ts - Validators :
validators.ts,account-update.payload.ts