================================================================================
QAssure Frontend - API Endpoints Documentation
================================================================================
Base URL: {{baseUrl}}/api/v1 (configured via VITE_API_BASE_URL environment variable)
All requests include Authorization header: Bearer {accessToken} (automatically added)

================================================================================
1. AUTHENTICATION APIs
================================================================================

1.1 Login
Method: POST
Endpoint: /auth/login
Headers: Content-Type: application/json
Request Body:
{
  "email": "string",
  "password": "string"
}
Response: {
  "success": true,
  "data": {
    "user": {
      "id": "string",
      "email": "string",
      "first_name": "string",
      "last_name": "string"
    },
    "tenant_id": "string",
    "roles": ["string"],
    "access_token": "string",
    "refresh_token": "string",
    "token_type": "string",
    "expires_in": number,
    "expires_at": "string"
  }
}

1.2 Logout
Method: POST
Endpoint: /auth/logout
Headers: 
  - Content-Type: application/json
  - Authorization: Bearer {accessToken}
Request Body: {}
Response: {
  "success": true,
  "message": "string" (optional)
}

================================================================================
2. TENANTS APIs
================================================================================

2.1 Get All Tenants
Method: GET
Endpoint: /tenants
Query Parameters:
  - page: number (default: 1)
  - limit: number (default: 20)
  - status: string (optional) - Filter by status: "active", "suspended", "deleted"
  - orderBy[]: string[] (optional) - Array format: ["field", "asc"] or ["field", "desc"]
    Example: orderBy[]=name&orderBy[]=asc
Headers: Authorization: Bearer {accessToken}
Response: {
  "success": true,
  "data": [
    {
      "id": "string",
      "name": "string",
      "slug": "string",
      "status": "active" | "suspended" | "deleted",
      "settings": object | null,
      "subscription_tier": "string" | null,
      "max_users": number | null,
      "max_modules": number | null,
      "created_at": "string",
      "updated_at": "string"
    }
  ],
  "pagination": {
    "page": number,
    "limit": number,
    "total": number,
    "totalPages": number,
    "hasMore": boolean
  }
}

2.2 Get Tenant by ID
Method: GET
Endpoint: /tenants/{id}
Headers: Authorization: Bearer {accessToken}
Response: {
  "success": true,
  "data": {
    "id": "string",
    "name": "string",
    "slug": "string",
    "status": "active" | "suspended" | "deleted",
    "settings": object | null,
    "subscription_tier": "string" | null,
    "max_users": number | null,
    "max_modules": number | null,
    "created_at": "string",
    "updated_at": "string"
  }
}

2.3 Create Tenant
Method: POST
Endpoint: /tenants
Headers: 
  - Content-Type: application/json
  - Authorization: Bearer {accessToken}
Request Body:
{
  "name": "string",                    // Required, min 3, max 100 characters
  "slug": "string",                     // Required, min 3, max 100 characters, regex: ^[a-z0-9-]+$
  "status": "active" | "suspended" | "deleted",  // Required
  "settings": object | null,            // Optional
  "subscription_tier": "string" | null, // Optional, max 50 characters
  "max_users": number | null,          // Optional, min 1
  "max_modules": number | null          // Optional, min 1
}
Response: {
  "success": true,
  "data": {
    "id": "string",
    "name": "string",
    "slug": "string",
    "status": "active" | "suspended" | "deleted",
    "settings": object | null,
    "subscription_tier": "string" | null,
    "max_users": number | null,
    "max_modules": number | null,
    "created_at": "string",
    "updated_at": "string"
  }
}

2.4 Update Tenant
Method: PUT
Endpoint: /tenants/{id}
Headers: 
  - Content-Type: application/json
  - Authorization: Bearer {accessToken}
Request Body:
{
  "name": "string",                    // Required, min 3, max 100 characters
  "slug": "string",                     // Required, min 3, max 100 characters, regex: ^[a-z0-9-]+$
  "status": "active" | "suspended" | "deleted",  // Required
  "settings": object | null,            // Optional
  "subscription_tier": "string" | null, // Optional, max 50 characters
  "max_users": number | null,          // Optional, min 1
  "max_modules": number | null          // Optional, min 1
}
Response: {
  "success": true,
  "data": {
    "id": "string",
    "name": "string",
    "slug": "string",
    "status": "active" | "suspended" | "deleted",
    "settings": object | null,
    "subscription_tier": "string" | null,
    "max_users": number | null,
    "max_modules": number | null,
    "created_at": "string",
    "updated_at": "string"
  }
}

2.5 Delete Tenant
Method: DELETE
Endpoint: /tenants/{id}
Headers: Authorization: Bearer {accessToken}
Response: {
  "success": true,
  "message": "string" (optional)
}

================================================================================
3. USERS APIs
================================================================================

3.1 Get All Users
Method: GET
Endpoint: /users
Query Parameters:
  - page: number (default: 1)
  - limit: number (default: 20)
  - status: string (optional) - Filter by status: "active", "suspended", "deleted"
  - orderBy[]: string[] (optional) - Array format: ["field", "asc"] or ["field", "desc"]
    Example: orderBy[]=email&orderBy[]=asc
Headers: Authorization: Bearer {accessToken}
Response: {
  "success": true,
  "data": [
    {
      "id": "string",
      "email": "string",
      "first_name": "string",
      "last_name": "string",
      "status": "active" | "suspended" | "deleted",
      "auth_provider": "string",
      "tenant_id": "string" | null,
      "role_id": "string" | null,
      "created_at": "string",
      "updated_at": "string"
    }
  ],
  "pagination": {
    "page": number,
    "limit": number,
    "total": number,
    "totalPages": number,
    "hasMore": boolean
  }
}

3.2 Get User by ID
Method: GET
Endpoint: /users/{id}
Headers: Authorization: Bearer {accessToken}
Response: {
  "success": true,
  "data": {
    "id": "string",
    "email": "string",
    "first_name": "string",
    "last_name": "string",
    "status": "active" | "suspended" | "deleted",
    "auth_provider": "string",
    "tenant_id": "string" | null,
    "role_id": "string" | null,
    "created_at": "string",
    "updated_at": "string"
  }
}

3.3 Create User
Method: POST
Endpoint: /users
Headers: 
  - Content-Type: application/json
  - Authorization: Bearer {accessToken}
Request Body:
{
  "email": "string",                    // Required, valid email format
  "password": "string",                 // Required, min 6 characters
  "first_name": "string",               // Required
  "last_name": "string",                // Required
  "status": "active" | "suspended" | "deleted",  // Required
  "auth_provider": "local",             // Required
  "tenant_id": "string",                // Required
  "role_id": "string"                   // Required
}
Response: {
  "success": true,
  "data": {
    "id": "string",
    "email": "string",
    "first_name": "string",
    "last_name": "string",
    "status": "active" | "suspended" | "deleted",
    "auth_provider": "string",
    "tenant_id": "string" | null,
    "role_id": "string" | null,
    "created_at": "string",
    "updated_at": "string"
  }
}

3.4 Update User
Method: PUT
Endpoint: /users/{id}
Headers: 
  - Content-Type: application/json
  - Authorization: Bearer {accessToken}
Request Body:
{
  "email": "string",                    // Required, valid email format
  "first_name": "string",               // Required
  "last_name": "string",                // Required
  "status": "active" | "suspended" | "deleted",  // Required
  "auth_provider": "string",             // Optional
  "tenant_id": "string",                // Required
  "role_id": "string"                   // Required
}
Response: {
  "success": true,
  "data": {
    "id": "string",
    "email": "string",
    "first_name": "string",
    "last_name": "string",
    "status": "active" | "suspended" | "deleted",
    "auth_provider": "string",
    "tenant_id": "string" | null,
    "role_id": "string" | null,
    "created_at": "string",
    "updated_at": "string"
  }
}

3.5 Delete User
Method: DELETE
Endpoint: /users/{id}
Headers: Authorization: Bearer {accessToken}
Response: {
  "success": true,
  "message": "string" (optional)
}

================================================================================
4. ROLES APIs
================================================================================

4.1 Get All Roles
Method: GET
Endpoint: /roles
Query Parameters:
  - page: number (default: 1)
  - limit: number (default: 20)
  - scope: string (optional) - Filter by scope: "platform", "tenant", "module"
  - orderBy[]: string[] (optional) - Array format: ["field", "asc"] or ["field", "desc"]
    Example: orderBy[]=name&orderBy[]=asc
Headers: Authorization: Bearer {accessToken}
Response: {
  "success": true,
  "data": [
    {
      "id": "string",
      "name": "string",
      "code": "string",
      "description": "string" | null,
      "scope": "platform" | "tenant" | "module",
      "created_at": "string",
      "updated_at": "string"
    }
  ],
  "pagination": {
    "page": number,
    "limit": number,
    "total": number,
    "totalPages": number,
    "hasMore": boolean
  }
}

4.2 Get Role by ID
Method: GET
Endpoint: /roles/{id}
Headers: Authorization: Bearer {accessToken}
Response: {
  "success": true,
  "data": {
    "id": "string",
    "name": "string",
    "code": "string",
    "description": "string" | null,
    "scope": "platform" | "tenant" | "module",
    "created_at": "string",
    "updated_at": "string"
  }
}

4.3 Create Role
Method: POST
Endpoint: /roles
Headers: 
  - Content-Type: application/json
  - Authorization: Bearer {accessToken}
Request Body:
{
  "name": "string",                     // Required
  "code": "super_admin" | "tenant_admin" | "quality_manager" | "developer" | "viewer",  // Required, enum
  "description": "string",              // Required
  "scope": "platform" | "tenant" | "module"  // Required, enum
}
Response: {
  "success": true,
  "data": {
    "id": "string",
    "name": "string",
    "code": "string",
    "description": "string" | null,
    "scope": "platform" | "tenant" | "module",
    "created_at": "string",
    "updated_at": "string"
  }
}

4.4 Update Role
Method: PUT
Endpoint: /roles/{id}
Headers: 
  - Content-Type: application/json
  - Authorization: Bearer {accessToken}
Request Body:
{
  "name": "string",                     // Required
  "code": "super_admin" | "tenant_admin" | "quality_manager" | "developer" | "viewer",  // Required, enum
  "description": "string",              // Required
  "scope": "platform" | "tenant" | "module"  // Required, enum
}
Response: {
  "success": true,
  "data": {
    "id": "string",
    "name": "string",
    "code": "string",
    "description": "string" | null,
    "scope": "platform" | "tenant" | "module",
    "created_at": "string",
    "updated_at": "string"
  }
}

4.5 Delete Role
Method: DELETE
Endpoint: /roles/{id}
Headers: Authorization: Bearer {accessToken}
Response: {
  "success": true,
  "message": "string" (optional)
}

================================================================================
5. MODULES APIs
================================================================================

5.1 Get All Modules
Method: GET
Endpoint: /modules
Query Parameters:
  - page: number (default: 1)
  - limit: number (default: 20)
  - status: string (optional) - Filter by status: "running", "stopped", "failed", etc.
  - orderBy[]: string[] (optional) - Array format: ["field", "asc"] or ["field", "desc"]
    Example: orderBy[]=name&orderBy[]=asc
Headers: Authorization: Bearer {accessToken}
Response: {
  "success": true,
  "data": [
    {
      "id": "string",
      "module_id": "string",
      "name": "string",
      "description": "string",
      "version": "string",
      "status": "string",
      "runtime_language": "string" | null,
      "framework": "string" | null,
      "base_url": "string",
      "health_endpoint": "string",
      "endpoints": ["string"] | null,
      "kafka_topics": ["string"] | null,
      "cpu_request": "string",
      "cpu_limit": "string",
      "memory_request": "string",
      "memory_limit": "string",
      "min_replicas": number,
      "max_replicas": number,
      "last_health_check": "string" | null,
      "health_status": "string" | null,
      "consecutive_failures": number | null,
      "registered_by": "string",
      "tenant_id": "string",
      "metadata": object | null,
      "created_at": "string",
      "updated_at": "string",
      "registered_by_email": "string"
    }
  ],
  "pagination": {
    "page": number,
    "limit": number,
    "total": number,
    "totalPages": number,
    "hasMore": boolean
  }
}

5.2 Get Module by ID
Method: GET
Endpoint: /modules/{id}
Headers: Authorization: Bearer {accessToken}
Response: {
  "success": true,
  "data": {
    "id": "string",
    "module_id": "string",
    "name": "string",
    "description": "string",
    "version": "string",
    "status": "string",
    "runtime_language": "string" | null,
    "framework": "string" | null,
    "base_url": "string",
    "health_endpoint": "string",
    "endpoints": ["string"] | null,
    "kafka_topics": ["string"] | null,
    "cpu_request": "string",
    "cpu_limit": "string",
    "memory_request": "string",
    "memory_limit": "string",
    "min_replicas": number,
    "max_replicas": number,
    "last_health_check": "string" | null,
    "health_status": "string" | null,
    "consecutive_failures": number | null,
    "registered_by": "string",
    "tenant_id": "string",
    "metadata": object | null,
    "created_at": "string",
    "updated_at": "string",
    "registered_by_email": "string"
  }
}

================================================================================
6. AUDIT LOGS APIs
================================================================================

6.1 Get All Audit Logs
Method: GET
Endpoint: /audit-logs
Query Parameters:
  - page: number (default: 1)
  - limit: number (default: 20)
  - method: string (optional) - Filter by HTTP method: "GET", "POST", "PUT", "DELETE", "PATCH"
  - orderBy[]: string[] (optional) - Array format: ["field", "asc"] or ["field", "desc"]
    Example: orderBy[]=created_at&orderBy[]=desc
Headers: Authorization: Bearer {accessToken}
Response: {
  "success": true,
  "data": [
    {
      "id": "string",
      "tenant_id": "string" | null,
      "user_id": "string" | null,
      "action": "string",
      "resource_type": "string",
      "resource_id": "string" | null,
      "request_method": "string" | null,
      "request_path": "string" | null,
      "request_body": object | null,
      "response_status": number | null,
      "response_body": object | null,
      "ip_address": "string" | null,
      "user_agent": "string" | null,
      "correlation_id": "string" | null,
      "changes": object | null,
      "metadata": object | null,
      "created_at": "string",
      "updated_at": "string",
      "user": {
        "id": "string",
        "email": "string",
        "first_name": "string",
        "last_name": "string"
      } | null,
      "tenant": {
        "id": "string",
        "name": "string"
      } | null
    }
  ],
  "pagination": {
    "page": number,
    "limit": number,
    "total": number,
    "totalPages": number,
    "hasMore": boolean
  }
}

6.2 Get Audit Log by ID
Method: GET
Endpoint: /audit-logs/{id}
Headers: Authorization: Bearer {accessToken}
Response: {
  "success": true,
  "data": {
    "id": "string",
    "tenant_id": "string" | null,
    "user_id": "string" | null,
    "action": "string",
    "resource_type": "string",
    "resource_id": "string" | null,
    "request_method": "string" | null,
    "request_path": "string" | null,
    "request_body": object | null,
    "response_status": number | null,
    "response_body": object | null,
    "ip_address": "string" | null,
    "user_agent": "string" | null,
    "correlation_id": "string" | null,
    "changes": object | null,
    "metadata": object | null,
    "created_at": "string",
    "updated_at": "string",
    "user": {
      "id": "string",
      "email": "string",
      "first_name": "string",
      "last_name": "string"
    } | null,
    "tenant": {
      "id": "string",
      "name": "string"
    } | null
  }
}

================================================================================
NOTES
================================================================================

1. Authentication:
   - All API requests (except /auth/login) require Bearer token in Authorization header
   - Token is automatically added by api-client interceptor from Redux store
   - On 401 error (except for /auth/login and /auth/logout), user is redirected to login page

2. Query Parameters:
   - Pagination: page (default: 1), limit (default: 20)
   - Sorting: orderBy[] format for array parameters (e.g., orderBy[]=name&orderBy[]=asc)
   - Filtering: status, scope, method (varies by endpoint)

3. Error Responses:
   - Validation errors: {
       "success": false,
       "error": "Validation failed",
       "details": [
         {
           "path": "string",
           "message": "string",
           "code": "string"
         }
       ]
     }
   - General errors: {
       "success": false,
       "error": {
         "code": "string",
         "message": "string"
       }
     }

4. Response Format:
   - All successful responses include "success": true
   - Data is wrapped in "data" property
   - Paginated responses include "pagination" object

5. Base URL:
   - Configured via VITE_API_BASE_URL environment variable
   - Default: http://localhost:3000/api/v1

================================================================================
END OF DOCUMENTATION
================================================================================
