47 lines
1.6 KiB
TypeScript
47 lines
1.6 KiB
TypeScript
|
|
import { NextResponse } from "next/server";
|
|||
|
|
import { getOrCreateSettings } from "@/lib/user-settings";
|
|||
|
|
import { getActiveAccountId } from "@/lib/account-context";
|
|||
|
|
import { buildThreadsOAuthUrl, getAppBaseUrl, getThreadsAppId } from "@/lib/threads-api";
|
|||
|
|
|
|||
|
|
export async function GET(request: Request) {
|
|||
|
|
let homeUrl: URL;
|
|||
|
|
try {
|
|||
|
|
homeUrl = new URL("/", new URL(request.url).origin);
|
|||
|
|
} catch {
|
|||
|
|
return NextResponse.json({ error: "invalid request url" }, { status: 400 });
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
try {
|
|||
|
|
const settings = await getOrCreateSettings();
|
|||
|
|
const appId = getThreadsAppId();
|
|||
|
|
homeUrl = new URL("/", getAppBaseUrl(request, settings.appUrl));
|
|||
|
|
|
|||
|
|
if (!appId) {
|
|||
|
|
homeUrl.searchParams.set(
|
|||
|
|
"threads_error",
|
|||
|
|
"系統尚未設定 Threads App,請管理員在 .env 填入 THREADS_APP_ID"
|
|||
|
|
);
|
|||
|
|
return NextResponse.redirect(homeUrl);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
const accountId = await getActiveAccountId();
|
|||
|
|
if (!accountId) {
|
|||
|
|
homeUrl.searchParams.set("threads_error", "no_active_account");
|
|||
|
|
return NextResponse.redirect(homeUrl);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
try {
|
|||
|
|
const url = buildThreadsOAuthUrl(request, appId, accountId, settings.appUrl);
|
|||
|
|
return NextResponse.redirect(url);
|
|||
|
|
} catch (err) {
|
|||
|
|
const message = err instanceof Error ? err.message : "invalid_app_id";
|
|||
|
|
homeUrl.searchParams.set("threads_error", message);
|
|||
|
|
return NextResponse.redirect(homeUrl);
|
|||
|
|
}
|
|||
|
|
} catch (err) {
|
|||
|
|
const message = err instanceof Error ? err.message : "authorize_failed";
|
|||
|
|
homeUrl.searchParams.set("threads_error", message);
|
|||
|
|
return NextResponse.redirect(homeUrl);
|
|||
|
|
}
|
|||
|
|
}
|