40 lines
1.0 KiB
TypeScript
40 lines
1.0 KiB
TypeScript
import "server-only";
|
|
|
|
import { queryAdminRows } from "@/lib/admin/database";
|
|
import {
|
|
createAdminSupabaseClient,
|
|
isAdminEmail,
|
|
} from "./admin-client-core";
|
|
|
|
export { createAdminSupabaseClient, isAdminEmail };
|
|
|
|
export async function isAdminUser(user: { id?: string; email?: string | null }) {
|
|
if (process.env.AUTH_PROVIDER?.trim() === "self-hosted") {
|
|
if (!user.id) return false;
|
|
try {
|
|
const rows = await queryAdminRows<{ allowed: boolean }>(
|
|
"select public.admin_has_permission($1, 'admin.access') as allowed",
|
|
[user.id],
|
|
);
|
|
return rows[0]?.allowed ?? false;
|
|
} catch {
|
|
return false;
|
|
}
|
|
}
|
|
if (isAdminEmail(user.email)) return true;
|
|
if (!user.id) return false;
|
|
|
|
try {
|
|
const admin = createAdminSupabaseClient();
|
|
const { data, error } = await admin
|
|
.from("admin_users")
|
|
.select("user_id")
|
|
.eq("user_id", user.id)
|
|
.is("revoked_at", null)
|
|
.maybeSingle();
|
|
return !error && Boolean(data);
|
|
} catch {
|
|
return false;
|
|
}
|
|
}
|