- DataTable组件操作列自适应 - 优化各种Modal弹窗 - 统一API调用方式(AbortSignal) - 添加全局订阅状态管理 - 优化各管理视图的交互和布局 - 修复国际化翻译问题
176 lines
4.2 KiB
TypeScript
176 lines
4.2 KiB
TypeScript
/**
|
|
* Admin Subscriptions API endpoints
|
|
* Handles user subscription management for administrators
|
|
*/
|
|
|
|
import { apiClient } from '../client'
|
|
import type {
|
|
UserSubscription,
|
|
SubscriptionProgress,
|
|
AssignSubscriptionRequest,
|
|
BulkAssignSubscriptionRequest,
|
|
ExtendSubscriptionRequest,
|
|
PaginatedResponse
|
|
} from '@/types'
|
|
|
|
/**
|
|
* List all subscriptions with pagination
|
|
* @param page - Page number (default: 1)
|
|
* @param pageSize - Items per page (default: 20)
|
|
* @param filters - Optional filters (status, user_id, group_id)
|
|
* @returns Paginated list of subscriptions
|
|
*/
|
|
export async function list(
|
|
page: number = 1,
|
|
pageSize: number = 20,
|
|
filters?: {
|
|
status?: 'active' | 'expired' | 'revoked'
|
|
user_id?: number
|
|
group_id?: number
|
|
},
|
|
options?: {
|
|
signal?: AbortSignal
|
|
}
|
|
): Promise<PaginatedResponse<UserSubscription>> {
|
|
const { data } = await apiClient.get<PaginatedResponse<UserSubscription>>(
|
|
'/admin/subscriptions',
|
|
{
|
|
params: {
|
|
page,
|
|
page_size: pageSize,
|
|
...filters
|
|
},
|
|
signal: options?.signal
|
|
}
|
|
)
|
|
return data
|
|
}
|
|
|
|
/**
|
|
* Get subscription by ID
|
|
* @param id - Subscription ID
|
|
* @returns Subscription details
|
|
*/
|
|
export async function getById(id: number): Promise<UserSubscription> {
|
|
const { data } = await apiClient.get<UserSubscription>(`/admin/subscriptions/${id}`)
|
|
return data
|
|
}
|
|
|
|
/**
|
|
* Get subscription progress
|
|
* @param id - Subscription ID
|
|
* @returns Subscription progress with usage stats
|
|
*/
|
|
export async function getProgress(id: number): Promise<SubscriptionProgress> {
|
|
const { data } = await apiClient.get<SubscriptionProgress>(`/admin/subscriptions/${id}/progress`)
|
|
return data
|
|
}
|
|
|
|
/**
|
|
* Assign subscription to user
|
|
* @param request - Assignment request
|
|
* @returns Created subscription
|
|
*/
|
|
export async function assign(request: AssignSubscriptionRequest): Promise<UserSubscription> {
|
|
const { data } = await apiClient.post<UserSubscription>('/admin/subscriptions/assign', request)
|
|
return data
|
|
}
|
|
|
|
/**
|
|
* Bulk assign subscriptions to multiple users
|
|
* @param request - Bulk assignment request
|
|
* @returns Created subscriptions
|
|
*/
|
|
export async function bulkAssign(
|
|
request: BulkAssignSubscriptionRequest
|
|
): Promise<UserSubscription[]> {
|
|
const { data } = await apiClient.post<UserSubscription[]>(
|
|
'/admin/subscriptions/bulk-assign',
|
|
request
|
|
)
|
|
return data
|
|
}
|
|
|
|
/**
|
|
* Extend subscription validity
|
|
* @param id - Subscription ID
|
|
* @param request - Extension request with days
|
|
* @returns Updated subscription
|
|
*/
|
|
export async function extend(
|
|
id: number,
|
|
request: ExtendSubscriptionRequest
|
|
): Promise<UserSubscription> {
|
|
const { data } = await apiClient.post<UserSubscription>(
|
|
`/admin/subscriptions/${id}/extend`,
|
|
request
|
|
)
|
|
return data
|
|
}
|
|
|
|
/**
|
|
* Revoke subscription
|
|
* @param id - Subscription ID
|
|
* @returns Success confirmation
|
|
*/
|
|
export async function revoke(id: number): Promise<{ message: string }> {
|
|
const { data } = await apiClient.delete<{ message: string }>(`/admin/subscriptions/${id}`)
|
|
return data
|
|
}
|
|
|
|
/**
|
|
* List subscriptions by group
|
|
* @param groupId - Group ID
|
|
* @param page - Page number
|
|
* @param pageSize - Items per page
|
|
* @returns Paginated list of subscriptions in the group
|
|
*/
|
|
export async function listByGroup(
|
|
groupId: number,
|
|
page: number = 1,
|
|
pageSize: number = 20
|
|
): Promise<PaginatedResponse<UserSubscription>> {
|
|
const { data } = await apiClient.get<PaginatedResponse<UserSubscription>>(
|
|
`/admin/groups/${groupId}/subscriptions`,
|
|
{
|
|
params: { page, page_size: pageSize }
|
|
}
|
|
)
|
|
return data
|
|
}
|
|
|
|
/**
|
|
* List subscriptions by user
|
|
* @param userId - User ID
|
|
* @param page - Page number
|
|
* @param pageSize - Items per page
|
|
* @returns Paginated list of user's subscriptions
|
|
*/
|
|
export async function listByUser(
|
|
userId: number,
|
|
page: number = 1,
|
|
pageSize: number = 20
|
|
): Promise<PaginatedResponse<UserSubscription>> {
|
|
const { data } = await apiClient.get<PaginatedResponse<UserSubscription>>(
|
|
`/admin/users/${userId}/subscriptions`,
|
|
{
|
|
params: { page, page_size: pageSize }
|
|
}
|
|
)
|
|
return data
|
|
}
|
|
|
|
export const subscriptionsAPI = {
|
|
list,
|
|
getById,
|
|
getProgress,
|
|
assign,
|
|
bulkAssign,
|
|
extend,
|
|
revoke,
|
|
listByGroup,
|
|
listByUser
|
|
}
|
|
|
|
export default subscriptionsAPI
|