Roadbound-BRR/supabase/functions/_shared/supabase.ts

43 lines
1.3 KiB
TypeScript

import { createClient } from "https://esm.sh/@supabase/supabase-js@2";
const supabaseUrl = Deno.env.get("SUPABASE_URL");
const supabaseAnonKey = Deno.env.get("SUPABASE_ANON_KEY");
const supabaseServiceRoleKey = Deno.env.get("SUPABASE_SERVICE_ROLE_KEY");
if (!supabaseUrl || !supabaseAnonKey) {
throw new Error("SUPABASE_URL and SUPABASE_ANON_KEY are required");
}
export function createAuthedClient(req: Request) {
const authHeader = req.headers.get("Authorization") ?? "";
return createClient(supabaseUrl, supabaseAnonKey, {
global: {
headers: { Authorization: authHeader },
},
});
}
export function createServiceClient() {
if (!supabaseServiceRoleKey) {
throw new Error("SUPABASE_SERVICE_ROLE_KEY is required");
}
return createClient(supabaseUrl, supabaseServiceRoleKey);
}
export async function requireUser(req: Request) {
const client = createAuthedClient(req);
const { data, error } = await client.auth.getUser();
if (error || !data.user) {
return { client, user: null, error: error?.message ?? "Unauthorized" };
}
return { client, user: data.user, error: null };
}
export function slugify(input: string): string {
return input
.toLowerCase()
.trim()
.replace(/[^a-z0-9]+/g, "-")
.replace(/^-+|-+$/g, "")
.slice(0, 64);
}