43 lines
1.3 KiB
TypeScript
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);
|
|
}
|