diff --git a/src/data/api/document.api.ts b/src/data/api/document.api.ts index 2ced129..8c85d58 100644 --- a/src/data/api/document.api.ts +++ b/src/data/api/document.api.ts @@ -1,7 +1,10 @@ // document.api.ts -const DOCUMENT_PDF_URL = - 'https://n8n.app.lci.ulsa.mx/webhook/62ca84ec-0adb-4006-aba1-32282d27d434' +import { invokeEdge } from '../supabase/invokeEdge' + +const EDGE = { + carbone_io_wrapper: 'carbone-io-wrapper', +} as const const DOCUMENT_PDF_ASIGNATURA_URL = 'https://n8n.app.lci.ulsa.mx/webhook/041a68be-7568-46d0-bc08-09ded12d017d' @@ -16,20 +19,19 @@ interface GeneratePdfParamsAsignatura { export async function fetchPlanPdf({ plan_estudio_id, }: GeneratePdfParams): Promise { - const response = await fetch(DOCUMENT_PDF_URL, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', + return await invokeEdge( + EDGE.carbone_io_wrapper, + { + action: 'downloadReport', + plan_estudio_id, }, - body: JSON.stringify({ plan_estudio_id }), - }) - - if (!response.ok) { - throw new Error('Error al generar el PDF') - } - - // n8n devuelve el archivo → lo tratamos como blob - return await response.blob() + { + headers: { + 'Content-Type': 'application/json', + }, + responseType: 'blob', + }, + ) } export async function fetchAsignaturaPdf({ diff --git a/src/data/supabase/invokeEdge.ts b/src/data/supabase/invokeEdge.ts index 2aeff2e..b7df21f 100644 --- a/src/data/supabase/invokeEdge.ts +++ b/src/data/supabase/invokeEdge.ts @@ -12,6 +12,7 @@ import type { SupabaseClient } from '@supabase/supabase-js' export type EdgeInvokeOptions = { method?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' headers?: Record + responseType?: 'json' | 'text' | 'blob' | 'arrayBuffer' } export class EdgeFunctionError extends Error { @@ -42,10 +43,16 @@ export async function invokeEdge( ): Promise { const supabase = client ?? supabaseBrowser() - const { data, error } = await supabase.functions.invoke(functionName, { + // Nota: algunas versiones/defs de @supabase/supabase-js no tipan `responseType` + // aunque el runtime lo soporte. Usamos `any` para no bloquear el uso de Blob. + const invoke: any = (supabase.functions as any).invoke.bind( + supabase.functions, + ) + const { data, error } = await invoke(functionName, { body, method: opts.method ?? 'POST', headers: opts.headers, + responseType: opts.responseType, }) if (error) {