# API Externe - Gestion des Utilisateurs

## Endpoint

**POST** `/api/external/users` - Créer un utilisateur  
**PUT** `/api/external/users/{id}` - Mettre à jour un utilisateur

## Authentification

L'API utilise une authentification par clé API. Vous devez inclure la clé API dans les headers :

```
X-API-Key: votre_clé_api
```

ou

```
Authorization: Bearer votre_clé_api
```

La clé API est définie dans le fichier `.env` avec la variable `DASHBOARD_API_KEY`.

## Format de la requête

### Créer un utilisateur (POST)

```json
{
  "full_name": "John Doe",
  "email": "john@example.com",
  "phone": "+221 77 000 00 01",
  "password": "password@2026",
  "company_id": 1,
  "role": "admin"
}
```

**Champs requis :**
- `full_name` (string, requis)
- `password` (string, min 8 caractères, requis)

**Champs optionnels :**
- `email` (string, email valide, unique)
- `phone` (string)
- `company_id` (integer, doit exister dans la table companies)
- `role` (string, doit exister dans la table roles : 'admin', 'superAdmin', 'gestionnaire')

### Mettre à jour un utilisateur (PUT)

```json
{
  "full_name": "John Doe Updated",
  "email": "john.updated@example.com",
  "phone": "+221 77 000 00 02",
  "password": "newpassword@2026",
  "company_id": 2,
  "role": "gestionnaire",
  "is_active": true
}
```

Tous les champs sont optionnels pour la mise à jour.

## Gestion des rôles avec Spatie

⚠️ **Important** : L'application Pressing utilise **Spatie Laravel Permission** pour la gestion des rôles. Les rôles ne sont **pas** stockés dans la table `users`, mais dans une table séparée `model_has_roles`.

Le contrôleur API :
1. Extrait le champ `role` du payload
2. Crée/met à jour l'utilisateur **sans** le champ `role`
3. Assigne le rôle avec `$user->assignRole($role)` après la création

## Rôles disponibles

- `admin` - Administrateur
- `superAdmin` - Super administrateur
- `gestionnaire` - Gestionnaire

## Réponses

### Succès (201 - Création)

```json
{
  "success": true,
  "message": "User created successfully",
  "data": {
    "id": 1,
    "full_name": "John Doe",
    "email": "john@example.com",
    "phone": "+221 77 000 00 01",
    "company_id": 1,
    "role": "admin",
    "created_at": "2026-01-30T16:25:39.000000Z"
  }
}
```

### Erreur de validation (422)

```json
{
  "error": "Validation failed",
  "messages": {
    "email": ["The email has already been taken."]
  }
}
```

### Erreur d'authentification (401)

```json
{
  "error": "Unauthorized",
  "message": "Invalid or missing API key"
}
```

## Correction de la fonction mapUserFieldsForApp

Pour le cas "Pressing", la fonction doit être corrigée comme suit :

```php
case 'Pressing':
    return [
        'full_name' => $user->name ?? $user->full_name ?? '',
        'email'      => $user->email,
        'phone'      => $user->number ?? $user->phone ?? '',
        'password'   => 'password@2026',
        'company_id' => $user->company_id,
        // Le champ 'role' peut être inclus - l'API le gérera correctement
        'role'       => 'admin', // ou déterminer dynamiquement
    ];
```

**Note** : Le champ `role` peut être inclus dans le payload. L'API l'extraira et l'assignera correctement avec Spatie après la création de l'utilisateur.

## Exemple d'utilisation avec cURL

```bash
curl -X POST http://127.0.0.1:1500/api/external/users \
  -H "Content-Type: application/json" \
  -H "X-API-Key: votre_clé_api" \
  -d '{
    "full_name": "Lee Albert",
    "email": "hotevys@mailinator.com",
    "phone": "",
    "password": "password@2026",
    "company_id": 165,
    "role": "admin"
  }'
```

