luowuyin's picture
25:05:05 10:41:39 v0.3.7
a572854
import { query } from "@/lib/db/client";
import { NextResponse } from "next/server";
import { verifyApiToken } from "@/lib/auth";
export async function POST(req: Request) {
const authError = verifyApiToken(req);
if (authError) {
return authError;
}
try {
const data = await req.json();
if (!data.version || !data.data) {
throw new Error("Invalid import data format");
}
try {
await query("BEGIN");
await query("TRUNCATE TABLE user_usage_records CASCADE");
await query("TRUNCATE TABLE model_prices CASCADE");
await query("TRUNCATE TABLE users CASCADE");
if (data.data.users?.length) {
for (const user of data.data.users) {
await query(
`INSERT INTO users (id, email, name, role, balance)
VALUES ($1, $2, $3, $4, $5)`,
[user.id, user.email, user.name, user.role, user.balance]
);
}
}
if (data.data.model_prices?.length) {
for (const price of data.data.model_prices) {
await query(
`INSERT INTO model_prices (id, name, input_price, output_price)
VALUES ($1, $2, $3, $4)`,
[price.id, price.name, price.input_price, price.output_price]
);
}
}
if (data.data.user_usage_records?.length) {
for (const record of data.data.user_usage_records) {
await query(
`INSERT INTO user_usage_records (
user_id, nickname, use_time, model_name,
input_tokens, output_tokens, cost, balance_after
) VALUES ($1, $2, $3, $4, $5, $6, $7, $8)`,
[
record.user_id,
record.nickname,
record.use_time,
record.model_name,
record.input_tokens,
record.output_tokens,
record.cost,
record.balance_after,
]
);
}
}
await query("COMMIT");
return NextResponse.json({
success: true,
message: "Data import successful",
});
} catch (error) {
await query("ROLLBACK");
throw error;
}
} catch (error) {
console.error("Fail to import database:", error);
return NextResponse.json(
{
success: false,
error:
error instanceof Error ? error.message : "Fail to import database",
},
{ status: 500 }
);
}
}