/* 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 }