0fcb77b991
CI/CD Pipeline / Check if frontend-only change (push) Has been skipped
CI/CD Pipeline / Frontend Lint (push) Successful in 1m6s
CI Build & Deploy Pipeline / Build Staging Web Image (push) Successful in 1m49s
CI Build & Deploy Pipeline / Build Production API Image (push) Has been skipped
CI Build & Deploy Pipeline / Build Production Web Image (push) Has been skipped
CI Build & Deploy Pipeline / Build Production Worker Image (push) Has been skipped
CI Build & Deploy Pipeline / Deploy Production (push) Has been skipped
CI Build & Deploy Pipeline / Production Browser E2E (push) Has been skipped
CI/CD Pipeline / Validate Code Quality And Tests (push) Successful in 3m1s
CI/CD Pipeline / Unit Tests (push) Successful in 3m20s
CI/CD Pipeline / Integration Tests (push) Successful in 1m29s
CI Build & Deploy Pipeline / Build Staging API Image (push) Successful in 7m4s
CI Build & Deploy Pipeline / Build Staging Worker Image (push) Successful in 7m54s
CI Build & Deploy Pipeline / Deploy Staging (Watchtower auto-deploy) (push) Successful in 45s
CI Build & Deploy Pipeline / Staging E2E Tests (push) Failing after 2m50s
CI Build & Deploy Pipeline / Staging API Integration Tests (push) Successful in 3m28s
Co-authored-by: xiaoxia <dev@xiaoxiajianji.com> Co-committed-by: xiaoxia <dev@xiaoxiajianji.com>
107 lines
2.5 KiB
TypeScript
107 lines
2.5 KiB
TypeScript
/**
|
|
* 订阅 API 模块
|
|
* 对接后端订阅管理接口
|
|
*/
|
|
import apiClient from "./client"
|
|
|
|
/** 套餐类型 */
|
|
export type PlanType = "free" | "standard" | "pro" | "enterprise"
|
|
|
|
/** 订阅状态 */
|
|
export type SubscriptionStatus = "active" | "expired" | "cancelled" | "trial"
|
|
|
|
/** 账单状态 */
|
|
export type BillingStatus = "paid" | "pending" | "failed" | "refunded"
|
|
|
|
/** 计费周期 */
|
|
export type BillingCycle = "monthly" | "yearly"
|
|
|
|
/** 套餐信息 */
|
|
export interface Plan {
|
|
id: PlanType
|
|
name: string
|
|
price: number | null
|
|
yearly_price?: number | null
|
|
description: string
|
|
recommended: boolean
|
|
features: string[]
|
|
}
|
|
|
|
/** 当前订阅信息 */
|
|
export interface SubscriptionInfo {
|
|
id: string
|
|
plan_id: PlanType
|
|
plan_name: string
|
|
status: SubscriptionStatus
|
|
billing_cycle: BillingCycle
|
|
current_period_start: string
|
|
current_period_end: string
|
|
amount: number
|
|
auto_renew: boolean
|
|
created_at: string
|
|
}
|
|
|
|
/** 账单记录 */
|
|
export interface BillingRecord {
|
|
id: string
|
|
plan_name: string
|
|
amount: number
|
|
billing_cycle: BillingCycle
|
|
status: BillingStatus
|
|
payment_method: string
|
|
created_at: string
|
|
invoice_url?: string
|
|
}
|
|
|
|
/** 升级/降级请求 */
|
|
export interface ChangePlanRequest {
|
|
target_plan_id: PlanType
|
|
billing_cycle: BillingCycle
|
|
}
|
|
|
|
/** 升级/降级响应 */
|
|
export interface ChangePlanResponse {
|
|
success: boolean
|
|
message: string
|
|
new_subscription?: SubscriptionInfo
|
|
}
|
|
|
|
// ============ API 函数 ============
|
|
|
|
/** 获取当前订阅信息 */
|
|
export const getCurrentSubscription = async (): Promise<SubscriptionInfo> => {
|
|
const response = await apiClient.get("/subscription/current")
|
|
return response.data
|
|
}
|
|
|
|
/** 获取账单记录列表 */
|
|
export const getBillingRecords = async (): Promise<BillingRecord[]> => {
|
|
const response = await apiClient.get("/subscription/billing-records")
|
|
return response.data
|
|
}
|
|
|
|
/** 升级/降级套餐 */
|
|
export const changePlan = async (request: ChangePlanRequest): Promise<ChangePlanResponse> => {
|
|
const response = await apiClient.post("/subscription/change-plan", request)
|
|
return response.data
|
|
}
|
|
|
|
/** 取消订阅 */
|
|
export const cancelSubscription = async (): Promise<{
|
|
success: boolean
|
|
message: string
|
|
}> => {
|
|
const response = await apiClient.post("/subscription/cancel")
|
|
return response.data
|
|
}
|
|
|
|
/** 切换自动续费 */
|
|
export const toggleAutoRenew = async (
|
|
enabled: boolean,
|
|
): Promise<{ success: boolean; message: string }> => {
|
|
const response = await apiClient.post("/subscription/toggle-auto-renew", {
|
|
enabled,
|
|
})
|
|
return response.data
|
|
}
|