/*
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 {
RedemptionRequest,
PaymentRequest,
AmountRequest,
AffiliateTransferRequest,
ApiResponse,
TopupInfoResponse,
RedemptionResponse,
AmountResponse,
PaymentResponse,
StripePaymentResponse,
AffiliateCodeResponse,
AffiliateTransferResponse,
BillingHistoryResponse,
CompleteOrderRequest,
CreemPaymentRequest,
CreemPaymentResponse,
WaffoPaymentRequest,
WaffoPaymentResponse,
WaffoPancakePaymentRequest,
WaffoPancakePaymentResponse,
} from './types'
// ============================================================================
// Wallet API Functions
// ============================================================================
/**
* Check if API response is successful
*/
export function isApiSuccess(response: ApiResponse): boolean {
return response.success === true || response.message === 'success'
}
/**
* Get topup configuration info
*/
export async function getTopupInfo(): Promise {
const res = await api.get('/api/user/topup/info')
return res.data
}
/**
* Redeem a topup code
*/
export async function redeemTopupCode(
request: RedemptionRequest
): Promise {
const res = await api.post('/api/user/topup', request)
return res.data
}
/**
* Calculate payment amount for regular payment
*/
export async function calculateAmount(
request: AmountRequest
): Promise {
const res = await api.post('/api/user/amount', request, {
skipBusinessError: true,
} as Record)
return res.data
}
/**
* Calculate payment amount for Stripe payment
*/
export async function calculateStripeAmount(
request: AmountRequest
): Promise {
const res = await api.post('/api/user/stripe/amount', request, {
skipBusinessError: true,
} as Record)
return res.data
}
/**
* Calculate payment amount for Waffo payment
*/
export async function calculateWaffoAmount(
request: AmountRequest
): Promise {
const res = await api.post('/api/user/waffo/amount', request, {
skipBusinessError: true,
} as Record)
return res.data
}
/**
* Request regular payment
*/
export async function requestPayment(
request: PaymentRequest
): Promise {
const res = await api.post('/api/user/pay', request, {
skipBusinessError: true,
} as Record)
return {
...res.data,
url: res.data.url || (res as unknown as { url?: string }).url,
}
}
/**
* Request Stripe payment
*/
export async function requestStripePayment(
request: PaymentRequest
): Promise {
const res = await api.post('/api/user/stripe/pay', request, {
skipBusinessError: true,
} as Record)
return res.data
}
/**
* Request Creem payment
*/
export async function requestCreemPayment(
request: CreemPaymentRequest
): Promise {
const res = await api.post('/api/user/creem/pay', request, {
skipBusinessError: true,
} as Record)
return res.data
}
/**
* Request Waffo payment
*/
export async function requestWaffoPayment(
request: WaffoPaymentRequest
): Promise {
const res = await api.post('/api/user/waffo/pay', request, {
skipBusinessError: true,
} as Record)
return res.data
}
/**
* Calculate payment amount for Waffo Pancake payment
*/
export async function calculateWaffoPancakeAmount(
request: AmountRequest
): Promise {
const res = await api.post('/api/user/waffo-pancake/amount', request, {
skipBusinessError: true,
} as Record)
return res.data
}
/**
* Request Waffo Pancake payment
*/
export async function requestWaffoPancakePayment(
request: WaffoPancakePaymentRequest
): Promise {
const res = await api.post('/api/user/waffo-pancake/pay', request, {
skipBusinessError: true,
} as Record)
return res.data
}
/**
* Get affiliate code
*/
export async function getAffiliateCode(): Promise {
const res = await api.get('/api/user/aff')
return res.data
}
/**
* Transfer affiliate quota to balance
*/
export async function transferAffiliateQuota(
request: AffiliateTransferRequest
): Promise {
const res = await api.post('/api/user/aff_transfer', request)
return res.data
}
/**
* Get billing history for current user
*/
export async function getUserBillingHistory(
page: number,
pageSize: number,
keyword?: string
): Promise> {
const params = new URLSearchParams({
p: page.toString(),
page_size: pageSize.toString(),
})
if (keyword) {
params.append('keyword', keyword)
}
const res = await api.get(`/api/user/topup/self?${params.toString()}`)
return res.data
}
/**
* Get billing history for all users (admin only)
*/
export async function getAllBillingHistory(
page: number,
pageSize: number,
keyword?: string
): Promise> {
const params = new URLSearchParams({
p: page.toString(),
page_size: pageSize.toString(),
})
if (keyword) {
params.append('keyword', keyword)
}
const res = await api.get(`/api/user/topup?${params.toString()}`)
return res.data
}
/**
* Complete a pending order (admin only)
*/
export async function completeOrder(
request: CompleteOrderRequest
): Promise {
const res = await api.post('/api/user/topup/complete', request)
return res.data
}