# Client Update with Auth Token API Documentation

## Overview
API endpoint untuk mengupdate data client menggunakan client ID yang diambil dari auth token, tanpa perlu menyertakan client ID sebagai path parameter.

## Endpoint

### Update Client with Auth Token
**PUT** `/clients/update`

#### Description
Mengupdate data client yang sedang login menggunakan client ID dari auth token.

#### Parameters
- Tidak ada path parameter, client ID diambil dari auth token

#### Headers
- **Authorization** (required): Bearer token untuk autentikasi user

#### Request Body
```json
{
  "name": "Updated Client Name",
  "description": "Updated client description",
  "clientType": "standalone",
  "parentClientId": null,
  "maxUsers": 100,
  "maxStorage": 1073741824,
  "settings": "{\"theme\": \"dark\"}",
  "isActive": true,
  "logoUrl": "https://example.com/logo.png",
  "logoImagePath": "clients/logos/client-id/logo.png",
  "address": "Jl. Example No. 123",
  "phoneNumber": "+62-123-456-7890",
  "website": "https://example.com"
}
```

#### Response Fields
- **name** (string, optional): Nama client
- **description** (string, optional): Deskripsi client
- **clientType** (string, optional): Tipe client (`parent_client`, `sub_client`, `standalone`)
- **parentClientId** (string, optional): ID parent client (untuk sub client)
- **maxUsers** (integer, optional): Batas maksimal user
- **maxStorage** (integer, optional): Batas maksimal storage dalam bytes
- **settings** (string, optional): JSON string untuk custom settings
- **isActive** (boolean, optional): Status aktif client
- **logoUrl** (string, optional): URL logo client
- **logoImagePath** (string, optional): Path logo di MinIO storage
- **address** (string, optional): Alamat client
- **phoneNumber** (string, optional): Nomor telepon client
- **website** (string, optional): Website resmi client

#### Response

##### Success Response (200)
```json
{
  "success": true,
  "messages": ["Clients successfully updated"],
  "data": null
}
```

#### Error Responses

##### 400 Bad Request
```json
{
  "success": false,
  "messages": ["Validation error"],
  "data": {
    "field": "error message"
  }
}
```

##### 401 Unauthorized
```json
{
  "success": false,
  "messages": ["user not found"]
}
```

##### 500 Internal Server Error
```json
{
  "success": false,
  "messages": ["client ID not found in user token"]
}
```

## Usage Examples

### cURL Example
```bash
curl -X PUT "http://localhost:8080/clients/update" \
  -H "Authorization: Bearer YOUR_TOKEN_HERE" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Updated Client Name",
    "description": "Updated description",
    "clientType": "standalone",
    "maxUsers": 100,
    "isActive": true,
    "address": "Jl. Example No. 123",
    "phoneNumber": "+62-123-456-7890",
    "website": "https://example.com"
  }'
```

### JavaScript Example
```javascript
const updateClient = async (clientData) => {
  try {
    const response = await fetch('/clients/update', {
      method: 'PUT',
      headers: {
        'Authorization': `Bearer ${token}`,
        'Content-Type': 'application/json'
      },
      body: JSON.stringify(clientData)
    });
    
    const data = await response.json();
    
    if (data.success) {
      console.log('Client updated successfully');
    } else {
      console.error('Update failed:', data.messages);
    }
  } catch (error) {
    console.error('Error updating client:', error);
  }
};

// Usage
updateClient({
  name: "Updated Client Name",
  description: "Updated description",
  clientType: "standalone",
  maxUsers: 100,
  isActive: true,
  address: "Jl. Example No. 123",
  phoneNumber: "+62-123-456-7890",
  website: "https://example.com"
});
```

## Use Cases
1. **Profile Update**: User mengupdate profil client mereka sendiri
2. **Settings Management**: Mengubah pengaturan client
3. **Contact Information**: Mengupdate informasi kontak client
4. **Logo Management**: Mengupdate URL atau path logo client
5. **Resource Limits**: Mengubah batas user atau storage

## Security Features
- **Authentication Required**: Harus menggunakan Bearer token yang valid
- **Client Isolation**: User hanya bisa mengupdate client mereka sendiri
- **Token Validation**: Client ID diambil dari token yang sudah diverifikasi
- **Input Validation**: Semua input divalidasi sebelum diproses

## Notes
- Endpoint ini menggunakan middleware `UserMiddleware` untuk mengekstrak informasi user dari JWT token
- Client ID diambil dari `user.ClientId` dalam token
- Jika user tidak ditemukan atau client ID tidak ada dalam token, akan mengembalikan error
- Semua field dalam request body bersifat optional
- Endpoint ini lebih aman daripada endpoint update dengan path parameter karena mencegah user mengupdate client lain
