40 lines
1.1 KiB
TypeScript
40 lines
1.1 KiB
TypeScript
import { fetchGeoInfo } from '@/lib/geoip';
|
|
import { db } from '@/lib/prisma';
|
|
import { resolvePlanPrice } from '@/modules/plan/services/plan-pricing.service';
|
|
import { parsePlanRules } from '@/modules/plan/services/plan-rules.service';
|
|
import type { AppContext } from '@/types/hono';
|
|
|
|
export async function listPlansHandler(c: AppContext) {
|
|
const plans = await db.plan.findMany({
|
|
orderBy: {
|
|
price: 'asc',
|
|
},
|
|
});
|
|
|
|
const countryParam = c.req.query('country');
|
|
let countryCode: string | undefined;
|
|
|
|
if (countryParam) {
|
|
countryCode = countryParam;
|
|
} else {
|
|
const ip = c.req.header('x-forwarded-for')?.split(',')[0]?.trim() || '127.0.0.1';
|
|
const geo = await fetchGeoInfo(ip);
|
|
countryCode = geo?.countryCode || undefined;
|
|
}
|
|
|
|
return c.json(
|
|
plans.map((plan) => {
|
|
const rules = parsePlanRules(plan.rules);
|
|
const resolved = resolvePlanPrice(Number(plan.price), rules, countryCode);
|
|
return {
|
|
code: plan.code,
|
|
name: plan.name,
|
|
price: resolved.amount,
|
|
currency: resolved.currency,
|
|
features: rules.features,
|
|
limits: rules.limits,
|
|
};
|
|
})
|
|
);
|
|
}
|