63 lines
2.1 KiB
TypeScript
63 lines
2.1 KiB
TypeScript
import { NextRequest, NextResponse } from "next/server";
|
|
import { getPocketBaseConfig } from "@/config/services.config";
|
|
import { getAdminToken } from "@/app/lib/pocketbase/admin";
|
|
|
|
import { COOKIE_NAME } from "@/app/lib/auth-cookie";
|
|
|
|
function getUserIdFromCookie(request: NextRequest): string | null {
|
|
const cookie = request.cookies.get(COOKIE_NAME)?.value;
|
|
if (!cookie) return null;
|
|
try {
|
|
const payload = JSON.parse(Buffer.from(cookie, "base64url").toString("utf-8"));
|
|
return payload?.userId ?? null;
|
|
} catch {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
const REQUIRED_FIELDS = ["nickname", "occupation", "reason", "single", "wechatId", "gender", "phone"];
|
|
|
|
function isRecordComplete(record: Record<string, unknown>): boolean {
|
|
return REQUIRED_FIELDS.every((key) => {
|
|
const v = record[key];
|
|
return v != null && String(v).trim() !== "";
|
|
});
|
|
}
|
|
|
|
export async function GET(request: NextRequest) {
|
|
try {
|
|
const userId = getUserIdFromCookie(request);
|
|
if (!userId) {
|
|
return NextResponse.json({ ok: true, hasRecord: false, isComplete: false });
|
|
}
|
|
|
|
const token = await getAdminToken();
|
|
if (!token) {
|
|
return NextResponse.json({ ok: true, hasRecord: false, isComplete: false });
|
|
}
|
|
|
|
const pb = getPocketBaseConfig();
|
|
const base = pb.url.replace(/\/$/, "");
|
|
const filter = `user_id="${userId}"`;
|
|
const res = await fetch(
|
|
`${base}/api/collections/${pb.joinCollection}/records?filter=${encodeURIComponent(filter)}&perPage=1`,
|
|
{ headers: { Authorization: `Bearer ${token}` }, cache: "no-store" }
|
|
);
|
|
|
|
if (!res.ok) {
|
|
return NextResponse.json({ ok: true, hasRecord: false, isComplete: false });
|
|
}
|
|
|
|
const data = await res.json().catch(() => ({}));
|
|
const record = (data?.items ?? [])[0];
|
|
if (!record) {
|
|
return NextResponse.json({ ok: true, hasRecord: false, isComplete: false });
|
|
}
|
|
|
|
const isComplete = isRecordComplete(record as Record<string, unknown>);
|
|
return NextResponse.json({ ok: true, hasRecord: true, isComplete });
|
|
} catch {
|
|
return NextResponse.json({ ok: true, hasRecord: false, isComplete: false });
|
|
}
|
|
}
|