const CLAVE = 'inspiracion-en-cancion-v1'; function desdeTexto(texto) { const limpio = typeof texto === 'string' ? texto.trim() : ''; return limpio ? [{ id: 'texto-principal', tipo: 'texto', texto: limpio }] : []; } function secciones(contenido) { if (!contenido?.campos) return []; const bloques = contenido.campos.inspiracionSecciones; return Array.isArray(bloques) && bloques.length ? bloques : desdeTexto(contenido.campos.inspiracion); } /** Traslada una sola vez la inspiración desde la grabación principal a la obra. */ export async function migrarInspiracion(c) { await c.query(`CREATE TABLE IF NOT EXISTS estudio_migracion ( clave text PRIMARY KEY, datos jsonb NOT NULL, fecha timestamptz NOT NULL DEFAULT now() )`); if ((await c.query('SELECT 1 FROM estudio_migracion WHERE clave=$1', [CLAVE])).rowCount) return { actualizadas: 0, aplicada: false }; await c.query("SELECT pg_advisory_xact_lock(hashtext('estudio:migrar:inspiracion'))"); const { rows } = await c.query(` SELECT c.id,c.borrador,c.publicado, g.borrador AS grabacion_borrador,g.publicado AS grabacion_publicado FROM estudio_documento c LEFT JOIN estudio_documento g ON g.id=c.borrador->'campos'->>'principalId' AND g.tipo='grabaciones' WHERE c.tipo='canciones' FOR UPDATE OF c `); const respaldo = []; for (const fila of rows) { const borrador = structuredClone(fila.borrador); const publicado = fila.publicado ? structuredClone(fila.publicado) : null; let cambia = false; const seccionesBorrador = secciones(borrador).length ? secciones(borrador) : secciones(fila.grabacion_borrador); if ( !Array.isArray(borrador.campos.inspiracionSecciones) || (!borrador.campos.inspiracionSecciones.length && seccionesBorrador.length) ) { borrador.campos.inspiracionSecciones = seccionesBorrador; cambia = true; } const seccionesPublicadas = publicado ? secciones(publicado).length ? secciones(publicado) : secciones(fila.grabacion_publicado) : []; if ( publicado && (!Array.isArray(publicado.campos.inspiracionSecciones) || (!publicado.campos.inspiracionSecciones.length && seccionesPublicadas.length)) ) { publicado.campos.inspiracionSecciones = seccionesPublicadas; cambia = true; } if (!cambia) continue; respaldo.push({ id: fila.id, borrador: fila.borrador, publicado: fila.publicado }); await c.query( 'UPDATE estudio_documento SET borrador=$2,publicado=$3,actualizado=now() WHERE id=$1', [fila.id, borrador, publicado] ); } await c.query('INSERT INTO estudio_migracion(clave,datos) VALUES($1,$2)', [ CLAVE, { documentos: respaldo } ]); return { actualizadas: respaldo.length, aplicada: true }; }