haixunMaster/app/api/session/import/route.ts

86 lines
3.0 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { NextResponse } from "next/server";
import { getActiveAccountProfile } from "@/lib/account-context";
import { assertAccountOwnedByUser } from "@/lib/auth/accounts";
import { authErrorResponse } from "@/lib/auth/api";
import { requireSessionUser } from "@/lib/auth/session";
import {
normalizeStorageStateInput,
type PlaywrightStorageState,
} from "@/lib/threads-browser/storage-state";
import { probeSession, saveAccountSession } from "@/lib/threads-browser";
export const maxDuration = 120;
export async function POST(request: Request) {
try {
const user = await requireSessionUser();
const body = (await request.json()) as {
storageState?: string | PlaywrightStorageState;
accountId?: string;
};
if (!body.storageState) {
return NextResponse.json({ error: "缺少 storageState" }, { status: 400 });
}
const normalized = normalizeStorageStateInput(body.storageState);
if (!normalized.ok) {
return NextResponse.json({ error: normalized.error }, { status: 400 });
}
const account = body.accountId
? await assertAccountOwnedByUser(user.id, body.accountId)
: await getActiveAccountProfile();
if (!account) {
return NextResponse.json(
{ error: "請先在側欄選擇或建立經營帳號,再匯入 session" },
{ status: 400 }
);
}
await saveAccountSession(account.id, normalized.storageState, { valid: true });
return NextResponse.json({
success: true,
valid: true,
synced: true,
username: account.username,
message: account.username
? `Session 已同步:@${account.username}`
: "Session 已同步到 server",
});
} catch (error) {
const authRes = authErrorResponse(error);
if (authRes) return authRes;
const message = error instanceof Error ? error.message : "匯入 session 失敗";
return NextResponse.json({ success: false, valid: false, message }, { status: 500 });
}
}
/** 不啟動瀏覽器,僅檢查 JSON 格式(供 UI 預覽用)。 */
export async function PUT(request: Request) {
try {
await requireSessionUser();
const body = (await request.json()) as {
storageState?: string | PlaywrightStorageState;
};
if (!body.storageState) {
return NextResponse.json({ error: "缺少 storageState" }, { status: 400 });
}
const normalized = normalizeStorageStateInput(body.storageState);
if (!normalized.ok) {
return NextResponse.json({ valid: false, message: normalized.error }, { status: 400 });
}
const valid = await probeSession(normalized.storageState);
return NextResponse.json({
valid,
message: valid ? "格式正確Threads session 有效" : "格式正確,但 Threads session 已失效",
});
} catch (error) {
const authRes = authErrorResponse(error);
if (authRes) return authRes;
const message = error instanceof Error ? error.message : "驗證失敗";
return NextResponse.json({ valid: false, message }, { status: 500 });
}
}