diff --git a/src/credits/credits.ts b/src/credits/credits.ts index 4f16e47..9cde6c0 100644 --- a/src/credits/credits.ts +++ b/src/credits/credits.ts @@ -21,6 +21,11 @@ export async function getUserCredits(userId: string): Promise { return record[0]?.currentCredits || 0; } +/** + * Update user's current credit balance + * @param userId - User ID + * @param credits - New credit balance + */ export async function updateUserCredits(userId: string, credits: number) { const db = await getDb(); await db @@ -29,6 +34,11 @@ export async function updateUserCredits(userId: string, credits: number) { .where(eq(userCredit.userId, userId)); } +/** + * Update user's last refresh time + * @param userId - User ID + * @param date - Last refresh time + */ export async function updateUserLastRefreshAt(userId: string, date: Date) { const db = await getDb(); await db @@ -63,11 +73,11 @@ export async function saveCreditTransaction({ type, description ); - throw new Error('Invalid params'); + throw new Error('saveCreditTransaction, invalid params'); } if (!Number.isFinite(amount) || amount === 0) { console.error('saveCreditTransaction, invalid amount', userId, amount); - throw new Error('Invalid amount'); + throw new Error('saveCreditTransaction, invalid amount'); } const db = await getDb(); await db.insert(creditTransaction).values({ @@ -107,18 +117,18 @@ export async function addCredits({ }) { if (!userId || !type || !description) { console.error('addCredits, invalid params', userId, type, description); - throw new Error('Invalid params'); + throw new Error('addCredits, invalid params'); } if (!Number.isFinite(amount) || amount <= 0) { console.error('addCredits, invalid amount', userId, amount); - throw new Error('Invalid amount'); + throw new Error('addCredits, invalid amount'); } if ( expireDays !== undefined && (!Number.isFinite(expireDays) || expireDays <= 0) ) { console.error('addCredits, invalid expire days', userId, expireDays); - throw new Error('Invalid expire days'); + throw new Error('addCredits, invalid expire days'); } // Process expired credits first await processExpiredCredits(userId); @@ -194,11 +204,11 @@ export async function consumeCredits({ }) { if (!userId || !description) { console.error('consumeCredits, invalid params', userId, description); - throw new Error('Invalid params'); + throw new Error('consumeCredits, invalid params'); } if (!Number.isFinite(amount) || amount <= 0) { console.error('consumeCredits, invalid amount', userId, amount); - throw new Error('Invalid amount'); + throw new Error('consumeCredits, invalid amount'); } // Process expired credits first await processExpiredCredits(userId); diff --git a/src/credits/types.ts b/src/credits/types.ts index 0b2fab4..0f94a21 100644 --- a/src/credits/types.ts +++ b/src/credits/types.ts @@ -9,6 +9,9 @@ export enum CREDIT_TRANSACTION_TYPE { EXPIRE = 'EXPIRE', // Credits expired } +/** + * Credit package price + */ export interface CreditPackagePrice { priceId: string; // Stripe price ID (not product id) amount: number; // Price amount in currency units (dollars, euros, etc.) diff --git a/src/lib/auth.ts b/src/lib/auth.ts index bd4c3c7..bab07b8 100644 --- a/src/lib/auth.ts +++ b/src/lib/auth.ts @@ -1,4 +1,6 @@ import { websiteConfig } from '@/config/website'; +import { addCredits } from '@/credits/credits'; +import { CREDIT_TRANSACTION_TYPE } from '@/credits/types'; import { getDb } from '@/db/index'; import { defaultMessages } from '@/i18n/messages'; import { LOCALE_COOKIE_NAME, routing } from '@/i18n/routing'; @@ -129,6 +131,19 @@ export const auth = betterAuth({ console.error('Newsletter subscription error:', error); } } + // Add register gift credits to the user if enabled in website config + if ( + websiteConfig.credits.registerGiftCredits.enable && + websiteConfig.credits.registerGiftCredits.credits > 0 + ) { + await addCredits({ + userId: user.id, + amount: websiteConfig.credits.registerGiftCredits.credits, + type: CREDIT_TRANSACTION_TYPE.REGISTER_GIFT, + description: 'Register gift credits', + expireDays: websiteConfig.credits.registerGiftCredits.expireDays, + }); + } }, }, },