/*
Copyright (C) 2023-2026 QuantumNous
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
import { api } from '@/lib/api'
import type {
ApiResponse,
PlanRecord,
PlanPayload,
UserSubscriptionRecord,
CreateUserSubscriptionRequest,
SubscriptionPayResponse,
SubscriptionPayRequest,
SelfSubscriptionData,
} from './types'
// ============================================================================
// Admin Plan Management
// ============================================================================
export async function getAdminPlans(): Promise> {
const res = await api.get('/api/subscription/admin/plans')
return res.data
}
export async function createPlan(
data: PlanPayload
): Promise> {
const res = await api.post('/api/subscription/admin/plans', data)
return res.data
}
export async function updatePlan(
id: number,
data: PlanPayload
): Promise> {
const res = await api.put(`/api/subscription/admin/plans/${id}`, data)
return res.data
}
export async function patchPlanStatus(
id: number,
enabled: boolean
): Promise {
const res = await api.patch(`/api/subscription/admin/plans/${id}`, {
enabled,
})
return res.data
}
// ============================================================================
// Admin User Subscription Management
// ============================================================================
export async function getUserSubscriptions(
userId: number
): Promise> {
const res = await api.get(
`/api/subscription/admin/users/${userId}/subscriptions`
)
return res.data
}
export async function createUserSubscription(
userId: number,
data: CreateUserSubscriptionRequest
): Promise> {
const res = await api.post(
`/api/subscription/admin/users/${userId}/subscriptions`,
data
)
return res.data
}
export async function invalidateUserSubscription(
subId: number
): Promise> {
const res = await api.post(
`/api/subscription/admin/user_subscriptions/${subId}/invalidate`
)
return res.data
}
export async function deleteUserSubscription(
subId: number
): Promise {
const res = await api.delete(
`/api/subscription/admin/user_subscriptions/${subId}`
)
return res.data
}
// ============================================================================
// User-facing Subscription Payment
// ============================================================================
export async function paySubscriptionStripe(
data: SubscriptionPayRequest
): Promise {
const res = await api.post('/api/subscription/stripe/pay', data)
return res.data
}
export async function paySubscriptionCreem(
data: SubscriptionPayRequest
): Promise {
const res = await api.post('/api/subscription/creem/pay', data)
return res.data
}
export async function paySubscriptionWaffoPancake(
data: SubscriptionPayRequest
): Promise {
const res = await api.post('/api/subscription/waffo-pancake/pay', data)
return res.data
}
// Mints a Pancake OnetimeProduct (see controller for the OnetimeProduct vs
// SubscriptionProduct rationale) using persisted creds + StoreID.
export async function createWaffoPancakeSubscriptionProduct(data: {
name: string
amount: string
}): Promise<
ApiResponse<{ product_id: string; product_name: string; store_id: string }>
> {
const res = await api.post(
'/api/option/waffo-pancake/subscription-product',
data
)
return res.data
}
// Returns the OnetimeProducts in the saved Pancake store; empty when the
// gateway isn't fully configured.
export async function listWaffoPancakeSubscriptionProductOptions(): Promise<
ApiResponse<{
store_id: string
products: { id: string; name: string; status: string }[]
}>
> {
const res = await api.post(
'/api/option/waffo-pancake/subscription-product-options'
)
return res.data
}
export async function paySubscriptionEpay(
data: SubscriptionPayRequest & { payment_method: string }
): Promise {
const res = await api.post('/api/subscription/epay/pay', data)
return {
...res.data,
url: res.data.url || (res as unknown as { url?: string }).url,
}
}
// ============================================================================
// User Self Subscriptions
// ============================================================================
export async function getSelfSubscriptions(): Promise<
ApiResponse
> {
const res = await api.get('/api/subscription/self')
return res.data
}
export async function getSelfSubscriptionFull(): Promise<
ApiResponse
> {
const res = await api.get('/api/subscription/self')
return res.data
}
export async function getPublicPlans(): Promise> {
const res = await api.get('/api/subscription/plans')
return res.data
}
export async function updateBillingPreference(
preference: string
): Promise> {
const res = await api.put('/api/subscription/self/preference', {
billing_preference: preference,
})
return res.data
}
export async function getGroups(): Promise> {
const res = await api.get('/api/group')
return res.data
}