# 📋 ClientsQueryRequestContext - Usage Guide (camelCase)

## 🎯 **Overview**

`ClientsQueryRequestContext` adalah struct yang memudahkan parsing query parameters dari HTTP request untuk filtering clients dengan hierarchy support. **Semua JSON fields menggunakan camelCase format.**

## 🔧 **Available Query Parameters (camelCase)**

### **Basic Filters**
```bash
# Filter by name (case-insensitive, partial match)
GET /api/clients?name=company

# Filter by client type
GET /api/clients?clientType=parent_client
GET /api/clients?clientType=sub_client  
GET /api/clients?clientType=standalone

# Filter by parent client ID
GET /api/clients?parentClientId=123e4567-e89b-12d3-a456-426614174000

# Filter by active status
GET /api/clients?isActive=true
GET /api/clients?isActive=false
```

### **Hierarchy Filters**
```bash
# Only show clients that have children (parent clients)
GET /api/clients?onlyParentClients=true

# Only show standalone clients (no parent, no children)
GET /api/clients?onlyStandalone=true

# Only show root level clients (no parent)
GET /api/clients?onlyRootClients=true

# Include all descendants when filtering by parent
GET /api/clients?parentClientId=uuid&includeSubClients=true
```

### **Pagination**
```bash
# Pagination
GET /api/clients?page=1&limit=10
GET /api/clients?page=2&limit=20

# Sorting
GET /api/clients?sort=name&sort_by=asc
GET /api/clients?sort=created_at&sort_by=desc
```

## 🚀 **Usage Examples (camelCase)**

### **1. Get All Parent Clients**
```bash
GET /api/clients?clientType=parent_client&isActive=true
```

### **2. Get Sub-Clients of Specific Parent**
```bash
GET /api/clients?parentClientId=123e4567-e89b-12d3-a456-426614174000
```

### **3. Get All Root Level Clients**
```bash
GET /api/clients?onlyRootClients=true
```

### **4. Search Clients by Name**
```bash
GET /api/clients?name=company&isActive=true
```

### **5. Get All Standalone Clients**
```bash
GET /api/clients?onlyStandalone=true
```

### **6. Complex Filtering**
```bash
GET /api/clients?clientType=sub_client&isActive=true&page=1&limit=20&sort=name&sort_by=asc
```

## 📊 **Response Structure (camelCase)**

```json
{
  "success": true,
  "messages": ["Clients list successfully retrieved"],
  "data": [
    {
      "id": "123e4567-e89b-12d3-a456-426614174000",
      "name": "Parent Company",
      "description": "Main company",
      "clientType": "parent_client",
      "parentClientId": null,
      "parentClient": null,
      "subClients": [
        {
          "id": "456e7890-e89b-12d3-a456-426614174001",
          "name": "Sub Company 1",
          "clientType": "sub_client",
          "currentUsers": 25,
          "isActive": true
        }
      ],
      "subClientCount": 1,
      "maxUsers": 100,
      "maxStorage": 1073741824,
      "currentUsers": 50,
      "currentStorage": 536870912,
      "settings": "{\"theme\": \"dark\"}",
      "createdById": 1,
      "createdBy": {
        "id": 1,
        "username": "admin",
        "fullname": "Admin User"
      },
      "isActive": true,
      "createdAt": "2024-01-01T00:00:00Z",
      "updatedAt": "2024-01-01T00:00:00Z"
    }
  ],
  "meta": {
    "page": 1,
    "limit": 10,
    "total": 1,
    "total_pages": 1
  }
}
```

## 🔍 **Filter Combinations**

### **Common Use Cases**

1. **Dashboard - Show Parent Clients Only**
   ```bash
   GET /api/clients?onlyParentClients=true&isActive=true&page=1&limit=10
   ```

2. **Client Management - Show All Active Clients**
   ```bash
   GET /api/clients?isActive=true&sort=name&sort_by=asc
   ```

3. **Hierarchy View - Show Root Clients**
   ```bash
   GET /api/clients?onlyRootClients=true&includeSubClients=true
   ```

4. **Search - Find Clients by Name**
   ```bash
   GET /api/clients?name=company&isActive=true
   ```

5. **Sub-Client Management - Show Children of Parent**
   ```bash
   GET /api/clients?parentClientId=uuid&isActive=true
   ```

## 📝 **Request Body Examples (camelCase)**

### **Create Client**
```json
{
  "name": "New Company",
  "description": "Company description",
  "clientType": "parent_client",
  "parentClientId": null,
  "maxUsers": 100,
  "maxStorage": 1073741824,
  "settings": "{\"theme\": \"dark\"}"
}
```

### **Update Client**
```json
{
  "name": "Updated Company",
  "clientType": "standalone",
  "parentClientId": null,
  "isActive": true
}
```

### **Move Client**
```json
{
  "targetParentId": "123e4567-e89b-12d3-a456-426614174000"
}
```

### **Bulk Create Sub-Clients**
```json
{
  "parentClientId": "123e4567-e89b-12d3-a456-426614174000",
  "subClients": [
    {
      "name": "Sub Client 1",
      "description": "First sub client",
      "maxUsers": 50,
      "maxStorage": 536870912
    },
    {
      "name": "Sub Client 2",
      "description": "Second sub client",
      "maxUsers": 25,
      "maxStorage": 268435456
    }
  ]
}
```

## ⚡ **Performance Tips**

1. **Use specific filters** - Always include `isActive=true` for better performance
2. **Limit results** - Use pagination (`page` & `limit`) for large datasets
3. **Use hierarchy filters** - `onlyParentClients`, `onlyStandalone`, `onlyRootClients` are optimized
4. **Combine filters** - Multiple filters work together efficiently

## 🛠 **Implementation Details**

### **Controller Usage**
```go
func (_i *clientsController) All(c *fiber.Ctx) error {
    paginate, err := paginator.Paginate(c)
    if err != nil {
        return err
    }

    reqContext := request.ClientsQueryRequestContext{
        Name:              c.Query("name"),
        ClientType:        c.Query("clientType"),
        ParentClientId:    c.Query("parentClientId"),
        IncludeSubClients: c.Query("includeSubClients"),
        OnlyParentClients: c.Query("onlyParentClients"),
        OnlyStandalone:    c.Query("onlyStandalone"),
        OnlyRootClients:   c.Query("onlyRootClients"),
        IsActive:          c.Query("isActive"),
        CreatedById:       c.Query("createdById"),
    }
    req := reqContext.ToParamRequest()
    req.Pagination = paginate

    clientsData, paging, err := _i.clientsService.All(req)
    // ... rest of implementation
}
```

## ✅ **Testing (camelCase)**

### **Test Cases**
```bash
# Test basic filtering
curl "http://localhost:8080/api/clients?name=test&isActive=true"

# Test hierarchy filtering  
curl "http://localhost:8080/api/clients?onlyParentClients=true"

# Test pagination
curl "http://localhost:8080/api/clients?page=1&limit=5"

# Test sorting
curl "http://localhost:8080/api/clients?sort=name&sort_by=asc"

# Test complex filtering
curl "http://localhost:8080/api/clients?clientType=sub_client&isActive=true&page=1&limit=10"
```

## 🔄 **Migration from snake_case**

### **Before (snake_case)**
```bash
GET /api/clients?client_type=parent_client&parent_client_id=uuid&is_active=true
```

### **After (camelCase)**
```bash
GET /api/clients?clientType=parent_client&parentClientId=uuid&isActive=true
```

### **Request Body Migration**
```json
// Before
{
  "client_type": "parent_client",
  "parent_client_id": "uuid",
  "max_users": 100,
  "max_storage": 1073741824
}

// After
{
  "clientType": "parent_client",
  "parentClientId": "uuid", 
  "maxUsers": 100,
  "maxStorage": 1073741824
}
```

---

## 🎉 **Ready to Use!**

`ClientsQueryRequestContext` sekarang sudah terintegrasi dengan:
- ✅ Controller parsing (camelCase)
- ✅ Repository filtering  
- ✅ Swagger documentation (camelCase)
- ✅ Type safety dengan UUID parsing
- ✅ Boolean conversion
- ✅ Pagination support
- ✅ **Full camelCase JSON support**

Semua query parameters dan response fields menggunakan camelCase format! 🚀