0.4.0 convex及界面修改

This commit is contained in:
liaibo
2026-02-01 08:47:40 +08:00
parent d1f055f51a
commit af92c4b149
636 changed files with 7522 additions and 1815 deletions
@@ -103,7 +103,8 @@ export async function DELETE(_request: Request, context: RouteContext) {
if (isConvexEnabled()) {
const { auth, client } = await getAuthedConvexClient();
try {
await client.mutation(api.tables.purge, {
// 软删除:进入垃圾桶(可恢复)
await client.mutation(api.tables.remove, {
userId: auth.userId,
tableId,
});
@@ -117,4 +118,3 @@ export async function DELETE(_request: Request, context: RouteContext) {
return NextResponse.json({ error: "当前仅支持 Convex 模式" }, { status: 501 });
}
@@ -0,0 +1,51 @@
import { NextResponse } from "next/server";
import { isConvexEnabled } from "@/lib/convex/enabled";
import { HttpError, requireAuthContext } from "@/lib/auth/authContext";
import { api } from "@/lib/convex/api";
import { getConvexAuthedHttpClient } from "@/lib/convex/server";
export const dynamic = "force-dynamic";
interface EmptyTrashPayload {
workspaceId?: string;
}
function makeExpiredDeletedAtForForceEmpty(): string {
// “清空附件垃圾桶”是一个显式的强制操作:直接清空所有垃圾桶内的表格,不受 10 分钟宽限期限制。
// Convex 侧按 `deleted_at <= expiredDeletedAt` 做过滤,因此这里给一个很靠后的时间上界即可。
return new Date(Date.now() + 1000 * 60 * 60 * 24 * 365 * 100).toISOString();
}
export async function POST(request: Request) {
if (!isConvexEnabled()) {
return NextResponse.json({ error: "当前仅支持 Convex 模式" }, { status: 501 });
}
let auth;
try {
auth = await requireAuthContext();
} catch (err) {
if (err instanceof HttpError) {
return NextResponse.json({ error: "未登录" }, { status: err.status });
}
return NextResponse.json({ error: "未登录" }, { status: 401 });
}
const { workspaceId }: EmptyTrashPayload = await request.json().catch(() => ({}));
if (!workspaceId) {
return NextResponse.json({ error: "缺少 workspaceId" }, { status: 400 });
}
const client = await getConvexAuthedHttpClient();
try {
const res = await client.mutation(api.tables.emptyTrashByWorkspace, {
userId: auth.userId,
workspaceId,
expiredDeletedAt: makeExpiredDeletedAtForForceEmpty(),
});
return NextResponse.json({ success: true, ...(res as any) });
} catch (err) {
const message = err instanceof Error ? err.message : "清空失败";
return NextResponse.json({ error: message }, { status: 500 });
}
}
@@ -0,0 +1,27 @@
import { NextResponse } from "next/server";
import { isConvexEnabled } from "@/lib/convex/enabled";
import { getAuthedConvexClient } from "@/lib/convex/route";
import { api } from "@/lib/convex/api";
export const dynamic = "force-dynamic";
export async function POST(request: Request) {
if (!isConvexEnabled()) {
return NextResponse.json({ error: "当前仅支持 Convex 模式" }, { status: 501 });
}
const { tableId } = (await request.json().catch(() => ({}))) as { tableId?: string };
if (!tableId) {
return NextResponse.json({ error: "缺少 tableId" }, { status: 400 });
}
const { auth, client } = await getAuthedConvexClient();
try {
await client.mutation(api.tables.purge, { userId: auth.userId, tableId });
return NextResponse.json({ success: true }, { status: 200 });
} catch (error) {
console.error("Convex API error:", error);
return NextResponse.json({ error: "Internal Server Error" }, { status: 500 });
}
}
@@ -0,0 +1,27 @@
import { NextResponse } from "next/server";
import { isConvexEnabled } from "@/lib/convex/enabled";
import { getAuthedConvexClient } from "@/lib/convex/route";
import { api } from "@/lib/convex/api";
export const dynamic = "force-dynamic";
export async function POST(request: Request) {
if (!isConvexEnabled()) {
return NextResponse.json({ error: "当前仅支持 Convex 模式" }, { status: 501 });
}
const { tableId } = (await request.json().catch(() => ({}))) as { tableId?: string };
if (!tableId) {
return NextResponse.json({ error: "缺少 tableId" }, { status: 400 });
}
const { auth, client } = await getAuthedConvexClient();
try {
await client.mutation(api.tables.restore, { userId: auth.userId, tableId });
return NextResponse.json({ success: true }, { status: 200 });
} catch (error) {
console.error("Convex API error:", error);
return NextResponse.json({ error: "Internal Server Error" }, { status: 500 });
}
}