# UML Class Diagram: Admin API Package

Package: `api.views.admin`, `api.validator`, `api.check_permission`, `api.models` audit/security tables.

## Class Responsibilities

| Class | Responsibility |
| --- | --- |
| `AdminApiBase` | Shared base for admin views. Performs token auth, route permission checks, API log creation/update, timestamp/signature validation, response wrapping, and relation update helpers. |
| `TokenAuthentication` | Reads `Authorization: Token <token>`, loads `AccessToken`, rejects missing, invalid, or expired tokens. |
| `BaseValidator` | Applies string-declared request rules such as `required`, `array`, `exists`, `in`, `date`, `time`, and numeric constraints. |
| `CheckPermissionBackend` | Combines role-level and user-level permissions for `user.has_perm(route_name)`. |
| `IncomingApiAdmin` | Stores incoming request payload, outgoing response payload, request URL, IP, and HTTP-like status code. |
| `AuditTrail` | Stores the parent audit event for admin actions. |
| `AuditTrailDetails` | Stores action-specific old/new data and translated remark parameters. |
| `AccessToken` | Stores device/app scoped admin auth tokens and expiry. |
| `User`, `Role`, `RolePermission`, `UserPermission`, `UserRole` | Identity, role membership, and permission storage. |

```mermaid
classDiagram
direction LR
class APIView
class BaseAuthentication
class AdminApiBase {
  +authentication_classes
  +initial(request)
  +basic_validation(data)
  +api_response(data, code, errors, error)
  +sign(data, secret)
  +update_m2m_field(model, field_name, old_ids, new_ids, old_new_data)
  +update_m2m_field_bulk(models, field_name, new_ids, old_new_data)
}
class TokenAuthentication {
  +authenticate(request)
}
class BaseValidator {
  +validate()
  +fails()
  +rule_required(field, value, param)
  +rule_exists(field, value, param)
  +rule_array(field, value, param)
}
class CheckPermissionBackend {
  +get_all_permissions(user_obj)
  +has_perm(user_obj, perm)
}
class AccessToken {
  +token
  +type
  +device
  +expires_at
  +is_expired()
  +extend_expiry(minutes)
}
class User {
  +email
  +name
  +user_type
  +status
}
class Role
class RolePermission
class UserPermission
class UserRole
class IncomingApiAdmin {
  +insert_log()
  +update_log()
}
class AuditTrail
class AuditTrailDetails {
  +custom_insert()
}

APIView <|-- AdminApiBase
BaseAuthentication <|-- TokenAuthentication
AdminApiBase --> TokenAuthentication : authenticates
TokenAuthentication --> AccessToken : loads token
AccessToken --> User : belongs to
AdminApiBase --> CheckPermissionBackend : user.has_perm()
CheckPermissionBackend --> UserRole : reads roles
CheckPermissionBackend --> RolePermission : reads role perms
CheckPermissionBackend --> UserPermission : reads user perms
User "*" -- "*" Role : UserRole
Role "1" --> "*" RolePermission
User "1" --> "*" UserPermission
AdminApiBase --> IncomingApiAdmin : request/response log
AdminApiBase --> BaseValidator : concrete views use rules
AdminApiBase --> AuditTrail : admin audit type
AuditTrail "1" --> "*" AuditTrailDetails
```

