haixunMaster/lib/auth/user-scope.ts

44 lines
1.3 KiB
TypeScript
Raw Normal View History

2026-06-21 12:50:31 +00:00
import "server-only";
import { prisma } from "@/lib/db";
import { requireSessionUser } from "@/lib/auth/session";
export async function getUserAccountIds(userId: string): Promise<string[]> {
const accounts = await prisma.account.findMany({
where: { userId },
select: { id: true },
});
return accounts.map((account) => account.id);
}
/** 只回傳屬於該使用者的 accountId 篩選條件,杜絕看到他人或孤兒資料。 */
export function accountIdScope(
accountIds: string[],
activeAccountId?: string | null
): { accountId: string } | { accountId: { in: string[] } } {
if (accountIds.length === 0) {
return { accountId: { in: [] } };
}
if (activeAccountId && accountIds.includes(activeAccountId)) {
return { accountId: activeAccountId };
}
return { accountId: { in: accountIds } };
}
export async function requireUserAccountScope(activeAccountId?: string | null) {
const user = await requireSessionUser();
const accountIds = await getUserAccountIds(user.id);
return {
user,
accountIds,
where: accountIdScope(accountIds, activeAccountId),
};
}
export function isAccountInUserScope(
accountIds: string[],
resourceAccountId: string | null | undefined
): boolean {
if (!resourceAccountId) return false;
return accountIds.includes(resourceAccountId);
}