カスタムプラン詳細表示
概要説明
カスタムプラン詳細表示機能により、管理者は特定のカスタムプランに関する完全な情報(すべての関連データと履歴を含む)を取得できます。
前提条件
- ユーザーは管理者として認証されている必要があります(SuperAdminまたはAdminStaffロール)
- カスタムプランが存在する必要があります
依存関係
- なし(読み取り専用操作)
Swaggerリンク
API: カスタムプラン詳細表示
ケースドキュメント
ケース1: 契約詳細取得成功
説明
管理者が特定のカスタムプランに関する詳細情報(すべての関係とメタデータを含む)を正常に取得します。
Sequence Diagram
sequenceDiagram
participant Admin
participant Controller as CustomContractController
participant Repository as CustomContractRepository
participant Database
Note over Admin,Database: GET /api/v1/admin/custom-contracts/{id}
rect rgb(200, 255, 200)
Note right of Admin: Happy Case Flow
Admin->>Controller: GET request with contract ID
rect rgb(200, 255, 255)
Note right of Controller: Data Retrieval
Controller->>Repository: findById(contractId)
Repository->>Database: SELECT * FROM custom_contracts WHERE id = ?
Database-->>Repository: Return contract record
Repository->>Repository: Load relationships (eager loading)
Repository->>Database: SELECT related records
Database-->>Repository: Return related data
Repository-->>Controller: Return contract with all relations
end
Controller-->>Admin: 200 OK (contract_data)
end
rect rgb(255, 200, 200)
Note right of Admin: Error Scenarios
rect rgb(255, 230, 230)
alt Contract Not Found
Repository-->>Controller: Null returned
Controller-->>Admin: 404 Not Found
else Database Error
Database-->>Repository: Database error
Repository-->>Controller: Error result
Controller-->>Admin: 400 Bad Request
end
end
end
ステップ
ステップ1: 契約取得
- 説明: すべての関係を含む契約レコードを取得します
- リクエスト:
GET /api/v1/admin/custom-contracts/{id} - 認証: ユーザーはSuperAdminまたはAdminStaffロールを持つ必要があります
- パスパラメータ:
id: カスタムプランID(必須、整数)
ステップ2: 関係の読み込み
- 説明: すべての関連データを積極的に読み込みます
- 読み込まれる関係:
group: メンバーを含むグループ情報group.groupMembers: すべてのグループメンバーpackagePlan: ベースパッケージプランの詳細subscription: 関連するサブスクリプションデータ
- データベース操作:
- custom_contractsからSELECT
- groups、package_plans、subscriptionsとのLEFT JOIN
- グループメンバー用の追加クエリ
ステップ3: レスポンス返却
- 説明: 完全な契約データを返却します
- レスポンスデータ:
- すべての契約フィールド
- グループ詳細(name, status, created_by)
- グループメンバーリスト
- パッケージプラン詳細(該当する場合)
- サブスクリプション詳細(slug, status, email)
- Stripeメタデータ(session_id, price_id, subscription_item_id)
- 使用制限(すべてのmax_*フィールド)
- 日付情報(starts_at, ends_at, created_at, updated_at)
- 成功メッセージ: "カスタムプランの詳細取得に成功しました"
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
string provider_checkout_session_id
string provider_price_id
string provider_subscription_item_id
timestamp starts_at
timestamp ends_at
integer max_member
integer max_product_group
integer max_product
integer max_category
integer max_search_query
integer max_viewpoint
string data_visible
tinyint api_available
timestamp created_at
timestamp updated_at
}
groups {
bigint id PK
string name
bigint created_by FK
integer status
timestamp created_at
timestamp updated_at
}
group_members {
bigint id PK
bigint group_id FK
bigint user_id FK
string role
timestamp created_at
}
subscriptions {
bigint id PK
string slug
bigint package_plan_id FK
bigint group_id FK
string status
string email
string payment_provider_customer_id
timestamp created_at
timestamp updated_at
}
package_plans {
bigint id PK
bigint package_id FK
string name
string billing_interval
integer amount
timestamp created_at
timestamp updated_at
}
users {
bigint id PK
string name
string email
timestamp created_at
}
custom_contracts ||--|| groups : belongs_to
custom_contracts ||--o| package_plans : based_on
custom_contracts ||--o| subscriptions : has
custom_contracts ||--o| users : managed_by
groups ||--o{ group_members : has
group_members ||--|| users : belongs_to
Error Handling
- Log: Errors are logged via
logThrow()method - Error Detail:
| Status Code | Error Message | Description |
|---|---|---|
| 404 | "カスタムプランが見つかりませんでした" | When contract with specified ID doesn't exist |
| 400 | Generic error with exception message | For unexpected database errors |
Additional Notes
Response Structure
The response includes comprehensive contract information:
- Contract Details: code, status, amounts, intervals, dates
- Stripe Integration: session_id, price_id, subscription_item_id
- Usage Limits: All max_* fields (null means unlimited)
- Related Group: Full group details with member list
- Related Subscription: Complete subscription information
- Related Package Plan: Base plan used as template
Group Members Information
- Includes all members of the contract's group
- Shows member roles and permissions
- Useful for admin to understand who has access
Usage Limits Display
nullvalues indicate unlimited usage for that resource0values indicate feature is disabled- Positive integers show the specific limit
Status Information
Contract status indicates lifecycle stage:
- draft: Created but not yet offered
- offered: Payment link sent, awaiting payment
- active: Payment successful, contract in effect
- expired: Contract end date has passed
- cancelled: Contract terminated before expiration
Stripe Metadata
- provider_checkout_session_id: Used to track payment session
- provider_price_id: Stripe price ID for subscription
- provider_subscription_item_id: Stripe subscription item for management
Performance Considerations
- Single query with eager loading prevents N+1 problem
- Indexed lookup on contract ID (primary key)
- Fast response time (typically < 100ms)
- Consider caching for frequently accessed contracts
Response Format Example
{
"status": true,
"message": "カスタムプランの詳細取得に成功しました",
"data": {
"id": 1,
"subscription_id": 10,
"package_plan_id": 3,
"group_id": 5,
"user_id": 15,
"code": "CUSTOM-2026-001",
"billing_interval": "month",
"currency": "jpy",
"amount": 150000,
"status": "active",
"provider_checkout_session_id": "cs_test_abc123",
"provider_price_id": "price_abc123",
"provider_subscription_item_id": "si_abc123",
"starts_at": "2026-02-01T00:00:00Z",
"ends_at": "2027-02-01T00:00:00Z",
"max_member": 10,
"max_product_group": 5,
"max_product": 100,
"max_category": 20,
"max_search_query": 50,
"max_viewpoint": 30,
"data_visible": "private",
"api_available": 1,
"created_at": "2026-01-28T10:30:00Z",
"updated_at": "2026-01-28T15:45:00Z",
"group": {
"id": 5,
"name": "Test Corporation",
"status": 1,
"created_by": 12,
"group_members": [
{
"id": 1,
"user_id": 15,
"role": "owner",
"user": {
"id": 15,
"name": "John Doe",
"email": "john@example.com"
}
}
]
},
"subscription": {
"id": 10,
"slug": "sub_abc123",
"status": "active",
"email": "billing@example.com",
"payment_provider_customer_id": "cus_abc123"
},
"package_plan": {
"id": 3,
"name": "Enterprise Plan",
"billing_interval": "month",
"amount": 100000
}
}
}