36 lines
1.3 KiB
TypeScript
36 lines
1.3 KiB
TypeScript
import type { Account } from "@prisma/client";
|
||
import { getOrCreateSettings } from "@/lib/user-settings";
|
||
import { getActiveAccountProfile } from "@/lib/account-context";
|
||
import {
|
||
accountHasThreadsToken,
|
||
ensureValidAccessTokenForAccount,
|
||
getThreadsCredentials,
|
||
} from "@/lib/threads-api";
|
||
|
||
export type ResolvedThreadsCredentials = NonNullable<
|
||
ReturnType<typeof getThreadsCredentials>
|
||
>;
|
||
|
||
/**
|
||
* 取得「目前帳號」的官方 API 憑證。
|
||
* App ID / App Secret 為全域共用(存在 Setting),
|
||
* access token / user id 為每個帳號各自的(存在 Account)。
|
||
* 會視需要刷新長效 token 並寫回該帳號。
|
||
*/
|
||
export async function getActiveThreadsCredentials(): Promise<ResolvedThreadsCredentials | null> {
|
||
const settings = await getOrCreateSettings();
|
||
const account = await getActiveAccountProfile();
|
||
if (!account) return null;
|
||
|
||
const accessToken = await ensureValidAccessTokenForAccount(account);
|
||
return getThreadsCredentials(settings, account, accessToken);
|
||
}
|
||
|
||
export function describeThreadsConnection(account: Account | null) {
|
||
return {
|
||
connected: accountHasThreadsToken(account),
|
||
threadsUserId: account?.threadsUserId ?? null,
|
||
threadsTokenExpiresAt: account?.threadsTokenExpiresAt?.toISOString() ?? null,
|
||
};
|
||
}
|