Utilisateurs
Profil (GET /user/profile)
Objet le plus complet du domaine utilisateur — c'est celui que consomme la page Profil :
{
id: number;
username: string;
first_name: string;
last_name: string;
job: string;
location: string;
phone: string;
phone_verified: string;
email: string;
email_verified: string;
avatar: string;
role: string;
email_verified_at: string;
is_active: string;
last_login: string;
time_zone: string;
created_at: string;
updated_at: string;
// Champs KYC / propriétaire (voir "Devenir propriétaire" ci-dessous)
user_type: string;
company_name: string;
country_region: string;
id_type: string;
id_number: string;
id_expiry_date: string;
id_photo_path: string;
place_type: string;
place_details: string;
address: string;
city: string;
state: string;
postal_code: string;
country: string;
latitude: string;
longitude: string;
}
Le code contient trois variantes de l'objet utilisateur (Account, User, ProfileResponse) qui décrivent globalement les mêmes champs mais avec des types différents pour les mêmes clés : is_active est tantôt boolean, tantôt number (0/1), tantôt string ("0"/"1") selon la variante ; email_verified est tantôt number tantôt string. Il existe même deux définitions incompatibles nommées ProfileResponse dans le code (l'une plate comme ci-dessus, l'autre enveloppant { user: Account }) — celle réellement utilisée par l'appel GET /user/profile est la version plate. Ne présumez pas du type d'un champ booléen sans vérifier la réponse réelle.
Mise à jour (PUT /user/update)
Envoyée en multipart/form-data ; tous les champs sont optionnels (seuls les champs fournis sont transmis) :
{
user_id?: number; // admin/support uniquement : id de l'utilisateur ciblé
is_active?: boolean; // admin/support uniquement : activer/désactiver le compte ciblé
username?: string;
first_name?: string;
last_name?: string;
location?: string;
email?: string;
avatar?: File; // jpeg/jpg/png/gif uniquement
phone?: string;
password?: string;
password_confirmation?: string;
// + les champs KYC listés ci-dessus (user_type, id_type, address, etc.)
}
Les booléens sont sérialisés en chaînes "1"/"0" dans le FormData. Le fichier avatar est validé côté client (type MIME, nom de fichier assaini) avant l'envoi.
Devenir propriétaire (POST /user/become-owner)
Formulaire de vérification d'identité (KYC), envoyé en multipart/form-data :
{
user_type: "individual" | "company";
country_region: string;
id_type: "identity_card" | "passport" | "driver_licence";
id_number: string;
id_expiry_date: string;
id_reco_path: File; // recto pièce d'identité — image ou PDF, 5 Mo max
id_verso_path: File; // verso pièce d'identité — mêmes contraintes
place_type: string;
place_details: string;
address: string;
city: string;
state: string;
postal_code: string;
country: string;
longitude: number;
latitude: number;
company_document?: File; // requis si user_type === "company"
}
Le schéma de validation exige company_document lorsque user_type vaut "company", mais la fonction d'envoi réelle n'ajoute jamais ce champ au FormData transmis à l'API — une inscription "entreprise" ne transmet donc pas le document malgré la validation qui l'exige côté formulaire. À vérifier/corriger côté produit.
Modération des demandes propriétaire (support)
| Endpoint | Usage |
|---|---|
GET /user/owner-requests | Liste des demandes en attente |
POST /user/{id}/approve-owner | Approuver une demande |
POST /user/{id}/reject-owner | Rejeter une demande |
POST /user/accept-owner-request/{id} | Variante d'acceptation, renvoie la demande complète |
GET /user/owner-request-status | Statut de la demande de l'utilisateur connecté (chaîne simple) |
Autres endpoints
| Endpoint | Usage |
|---|---|
GET /user/list, GET /user/{id} | Liste et détail |
GET /user/search-user | Recherche |
GET /user/individuals, GET /user/companies | Filtrage par type de compte |
GET /user/{userId}/stats | Statistiques d'un utilisateur |
DELETE /user/delete | Suppression d'un compte |
POST /user/admin-support/assign | Assignation automatique d'un agent support |