> ## Documentation Index
> Fetch the complete documentation index at: https://docs.flowxi.app/llms.txt
> Use this file to discover all available pages before exploring further.

# Me

> Récupérer et mettre à jour le profil utilisateur connecté, y compris l’upload photo (Backblaze B2).

Endpoints “Me” = profil de l’utilisateur **connecté** (session Sanctum).

## Prérequis

### Authentification

Tous les endpoints ci-dessous requièrent **Sanctum Bearer token**.

Headers recommandés :

```http theme={null}
Accept: application/json
Authorization: Bearer <token>
X-App-Locale: fr
```

* `X-App-Locale` : optionnel, mais recommandé. Fallback `fr` si absent ou invalide.
* Les erreurs et messages sont localisés.

***

## GET /api/v1/me

Retourne le profil complet de l’utilisateur connecté.

### Exemple (curl)

```bash theme={null}
curl --location 'https://api.flowxi.app/api/v1/me' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <token>' \
  --header 'X-App-Locale: fr'
```

### Réponse 200

* `photo_url` est une **URL exploitable** :

  * si la photo est uploadée : **URL signée Backblaze** (TTL \~ 30 min)
  * sinon : fallback DiceBear (URL publique stable)

```json theme={null}
{
  "code": "ME_OK",
  "message": "OK",
  "data": {
    "id": 17,
    "email": "fandjinoujaf@gmail.com",
    "status": "active",
    "locale": "fr",
    "username": "fx00000017",
    "photo_url": "https://s3.us-west-004.backblazeb2.com/flowxi-storage-prod/profile_photos/....",
    "first_name": "Jafette",
    "last_name": "Fandjinou",
    "birth_date": "1999-01-01",
    "country": "BJ",
    "nationality": "BEN",
    "phone_number": "+22900000000",
    "twofa_enabled": false,
    "created_at": "2026-01-09T17:08:57.000000Z",
    "updated_at": "2026-01-09T17:39:23.000000Z"
  }
}
```

***

## PATCH /api/v1/me

Met à jour les informations de base.

### Champs supportés

* `first_name` (string)
* `last_name` (string)
* `birth_date` (YYYY-MM-DD)
* `country` (string, ex: `BJ`) → **normalisé en uppercase**
* `nationality` (string, ex: `BEN`) → **normalisé en uppercase**
* `phone_number` (string)

### Exemple (curl)

```bash theme={null}
curl --location --request PATCH 'https://api.flowxi.app/api/v1/me' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer <token>' \
  --header 'X-App-Locale: fr' \
  --data '{
    "first_name": "Jafette",
    "last_name": "Fandjinou",
    "birth_date": "1999-01-01",
    "country": "BJ",
    "nationality": "BEN",
    "phone_number": "+22900000000"
  }'
```

### Réponse 200

```json theme={null}
{
  "code": "ME_UPDATED",
  "message": "Profil mis à jour.",
  "data": {
    "id": 17,
    "first_name": "Jafette",
    "last_name": "Fandjinou",
    "birth_date": "1999-01-01",
    "country": "BJ",
    "nationality": "BEN",
    "phone_number": "+22900000000",
    "updated_at": "2026-01-09T17:11:56.000000Z"
  }
}
```

***

## POST /api/v1/me/photo

Upload photo de profil (`multipart/form-data`).

### Règles

* Champ : `photo` (required)
* Types : `jpg`, `jpeg`, `png`, `webp`
* Taille max : `4096 KB`
* Stockage :

  * upload sur **Backblaze B2 (S3 compatible)**
  * en base, seule la **clé** `profile_photos/...` est stockée
  * suppression automatique de l’ancienne photo si présente

### Exemple (curl)

```bash theme={null}
curl --location 'https://api.flowxi.app/api/v1/me/photo' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <token>' \
  --header 'X-App-Locale: fr' \
  --form "photo=@/path/to/photo.jpg"
```

### Réponse 200

```json theme={null}
{
  "code": "ME_PHOTO_UPDATED",
  "message": "Photo de profil mise à jour.",
  "data": {
    "photo_url": "https://s3.us-west-004.backblazeb2.com/flowxi-storage-prod/profile_photos/user_17_....jpg?...",
    "updated_at": "2026-01-09T17:39:23.000000Z"
  }
}
```

***

## Codes d’erreur (contract)

### 401 UNAUTHENTICATED

```json theme={null}
{
  "code": "UNAUTHENTICATED",
  "message": "Non authentifié."
}
```

### 422 VALIDATION\_FAILED

```json theme={null}
{
  "code": "VALIDATION_FAILED",
  "message": "Certaines informations sont invalides.",
  "errors": {
    "field": ["..."]
  }
}
```

### 500 SERVER\_ERROR

```json theme={null}
{
  "code": "SERVER_ERROR",
  "message": "Une erreur est survenue, réessayez plus tard."
}
```
