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.
77 lines
2.6 KiB
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 };
|
|
}
|