Aller au contenu

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

{
  "email": "new@example.com"
}

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 KYC verified requis

Request body — type phone

{
  "type": "phone",
  "phone": "+33612345678"
}

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

{
  "password": "NewPassword123"
}

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

{
  "leaderboardVisibility": "private"
}

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/top et /internal/leaderboard/investor renvoie 404 pour son publicInvestorId
  • public : réapparition immédiate dans le classement (données déjà dans le snapshot)

Liens