Yaltopia-FIFA/lib/auth/resolve-portal-role.ts
Kirubel-Kibru-Yaltopia 89440985f1
Some checks failed
Deploy to Cloudflare Workers / deploy (push) Has been cancelled
x
2026-05-24 21:46:10 +03:00

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 };
}