You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
senzapaura_es/scripts/estudio/inspiracion.mjs

77 lines
2.6 KiB

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

Powered by TurnKey Linux.