Some checks failed
Deploy to Cloudflare Workers / deploy (push) Has been cancelled
96 lines
2.5 KiB
TypeScript
96 lines
2.5 KiB
TypeScript
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 };
|
|
}
|