Store calculation history on server with bazi input and chart snapshots.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
dekun
2026-06-13 09:57:16 +08:00
parent fcf071cfaa
commit 123a5cce6d
17 changed files with 419 additions and 54 deletions
+21
View File
@@ -0,0 +1,21 @@
import { NextResponse } from "next/server";
import { getHistoryUsername } from "@/lib/history/request-user";
import { deleteHistoryEntry } from "@/lib/history/server-store";
export async function DELETE(
_req: Request,
{ params }: { params: Promise<{ id: string }> },
) {
const username = await getHistoryUsername();
if (!username) {
return NextResponse.json({ error: "请先登录" }, { status: 401 });
}
const { id } = await params;
const removed = await deleteHistoryEntry(username, id);
if (!removed) {
return NextResponse.json({ error: "记录不存在" }, { status: 404 });
}
return NextResponse.json({ ok: true });
}
+49
View File
@@ -0,0 +1,49 @@
import { NextResponse } from "next/server";
import { getHistoryUsername } from "@/lib/history/request-user";
import {
addHistoryEntry,
listHistoryEntries,
} from "@/lib/history/server-store";
import type { CalcHistoryCreate } from "@/lib/history/types";
export async function GET() {
const username = await getHistoryUsername();
if (!username) {
return NextResponse.json({ error: "请先登录" }, { status: 401 });
}
const items = await listHistoryEntries(username);
return NextResponse.json({ items });
}
export async function POST(req: Request) {
const username = await getHistoryUsername();
if (!username) {
return NextResponse.json({ error: "请先登录" }, { status: 401 });
}
let body: CalcHistoryCreate;
try {
body = (await req.json()) as CalcHistoryCreate;
} catch {
return NextResponse.json({ error: "请求格式错误" }, { status: 400 });
}
if (!body.mode || !body.title || !body.question || !body.completion) {
return NextResponse.json({ error: "缺少必填字段" }, { status: 400 });
}
const entry = await addHistoryEntry(username, {
mode: body.mode,
title: body.title,
question: body.question,
summary: body.summary ?? "",
completion: body.completion,
meta: body.meta ?? {},
baziInput: body.baziInput,
baziChart: body.baziChart,
hexagram: body.hexagram,
});
return NextResponse.json({ entry });
}