Your Name 9b1de1a9f3
Some checks failed
Lint / build (20) (push) Has been cancelled
Playwright Tests / test (push) Has been cancelled
新增新版首页模式切换与会员升级配置体系
2026-02-13 19:20:54 +08:00

87 lines
2.5 KiB
TypeScript

import { NextResponse } from "next/server";
import { eq } from "drizzle-orm";
import { auth } from "@/app/(auth)/auth";
import { db } from "@/lib/db";
import { systemSettings } from "@/lib/db/schema";
import {
checkUserImageQuota,
getUserMonthlyImageCount,
} from "@/lib/db/queries";
import {
defaultMembershipConfig,
defaultMembershipUserOverrides,
getMembershipPlanById,
normalizeMembershipConfig,
normalizeMembershipUserOverrides,
resolveMembershipPlanIdForUser,
} from "@/lib/membership/config";
const MEMBERSHIP_CONFIG_KEY = "membership_config";
const MEMBERSHIP_USER_OVERRIDES_KEY = "membership_user_plan_overrides";
export async function GET() {
try {
const session = await auth();
if (!session?.user?.id) {
return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
}
const [configSetting, overridesSetting, quota, totalImages] = await Promise.all([
db
.select()
.from(systemSettings)
.where(eq(systemSettings.key, MEMBERSHIP_CONFIG_KEY))
.limit(1)
.then((rows) => rows[0]),
db
.select()
.from(systemSettings)
.where(eq(systemSettings.key, MEMBERSHIP_USER_OVERRIDES_KEY))
.limit(1)
.then((rows) => rows[0]),
checkUserImageQuota(session.user.id),
getUserMonthlyImageCount(session.user.id),
]);
const config = configSetting?.value
? normalizeMembershipConfig(configSetting.value)
: defaultMembershipConfig;
const overrides = overridesSetting?.value
? normalizeMembershipUserOverrides(overridesSetting.value)
: defaultMembershipUserOverrides;
const currentPlanId = resolveMembershipPlanIdForUser(
session.user.id,
session.user.email,
config,
overrides
);
const currentPlan = getMembershipPlanById(config, currentPlanId);
const currentCredits =
quota.remaining !== null ? Math.max(0, quota.remaining) : currentPlan.monthlyCredits;
return NextResponse.json({
config,
currentPlanId,
currentPlan,
summary: {
currentCredits,
dailyFreeCredits: currentPlan.dailyFreeCredits,
usedThisMonth: quota.used,
monthlyLimit: quota.limit,
remainingThisMonth: quota.remaining,
totalImages,
},
updatedAt: new Date().toISOString(),
});
} catch (error) {
console.error("[Membership Summary API] Error:", error);
return NextResponse.json(
{ error: "Failed to fetch membership summary" },
{ status: 500 }
);
}
}