import type { SupabaseClient, User } from "@supabase/supabase-js"; import type { PortalRole } from "./roles"; export function portalRoleFromMetadata(user: User): PortalRole | null { const raw = user.user_metadata?.portal_role; if (raw === "league_master" || raw === "manager") return raw; return null; } export function isPortalRoleSchemaError(message?: string): boolean { if (!message) return false; const m = message.toLowerCase(); return ( m.includes("portal_role") && (m.includes("column") || m.includes("schema cache") || m.includes("does not exist")) ); } /** * Resolves portal role from profiles table, then auth metadata, then default (manager). */ export async function resolvePortalRole( supabase: SupabaseClient, user: User ): Promise<{ role: PortalRole; profileMissing: boolean; profileError?: string; }> { const { data, error } = await supabase .from("profiles") .select("portal_role") .eq("id", user.id) .maybeSingle(); if (!error && data?.portal_role) { const role = data.portal_role as PortalRole; if (role === "league_master" || role === "manager") { return { role, profileMissing: false }; } } const fromMeta = portalRoleFromMetadata(user); if (fromMeta) { return { role: fromMeta, profileMissing: Boolean(error), profileError: error?.message, }; } return { role: "manager", profileMissing: Boolean(error), profileError: error?.message, }; } /** Sync profile row + portal_role after signup or when column was missing. */ export async function ensureUserProfile( supabase: SupabaseClient, user: User, portalRole: PortalRole, displayName?: string ): Promise<{ ok: boolean; error?: string }> { const { error: rpcError } = await supabase.rpc("ensure_user_profile", { p_display_name: displayName ?? user.user_metadata?.display_name ?? user.email?.split("@")[0] ?? null, p_portal_role: portalRole, }); if (!rpcError) return { ok: true }; if (isPortalRoleSchemaError(rpcError.message)) { return { ok: false, error: "schema" }; } const { error: upsertError } = await supabase.from("profiles").upsert( { id: user.id, display_name: displayName ?? user.user_metadata?.display_name ?? user.email?.split("@")[0], portal_role: portalRole, }, { onConflict: "id" } ); if (!upsertError) return { ok: true }; return { ok: false, error: upsertError.message }; }