Files
MineGeo/lib/supabase.ts

62 lines
1.9 KiB
TypeScript

import "server-only";
import { createClient } from "@supabase/supabase-js";
import { createServerClient } from "@supabase/ssr";
import { cookies } from "next/headers";
import { cache } from "react";
import type { Database } from "@/shared/database";
import { ServiceError, checkServiceError } from "./service-error";
let singleton: ReturnType<typeof createClient<Database>> | undefined;
export function admin() {
if (!process.env.NEXT_PUBLIC_SUPABASE_URL || !process.env.SUPABASE_SECRET_KEY)
throw new ServiceError(
"MineGeo is not configured yet. Please try again later.",
);
return (singleton ??= createClient<Database>(
process.env.NEXT_PUBLIC_SUPABASE_URL,
process.env.SUPABASE_SECRET_KEY,
{ auth: { persistSession: false, autoRefreshToken: false } },
));
}
export async function authClient() {
const jar = await cookies();
return createServerClient(
process.env.NEXT_PUBLIC_SUPABASE_URL!,
process.env.NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY!,
{
cookies: {
getAll: () => jar.getAll(),
setAll: (values) => {
try {
values.forEach(({ name, value, options }) =>
jar.set(name, value, options),
);
} catch {
/* Server components refresh through proxy. */
}
},
},
},
);
}
export const user = cache(async function user() {
if (
!process.env.NEXT_PUBLIC_SUPABASE_URL ||
!process.env.NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY
)
return null;
const client = await authClient();
const {
data: { user },
} = await client.auth.getUser();
return user;
});
export function required<T>(result: {
data: T;
error: { message: string; code?: string } | null;
}): NonNullable<T> {
checkServiceError(result.error);
if (result.data === null || result.data === undefined)
throw new Error("Record not found");
return result.data as NonNullable<T>;
}