70 lines
2.0 KiB
TypeScript
70 lines
2.0 KiB
TypeScript
import { DEMO_AUTH_ENABLED, getStoredAccessToken } from "@/lib/auth";
|
|
|
|
const SUPABASE_URL = (import.meta.env["VITE_SUPABASE_URL"] ?? "").replace(/\/+$/, "");
|
|
const SUPABASE_ANON_KEY = import.meta.env["VITE_SUPABASE_ANON_KEY"] ?? "";
|
|
|
|
function parseErrorMessage(payload: unknown, fallback: string) {
|
|
if (!payload || typeof payload !== "object") return fallback;
|
|
const record = payload as Record<string, unknown>;
|
|
const message = record["message"];
|
|
const error = record["error"];
|
|
const details = record["details"];
|
|
|
|
if (typeof message === "string" && message.trim()) return message;
|
|
if (typeof error === "string" && error.trim()) return error;
|
|
if (typeof details === "string" && details.trim()) return details;
|
|
return fallback;
|
|
}
|
|
|
|
export function hasRealSupabaseSession() {
|
|
return !DEMO_AUTH_ENABLED && Boolean(getStoredAccessToken());
|
|
}
|
|
|
|
export async function callAuthenticatedRpc<T>(
|
|
functionName: string,
|
|
payload: Record<string, unknown> = {},
|
|
): Promise<T> {
|
|
if (DEMO_AUTH_ENABLED) {
|
|
throw new Error("Esta operación de Supabase no está disponible en modo demostrativo.");
|
|
}
|
|
|
|
if (!SUPABASE_URL || !SUPABASE_ANON_KEY) {
|
|
throw new Error("Faltan las variables VITE_SUPABASE_URL o VITE_SUPABASE_ANON_KEY.");
|
|
}
|
|
|
|
const accessToken = getStoredAccessToken();
|
|
if (!accessToken) {
|
|
throw new Error("No hay una sesión autenticada activa.");
|
|
}
|
|
|
|
const response = await fetch(`${SUPABASE_URL}/rest/v1/rpc/${functionName}`, {
|
|
method: "POST",
|
|
headers: {
|
|
apikey: SUPABASE_ANON_KEY,
|
|
Authorization: `Bearer ${accessToken}`,
|
|
"Content-Type": "application/json",
|
|
Accept: "application/json",
|
|
},
|
|
body: JSON.stringify(payload),
|
|
});
|
|
|
|
const text = await response.text();
|
|
let parsed: unknown = null;
|
|
|
|
if (text) {
|
|
try {
|
|
parsed = JSON.parse(text) as unknown;
|
|
} catch {
|
|
parsed = text;
|
|
}
|
|
}
|
|
|
|
if (!response.ok) {
|
|
throw new Error(
|
|
parseErrorMessage(parsed, `Supabase rechazó la operación ${functionName} (${response.status}).`),
|
|
);
|
|
}
|
|
|
|
return parsed as T;
|
|
}
|