Danh Sách Hợp Đồng Tùy Chỉnh
Mô Tả Tổng Quan
Tính năng Danh Sách Hợp Đồng Tùy Chỉnh cung cấp cho quản trị viên khả năng xem, tìm kiếm và lọc các hợp đồng tùy chỉnh với phân trang. Endpoint này hỗ trợ nhiều tiêu chí lọc và trả về kết quả phân trang với dữ liệu liên quan.
Điều Kiện Tiên Quyết
- Người dùng phải được xác thực với vai trò quản trị viên (SuperAdmin hoặc AdminStaff)
Phụ Thuộc
- Không có (thao tác chỉ đọc)
Liên Kết Swagger
API: Danh Sách Hợp Đồng Tùy Chỉnh
Tài Liệu Trường Hợp
Trường Hợp 1: Lấy Danh Sách Hợp Đồng Thành Công
Mô Tả
Quản trị viên lấy thành công danh sách phân trang các hợp đồng tùy chỉnh với các bộ lọc tùy chọn được áp dụng. Kết quả bao gồm dữ liệu đăng ký, nhóm, người dùng và gói liên quan.
Sequence Diagram
sequenceDiagram
participant Admin
participant Controller as CustomContractController
participant Request as ListCustomContractRequest
participant Service as CustomContractService
participant Repository as CustomContractRepository
participant Database
Note over Admin,Database: GET /api/v1/admin/custom-contracts
rect rgb(200, 255, 200)
Note right of Admin: Happy Case Flow
Admin->>Controller: GET request with filters
rect rgb(200, 230, 255)
Note right of Controller: Request Validation
Controller->>Request: validate(params)
Request->>Request: Validate filter parameters
Request->>Request: Validate pagination params
Request-->>Controller: Validation passed
end
rect rgb(200, 255, 255)
Note right of Controller: Query Processing
Controller->>Service: list(validatedParams)
Service->>Repository: getQuery() with filters
Repository->>Repository: Build query with joins
Repository->>Repository: Apply status filter
Repository->>Repository: Apply group_name filter
Repository->>Repository: Apply other filters
Repository->>Database: Execute paginated query
Database-->>Repository: Return contract records
Repository-->>Service: Return paginated collection
Service-->>Controller: Return paginated results
end
Controller-->>Admin: 200 OK (contracts, meta, links)
end
Các Bước
Bước 1: Xác Thực Yêu Cầu
- Mô Tả: Xác thực các tham số bộ lọc và phân trang
- Yêu Cầu:
GET /api/v1/admin/custom-contracts?status=offered&group_name=test&page=1&per_page=10 - Ủy Quyền: Người dùng phải có vai trò SuperAdmin hoặc AdminStaff
- Các Bộ Lọc Có Sẵn:
status: Filter by contract status (offered, active, draft, expired, cancelled, or 'all')group_id: Filter by specific group IDgroup_name: Filter by group name (partial match, case-insensitive)subscription_id: Filter by subscription IDuser_id: Filter by user IDcode: Filter by contract code (partial match)per_page: Items per page (default: 10)page: Page number (default: 1)
Step 2: Query Building
- Description: Build database query with filters and eager loading
- Action:
- Load relationships: subscription, group, user, packagePlan
- Apply status filter (if provided and not 'all')
- Apply group_id filter (if provided)
- Apply group_name filter with LIKE query (if provided)
- Apply subscription_id filter (if provided)
- Apply user_id filter (if provided)
- Apply code filter with LIKE query (if provided)
- Order by id DESC (latest first)
- Database Operations:
- SELECT from custom_contracts with LEFT JOINs
- WHERE clauses for filters
- ORDER BY id DESC
- LIMIT and OFFSET for pagination
Step 3: Execute Paginated Query
- Description: Execute query and return paginated results
- Action:
- Execute query with pagination
- Calculate total count
- Build pagination meta data
- Build pagination links (first, last, prev, next)
- Response Structure:
data: Array of contract resourcesmeta: Pagination metadata (total, per_page, current_page, last_page)links: Pagination links (first, last, prev, next)
Database Related Tables & Fields
erDiagram
custom_contracts {
bigint id PK
bigint subscription_id FK
bigint package_plan_id FK
bigint group_id FK
bigint user_id FK
string code
string billing_interval
string currency
integer amount
string status
timestamp created_at
timestamp updated_at
}
subscriptions {
bigint id PK
string slug
bigint package_plan_id FK
bigint group_id FK
string status
timestamp created_at
}
groups {
bigint id PK
string name
integer status
timestamp created_at
}
users {
bigint id PK
string name
string email
timestamp created_at
}
package_plans {
bigint id PK
string name
string billing_interval
timestamp created_at
}
custom_contracts ||--o| subscriptions : has
custom_contracts ||--|| groups : belongs_to
custom_contracts ||--o| users : managed_by
custom_contracts ||--o| package_plans : based_on
Error Handling
- Log: Errors are logged via
logThrow()method - Error Detail:
| Status Code | Error Message | Description |
|---|---|---|
| 422 | Validation error messages | When filter parameters are invalid |
| 400 | Generic error with exception message | For unexpected database errors |
Additional Notes
Filter Behavior
- Status Filter:
- Accepts single status or comma-separated list
- 'all' shows contracts in any status
- Default: shows all statuses
- Group Name Filter:
- Case-insensitive partial match
- Uses SQL LIKE with wildcards:
%search%
- Code Filter:
- Partial match for contract codes
- Useful for searching by contract identifier patterns
Pagination
- Default per_page: 10
- Minimum per_page: 1
- Maximum per_page: 100
- Results always ordered by ID DESC (newest first)
Performance Considerations
- Indexed fields: status, subscription_id
- Eager loading prevents N+1 queries
- Group name filter uses LIKE (consider full-text search for large datasets)
- Consider caching for frequently accessed pages
Response Format
{
"status": true,
"message": "カスタムプラン一覧の取得に成功しました",
"data": [
{
"id": 1,
"code": "CUSTOM-2026-001",
"status": "offered",
"amount": 150000,
"billing_interval": "month",
"currency": "jpy",
"group": {
"id": 5,
"name": "Test Corporation"
},
"subscription": {
"id": 10,
"slug": "sub_abc123"
},
"created_at": "2026-02-01T10:30:00Z"
}
],
"meta": {
"current_page": 1,
"last_page": 5,
"per_page": 10,
"total": 45
},
"links": {
"first": "http://api.example.com/api/v1/admin/custom-contracts?page=1",
"last": "http://api.example.com/api/v1/admin/custom-contracts?page=5",
"prev": null,
"next": "http://api.example.com/api/v1/admin/custom-contracts?page=2"
}
}