Se visualiza y descarga el pdf de la asignatura
This commit is contained in:
@@ -1,14 +1,18 @@
|
||||
// document.api.ts
|
||||
|
||||
import { supabaseBrowser } from '../supabase/client'
|
||||
import { invokeEdge } from '../supabase/invokeEdge'
|
||||
|
||||
import { requireData, throwIfError } from './_helpers'
|
||||
|
||||
import type { Tables } from '@/types/supabase'
|
||||
|
||||
import { columnParsers } from '@/lib/asignaturaColumnParsers'
|
||||
|
||||
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'
|
||||
|
||||
interface GeneratePdfParams {
|
||||
plan_estudio_id: string
|
||||
}
|
||||
@@ -16,6 +20,52 @@ interface GeneratePdfParamsAsignatura {
|
||||
asignatura_id: string
|
||||
}
|
||||
|
||||
function isPlainRecord(value: unknown): value is Record<string, unknown> {
|
||||
return typeof value === 'object' && value !== null && !Array.isArray(value)
|
||||
}
|
||||
|
||||
function toStringValue(value: unknown): string {
|
||||
if (typeof value === 'string') return value
|
||||
if (typeof value === 'number' || typeof value === 'boolean')
|
||||
return String(value)
|
||||
if (value === null || value === undefined) return ''
|
||||
try {
|
||||
return JSON.stringify(value)
|
||||
} catch {
|
||||
return String(value)
|
||||
}
|
||||
}
|
||||
|
||||
function buildAsignaturaReportData(
|
||||
row: Pick<
|
||||
Tables<'asignaturas'>,
|
||||
'datos' | 'contenido_tematico' | 'criterios_de_evaluacion'
|
||||
>,
|
||||
): Record<string, string> {
|
||||
const out: Record<string, string> = {}
|
||||
|
||||
const datosRaw = row.datos
|
||||
if (isPlainRecord(datosRaw)) {
|
||||
for (const [k, v] of Object.entries(datosRaw)) {
|
||||
if (v === null || v === undefined) continue
|
||||
out[k] = toStringValue(v)
|
||||
}
|
||||
}
|
||||
|
||||
for (const [key, parser] of Object.entries(columnParsers)) {
|
||||
if (!parser) continue
|
||||
|
||||
const current = out[key]
|
||||
if (typeof current === 'string' && current.trim()) continue
|
||||
|
||||
const rawValue = (row as any)?.[key]
|
||||
const parsed = parser(rawValue)
|
||||
if (parsed.trim()) out[key] = parsed
|
||||
}
|
||||
|
||||
return out
|
||||
}
|
||||
|
||||
export async function fetchPlanPdf({
|
||||
plan_estudio_id,
|
||||
}: GeneratePdfParams): Promise<Blob> {
|
||||
@@ -38,18 +88,41 @@ export async function fetchPlanPdf({
|
||||
export async function fetchAsignaturaPdf({
|
||||
asignatura_id,
|
||||
}: GeneratePdfParamsAsignatura): Promise<Blob> {
|
||||
const response = await fetch(DOCUMENT_PDF_ASIGNATURA_URL, {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
const supabase = supabaseBrowser()
|
||||
|
||||
const { data, error } = await supabase
|
||||
.from('asignaturas')
|
||||
.select('*')
|
||||
.eq('id', asignatura_id)
|
||||
.single()
|
||||
|
||||
throwIfError(error)
|
||||
|
||||
const row = requireData(
|
||||
data as Pick<
|
||||
Tables<'asignaturas'>,
|
||||
'datos' | 'contenido_tematico' | 'criterios_de_evaluacion'
|
||||
>,
|
||||
'Asignatura no encontrada',
|
||||
)
|
||||
|
||||
// const reportData = buildAsignaturaReportData(row)
|
||||
|
||||
return await invokeEdge<Blob>(
|
||||
EDGE.carbone_io_wrapper,
|
||||
{
|
||||
action: 'downloadReport',
|
||||
asignatura_id,
|
||||
body: {
|
||||
data: row,
|
||||
convertTo: 'pdf',
|
||||
},
|
||||
},
|
||||
body: JSON.stringify({ asignatura_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',
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user