|
|
/**
|
|
|
* Siembra los ánimos.
|
|
|
*
|
|
|
* npm run db:animos
|
|
|
*
|
|
|
* Son los nueve factores de la **GEMS** (*Geneva Emotional Music Scale*), que es
|
|
|
* una escala hecha para emoción musical y no para emoción en general: por eso
|
|
|
* tiene «trascendencia» y «nostalgia» y no tiene «miedo» ni «asco».
|
|
|
*
|
|
|
* Cada uno lleva además los dos ejes del modelo circumplejo de Russell:
|
|
|
* valencia —si tira a agradable o a desagradable— y energía. Sirven para
|
|
|
* ordenar, para interpolar entre dos ánimos, y sobre todo porque son
|
|
|
* redactables: «alta energía, valencia baja» es una instrucción que una IA
|
|
|
* entiende; «tensión» a secas, no.
|
|
|
*
|
|
|
* Idempotente por código: volver a lanzarlo actualiza y no duplica.
|
|
|
*/
|
|
|
|
|
|
import pg from 'pg';
|
|
|
|
|
|
/** `valencia` va de −1 a 1 y `energia` de 0 a 100, como dice el esquema. */
|
|
|
const ANIMOS = [
|
|
|
{
|
|
|
codigo: 'asombro',
|
|
|
nombre: 'Asombro',
|
|
|
gems: 'wonder',
|
|
|
valencia: 1,
|
|
|
energia: 60,
|
|
|
descripcion: 'Lo que abre los ojos. Deslumbra sin arrollar.'
|
|
|
},
|
|
|
{
|
|
|
codigo: 'trascendencia',
|
|
|
nombre: 'Trascendencia',
|
|
|
gems: 'transcendence',
|
|
|
valencia: 1,
|
|
|
energia: 45,
|
|
|
descripcion: 'Sacar a alguien de sí mismo. Lo solemne sin lo grandilocuente.'
|
|
|
},
|
|
|
{
|
|
|
codigo: 'ternura',
|
|
|
nombre: 'Ternura',
|
|
|
gems: 'tenderness',
|
|
|
valencia: 1,
|
|
|
energia: 30,
|
|
|
descripcion: 'El cariño dicho de cerca y en voz baja.'
|
|
|
},
|
|
|
{
|
|
|
codigo: 'nostalgia',
|
|
|
nombre: 'Nostalgia',
|
|
|
gems: 'nostalgia',
|
|
|
valencia: 0,
|
|
|
energia: 30,
|
|
|
descripcion:
|
|
|
'Lo que se recuerda con gusto y duele un poco. La valencia va en medio a propósito.'
|
|
|
},
|
|
|
{
|
|
|
codigo: 'serenidad',
|
|
|
nombre: 'Serenidad',
|
|
|
gems: 'peacefulness',
|
|
|
valencia: 1,
|
|
|
energia: 20,
|
|
|
descripcion: 'Calma sin sueño. Nada que resolver.'
|
|
|
},
|
|
|
{
|
|
|
codigo: 'fuerza',
|
|
|
nombre: 'Fuerza',
|
|
|
gems: 'power',
|
|
|
valencia: 1,
|
|
|
energia: 85,
|
|
|
descripcion: 'Empuje, triunfo, ganas. Lo que se canta de pie.'
|
|
|
},
|
|
|
{
|
|
|
codigo: 'alegria-vital',
|
|
|
nombre: 'Alegría vital',
|
|
|
gems: 'joyful activation',
|
|
|
valencia: 1,
|
|
|
energia: 80,
|
|
|
descripcion: 'Alegría que mueve el cuerpo. Es la de bailar, no la de sonreír.'
|
|
|
},
|
|
|
{
|
|
|
codigo: 'tension',
|
|
|
nombre: 'Tensión',
|
|
|
gems: 'tension',
|
|
|
valencia: -1,
|
|
|
energia: 75,
|
|
|
descripcion: 'Nervio, inquietud, algo a punto de pasar.'
|
|
|
},
|
|
|
{
|
|
|
codigo: 'tristeza',
|
|
|
nombre: 'Tristeza',
|
|
|
gems: 'sadness',
|
|
|
valencia: -1,
|
|
|
energia: 20,
|
|
|
descripcion: 'La pena quieta. En un bolero, la de siempre.'
|
|
|
}
|
|
|
];
|
|
|
|
|
|
const c = new pg.Client({ connectionString: process.env.DATABASE_URL, query_timeout: 15_000 });
|
|
|
await c.connect();
|
|
|
|
|
|
let nuevos = 0;
|
|
|
for (const a of ANIMOS) {
|
|
|
const { rows } = await c.query(
|
|
|
`insert into animo (id, codigo, nombre, gems, valencia, energia, descripcion)
|
|
|
values (gen_random_uuid(), $1, $2, $3, $4, $5, $6)
|
|
|
on conflict (codigo) do update set
|
|
|
nombre = excluded.nombre,
|
|
|
gems = excluded.gems,
|
|
|
valencia = excluded.valencia,
|
|
|
energia = excluded.energia,
|
|
|
descripcion = excluded.descripcion
|
|
|
returning (xmax = 0) as insertado`,
|
|
|
[a.codigo, a.nombre, a.gems, a.valencia, a.energia, a.descripcion]
|
|
|
);
|
|
|
if (rows[0].insertado) nuevos++;
|
|
|
}
|
|
|
|
|
|
console.log(`${ANIMOS.length} ánimos: ${nuevos} nuevos, ${ANIMOS.length - nuevos} actualizados.`);
|
|
|
await c.end();
|