73 lines
1.9 KiB
TypeScript
73 lines
1.9 KiB
TypeScript
import { NextResponse } from "next/server";
|
|
import { z } from "zod";
|
|
|
|
import { isPostgresError, queryAdminRows } from "@/lib/admin/database";
|
|
import {
|
|
adminErrorResponse,
|
|
invalidQueryResponse,
|
|
requestId,
|
|
requireAdminMutation,
|
|
} from "@/lib/admin/http";
|
|
|
|
export const runtime = "nodejs";
|
|
|
|
const resetSchema = z.object({
|
|
userId: z.string().uuid(),
|
|
confirmation: z.literal("RESET"),
|
|
});
|
|
|
|
type ResetRow = {
|
|
user_id: string;
|
|
email: string;
|
|
credits: number;
|
|
chat_sessions_deleted: number;
|
|
chart_profiles_deleted: number;
|
|
synastry_reports_deleted: number;
|
|
};
|
|
|
|
export async function POST(request: Request) {
|
|
try {
|
|
const session = await requireAdminMutation(
|
|
request,
|
|
"admin.users.manage_roles",
|
|
);
|
|
const parsed = resetSchema.safeParse(await request.json().catch(() => null));
|
|
if (!parsed.success) return invalidQueryResponse(parsed.error.flatten());
|
|
|
|
const rows = await queryAdminRows<ResetRow>(
|
|
"select * from public.admin_reset_customer_account($1, $2, $3, $4)",
|
|
[
|
|
session.user.id,
|
|
parsed.data.userId,
|
|
"admin_console_reset_customer",
|
|
requestId(request),
|
|
],
|
|
);
|
|
const row = rows[0];
|
|
if (!row) return NextResponse.json({ error: "用户不存在" }, { status: 404 });
|
|
|
|
return NextResponse.json({
|
|
data: {
|
|
userId: row.user_id,
|
|
email: row.email,
|
|
credits: row.credits,
|
|
deleted: {
|
|
chatSessions: row.chat_sessions_deleted,
|
|
chartProfiles: row.chart_profiles_deleted,
|
|
synastryReports: row.synastry_reports_deleted,
|
|
},
|
|
},
|
|
});
|
|
} catch (error) {
|
|
if (
|
|
isPostgresError(error)
|
|
&& error.code === "P0002"
|
|
&& error instanceof Error
|
|
&& error.message.includes("admin_customer_not_found_or_identity_bridge_mismatch")
|
|
) {
|
|
return NextResponse.json({ error: "用户不存在或账号数据不完整" }, { status: 404 });
|
|
}
|
|
return adminErrorResponse(error);
|
|
}
|
|
}
|