Files
litlyx/dashboard/server/api/payments/change_plan.ts
2025-11-28 16:49:20 +01:00

45 lines
1.8 KiB
TypeScript

import { getPlanFromTag } from "~/shared/data/PLANS";
import { PremiumModel } from "~/shared/schema/PremiumSchema";
export default defineEventHandler(async event => {
//TODO: SELFHOST
const ctx = await getRequestContext(event, 'flag:allowAnonRegistered');
const { user_id } = ctx;
const { plan } = getQuery(event);
const newPlan = getPlanFromTag(plan as any);
if (!newPlan) throw createError({ status: 400, message: 'Plan not valid. Please contact support.' });
const tRpc = useTRPC();
const premiumData = await PremiumModel.findOne({ user_id });
if (!premiumData) throw createError({ status: 400, message: 'Premium data not found. Please contact support.' });
const paymentMethods = await tRpc.payments.customer.listMethods.query({ customer_id: premiumData.customer_id });
const config = useRuntimeConfig();
const redirect_url = config.BASE_URL + '/payment_ok';
if (paymentMethods.data.length > 0) {
if (premiumData.payment_failed) {
const checkout_url = await tRpc.payments.subscription.checkout.mutate({ customer_id: premiumData.customer_id, user_id: premiumData.user_id.toString(), plan_tag: newPlan.TAG, redirect_url });
return { ok: true, soft: false, url: checkout_url }
} else {
return ({ ok: true, soft: true, url: `/checkout?plan_tag=${newPlan.TAG}` });
// await tRpc.payments.subscription.activate.mutate({ customer_id: premiumData.customer_id, user_id: premiumData.user_id.toString(), plan_tag: newPlan.TAG });
// return { ok: true }
}
} else {
const checkout_url = await tRpc.payments.subscription.checkout.mutate({ customer_id: premiumData.customer_id, user_id: premiumData.user_id.toString(), plan_tag: newPlan.TAG, redirect_url });
return { ok: true, soft: false, url: checkout_url }
}
});