feat: add register gift and monthly refresh credits to new user

This commit is contained in:
javayhu 2025-07-12 00:55:27 +08:00
parent 9f3c5e80c2
commit 765f5e1e39
2 changed files with 70 additions and 38 deletions

View File

@ -632,13 +632,13 @@
},
"paymentIdCopied": "支付ID已复制到剪贴板",
"types": {
"MONTHLY_REFRESH": "每月刷新",
"REGISTER_GIFT": "注册礼品",
"PURCHASE": "购买",
"USAGE": "使用",
"EXPIRE": "过期",
"SUBSCRIPTION_RENEWAL": "订阅续费",
"LIFETIME_MONTHLY": "终身月度"
"MONTHLY_REFRESH": "每月赠送",
"REGISTER_GIFT": "注册赠送",
"PURCHASE": "购买积分",
"USAGE": "使用积分",
"EXPIRE": "过期积分",
"SUBSCRIPTION_RENEWAL": "订阅月度积分",
"LIFETIME_MONTHLY": "终身月度积分"
},
"detailViewer": {
"title": "积分交易详情",

View File

@ -1,16 +1,19 @@
import { websiteConfig } from '@/config/website';
import { addCredits } from '@/credits/credits';
import { CREDIT_TRANSACTION_TYPE } from '@/credits/types';
import {
addMonthlyFreeCreditsIfNeed,
addRegisterGiftCredits,
} from '@/credits/credits';
import { getDb } from '@/db/index';
import { defaultMessages } from '@/i18n/messages';
import { LOCALE_COOKIE_NAME, routing } from '@/i18n/routing';
import { sendEmail } from '@/mail';
import { subscribe } from '@/newsletter';
import { betterAuth } from 'better-auth';
import { type User, betterAuth } from 'better-auth';
import { drizzleAdapter } from 'better-auth/adapters/drizzle';
import { admin } from 'better-auth/plugins';
import { parse as parseCookies } from 'cookie';
import type { Locale } from 'next-intl';
import { getAllPricePlans } from './price-plan';
import { getBaseUrl, getUrlWithLocaleInCallbackUrl } from './urls/urls';
/**
@ -116,34 +119,7 @@ export const auth = betterAuth({
user: {
create: {
after: async (user) => {
// Auto subscribe user to newsletter after sign up if enabled in website config
if (user.email && websiteConfig.newsletter.autoSubscribeAfterSignUp) {
try {
const subscribed = await subscribe(user.email);
if (!subscribed) {
console.error(
`Failed to subscribe user ${user.email} to newsletter`
);
} else {
console.log(`User ${user.email} subscribed to newsletter`);
}
} catch (error) {
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,
});
}
await onCreateUser(user);
},
},
},
@ -179,3 +155,59 @@ export function getLocaleFromRequest(request?: Request): Locale {
const cookies = parseCookies(request?.headers.get('cookie') ?? '');
return (cookies[LOCALE_COOKIE_NAME] as Locale) ?? routing.defaultLocale;
}
/**
* On create user hook
*
* @param user - The user to create
*/
async function onCreateUser(user: User) {
// Auto subscribe user to newsletter after sign up if enabled in website config
if (user.email && websiteConfig.newsletter.autoSubscribeAfterSignUp) {
try {
const subscribed = await subscribe(user.email);
if (!subscribed) {
console.error(`Failed to subscribe user ${user.email} to newsletter`);
} else {
console.log(`User ${user.email} subscribed to newsletter`);
}
} catch (error) {
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
) {
try {
await addRegisterGiftCredits(user.id);
const credits = websiteConfig.credits.registerGiftCredits.credits;
console.log(
`added register gift credits for user ${user.id}, credits: ${credits}`
);
} catch (error) {
console.error('Register gift credits error:', error);
}
}
// Add free monthly credits to the user if enabled in website config
const pricePlans = await getAllPricePlans();
const freePlan = pricePlans.find((plan) => plan.isFree);
if (
freePlan?.credits?.enable &&
freePlan?.credits?.amount &&
freePlan?.credits?.amount > 0
) {
try {
await addMonthlyFreeCreditsIfNeed(user.id);
const credits = freePlan.credits.amount;
console.log(
`added free monthly credits for user ${user.id}, credits: ${credits}`
);
} catch (error) {
console.error('Free monthly credits error:', error);
}
}
}