Preparar repositorio para despliegue: código fuente limpio
This commit is contained in:
parent
866f5c432d
commit
3eca832c1a
76 changed files with 5434 additions and 3496 deletions
14
init-db/00-replication-slot.sql
Normal file
14
init-db/00-replication-slot.sql
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
-- Enable replication access from the replica container
|
||||
-- This file is sourced after the database is initialized
|
||||
|
||||
-- Add pg_hba.conf entry for replication
|
||||
-- Note: This needs to be done via ALTER SYSTEM or pg_hba.conf file
|
||||
|
||||
DO $$
|
||||
BEGIN
|
||||
-- Create replication slot to prevent WAL removal
|
||||
IF NOT EXISTS (SELECT 1 FROM pg_replication_slots WHERE slot_name = 'replica_slot') THEN
|
||||
PERFORM pg_create_physical_replication_slot('replica_slot');
|
||||
END IF;
|
||||
END
|
||||
$$;
|
||||
13
init-db/00-replication-user.sql
Normal file
13
init-db/00-replication-user.sql
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
-- Create replication user for streaming replication
|
||||
-- This user will be used by the replica to connect to the primary
|
||||
|
||||
DO $$
|
||||
BEGIN
|
||||
IF NOT EXISTS (SELECT FROM pg_roles WHERE rolname = 'replicator') THEN
|
||||
CREATE ROLE replicator WITH REPLICATION LOGIN PASSWORD 'replica_password';
|
||||
END IF;
|
||||
END
|
||||
$$;
|
||||
|
||||
-- Grant necessary permissions
|
||||
GRANT CONNECT ON DATABASE rss TO replicator;
|
||||
39
init-db/01.schema.sql
Normal file
39
init-db/01.schema.sql
Normal file
|
|
@ -0,0 +1,39 @@
|
|||
CREATE TABLE IF NOT EXISTS continentes (id SERIAL PRIMARY KEY, nombre VARCHAR(50) NOT NULL UNIQUE);
|
||||
CREATE TABLE IF NOT EXISTS categorias (id SERIAL PRIMARY KEY, nombre VARCHAR(100) NOT NULL UNIQUE);
|
||||
CREATE TABLE IF NOT EXISTS paises (id SERIAL PRIMARY KEY, nombre VARCHAR(100) NOT NULL UNIQUE, continente_id INTEGER REFERENCES continentes(id) ON DELETE SET NULL);
|
||||
CREATE TABLE IF NOT EXISTS feeds (id SERIAL PRIMARY KEY, nombre VARCHAR(255), descripcion TEXT, url TEXT NOT NULL UNIQUE, categoria_id INTEGER REFERENCES categorias(id) ON DELETE SET NULL, pais_id INTEGER REFERENCES paises(id) ON DELETE SET NULL, idioma CHAR(2), activo BOOLEAN DEFAULT TRUE, fallos INTEGER DEFAULT 0, last_etag TEXT, last_modified TEXT);
|
||||
CREATE TABLE IF NOT EXISTS fuentes_url (
|
||||
id SERIAL PRIMARY KEY,
|
||||
nombre VARCHAR(255) NOT NULL,
|
||||
url TEXT NOT NULL UNIQUE,
|
||||
categoria_id INTEGER REFERENCES categorias(id) ON DELETE SET NULL,
|
||||
pais_id INTEGER REFERENCES paises(id) ON DELETE SET NULL,
|
||||
idioma CHAR(2) DEFAULT 'es',
|
||||
last_check TIMESTAMP WITHOUT TIME ZONE,
|
||||
last_status VARCHAR(50),
|
||||
status_message TEXT,
|
||||
last_http_code INTEGER,
|
||||
active BOOLEAN DEFAULT TRUE
|
||||
);
|
||||
CREATE TABLE IF NOT EXISTS noticias (id VARCHAR(32) PRIMARY KEY, titulo TEXT, resumen TEXT, url TEXT NOT NULL UNIQUE, fecha TIMESTAMP, imagen_url TEXT, fuente_nombre VARCHAR(255), categoria_id INTEGER REFERENCES categorias(id) ON DELETE SET NULL, pais_id INTEGER REFERENCES paises(id) ON DELETE SET NULL, tsv tsvector);
|
||||
|
||||
|
||||
ALTER TABLE noticias ADD COLUMN IF NOT EXISTS tsv tsvector;
|
||||
ALTER TABLE noticias ADD COLUMN IF NOT EXISTS topics_processed BOOLEAN DEFAULT FALSE;
|
||||
|
||||
|
||||
CREATE OR REPLACE FUNCTION noticias_tsv_trigger() RETURNS trigger AS $$
|
||||
BEGIN
|
||||
new.tsv := setweight(to_tsvector('spanish', coalesce(new.titulo,'')), 'A') ||
|
||||
setweight(to_tsvector('spanish', coalesce(new.resumen,'')), 'B');
|
||||
return new;
|
||||
END
|
||||
$$ LANGUAGE plpgsql;
|
||||
|
||||
DROP TRIGGER IF EXISTS tsvectorupdate ON noticias;
|
||||
|
||||
CREATE TRIGGER tsvectorupdate
|
||||
BEFORE INSERT OR UPDATE ON noticias
|
||||
FOR EACH ROW EXECUTE PROCEDURE noticias_tsv_trigger();
|
||||
|
||||
CREATE INDEX IF NOT EXISTS noticias_tsv_idx ON noticias USING gin(tsv);
|
||||
9
init-db/02-continentes.sql
Executable file
9
init-db/02-continentes.sql
Executable file
|
|
@ -0,0 +1,9 @@
|
|||
INSERT INTO continentes (id, nombre) VALUES
|
||||
(1, 'África'),
|
||||
(2, 'América'),
|
||||
(3, 'Asia'),
|
||||
(4, 'Europa'),
|
||||
(5, 'Oceanía'),
|
||||
(6, 'Antártida')
|
||||
ON CONFLICT (id) DO NOTHING;
|
||||
|
||||
18
init-db/03-categorias.sql
Executable file
18
init-db/03-categorias.sql
Executable file
|
|
@ -0,0 +1,18 @@
|
|||
INSERT INTO categorias (nombre) VALUES
|
||||
('Ciencia'),
|
||||
('Cultura'),
|
||||
('Deportes'),
|
||||
('Economía'),
|
||||
('Educación'),
|
||||
('Entretenimiento'),
|
||||
('Internacional'),
|
||||
('Medio Ambiente'),
|
||||
('Moda'),
|
||||
('Opinión'),
|
||||
('Política'),
|
||||
('Salud'),
|
||||
('Sociedad'),
|
||||
('Tecnología'),
|
||||
('Viajes')
|
||||
ON CONFLICT DO NOTHING;
|
||||
|
||||
198
init-db/04-paises.sql
Executable file
198
init-db/04-paises.sql
Executable file
|
|
@ -0,0 +1,198 @@
|
|||
INSERT INTO paises (nombre, continente_id) VALUES
|
||||
('Afganistán', 3),
|
||||
('Albania', 4),
|
||||
('Alemania', 4),
|
||||
('Andorra', 4),
|
||||
('Angola', 1),
|
||||
('Antigua y Barbuda', 2),
|
||||
('Arabia Saudita', 3),
|
||||
('Argelia', 1),
|
||||
('Argentina', 2),
|
||||
('Armenia', 3),
|
||||
('Australia', 5),
|
||||
('Austria', 4),
|
||||
('Azerbaiyán', 3),
|
||||
('Bahamas', 2),
|
||||
('Bangladés', 3),
|
||||
('Barbados', 2),
|
||||
('Baréin', 3),
|
||||
('Bélgica', 4),
|
||||
('Belice', 2),
|
||||
('Benín', 1),
|
||||
('Bielorrusia', 4),
|
||||
('Birmania', 3),
|
||||
('Bolivia', 2),
|
||||
('Bosnia y Herzegovina', 4),
|
||||
('Botsuana', 1),
|
||||
('Brasil', 2),
|
||||
('Brunéi', 3),
|
||||
('Bulgaria', 4),
|
||||
('Burkina Faso', 1),
|
||||
('Burundi', 1),
|
||||
('Bután', 3),
|
||||
('Cabo Verde', 1),
|
||||
('Camboya', 3),
|
||||
('Camerún', 1),
|
||||
('Canadá', 2),
|
||||
('Catar', 3),
|
||||
('Chad', 1),
|
||||
('Chile', 2),
|
||||
('China', 3),
|
||||
('Chipre', 3),
|
||||
('Colombia', 2),
|
||||
('Comoras', 1),
|
||||
('Corea del Norte', 3),
|
||||
('Corea del Sur', 3),
|
||||
('Costa de Marfil', 1),
|
||||
('Costa Rica', 2),
|
||||
('Croacia', 4),
|
||||
('Cuba', 2),
|
||||
('Dinamarca', 4),
|
||||
('Dominica', 2),
|
||||
('Ecuador', 2),
|
||||
('Egipto', 1),
|
||||
('El Salvador', 2),
|
||||
('Emiratos Árabes Unidos', 3),
|
||||
('Eritrea', 1),
|
||||
('Eslovaquia', 4),
|
||||
('Eslovenia', 4),
|
||||
('España', 4),
|
||||
('Estados Unidos', 2),
|
||||
('Estonia', 4),
|
||||
('Esuatini', 1),
|
||||
('Etiopía', 1),
|
||||
('Filipinas', 3),
|
||||
('Finlandia', 4),
|
||||
('Fiyi', 5),
|
||||
('Francia', 4),
|
||||
('Gabón', 1),
|
||||
('Gambia', 1),
|
||||
('Georgia', 3),
|
||||
('Ghana', 1),
|
||||
('Granada', 2),
|
||||
('Grecia', 4),
|
||||
('Guatemala', 2),
|
||||
('Guinea', 1),
|
||||
('Guinea-Bisáu', 1),
|
||||
('Guinea Ecuatorial', 1),
|
||||
('Guyana', 2),
|
||||
('Haití', 2),
|
||||
('Honduras', 2),
|
||||
('Hungría', 4),
|
||||
('India', 3),
|
||||
('Indonesia', 3),
|
||||
('Irak', 3),
|
||||
('Irán', 3),
|
||||
('Irlanda', 4),
|
||||
('Islandia', 4),
|
||||
('Islas Marshall', 5),
|
||||
('Islas Salomón', 5),
|
||||
('Israel', 3),
|
||||
('Italia', 4),
|
||||
('Jamaica', 2),
|
||||
('Japón', 3),
|
||||
('Jordania', 3),
|
||||
('Kazajistán', 3),
|
||||
('Kenia', 1),
|
||||
('Kirguistán', 3),
|
||||
('Kiribati', 5),
|
||||
('Kuwait', 3),
|
||||
('Laos', 3),
|
||||
('Lesoto', 1),
|
||||
('Letonia', 4),
|
||||
('Líbano', 3),
|
||||
('Liberia', 1),
|
||||
('Libia', 1),
|
||||
('Liechtenstein', 4),
|
||||
('Lituania', 4),
|
||||
('Luxemburgo', 4),
|
||||
('Macedonia del Norte', 4),
|
||||
('Madagascar', 1),
|
||||
('Malasia', 3),
|
||||
('Malaui', 1),
|
||||
('Maldivas', 3),
|
||||
('Malí', 1),
|
||||
('Malta', 4),
|
||||
('Marruecos', 1),
|
||||
('Mauricio', 1),
|
||||
('Mauritania', 1),
|
||||
('México', 2),
|
||||
('Micronesia', 5),
|
||||
('Moldavia', 4),
|
||||
('Mónaco', 4),
|
||||
('Mongolia', 3),
|
||||
('Montenegro', 4),
|
||||
('Mozambique', 1),
|
||||
('Namibia', 1),
|
||||
('Nauru', 5),
|
||||
('Nepal', 3),
|
||||
('Nicaragua', 2),
|
||||
('Níger', 1),
|
||||
('Nigeria', 1),
|
||||
('Noruega', 4),
|
||||
('Nueva Zelanda', 5),
|
||||
('Omán', 3),
|
||||
('Países Bajos', 4),
|
||||
('Pakistán', 3),
|
||||
('Palaos', 5),
|
||||
('Palestina', 3),
|
||||
('Panamá', 2),
|
||||
('Papúa Nueva Guinea', 5),
|
||||
('Paraguay', 2),
|
||||
('Perú', 2),
|
||||
('Polonia', 4),
|
||||
('Portugal', 4),
|
||||
('Reino Unido', 4),
|
||||
('República Centroafricana', 1),
|
||||
('República Checa', 4),
|
||||
('República del Congo', 1),
|
||||
('República Democrática del Congo', 1),
|
||||
('República Dominicana', 2),
|
||||
('Ruanda', 1),
|
||||
('Rumanía', 4),
|
||||
('Rusia', 3),
|
||||
('Samoa', 5),
|
||||
('San Cristóbal y Nieves', 2),
|
||||
('San Marino', 4),
|
||||
('San Vicente y las Granadinas', 2),
|
||||
('Santa Lucía', 2),
|
||||
('Santo Tomé y Príncipe', 1),
|
||||
('Senegal', 1),
|
||||
('Serbia', 4),
|
||||
('Seychelles', 1),
|
||||
('Sierra Leona', 1),
|
||||
('Singapur', 3),
|
||||
('Siria', 3),
|
||||
('Somalia', 1),
|
||||
('Sri Lanka', 3),
|
||||
('Sudáfrica', 1),
|
||||
('Sudán', 1),
|
||||
('Sudán del Sur', 1),
|
||||
('Suecia', 4),
|
||||
('Suiza', 4),
|
||||
('Surinam', 2),
|
||||
('Tailandia', 3),
|
||||
('Tanzania', 1),
|
||||
('Tayikistán', 3),
|
||||
('Timor Oriental', 3),
|
||||
('Togo', 1),
|
||||
('Tonga', 5),
|
||||
('Trinidad y Tobago', 2),
|
||||
('Túnez', 1),
|
||||
('Turkmenistán', 3),
|
||||
('Turquía', 3),
|
||||
('Tuvalu', 5),
|
||||
('Ucrania', 4),
|
||||
('Uganda', 1),
|
||||
('Uruguay', 2),
|
||||
('Uzbekistán', 3),
|
||||
('Vanuatu', 5),
|
||||
('Vaticano', 4),
|
||||
('Venezuela', 2),
|
||||
('Vietnam', 3),
|
||||
('Yemen', 3),
|
||||
('Yibuti', 1),
|
||||
('Zambia', 1),
|
||||
('Zimbabue', 1)
|
||||
ON CONFLICT DO NOTHING;
|
||||
|
||||
15
init-db/05-traducciones.sql
Normal file
15
init-db/05-traducciones.sql
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
CREATE TABLE IF NOT EXISTS traducciones (
|
||||
id SERIAL PRIMARY KEY,
|
||||
noticia_id VARCHAR(32) REFERENCES noticias(id) ON DELETE CASCADE,
|
||||
lang_from CHAR(5),
|
||||
lang_to CHAR(5) NOT NULL,
|
||||
titulo_trad TEXT,
|
||||
resumen_trad TEXT,
|
||||
status VARCHAR(16) DEFAULT 'done',
|
||||
error TEXT,
|
||||
created_at TIMESTAMP DEFAULT NOW(),
|
||||
UNIQUE (noticia_id, lang_to)
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS traducciones_to_idx ON traducciones (lang_to);
|
||||
|
||||
24
init-db/06-tags.sql
Normal file
24
init-db/06-tags.sql
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
-- init-db/06-tags.sql (modelo simple compatible con ner_worker.py)
|
||||
|
||||
-- Tabla de tags
|
||||
CREATE TABLE IF NOT EXISTS tags (
|
||||
id SERIAL PRIMARY KEY,
|
||||
valor TEXT NOT NULL,
|
||||
tipo TEXT NOT NULL, -- 'persona','organizacion','lugar', ...
|
||||
UNIQUE (valor, tipo)
|
||||
);
|
||||
|
||||
-- Relación tag <-> traducción
|
||||
CREATE TABLE IF NOT EXISTS tags_noticia (
|
||||
id SERIAL PRIMARY KEY,
|
||||
traduccion_id INT NOT NULL REFERENCES traducciones(id) ON DELETE CASCADE,
|
||||
tag_id INT NOT NULL REFERENCES tags(id) ON DELETE CASCADE,
|
||||
UNIQUE (traduccion_id, tag_id)
|
||||
);
|
||||
|
||||
-- Índices útiles
|
||||
CREATE INDEX IF NOT EXISTS idx_tags_valor ON tags(valor);
|
||||
CREATE INDEX IF NOT EXISTS idx_tags_tipo ON tags(tipo);
|
||||
CREATE INDEX IF NOT EXISTS idx_tags_noticia_trid ON tags_noticia(traduccion_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_tags_noticia_tag ON tags_noticia(tag_id);
|
||||
|
||||
42
init-db/07-tags-views.sql
Normal file
42
init-db/07-tags-views.sql
Normal file
|
|
@ -0,0 +1,42 @@
|
|||
-- init-db/07-tags-views.sql
|
||||
-- Vista de Top tags (24h) para el esquema:
|
||||
-- tags(id, valor, tipo)
|
||||
-- tags_noticia(id, traduccion_id, tag_id)
|
||||
-- traducciones(id, noticia_id, lang_to, status, ...)
|
||||
-- noticias(id, fecha, ...)
|
||||
|
||||
CREATE OR REPLACE VIEW public.v_tag_counts_24h AS
|
||||
SELECT
|
||||
tg.id,
|
||||
tg.valor,
|
||||
tg.tipo,
|
||||
COUNT(*) AS apariciones
|
||||
FROM public.tags tg
|
||||
JOIN public.tags_noticia tn ON tn.tag_id = tg.id
|
||||
JOIN public.traducciones t ON t.id = tn.traduccion_id
|
||||
JOIN public.noticias n ON n.id = t.noticia_id
|
||||
WHERE t.status = 'done'
|
||||
AND t.lang_to = 'es'
|
||||
AND n.fecha >= now() - INTERVAL '24 hours'
|
||||
GROUP BY tg.id, tg.valor, tg.tipo
|
||||
ORDER BY apariciones DESC, tg.valor;
|
||||
|
||||
-- Índices recomendados para acelerar la vista (idempotentes)
|
||||
CREATE INDEX IF NOT EXISTS idx_noticias_fecha
|
||||
ON public.noticias (fecha);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_traducciones_noticia_lang_status
|
||||
ON public.traducciones (noticia_id, lang_to, status);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_tags_noticia_traduccion
|
||||
ON public.tags_noticia (traduccion_id);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_tags_noticia_tag
|
||||
ON public.tags_noticia (tag_id);
|
||||
|
||||
-- (Opcionales si no existen ya, pero ayudan en búsquedas ad hoc)
|
||||
CREATE INDEX IF NOT EXISTS idx_tags_valor
|
||||
ON public.tags (valor);
|
||||
CREATE INDEX IF NOT EXISTS idx_tags_tipo
|
||||
ON public.tags (tipo);
|
||||
|
||||
45
init-db/08-embeddings.sql
Normal file
45
init-db/08-embeddings.sql
Normal file
|
|
@ -0,0 +1,45 @@
|
|||
CREATE TABLE IF NOT EXISTS traduccion_embeddings (
|
||||
id SERIAL PRIMARY KEY,
|
||||
traduccion_id INT NOT NULL REFERENCES traducciones(id) ON DELETE CASCADE,
|
||||
model TEXT NOT NULL,
|
||||
dim INT NOT NULL,
|
||||
embedding DOUBLE PRECISION[] NOT NULL,
|
||||
created_at TIMESTAMP DEFAULT NOW(),
|
||||
UNIQUE (traduccion_id, model)
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_tr_emb_traduccion_id ON traduccion_embeddings(traduccion_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_tr_emb_model ON traduccion_embeddings(model);
|
||||
|
||||
DO $$
|
||||
BEGIN
|
||||
IF EXISTS (
|
||||
SELECT 1 FROM information_schema.tables
|
||||
WHERE table_schema = 'public' AND table_name = 'embeddings'
|
||||
) THEN
|
||||
EXECUTE 'ALTER TABLE embeddings RENAME TO embeddings_legacy';
|
||||
END IF;
|
||||
EXCEPTION WHEN others THEN
|
||||
NULL;
|
||||
END$$;
|
||||
|
||||
CREATE OR REPLACE VIEW embeddings AS
|
||||
SELECT
|
||||
te.traduccion_id,
|
||||
te.dim,
|
||||
te.embedding AS vec
|
||||
FROM traduccion_embeddings te
|
||||
WHERE te.model = 'sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2';
|
||||
|
||||
CREATE TABLE IF NOT EXISTS related_noticias (
|
||||
traduccion_id INT NOT NULL REFERENCES traducciones(id) ON DELETE CASCADE,
|
||||
related_traduccion_id INT NOT NULL REFERENCES traducciones(id) ON DELETE CASCADE,
|
||||
score DOUBLE PRECISION NOT NULL,
|
||||
created_at TIMESTAMP DEFAULT NOW(),
|
||||
PRIMARY KEY (traduccion_id, related_traduccion_id),
|
||||
CHECK (traduccion_id <> related_traduccion_id)
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_related_by_tr ON related_noticias (traduccion_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_related_by_relatedtr ON related_noticias (related_traduccion_id);
|
||||
|
||||
62
init-db/09-eventos.sql
Normal file
62
init-db/09-eventos.sql
Normal file
|
|
@ -0,0 +1,62 @@
|
|||
BEGIN;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS eventos (
|
||||
id BIGSERIAL PRIMARY KEY,
|
||||
creado_en TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
actualizado_en TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
titulo TEXT,
|
||||
fecha_inicio TIMESTAMPTZ,
|
||||
fecha_fin TIMESTAMPTZ,
|
||||
n_noticias INTEGER NOT NULL DEFAULT 0,
|
||||
centroid JSONB NOT NULL,
|
||||
total_traducciones INTEGER NOT NULL DEFAULT 1
|
||||
);
|
||||
|
||||
ALTER TABLE traducciones
|
||||
ADD COLUMN IF NOT EXISTS evento_id BIGINT REFERENCES eventos(id);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS eventos_noticias (
|
||||
evento_id BIGINT NOT NULL REFERENCES eventos(id) ON DELETE CASCADE,
|
||||
noticia_id VARCHAR(32) NOT NULL REFERENCES noticias(id) ON DELETE CASCADE,
|
||||
traduccion_id INTEGER NOT NULL REFERENCES traducciones(id) ON DELETE CASCADE,
|
||||
PRIMARY KEY (evento_id, noticia_id)
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_traducciones_evento
|
||||
ON traducciones(evento_id);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_traducciones_evento_fecha
|
||||
ON traducciones(evento_id, noticia_id);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_trad_id
|
||||
ON traducciones(id);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_eventos_fecha_inicio
|
||||
ON eventos (fecha_inicio DESC NULLS LAST);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_eventos_noticias_evento
|
||||
ON eventos_noticias (evento_id);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_eventos_noticias_noticia
|
||||
ON eventos_noticias (noticia_id);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_eventos_noticias_traduccion
|
||||
ON eventos_noticias (traduccion_id);
|
||||
|
||||
CREATE OR REPLACE FUNCTION actualizar_evento_modificado()
|
||||
RETURNS TRIGGER AS $$
|
||||
BEGIN
|
||||
NEW.actualizado_en = NOW();
|
||||
RETURN NEW;
|
||||
END;
|
||||
$$ LANGUAGE plpgsql;
|
||||
|
||||
DROP TRIGGER IF EXISTS trg_evento_modificado ON eventos;
|
||||
|
||||
CREATE TRIGGER trg_evento_modificado
|
||||
BEFORE UPDATE ON eventos
|
||||
FOR EACH ROW
|
||||
EXECUTE FUNCTION actualizar_evento_modificado();
|
||||
|
||||
COMMIT;
|
||||
|
||||
10
init-db/10-favoritos.sql
Normal file
10
init-db/10-favoritos.sql
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
-- Favorites table for saving news
|
||||
CREATE TABLE IF NOT EXISTS favoritos (
|
||||
id SERIAL PRIMARY KEY,
|
||||
session_id VARCHAR(64) NOT NULL,
|
||||
noticia_id VARCHAR(32) REFERENCES noticias(id) ON DELETE CASCADE,
|
||||
created_at TIMESTAMP DEFAULT NOW(),
|
||||
UNIQUE (session_id, noticia_id)
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_favoritos_session ON favoritos(session_id);
|
||||
5
init-db/10-indexes.sql
Normal file
5
init-db/10-indexes.sql
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
-- Optimización de índices
|
||||
CREATE INDEX IF NOT EXISTS idx_noticias_pais ON noticias(pais_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_noticias_categoria ON noticias(categoria_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_traducciones_created_at ON traducciones(created_at);
|
||||
CREATE INDEX IF NOT EXISTS idx_news_topics_topic_id ON news_topics(topic_id);
|
||||
18
init-db/11-performance-indexes.sql
Normal file
18
init-db/11-performance-indexes.sql
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
-- Índices de optimización de rendimiento
|
||||
-- Creados: 2025-12-16
|
||||
-- Propósito: Acelerar consultas frecuentes de conteo y filtrado
|
||||
|
||||
-- Índices parciales para estados de traducciones
|
||||
CREATE INDEX IF NOT EXISTS idx_traducciones_status_partial_done
|
||||
ON traducciones(status) WHERE status = 'done';
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_traducciones_status_partial_pending
|
||||
ON traducciones(status) WHERE status = 'pending';
|
||||
|
||||
-- Índice compuesto para feeds activos/inactivos con fallos
|
||||
CREATE INDEX IF NOT EXISTS idx_feeds_activo_fallos
|
||||
ON feeds(activo, fallos);
|
||||
|
||||
-- Índice compuesto para páginas de noticias con filtros comunes
|
||||
CREATE INDEX IF NOT EXISTS idx_noticias_fecha_pais_categoria
|
||||
ON noticias(fecha DESC, pais_id, categoria_id);
|
||||
79
init-db/11-topics-data.sql
Normal file
79
init-db/11-topics-data.sql
Normal file
|
|
@ -0,0 +1,79 @@
|
|||
-- Create Topics Table
|
||||
CREATE TABLE IF NOT EXISTS topics (
|
||||
id SERIAL PRIMARY KEY,
|
||||
slug VARCHAR(50) UNIQUE NOT NULL,
|
||||
name VARCHAR(100) NOT NULL,
|
||||
weight INTEGER DEFAULT 1,
|
||||
keywords TEXT,
|
||||
group_name VARCHAR(50)
|
||||
);
|
||||
|
||||
-- Create News Topics Relation Table
|
||||
CREATE TABLE IF NOT EXISTS news_topics (
|
||||
noticia_id VARCHAR(32) REFERENCES noticias(id) ON DELETE CASCADE,
|
||||
topic_id INTEGER REFERENCES topics(id) ON DELETE CASCADE,
|
||||
score INTEGER DEFAULT 0,
|
||||
created_at TIMESTAMP DEFAULT NOW(),
|
||||
PRIMARY KEY (noticia_id, topic_id)
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_news_topics_score ON news_topics(score DESC);
|
||||
|
||||
-- Insert Initial Topics Data
|
||||
-- Uses ON CONFLICT to update if exists.
|
||||
|
||||
INSERT INTO topics (slug, name, weight, keywords) VALUES
|
||||
('middle_east', 'Oriente Medio', 5, 'israel,estado de israel,tel aviv,jerusalén,al quds,gaza,franja de gaza,rafah,jan yunis,cisjordania,territorios ocupados,palestina,autoridad nacional palestina,anp,ramala,iran,república islámica de iran,teherán,isfahán,qom,iraq,irak,bagdad,basora,kurdistán iraquí,erbil,siria,damasco,aleppo,idlib,raqqa,líbano,beirut,sur del líbano,jordania,ammán,arabia saudí,riad,la meca,medina,emiratos árabes,emiratos árabes unidos,uae,dubái,abudabi,sharjah,qatar,doha,kuwait,bahrein,bahréin,manama,oman,yemen,saná,aden,hamas,hamás,yihad islámica,islamic jihad,hezbolá,hizbulá,hezbollah,hutíes,rebeldes hutíes,houthi,ansar allah,isis,estado islámico,daesh,al qaeda,talibanes,fatah,peshmerga,ypg,fds,milicias chiíes,pmu,pasdarán,guardia revolucionaria iraní,irgc,bombardeo,bombardeos,ataque aéreo,ataque con drones,drones suicidas,misiles,cohetes,misil balístico,misil de crucero,iron dome,cúpula de hierro,interceptores,sirenas antiaéreas,incursión terrestre,operación militar,ofensiva,contraofensiva,combates,enfrentamientos,hostilidades,escalada militar,movilización militar,fuerzas armadas,retirada de tropas,zona desmilitarizada,frontera norte,frontera sur,rehenes,liberación de rehenes,intercambio de prisioneros,secuestro,negociación de rehenes,crisis humanitaria,desplazados,refugiados,campamentos,asedio,bloqueo,corte de suministros,hambruna,escasez de agua,ayuda humanitaria,unrwa,alto el fuego,tregua,mediación egipcia,mediación qatarí,acuerdos de abraham,normalización diplomática,liga árabe,cumbre árabe,cumbre del golfo,negociaciones israelo-palestinas,solución de dos estados,relaciones árabe-israelíes,relaciones palestino-israelíes,países del golfo,monarquías del golfo,injerencia iraní,influencia saudí,diplomacia regional,petróleo,crudo,brent,wti,oleoducto,gasoducto,refinería,infraestructura energética,opep,opec,opep+,producción petrolera,gas natural,catar gas,estrecho de hormuz,mar rojo,golfo pérsico,golfo de aden,suní,chií,chiita,wahabismo,salafismo,conflicto sectario,tensión sectaria,lugares sagrados,peregrinación,ramadán,hajj,terrorismo,atentado,explosión,radicalización,células terroristas,operación antiterrorista,servicios secretos,inteligencia militar,contrainteligencia,oriente medio,medio oriente,mashreq,levant,inestabilidad regional,crisis del golfo,conflicto en oriente medio')
|
||||
ON CONFLICT (slug) DO UPDATE SET name = EXCLUDED.name, weight = EXCLUDED.weight, keywords = EXCLUDED.keywords;
|
||||
|
||||
INSERT INTO topics (slug, name, weight, keywords) VALUES
|
||||
('ukraine_russia', 'Ucrania / Rusia', 5, 'ucrania,estado ucraniano,kyiv,kiev,odesa,lviv,rusia,federación rusa,moscú,san petersburgo,zelensky,zelenski,volodímir zelenski,putin,vladímir putin,kremlin,dimitri peskov,sergei lavrov,donbás,donbas,donetsk,donesk,oblast de donetsk,lugansk,luhansk,oblast de lugansk,crimea,sebastopol,península de crimea,mariúpol,jersón,zaporizhzhia,jarkov,sumy,bahmut,avdiivka,lyman,soledar,invasión,invadir,ataque ruso,agresión rusa,contraofensiva,ofensiva ucraniana,ofensiva rusa,bombardeo,ataques masivos,ataques nocturnos,artillería,ataque con misiles,ataque con drones,drones kamikaze,shahed,geran-2,lanzadores múltiples,misiles hipersónicos,kizhal,iskander,kalibr,sistema antiaéreo,patriot,nasams,s-300,s-400,defensa aérea,interceptores,sirenas antiaéreas,fuerzas armadas ucranianas,fuerzas armadas rusas,wagner,grupo wagner,rosgvardia,militares movilizados,reservistas,mercenarios,voluntarios internacionales,anexión,territorios anexionados,referéndum falso,integración forzada,administración ocupante,rusificación,pasaporte ruso obligatorio,tanques leopard,abrams,challenger,vehículos blindados,bradley,artillería autopropulsada,munición de racimo,munición guiada,misiles tácticos,drones de reconocimiento,guerra electrónica,ciberataque ruso,guerra híbrida,desinformación,propaganda rusa,operaciones encubiertas,hackers prorrusos,ataques informáticos masivos,movilización,movilización parcial,llamamiento a filas,despliegue,reservistas,retirada,bajas,pérdidas militares,deserción,frente oriental,línea de contacto,trincheras,alianza occidental,apoyo militar occidental,otan,nato,unión europea,g7,sanciones,embargo,tope al petróleo ruso,precio del gas,negociaciones de paz,alto el fuego,mediación,acusaciones de crímenes de guerra,crímenes contra la humanidad,refugiados ucranianos,desplazados internos,crisis humanitaria,corte de electricidad,infraestructura destruida,ataques a civiles,bombardeos a infraestructura crítica,corredores humanitarios,evacuaciones masivas,gas ruso,nord stream,nord stream 2,oleoducto,gasoducto,corte de suministro,crisis energética europea,acuerdo de exportación de grano,corredor del mar negro,bloqueo portuario,ataques a puertos ucranianos,osce,onu en ucrania,observadores internacionales,ue apoyo a ucrania,fondo europeo de defensa,escalada nuclear,amenaza nuclear,retórica nuclear,conflicto en ucrania,guerra de ucrania,agresión rusa,resistencia ucraniana,estancamiento militar,frente de batalla,situación en el donbás')
|
||||
ON CONFLICT (slug) DO UPDATE SET name = EXCLUDED.name, weight = EXCLUDED.weight, keywords = EXCLUDED.keywords;
|
||||
|
||||
INSERT INTO topics (slug, name, weight, keywords) VALUES
|
||||
('china', 'China / Asia Oriental', 5, 'china,república popular china,rpc,beijing,pekin,shanghai,guangzhou,shenzhen,hong kong,macau,tíbet,xinjiang,mongolia interior,xi jinping,líder chino,secretario general,partido comunista chino,pcc,comité central,politburó,congreso nacional del pueblo,asamblea nacional popular,primer ministro chino,consejo de estado,taiwán,taipei,estrecho de taiwán,islas kinmen,islas matsu,reunificación,independencia de taiwán,incursiones aéreas,zona de identificación de defensa aérea,adiz,ejercicios militares chinos,bloqueo simulado,flota del pacífico,tensiones sino-taiwanesas,corea del sur,seúl,japón,tokio,mar de china meridional,islas spratly,islas paracel,filipinas,vietnam,disputas territoriales en asia,acuartelamiento indo-pacífico,acuerdos en asia oriental,asean+3,diplomacia china,soft power chino,poder blando,guerra comercial,relaciones sino estadounidenses,relaciones china rusia,alianza estratégica china rusia,cumbre de la unasur china,foros regionales asiáticos,g20,brics,brics+,ruta de la seda,nueva ruta de la seda,belt and road,bri,iniciativa de la franja y la ruta,gdi,global development initiative,gsi,global security initiative,gci,global civilization initiative,hecho en china 2025,made in china 2025,dual circulation,aiib,asian infrastructure investment bank,sco,ocsh,shanghai cooperation organisation,rcep,regional comprehensive economic partnership,asean china,foros del este asiático,apec,cooperación asia-pacífico,semiconductores chinos,industria de chips,litografía china,huawei,zte,bytedance,tiktok,dji,supercomputación china,chips avanzados,restricciones de chips,bloqueo tecnológico eeuu china,ciberespionaje,ataques chinos,apt chino,hackers chinos,piratería estatal,robo tecnológico,ciberataque,gran cortafuegos,gran firewall de china,control de internet,vigilancia digital,ejército chino,pla,ejército de liberación popular,armada china,fuerza aérea china,misiles hipersónicos chinos,modernización militar china,cibercomando chino,marina del epl,guardia costera china,zona de exclusión aérea,maniobras militares,xinjiang,uigur,minorías uigures,reeducación,control social,vigilancia masiva,cámaras de reconocimiento facial,tíbet,libertades civiles en china,economía china,crecimiento chino,exportaciones chinas,industria manufacturera,crisis inmobiliaria china,evergrande,country garden,mercado inmobiliario chino,inversiones chinas,fondos soberanos de china,asia oriental,asia pacífico,indo pacífico,potencia asiática,superpotencia china,expansión china')
|
||||
ON CONFLICT (slug) DO UPDATE SET name = EXCLUDED.name, weight = EXCLUDED.weight, keywords = EXCLUDED.keywords;
|
||||
|
||||
INSERT INTO topics (slug, name, weight, keywords) VALUES
|
||||
('eurasia_russia', 'Eurasia / Influencia Rusa', 4, 'unión euroasiática,eaeu,ueea,eurasian economic union,csto,otsc,collective security treaty organization,comunidad de estados independientes,cei,cis,organización del tratado de seguridad colectiva,parlamento euroasiático,espacio económico euroasiático,asia central,asia central rusa,antiguas repúblicas soviéticas,kazajistán,kazakhstan,astana,almaty,uzbekistán,uzbekistan,tashkent,kirguistán,kirguistan,kirguizistán,bishkek,tayikistán,tayikistan,dusambé,turkmenistán,turkmenistan,ashgabat,armenia,ereván,georgia,tiflis,moldavia,moldova,chisinau,bielorrusia,belarus,minsk,cáucaso sur,cáucaso norte,nagorno karabaj,artsaj,osetia del sur,abjasia,transnistria,donbás euroasiático,frontera ruso-georgiana,bases militares rusas,presencia militar rusa en asia central,fuerzas de paz rusas,operaciones de seguridad regional,ejercicios militares conjuntos,vostok,centr,organización del tratado de amistad y cooperación,cooperación policial euroasiática,centrado en seguridad,unión aduanera,aranceles euroasiáticos,bloque económico euroasiático,intercambio comercial con rusia,dependencia energética de rusia,corredores energéticos,oleoductos euroasiáticos,gasoductos rusos,acuerdos bilaterales con moscú,política económica euroasiática,gazprom,rosneft,transneft,lukoil,gasoducto fuerza de siberia,power of siberia,gasoducto asia central rusia,oleoducto bakú-tiflis-ceyhan,btc pipeline,energía euroasiática,seguridad energética del cáucaso,organización de cooperación de shanghái,sco,ocsh,alianza estratégica china rusia,eje pekín-moscú,rusia en asia central,influencia rusa en el cáucaso,geopolítica euroasiática,integración postsoviética,proyectos euroasiáticos,visitas de estado en asia central,migrantes de asia central en rusia,remesas a asia central,dependencia laboral,crisis fronterizas,rotación laboral regional,eurasia,espacio postsoviético,antiguo bloque soviético,influencia rusa,hegemonía rusa,zona de influencia rusa,vecindario cercano de rusia,near abroad,orden euroasiático,esfera rusa de influencia')
|
||||
ON CONFLICT (slug) DO UPDATE SET name = EXCLUDED.name, weight = EXCLUDED.weight, keywords = EXCLUDED.keywords;
|
||||
|
||||
INSERT INTO topics (slug, name, weight, keywords) VALUES
|
||||
('organismos_globales', 'Organismos Globales', 5, 'onu,naciones unidas,naciones-unidas,asamblea general,consejo de seguridad,secretario general,resolución de la onu,misiones de paz,cascos azules,ecosoc,consejo económico y social,pnuma,programa de naciones unidas para el medio ambiente,pnud,programa de naciones unidas para el desarrollo,onu mujeres,fondo de población de la onu,unfpa,unrwa,agencia de onu para refugiados palestinos,unhabitat,unops,unesco,unido,oms,organización mundial de la salud,ops,organización panamericana de la salud,unicef,fao,acnur,oim,oit,oms,cruz roja internacional,cicr,robos humanitarios internacionales,fmi,fondo monetario internacional,banco mundial,bm,banco internacional de reconstrucción y fomento,bird,asociación internacional de fomento,aif,banco de pagos internacionales,bis,omc,organización mundial del comercio,ocde,organización para la cooperación y el desarrollo económicos,unctad,comercio y desarrollo,foro de davos,wef,foro económico mundial,g7,g20,club de parís,club de londres,corte penal internacional,cpi,tribunal internacional de justicia,tij,corte internacional de justicia,corte permanente de arbitraje,cpa,tribunales de la haya,la haya,oiea,organismo internacional de energía atómica,ctbto,organismo de control de pruebas nucleares,interpol,oficina internacional de policía criminal,onuad,desarme,convención sobre armas químicas,opaq,ipcc,panel intergubernamental del cambio climático,cop,cumbres climáticas,acuerdo de parís,onu clima,pnuma,programa medioambiental de la onu,unesco,organización de naciones unidas para la educación,oms,oms investigación,onu ciencia,oms cooperación global,movimiento de países no alineados,no aligned movement,nam,alianza global,cooperación multilateral,instituciones multilaterales,gobernanza global')
|
||||
ON CONFLICT (slug) DO UPDATE SET name = EXCLUDED.name, weight = EXCLUDED.weight, keywords = EXCLUDED.keywords;
|
||||
|
||||
INSERT INTO topics (slug, name, weight, keywords) VALUES
|
||||
('organismos_occidente', 'Organismos Occidente', 5, 'unión europea,ue,comisión europea,ejecutivo comunitario,parlamento europeo,eurocámara,consejo europeo,consejo de la unión europea,consejo de ministros,tribunal de justicia de la unión europea,tjue,tribunal de cuentas europeo,servicio europeo de acción exterior,seae,alto representante de la ue,alto representante para asuntos exteriores,bce,banco central europeo,eurogrupo,mecanismo europeo de estabilidad,mee,rescate europeo,eurozona,zona euro,banco europeo de inversiones,bei,banco europeo de reconstrucción y desarrollo,berd,europol,oficina europea de policía,eurojust,cooperación judicial europea,frontex,agencia europea de fronteras,olaf,oficina europea de lucha contra el fraude,easa,agencia europea de seguridad aérea,ema,agencia europea del medicamento,enisa,agencia europea de ciberseguridad,eu-osha,agencia europea para la seguridad y salud en el trabajo,consejo de europa,tribunal europeo de derechos humanos,tedh,convención europea de derechos humanos,otan,nato,alianza atlántica,alianza del atlántico norte,mando aliado,ejercicios de la otan,osce,organización para la seguridad y la cooperación en europa,agencia europea de defensa,eda,ocde,organización para la cooperación y el desarrollo económicos,g7,cumbre del g7,g7 ampliado,club de países industrializados,efta,aelc,asociación europea de libre comercio,espacio económico europeo,eee,schengen,acuerdos de schengen,zona schengen,política de vecindad europea,vecindad oriental,pilar europeo de derechos sociales,estado de derecho en la ue,mecanismo del estado de derecho,cumbre eu-usa,relaciones transatlánticas,bloque occidental,alianza occidental,instituciones europeas,burocracia de bruselas,estructura comunitaria,marco institucional europeo')
|
||||
ON CONFLICT (slug) DO UPDATE SET name = EXCLUDED.name, weight = EXCLUDED.weight, keywords = EXCLUDED.keywords;
|
||||
|
||||
INSERT INTO topics (slug, name, weight, keywords) VALUES
|
||||
('organismos_america', 'Organismos América', 4, 'oea,organización de los estados americanos,cidh,comisión interamericana de derechos humanos,corte idh,corte interamericana de derechos humanos,bid,banco interamericano de desarrollo,bcie,banco centroamericano de integración económica,caf,banco de desarrollo de américa latina,cepal,comisión económica para américa latina y el caribe,fonplata,fondo financiero para el desarrollo de la cuenca del plata,mercosur,mercosul,mercosur ampliado,unasur,unión de naciones suramericanas,alianza del pacífico,apec latinoamérica,alap,alba,alba-tcp,alternativa bolivariana para las américas,prosur,foro para el progreso de américa del sur,sica,sistema de la integración centroamericana,parlacen,parlamento centroamericano,caricom,comunidad del caribe,acs,asociación de estados del caribe,sela,sistema económico latinoamericano y caribeño,usmca,tmec,nafta,tratado de libre comercio de américa del norte,cumbre de líderes de américa del norte,alianza para la prosperidad,alianza energética norteamericana,junta interamericana de defensa,consejo de defensa suramericano,seguridad hemisférica,cooperación militar regional,celac,comunidad de estados latinoamericanos y caribeños,cumbre iberoamericana,secretaría general iberoamericana,segib,organismo andino de integración,comunidad andina,can,ops,organización panamericana de la salud,panam sports,odepa,organización deportiva panamericana,oit américas,unesco américa latina,retrofit latinoamérica,infraestructura regional,integración latinoamericana,cooperación regional,foros latinoamericanos,mecanismos regionales,agenda hemisférica,diplomacia regional')
|
||||
ON CONFLICT (slug) DO UPDATE SET name = EXCLUDED.name, weight = EXCLUDED.weight, keywords = EXCLUDED.keywords;
|
||||
|
||||
INSERT INTO topics (slug, name, weight, keywords) VALUES
|
||||
('organismos_china_rusia', 'Org. China/Rusia/BRICS', 5, 'brics,brics+,nuevos brics,expansión de los brics,sco,ocsh,shanghai cooperation organisation,organización de cooperación de shanghái,belt and road,belt & road,bri,iniciativa de la franja y la ruta,ruta de la seda,nueva ruta de la seda,silk road,gdi,global development initiative,gsi,global security initiative,gci,global civilization initiative,made in china 2025,dual circulation strategy,aiib,asian infrastructure investment bank,nuevo banco de desarrollo,new development bank,ndb,banco euroasiático de desarrollo,banco asiático de inversión en infraestructura,csto,otsc,collective security treaty organization,organización del tratado de seguridad colectiva,eaeu,ueea,unión económica euroasiática,eurasian economic union,cei,cis,comunidad de estados independientes,rosatom,gazprom forum,foro energético ruso,foro de boao,boao forum for asia,asean+3,asean plus three,asia cooperation dialogue,acd,cica,conference on interaction and confidence building measures in asia,organización del tratado de amistad y cooperación,otl del caspio,caspian summit,consejo turco,turkic council,organización de estados túrquicos,ejercicios conjuntos china rusia,alianza militar euroasiática,cooperación militar sino-rusa,joint sea naval exercises,vostok ejercicios militares,rcep,regional comprehensive economic partnership,asian cooperation forum,cinturón económico de la ruta de la seda,eurasian land bridge,foro energético del caspio,acuerdos energéticos china rusia,gasoducto fuerza de siberia,power of siberia pipeline,foro petrolero euroasiático,multipolaridad,orden multipolar,alternativa a occidente,bloque euroasiático,cooperación sino-rusa,alianza estratégica china rusia')
|
||||
ON CONFLICT (slug) DO UPDATE SET name = EXCLUDED.name, weight = EXCLUDED.weight, keywords = EXCLUDED.keywords;
|
||||
|
||||
INSERT INTO topics (slug, name, weight, keywords) VALUES
|
||||
('big_tech', 'Big Tech / Gigantes Tecnológicos', 4, 'apple,google,alphabet,tesla,spacex,amazon,meta,facebook,microsoft,netflix,nvidia,intel,amd,samsung,huawei,tiktok,bytedance,oracle,ibm,salesforce,adobe,alibaba,tencent,baidu,uber,airbnb,spotify,tim cook,sundar pichai,elon musk,mark zuckerberg,satya nadella,jeff bezos,jensen huang,reed hastings,jack ma,pony ma,zhang yiming,iphone,ipad,macbook,ios,macos,app store,android,google play,chrome,chromebook,gmail,google cloud,aws,amazon web services,azure,microsoft 365,office 365,teams,windows,xbox,meta quest,oculus,realidad virtual,realidad aumentada,tesla model 3,tesla model y,autopilot,full self driving,fsd,prime video,netflix,hbo max,disney+,tiktok app,instagram,whatsapp,messenger,youtube,youtube premium,plataforma digital,marketplace,ecommerce,comercio electrónico,suscripción,modelo freemium,publicidad digital,anuncios online,economía de plataforma,gig economy,economía colaborativa,cloud,computación en la nube,centros de datos,data center,edge computing,cdn,infraestructura cloud,paas,saas,iaas,kubernetes,docker,microservicios,vehículo eléctrico,coche eléctrico,supercargadores,red de carga,conducción autónoma,software de conducción,baterías,gigafactory,modelo de lenguaje,servicio de ia,ia en la nube,plataformas de inteligencia artificial,api de ia,servicios cognitivos,vision artificial en la nube,fusión,adquisición,m&a,compra de startup,venta de activos,spin-off,scisión empresarial,salida a bolsa,opv,ipo,valoración multimillonaria,unicornio,capital riesgo,posición dominante,monopolio digital,antimonopolio,antitrust,regulación tecnológica,ley de mercados digitales,protección de datos,privacidad,rgpd,gdpr,investigación regulatoria,multa antimonopolio,control de contenidos,moderación de contenidos,big tech,gigantes tecnológicos,empresas tecnológicas,multinacional tecnológica,ecosistema tecnológico,resultados trimestrales,beneficios récord,capitalización bursátil')
|
||||
ON CONFLICT (slug) DO UPDATE SET name = EXCLUDED.name, weight = EXCLUDED.weight, keywords = EXCLUDED.keywords;
|
||||
|
||||
INSERT INTO topics (slug, name, weight, keywords) VALUES
|
||||
('economia_global', 'Economía Global', 4, 'economía,macroeconomía,pib,producto interior bruto,inflación,deflación,estanflación,recesión,desaceleración,crecimiento económico,actividad económica,balanza comercial,déficit,superávit,deuda pública,deuda soberana,estímulo fiscal,austeridad,ajuste estructural,mercados financieros,bolsa,acciones,índice bursátil,ibex,nasdaq,dow jones,sp500,ftse,nikkei,bonos,renta fija,renta variable,divisas,tipos de cambio,volatilidad,inversores,capitalización,crisis financiera,burbuja financiera,corrección del mercado,banca central,banco central,tipos de interés,política monetaria,quantitative easing,qe,subida de tipos,bce,fed,reserva federal,banco de inglaterra,banco de japón,tasa de referencia,inflación subyacente,petróleo,crudo,brent,wti,gas natural,carbón,energía,matérias primas,commodities,minería,cobre,litio,oro,plata,energía renovable,transición energética,opep,opep+,precio del petróleo,producción petrolera,comercio internacional,aranceles,exportaciones,importaciones,barreras comerciales,guerra comercial,organización mundial del comercio,omc,rcep,nafta,usmca,tratado de libre comercio,logística,cadena de suministro,supply chain,puertos,fletes,g7,g20,brics,fmi,fondo monetario internacional,banco mundial,ocde,foro de davos,wef,banco asiático de inversión,aiib,banco interamericano de desarrollo,bid,cepal,mercosur,unión europea económica,inversión,capital riesgo,private equity,fusiones y adquisiciones,m&a,inversión extranjera directa,ied,empresas multinacionales,gigantes empresariales,beneficios,dividendos,resultados trimestrales,balances,rentabilidad,bitcoin,ethereum,criptomonedas,criptoactivos,blockchain,fintech,banca digital,tokenización,defi,criptoexchange,volatilidad cripto,minería de bitcoin,crisis económica,crisis de deuda,crisis bancaria,riesgo país,tensiones económicas,colapso financiero,fuga de capitales,corralito,intervención estatal,desempleo,paro,ocupación,mercado laboral,salarios,negociación colectiva,coste de vida,pobreza,desigualdad,clase media,economía global,sistema financiero,competitividad,inestabilidad económica,política económica')
|
||||
ON CONFLICT (slug) DO UPDATE SET name = EXCLUDED.name, weight = EXCLUDED.weight, keywords = EXCLUDED.keywords;
|
||||
|
||||
INSERT INTO topics (slug, name, weight, keywords) VALUES
|
||||
('desastres_y_crisis', 'Desastres y Crisis', 5, 'terremoto,sismo,seísmo,epicentro,magnitud,réplica,tsunami,maremoto,inundación,riada,lluvias torrenciales,crecida de río,huracán,tormenta tropical,tifón,ciclón,tornado,tormenta eléctrica,erupción volcánica,volcán,lava,ceniza volcánica,deslizamiento de tierra,corrimiento de tierras,alud,avalancha,sequía,ola de calor,ola de frío,incendio forestal,fuego,desastre natural,explosión,fuga tóxica,derrame químico,accidente industrial,planta química,accidente nuclear,reactor nuclear,radiación,fuga nuclear,contaminación,derrame petrolero,marea negra,colapso estructural,derrumbamiento,explosión de gas,accidente minero,atentado,ataque terrorista,terrorismo,bomba,artefacto explosivo,yihadista,estado islámico,isis,al qaeda,coche bomba,suicida,atacante,tiroteo masivo,radicalización,extremismo violento,guerra,conflicto armado,combates,batalla,frente de guerra,ofensiva,contraofensiva,bombardeo,incursión militar,ataque aéreo,ataque con drones,misiles,artillería,fuerzas armadas,tropas,movilización militar,invasión,ocupación,escalada,armamento,armas pesadas,genocidio,limpieza étnica,violaciones de derechos humanos,epidemia,pandemia,brote,virus,infección,covid,ebola,zika,gripe aviar,sars,mers,alerta sanitaria,cuarentena,aislamiento,contagio,colapso sanitario,emergencia de salud pública,crisis humanitaria,refugiados,desplazados,campamentos,hambruna,inseguridad alimentaria,falta de agua,ayuda humanitaria,emergencia humanitaria,crisis migratoria,socorro internacional,organizaciones de socorro,accidente,tragedia,fatalidades,víctimas,heridos,rescate,accidente de tráfico,accidente de carretera,accidente vial,colisión,choque frontal,alcance,salida de vía,autopista,carretera,caravana,atasco,retención,conductor herido,peatón atropellado,atropello,multitudinario,cadena de colisiones,choque múltiple,accidente de autobús,autobús volcado,accidente de camión,camión cisterna,vehículo incendiado,accidente mortal,accidente de avión,accidente aéreo,siniestralidad aérea,accidente ferroviario,descarrilamiento,tren siniestrado,accidente marítimo,naufragio,barco volcado,catástrofe,desastre,emergencia,alerta roja,alerta meteorológica,evacuación,crisis,devastación,pérdidas humanas,operativo de rescate')
|
||||
ON CONFLICT (slug) DO UPDATE SET name = EXCLUDED.name, weight = EXCLUDED.weight, keywords = EXCLUDED.keywords;
|
||||
|
||||
INSERT INTO topics (slug, name, weight, keywords) VALUES
|
||||
('conflictos', 'Conflictos y Seguridad', 5, 'conflicto armado,guerra,guerra civil,combates,batalla,frente,frente de batalla,ofensiva,contraofensiva,incursión,incursión militar,invasión,ocupación,asedio,bombardeo,ataque aéreo,ataque terrestre,ataque con drones,misil,artillería,fuego cruzado,tropas,armamento,armas pesadas,militares,movilización,despliegue militar,zona de conflicto,golpe de estado,intentona golpista,junta militar,derrocamiento,toma del poder,ruptura institucional,estado de excepción,toque de queda,represión estatal,levantamiento,insurrección,motín,disturbios,protestas masivas,rebelión,sublevación,conflicto étnico,violencia sectaria,tensiones étnicas,limpieza étnica,persecución étnica,enfrentamiento tribal,violencia intercomunitaria,minorías perseguidas,atentado,ataque terrorista,terrorismo,extremismo,radicalización,yihadista,estado islámico,isis,al qaeda,talibanes,coche bomba,artefacto explosivo,suicida,milicia,guerrilla,grupo insurgente,insurgencia,paramilitares,señores de la guerra,cártel,mafia,crimen organizado,narcotráfico,tráfico de armas,tráfico de personas,extorsión,sicarios,bandas armadas,ciberataque,ciberataque masivo,hackeo,ataque informático,ataque ransomware,infiltración informática,phishing,ciberespionaje,filtración de datos,inteligencia militar,operación encubierta,guerra híbrida,desinformación,propaganda,sanciones,sanciones económicas,embargo,bloqueo económico,bloqueo comercial,castigo diplomático,retirada de embajadores,secuestro,rapto,toma de rehenes,ejecución,ejecución extrajudicial,asesinato político,magnicidio,intento de asesinato,masacre,tiroteo,fuerza letal,ataque coordinado,cascos azules,misión de paz,intervención militar,zona desmilitarizada,alto el fuego,tregua,acuerdo de paz,escalada,escalada militar,tensión internacional,amenaza,hostilidades,crisis de seguridad,conflicto internacional')
|
||||
ON CONFLICT (slug) DO UPDATE SET name = EXCLUDED.name, weight = EXCLUDED.weight, keywords = EXCLUDED.keywords;
|
||||
|
||||
INSERT INTO topics (slug, name, weight, keywords) VALUES
|
||||
('elecciones_politica', 'Elecciones y Política', 3, 'elecciones,elección presidencial,elección parlamentaria,elecciones generales,elecciones regionales,elecciones locales,urna,votación,voto,recuento,escrutinio,participación electoral,abstención,jornada electoral,segunda vuelta,balotaje,candidato,candidatura,lista electoral,victoria electoral,derrota electoral,coalición electoral,campaña,mitin,debate electoral,debate televisado,programa electoral,promesas electorales,encuesta,sondeo,intención de voto,tracking electoral,eje izquierda-derecha,eslogan político,gira electoral,referéndum,plebiscito,consulta popular,consulta vinculante,autodeterminación,reforma constitucional,cambio de constitución,estatuto,referendo de independencia,fraude electoral,manipulación electoral,irregularidades,compra de votos,clientelismo,intimidación electoral,impugnación de resultados,protestas post-electorales,observadores internacionales,acusaciones de fraude,presidente,primer ministro,jefe de estado,jefe de gobierno,gabinete,ministro,secretario de estado,portavoz,alcalde,gobernador,diputado,senador,legislador,parlamento,asamblea,congreso,senado,cámara baja,cámara alta,comité parlamentario,mayoría absoluta,mayoría simple,oposición,disolución del parlamento,moción de censura,investidura,votación parlamentaria,partido político,coalición,alianza,bloque parlamentario,oposición política,izquierda,derecha,centro,extrema derecha,extrema izquierda,liberal,conservador,socialdemócrata,populismo,crisis política,dimisión,renuncia,interpelación,gobierno interino,vacancia,caída del gobierno,bloqueo institucional,parálisis política,estado de excepción político,política exterior,relaciones diplomáticas,acuerdos bilaterales,visita oficial,reconocimiento internacional,tensiones diplomáticas,embajador,ministerio de exteriores,corrupción,soborno,malversación,tráfico de influencias,escándalo político,investigación judicial,audiencia parlamentaria,comisión de investigación,imputación,procesamiento,manifestación,protesta,movilización,huelga general,huelga política,movimientos ciudadanos,activistas,revolución de colores,presión social,derechos civiles,gobierno,administración,estabilidad política,modelo político,transición política,proceso democrático,instituciones,estado de derecho,crisis institucional')
|
||||
ON CONFLICT (slug) DO UPDATE SET name = EXCLUDED.name, weight = EXCLUDED.weight, keywords = EXCLUDED.keywords;
|
||||
|
||||
INSERT INTO topics (slug, name, weight, keywords) VALUES
|
||||
('tecnologia', 'Tecnología', 3, 'inteligencia artificial,ia,algoritmo,machine learning,deep learning,red neuronal,modelo de lenguaje,modelo generativo,llm,transformer,genai,openai,chatgpt,gpt,anthropic,claude,google gemini,llama,metallama,hugging face,inferencias,entrenamiento de modelos,fine tuning,datasets,vectorización,embeddings,visión artificial,nlp,procesamiento de lenguaje natural,chips,semiconductores,nanómetros,oblea,gpu,cpu,asic,intel,amd,nvidia,arm,tsmc,samsung semiconductors,litografía,europa chips act,chiplets,memoria hbm,vrm,arquitectura computacional,supercomputador,hpc,robot,robótica,robot humanoide,automatización,drones,vehículos autónomos,coche autónomo,autopilot,industria 4.0,digital twins,iot,internet de las cosas,sensores inteligentes,domótica,smart home,ciberseguridad,ciberataque,ciberdefensa,phishing,ransomware,malware,spyware,vulnerabilidad,cve,zero-day,hackeo,intrusión,filtración de datos,brecha de seguridad,criptografía,seguridad informática,firewall,5g,6g,fibra óptica,redes móviles,torres de telecomunicaciones,infraestructura de red,satélites,starlink,orbital,ancho de banda,latencia,internet global,operadores de telecomunicaciones,redes privadas,software,aplicación,plataforma digital,startup,ecosistema tech,innovación,transformación digital,saas,paas,iaas,cloud,nube,computación en la nube,servidores,microservicios,contenedores,docker,kubernetes,devops,código abierto,open source,repositorio,api,microchips,firmware,computación cuántica,qubits,enfriamiento criogénico,superposición cuántica,enlace cuántico,computación distribuida,edge computing,fog computing,holografía,realidad aumentada,realidad virtual,metaverso,xr,visión por computador,apple,google,alphabet,tesla,meta,amazon,microsoft,tim cook,sundar pichai,elon musk,mark zuckerberg,silicon valley,gigante tecnológico,unicornios,big data,data mining,análisis predictivo,modelos estadísticos,data science,científico de datos,pipelines de datos,lagos de datos,etl,warehouse,baterías,ion-litio,carga rápida,movilidad eléctrica,supercargadores,vehículo eléctrico,eficiencia energética,tecnologías verdes,energía inteligente,tecnología,sector tecnológico,ecosistema digital,innovación disruptiva,avance tecnológico,desarrollo tecnológico')
|
||||
ON CONFLICT (slug) DO UPDATE SET name = EXCLUDED.name, weight = EXCLUDED.weight, keywords = EXCLUDED.keywords;
|
||||
8
init-db/12-stats.sql
Normal file
8
init-db/12-stats.sql
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
CREATE TABLE IF NOT EXISTS translation_stats (
|
||||
id SERIAL PRIMARY KEY,
|
||||
created_at TIMESTAMP DEFAULT NOW(),
|
||||
lang_to VARCHAR(10)
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_trans_stats_date ON translation_stats(created_at);
|
||||
CREATE INDEX IF NOT EXISTS idx_trans_stats_lang ON translation_stats(lang_to);
|
||||
8
init-db/13-entity-images.sql
Normal file
8
init-db/13-entity-images.sql
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
CREATE TABLE IF NOT EXISTS entity_images (
|
||||
id SERIAL PRIMARY KEY,
|
||||
entity_name TEXT UNIQUE NOT NULL,
|
||||
image_url TEXT,
|
||||
summary TEXT,
|
||||
source TEXT DEFAULT 'wikipedia',
|
||||
last_checked TIMESTAMP WITH TIME ZONE DEFAULT NOW()
|
||||
);
|
||||
41
init-db/20-usuarios.sql
Normal file
41
init-db/20-usuarios.sql
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
-- Tabla de usuarios
|
||||
-- Almacena información de autenticación y perfil de usuarios
|
||||
|
||||
CREATE TABLE IF NOT EXISTS usuarios (
|
||||
id SERIAL PRIMARY KEY,
|
||||
username VARCHAR(50) NOT NULL UNIQUE,
|
||||
email VARCHAR(255) NOT NULL UNIQUE,
|
||||
password_hash VARCHAR(255) NOT NULL,
|
||||
created_at TIMESTAMP DEFAULT NOW(),
|
||||
updated_at TIMESTAMP DEFAULT NOW(),
|
||||
last_login TIMESTAMP,
|
||||
is_active BOOLEAN DEFAULT TRUE,
|
||||
CONSTRAINT username_min_length CHECK (LENGTH(username) >= 3),
|
||||
CONSTRAINT email_format CHECK (email ~* '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$')
|
||||
);
|
||||
|
||||
-- Índices para búsquedas rápidas
|
||||
CREATE INDEX IF NOT EXISTS idx_usuarios_username ON usuarios(username);
|
||||
CREATE INDEX IF NOT EXISTS idx_usuarios_email ON usuarios(email);
|
||||
CREATE INDEX IF NOT EXISTS idx_usuarios_active ON usuarios(is_active) WHERE is_active = TRUE;
|
||||
|
||||
-- Trigger para actualizar updated_at
|
||||
CREATE OR REPLACE FUNCTION update_usuario_timestamp()
|
||||
RETURNS TRIGGER AS $$
|
||||
BEGIN
|
||||
NEW.updated_at = NOW();
|
||||
RETURN NEW;
|
||||
END;
|
||||
$$ LANGUAGE plpgsql;
|
||||
|
||||
CREATE TRIGGER trigger_update_usuario_timestamp
|
||||
BEFORE UPDATE ON usuarios
|
||||
FOR EACH ROW
|
||||
EXECUTE FUNCTION update_usuario_timestamp();
|
||||
|
||||
-- Comentarios
|
||||
COMMENT ON TABLE usuarios IS 'Usuarios registrados del sistema';
|
||||
COMMENT ON COLUMN usuarios.username IS 'Nombre de usuario único';
|
||||
COMMENT ON COLUMN usuarios.email IS 'Correo electrónico único';
|
||||
COMMENT ON COLUMN usuarios.password_hash IS 'Hash bcrypt de la contraseña';
|
||||
COMMENT ON COLUMN usuarios.is_active IS 'Indica si la cuenta está activa';
|
||||
27
init-db/21-search-history.sql
Normal file
27
init-db/21-search-history.sql
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
-- Tabla de historial de búsquedas
|
||||
-- Registra todas las búsquedas realizadas por usuarios autenticados
|
||||
|
||||
CREATE TABLE IF NOT EXISTS search_history (
|
||||
id SERIAL PRIMARY KEY,
|
||||
user_id INTEGER NOT NULL REFERENCES usuarios(id) ON DELETE CASCADE,
|
||||
query TEXT NOT NULL,
|
||||
results_count INTEGER DEFAULT 0,
|
||||
searched_at TIMESTAMP DEFAULT NOW(),
|
||||
CONSTRAINT query_not_empty CHECK (LENGTH(TRIM(query)) > 0)
|
||||
);
|
||||
|
||||
-- Índices para queries eficientes
|
||||
CREATE INDEX IF NOT EXISTS idx_search_history_user_date
|
||||
ON search_history(user_id, searched_at DESC);
|
||||
CREATE INDEX IF NOT EXISTS idx_search_history_user_id
|
||||
ON search_history(user_id);
|
||||
|
||||
-- Índice para buscar búsquedas populares
|
||||
CREATE INDEX IF NOT EXISTS idx_search_history_query
|
||||
ON search_history(query);
|
||||
|
||||
-- Comentarios
|
||||
COMMENT ON TABLE search_history IS 'Historial de búsquedas de usuarios';
|
||||
COMMENT ON COLUMN search_history.user_id IS 'Usuario que realizó la búsqueda';
|
||||
COMMENT ON COLUMN search_history.query IS 'Término de búsqueda';
|
||||
COMMENT ON COLUMN search_history.results_count IS 'Cantidad de resultados encontrados';
|
||||
34
init-db/22-favoritos-migration.sql
Normal file
34
init-db/22-favoritos-migration.sql
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
-- Migración: Actualizar tabla favoritos para soportar usuarios autenticados
|
||||
-- Añade columna user_id manteniendo retrocompatibilidad con session_id
|
||||
|
||||
-- Agregar columna user_id si no existe
|
||||
DO $$
|
||||
BEGIN
|
||||
IF NOT EXISTS (
|
||||
SELECT 1 FROM information_schema.columns
|
||||
WHERE table_name = 'favoritos' AND column_name = 'user_id'
|
||||
) THEN
|
||||
ALTER TABLE favoritos ADD COLUMN user_id INTEGER REFERENCES usuarios(id) ON DELETE CASCADE;
|
||||
END IF;
|
||||
END $$;
|
||||
|
||||
-- Modificar constraint UNIQUE para incluir user_id
|
||||
-- Primero eliminar constraint existente si existe
|
||||
ALTER TABLE favoritos DROP CONSTRAINT IF EXISTS favoritos_session_id_noticia_id_key;
|
||||
ALTER TABLE favoritos DROP CONSTRAINT IF EXISTS favoritos_unique_favorite;
|
||||
|
||||
-- Crear nuevo constraint que permite favoritos por user_id O session_id
|
||||
ALTER TABLE favoritos ADD CONSTRAINT favoritos_unique_favorite
|
||||
UNIQUE NULLS NOT DISTINCT (user_id, session_id, noticia_id);
|
||||
|
||||
-- Agregar check constraint: debe tener user_id O session_id (no ambos nulos)
|
||||
ALTER TABLE favoritos DROP CONSTRAINT IF EXISTS favoritos_user_or_session;
|
||||
ALTER TABLE favoritos ADD CONSTRAINT favoritos_user_or_session
|
||||
CHECK (user_id IS NOT NULL OR session_id IS NOT NULL);
|
||||
|
||||
-- Crear índice en user_id para búsquedas rápidas
|
||||
CREATE INDEX IF NOT EXISTS idx_favoritos_user_id ON favoritos(user_id);
|
||||
|
||||
-- Comentarios
|
||||
COMMENT ON COLUMN favoritos.user_id IS 'Usuario autenticado (NULL si es favorito anónimo)';
|
||||
COMMENT ON COLUMN favoritos.session_id IS 'ID de sesión anónima (NULL si usuario autenticado)';
|
||||
2
init-db/30-add_avatar_url.sql
Normal file
2
init-db/30-add_avatar_url.sql
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
-- Add avatar_url column to users table if it doesn't exist
|
||||
ALTER TABLE usuarios ADD COLUMN IF NOT EXISTS avatar_url TEXT;
|
||||
38
init-db/31-add_feeds_pending_table.sql
Normal file
38
init-db/31-add_feeds_pending_table.sql
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
-- Migration: Add pending feeds table for review workflow
|
||||
-- This table stores discovered feeds that need manual review/approval
|
||||
|
||||
CREATE TABLE IF NOT EXISTS feeds_pending (
|
||||
id SERIAL PRIMARY KEY,
|
||||
fuente_url_id INTEGER REFERENCES fuentes_url(id) ON DELETE CASCADE,
|
||||
feed_url TEXT NOT NULL UNIQUE,
|
||||
feed_title VARCHAR(255),
|
||||
feed_description TEXT,
|
||||
feed_language CHAR(5),
|
||||
feed_type VARCHAR(20),
|
||||
entry_count INTEGER DEFAULT 0,
|
||||
detected_country_id INTEGER REFERENCES paises(id),
|
||||
suggested_categoria_id INTEGER REFERENCES categorias(id),
|
||||
categoria_id INTEGER REFERENCES categorias(id),
|
||||
pais_id INTEGER REFERENCES paises(id),
|
||||
idioma CHAR(2),
|
||||
discovered_at TIMESTAMP DEFAULT NOW(),
|
||||
reviewed BOOLEAN DEFAULT FALSE,
|
||||
approved BOOLEAN DEFAULT FALSE,
|
||||
reviewed_at TIMESTAMP,
|
||||
reviewed_by VARCHAR(100),
|
||||
notes TEXT
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_feeds_pending_reviewed ON feeds_pending(reviewed, approved);
|
||||
CREATE INDEX IF NOT EXISTS idx_feeds_pending_fuente ON feeds_pending(fuente_url_id);
|
||||
|
||||
-- Add constraint to fuentes_url to require categoria_id or pais_id for processing
|
||||
ALTER TABLE fuentes_url
|
||||
ADD COLUMN IF NOT EXISTS require_review BOOLEAN DEFAULT TRUE,
|
||||
ADD COLUMN IF NOT EXISTS auto_approve BOOLEAN DEFAULT FALSE;
|
||||
|
||||
COMMENT ON TABLE feeds_pending IS 'Feeds discovered but pending review/approval before being added to active feeds';
|
||||
COMMENT ON COLUMN feeds_pending.detected_country_id IS 'Country detected automatically from feed language/domain';
|
||||
COMMENT ON COLUMN feeds_pending.suggested_categoria_id IS 'Category suggested based on feed content/keywords';
|
||||
COMMENT ON COLUMN fuentes_url.require_review IS 'If TRUE, feeds from this URL need manual approval';
|
||||
COMMENT ON COLUMN fuentes_url.auto_approve IS 'If TRUE, feeds are automatically approved and activated';
|
||||
7
init-db/32-add_traceability_cols.sql
Normal file
7
init-db/32-add_traceability_cols.sql
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
-- Add fuente_url_id to feeds table for traceability
|
||||
ALTER TABLE feeds
|
||||
ADD COLUMN IF NOT EXISTS fuente_url_id INTEGER REFERENCES fuentes_url(id) ON DELETE SET NULL;
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_feeds_fuente_url ON feeds(fuente_url_id);
|
||||
|
||||
COMMENT ON COLUMN feeds.fuente_url_id IS 'ID of the URL source that discovered this feed';
|
||||
90
init-db/33-create_video_parrillas.sql
Normal file
90
init-db/33-create_video_parrillas.sql
Normal file
|
|
@ -0,0 +1,90 @@
|
|||
-- Script SQL para crear tablas de parrillas de noticias para videos
|
||||
|
||||
-- Tabla principal de parrillas/programaciones
|
||||
CREATE TABLE IF NOT EXISTS video_parrillas (
|
||||
id SERIAL PRIMARY KEY,
|
||||
nombre VARCHAR(255) NOT NULL UNIQUE,
|
||||
descripcion TEXT,
|
||||
tipo_filtro VARCHAR(50) NOT NULL, -- 'pais', 'categoria', 'entidad', 'continente', 'custom'
|
||||
|
||||
-- Filtros
|
||||
pais_id INTEGER REFERENCES paises(id),
|
||||
categoria_id INTEGER REFERENCES categorias(id),
|
||||
continente_id INTEGER REFERENCES continentes(id),
|
||||
entidad_nombre VARCHAR(255), -- Para filtrar por persona/organización específica
|
||||
entidad_tipo VARCHAR(50), -- 'persona', 'organizacion'
|
||||
|
||||
-- Configuración de generación
|
||||
max_noticias INTEGER DEFAULT 5, -- Número máximo de noticias por video
|
||||
duracion_maxima INTEGER DEFAULT 180, -- Duración máxima en segundos
|
||||
idioma_voz VARCHAR(10) DEFAULT 'es', -- Idioma del TTS
|
||||
voz_modelo VARCHAR(100), -- Modelo de voz específico a usar
|
||||
|
||||
-- Configuración de diseño
|
||||
template VARCHAR(50) DEFAULT 'standard', -- 'standard', 'modern', 'minimal'
|
||||
include_images BOOLEAN DEFAULT true,
|
||||
include_subtitles BOOLEAN DEFAULT true,
|
||||
|
||||
-- Programación
|
||||
frecuencia VARCHAR(20), -- 'daily', 'weekly', 'manual'
|
||||
ultima_generacion TIMESTAMP,
|
||||
proxima_generacion TIMESTAMP,
|
||||
|
||||
-- Estado
|
||||
activo BOOLEAN DEFAULT true,
|
||||
created_at TIMESTAMP DEFAULT NOW(),
|
||||
updated_at TIMESTAMP DEFAULT NOW()
|
||||
);
|
||||
|
||||
-- Tabla de videos generados
|
||||
CREATE TABLE IF NOT EXISTS video_generados (
|
||||
id SERIAL PRIMARY KEY,
|
||||
parrilla_id INTEGER REFERENCES video_parrillas(id) ON DELETE CASCADE,
|
||||
titulo VARCHAR(500) NOT NULL,
|
||||
descripcion TEXT,
|
||||
fecha_generacion TIMESTAMP DEFAULT NOW(),
|
||||
|
||||
-- Archivos
|
||||
video_path VARCHAR(500),
|
||||
audio_path VARCHAR(500),
|
||||
subtitles_path VARCHAR(500),
|
||||
thumbnail_path VARCHAR(500),
|
||||
|
||||
-- Metadata
|
||||
duracion INTEGER, -- en segundos
|
||||
num_noticias INTEGER,
|
||||
noticias_ids TEXT[], -- Array de IDs de noticias incluidas
|
||||
|
||||
-- Estado de procesamiento
|
||||
status VARCHAR(20) DEFAULT 'pending', -- 'pending', 'processing', 'completed', 'error'
|
||||
error_message TEXT,
|
||||
|
||||
-- Estadísticas
|
||||
views INTEGER DEFAULT 0,
|
||||
created_at TIMESTAMP DEFAULT NOW()
|
||||
);
|
||||
|
||||
-- Tabla de noticias en videos (relación muchos a muchos)
|
||||
CREATE TABLE IF NOT EXISTS video_noticias (
|
||||
id SERIAL PRIMARY KEY,
|
||||
video_id INTEGER REFERENCES video_generados(id) ON DELETE CASCADE,
|
||||
noticia_id VARCHAR(100) NOT NULL,
|
||||
traduccion_id INTEGER REFERENCES traducciones(id),
|
||||
orden INTEGER NOT NULL, -- Orden de aparición en el video
|
||||
timestamp_inicio FLOAT, -- Segundo donde comienza esta noticia
|
||||
timestamp_fin FLOAT, -- Segundo donde termina esta noticia
|
||||
created_at TIMESTAMP DEFAULT NOW()
|
||||
);
|
||||
|
||||
-- Índices para mejorar performance
|
||||
CREATE INDEX IF NOT EXISTS idx_parrillas_tipo ON video_parrillas(tipo_filtro);
|
||||
CREATE INDEX IF NOT EXISTS idx_parrillas_activo ON video_parrillas(activo);
|
||||
CREATE INDEX IF NOT EXISTS idx_parrillas_proxima ON video_parrillas(proxima_generacion);
|
||||
CREATE INDEX IF NOT EXISTS idx_videos_parrilla ON video_generados(parrilla_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_videos_status ON video_generados(status);
|
||||
CREATE INDEX IF NOT EXISTS idx_videos_fecha ON video_generados(fecha_generacion DESC);
|
||||
|
||||
-- Comentarios para documentación
|
||||
COMMENT ON TABLE video_parrillas IS 'Configuraciones de parrillas de noticias para generar videos automáticos';
|
||||
COMMENT ON TABLE video_generados IS 'Videos generados a partir de parrillas de noticias';
|
||||
COMMENT ON TABLE video_noticias IS 'Relación entre videos y las noticias que contienen';
|
||||
49
init-db/34-add-search-vectors-es.sql
Normal file
49
init-db/34-add-search-vectors-es.sql
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
-- Add search_vector_es columns for full-text search in Spanish
|
||||
-- This migration adds missing columns referenced in search.py
|
||||
|
||||
-- Add search_vector_es to noticias table
|
||||
ALTER TABLE noticias ADD COLUMN IF NOT EXISTS search_vector_es tsvector;
|
||||
|
||||
-- Add search_vector_es to traducciones table
|
||||
ALTER TABLE traducciones ADD COLUMN IF NOT EXISTS search_vector_es tsvector;
|
||||
|
||||
-- Create function to update noticias search_vector_es
|
||||
CREATE OR REPLACE FUNCTION noticias_search_vector_es_trigger() RETURNS trigger AS $$
|
||||
BEGIN
|
||||
new.search_vector_es := setweight(to_tsvector('spanish', coalesce(new.titulo,'')), 'A') ||
|
||||
setweight(to_tsvector('spanish', coalesce(new.resumen,'')), 'B');
|
||||
return new;
|
||||
END
|
||||
$$ LANGUAGE plpgsql;
|
||||
|
||||
-- Create trigger for noticias
|
||||
DROP TRIGGER IF EXISTS search_vector_es_update_noticias ON noticias;
|
||||
CREATE TRIGGER search_vector_es_update_noticias
|
||||
BEFORE INSERT OR UPDATE ON noticias
|
||||
FOR EACH ROW EXECUTE PROCEDURE noticias_search_vector_es_trigger();
|
||||
|
||||
-- Create function to update traducciones search_vector_es
|
||||
CREATE OR REPLACE FUNCTION traducciones_search_vector_es_trigger() RETURNS trigger AS $$
|
||||
BEGIN
|
||||
new.search_vector_es := setweight(to_tsvector('spanish', coalesce(new.titulo_trad,'')), 'A') ||
|
||||
setweight(to_tsvector('spanish', coalesce(new.resumen_trad,'')), 'B');
|
||||
return new;
|
||||
END
|
||||
$$ LANGUAGE plpgsql;
|
||||
|
||||
-- Create trigger for traducciones
|
||||
DROP TRIGGER IF EXISTS search_vector_es_update_traducciones ON traducciones;
|
||||
CREATE TRIGGER search_vector_es_update_traducciones
|
||||
BEFORE INSERT OR UPDATE ON traducciones
|
||||
FOR EACH ROW EXECUTE PROCEDURE traducciones_search_vector_es_trigger();
|
||||
|
||||
-- Create GIN indexes for fast full-text search
|
||||
CREATE INDEX IF NOT EXISTS noticias_search_vector_es_idx ON noticias USING gin(search_vector_es);
|
||||
CREATE INDEX IF NOT EXISTS traducciones_search_vector_es_idx ON traducciones USING gin(search_vector_es);
|
||||
|
||||
-- Update existing data
|
||||
UPDATE noticias SET search_vector_es = to_tsvector('spanish', coalesce(titulo,'') || ' ' || coalesce(resumen,'')) WHERE search_vector_es IS NULL;
|
||||
UPDATE traducciones SET search_vector_es = to_tsvector('spanish', coalesce(titulo_trad,'') || ' ' || coalesce(resumen_trad,'')) WHERE search_vector_es IS NULL;
|
||||
|
||||
-- Add composite index for traducciones search optimization
|
||||
CREATE INDEX IF NOT EXISTS traducciones_search_composite_idx ON traducciones(lang_to, status) WHERE search_vector_es IS NOT NULL;
|
||||
235
init-db/99_stable_keys.sql
Normal file
235
init-db/99_stable_keys.sql
Normal file
|
|
@ -0,0 +1,235 @@
|
|||
-- 99_stable_keys.sql
|
||||
-- Claves estables para continentes, categorías y países + índices
|
||||
|
||||
-- ===== Continentes: code estable =====
|
||||
ALTER TABLE continentes
|
||||
ADD COLUMN IF NOT EXISTS code TEXT UNIQUE;
|
||||
|
||||
UPDATE continentes SET code = CASE nombre
|
||||
WHEN 'África' THEN 'AF'
|
||||
WHEN 'América' THEN 'AM'
|
||||
WHEN 'Asia' THEN 'AS'
|
||||
WHEN 'Europa' THEN 'EU'
|
||||
WHEN 'Oceanía' THEN 'OC'
|
||||
WHEN 'Antártida' THEN 'AN'
|
||||
END
|
||||
WHERE code IS NULL;
|
||||
|
||||
-- ===== Categorías: slug estable =====
|
||||
ALTER TABLE categorias
|
||||
ADD COLUMN IF NOT EXISTS slug TEXT UNIQUE;
|
||||
|
||||
UPDATE categorias
|
||||
SET slug = lower(regexp_replace(nombre, '\s+', '-', 'g'))
|
||||
WHERE slug IS NULL;
|
||||
|
||||
-- ===== Países: ISO2 / ISO3 =====
|
||||
ALTER TABLE paises
|
||||
ADD COLUMN IF NOT EXISTS iso2 CHAR(2) UNIQUE,
|
||||
ADD COLUMN IF NOT EXISTS iso3 CHAR(3) UNIQUE;
|
||||
|
||||
-- Mapeo ISO-3166 (alpha-2 / alpha-3) para TODOS los países de 04-paises.sql
|
||||
-- Europa/Asia/África/Américas/Oceanía (nombres en español tal como en tu seed)
|
||||
|
||||
UPDATE paises SET iso2='AF', iso3='AFG' WHERE nombre='Afganistán' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='AL', iso3='ALB' WHERE nombre='Albania' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='DE', iso3='DEU' WHERE nombre='Alemania' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='AD', iso3='AND' WHERE nombre='Andorra' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='AO', iso3='AGO' WHERE nombre='Angola' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='AG', iso3='ATG' WHERE nombre='Antigua y Barbuda' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='SA', iso3='SAU' WHERE nombre='Arabia Saudita' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='DZ', iso3='DZA' WHERE nombre='Argelia' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='AR', iso3='ARG' WHERE nombre='Argentina' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='AM', iso3='ARM' WHERE nombre='Armenia' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='AU', iso3='AUS' WHERE nombre='Australia' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='AT', iso3='AUT' WHERE nombre='Austria' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='AZ', iso3='AZE' WHERE nombre='Azerbaiyán' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='BS', iso3='BHS' WHERE nombre='Bahamas' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='BD', iso3='BGD' WHERE nombre='Bangladés' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='BB', iso3='BRB' WHERE nombre='Barbados' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='BH', iso3='BHR' WHERE nombre='Baréin' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='BE', iso3='BEL' WHERE nombre='Bélgica' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='BZ', iso3='BLZ' WHERE nombre='Belice' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='BJ', iso3='BEN' WHERE nombre='Benín' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='BY', iso3='BLR' WHERE nombre='Bielorrusia' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='MM', iso3='MMR' WHERE nombre='Birmania' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='BO', iso3='BOL' WHERE nombre='Bolivia' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='BA', iso3='BIH' WHERE nombre='Bosnia y Herzegovina' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='BW', iso3='BWA' WHERE nombre='Botsuana' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='BR', iso3='BRA' WHERE nombre='Brasil' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='BN', iso3='BRN' WHERE nombre='Brunéi' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='BG', iso3='BGR' WHERE nombre='Bulgaria' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='BF', iso3='BFA' WHERE nombre='Burkina Faso' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='BI', iso3='BDI' WHERE nombre='Burundi' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='BT', iso3='BTN' WHERE nombre='Bután' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='CV', iso3='CPV' WHERE nombre='Cabo Verde' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='KH', iso3='KHM' WHERE nombre='Camboya' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='CM', iso3='CMR' WHERE nombre='Camerún' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='CA', iso3='CAN' WHERE nombre='Canadá' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='QA', iso3='QAT' WHERE nombre='Catar' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='TD', iso3='TCD' WHERE nombre='Chad' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='CL', iso3='CHL' WHERE nombre='Chile' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='CN', iso3='CHN' WHERE nombre='China' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='CY', iso3='CYP' WHERE nombre='Chipre' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='CO', iso3='COL' WHERE nombre='Colombia' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='KM', iso3='COM' WHERE nombre='Comoras' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='KP', iso3='PRK' WHERE nombre='Corea del Norte' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='KR', iso3='KOR' WHERE nombre='Corea del Sur' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='CI', iso3='CIV' WHERE nombre='Costa de Marfil' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='CR', iso3='CRI' WHERE nombre='Costa Rica' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='HR', iso3='HRV' WHERE nombre='Croacia' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='CU', iso3='CUB' WHERE nombre='Cuba' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='DK', iso3='DNK' WHERE nombre='Dinamarca' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='DM', iso3='DMA' WHERE nombre='Dominica' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='EC', iso3='ECU' WHERE nombre='Ecuador' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='EG', iso3='EGY' WHERE nombre='Egipto' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='SV', iso3='SLV' WHERE nombre='El Salvador' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='AE', iso3='ARE' WHERE nombre='Emiratos Árabes Unidos' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='ER', iso3='ERI' WHERE nombre='Eritrea' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='SK', iso3='SVK' WHERE nombre='Eslovaquia' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='SI', iso3='SVN' WHERE nombre='Eslovenia' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='ES', iso3='ESP' WHERE nombre='España' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='US', iso3='USA' WHERE nombre='Estados Unidos' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='EE', iso3='EST' WHERE nombre='Estonia' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='SZ', iso3='SWZ' WHERE nombre='Esuatini' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='ET', iso3='ETH' WHERE nombre='Etiopía' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='PH', iso3='PHL' WHERE nombre='Filipinas' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='FI', iso3='FIN' WHERE nombre='Finlandia' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='FJ', iso3='FJI' WHERE nombre='Fiyi' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='FR', iso3='FRA' WHERE nombre='Francia' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='GA', iso3='GAB' WHERE nombre='Gabón' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='GM', iso3='GMB' WHERE nombre='Gambia' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='GE', iso3='GEO' WHERE nombre='Georgia' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='GH', iso3='GHA' WHERE nombre='Ghana' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='GD', iso3='GRD' WHERE nombre='Granada' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='GR', iso3='GRC' WHERE nombre='Grecia' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='GT', iso3='GTM' WHERE nombre='Guatemala' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='GN', iso3='GIN' WHERE nombre='Guinea' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='GW', iso3='GNB' WHERE nombre='Guinea-Bisáu' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='GQ', iso3='GNQ' WHERE nombre='Guinea Ecuatorial' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='GY', iso3='GUY' WHERE nombre='Guyana' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='HT', iso3='HTI' WHERE nombre='Haití' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='HN', iso3='HND' WHERE nombre='Honduras' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='HU', iso3='HUN' WHERE nombre='Hungría' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='IN', iso3='IND' WHERE nombre='India' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='ID', iso3='IDN' WHERE nombre='Indonesia' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='IQ', iso3='IRQ' WHERE nombre='Irak' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='IR', iso3='IRN' WHERE nombre='Irán' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='IE', iso3='IRL' WHERE nombre='Irlanda' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='IS', iso3='ISL' WHERE nombre='Islandia' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='MH', iso3='MHL' WHERE nombre='Islas Marshall' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='SB', iso3='SLB' WHERE nombre='Islas Salomón' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='IL', iso3='ISR' WHERE nombre='Israel' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='IT', iso3='ITA' WHERE nombre='Italia' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='JM', iso3='JAM' WHERE nombre='Jamaica' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='JP', iso3='JPN' WHERE nombre='Japón' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='JO', iso3='JOR' WHERE nombre='Jordania' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='KZ', iso3='KAZ' WHERE nombre='Kazajistán' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='KE', iso3='KEN' WHERE nombre='Kenia' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='KG', iso3='KGZ' WHERE nombre='Kirguistán' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='KI', iso3='KIR' WHERE nombre='Kiribati' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='KW', iso3='KWT' WHERE nombre='Kuwait' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='LA', iso3='LAO' WHERE nombre='Laos' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='LS', iso3='LSO' WHERE nombre='Lesoto' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='LV', iso3='LVA' WHERE nombre='Letonia' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='LB', iso3='LBN' WHERE nombre='Líbano' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='LR', iso3='LBR' WHERE nombre='Liberia' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='LY', iso3='LBY' WHERE nombre='Libia' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='LI', iso3='LIE' WHERE nombre='Liechtenstein' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='LT', iso3='LTU' WHERE nombre='Lituania' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='LU', iso3='LUX' WHERE nombre='Luxemburgo' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='MK', iso3='MKD' WHERE nombre='Macedonia del Norte' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='MG', iso3='MDG' WHERE nombre='Madagascar' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='MY', iso3='MYS' WHERE nombre='Malasia' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='MW', iso3='MWI' WHERE nombre='Malaui' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='MV', iso3='MDV' WHERE nombre='Maldivas' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='ML', iso3='MLI' WHERE nombre='Malí' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='MT', iso3='MLT' WHERE nombre='Malta' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='MA', iso3='MAR' WHERE nombre='Marruecos' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='MU', iso3='MUS' WHERE nombre='Mauricio' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='MR', iso3='MRT' WHERE nombre='Mauritania' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='MX', iso3='MEX' WHERE nombre='México' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='FM', iso3='FSM' WHERE nombre='Micronesia' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='MD', iso3='MDA' WHERE nombre='Moldavia' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='MC', iso3='MCO' WHERE nombre='Mónaco' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='MN', iso3='MNG' WHERE nombre='Mongolia' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='ME', iso3='MNE' WHERE nombre='Montenegro' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='MZ', iso3='MOZ' WHERE nombre='Mozambique' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='NA', iso3='NAM' WHERE nombre='Namibia' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='NR', iso3='NRU' WHERE nombre='Nauru' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='NP', iso3='NPL' WHERE nombre='Nepal' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='NI', iso3='NIC' WHERE nombre='Nicaragua' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='NE', iso3='NER' WHERE nombre='Níger' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='NG', iso3='NGA' WHERE nombre='Nigeria' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='NO', iso3='NOR' WHERE nombre='Noruega' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='NZ', iso3='NZL' WHERE nombre='Nueva Zelanda' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='OM', iso3='OMN' WHERE nombre='Omán' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='NL', iso3='NLD' WHERE nombre='Países Bajos' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='PK', iso3='PAK' WHERE nombre='Pakistán' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='PW', iso3='PLW' WHERE nombre='Palaos' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='PS', iso3='PSE' WHERE nombre='Palestina' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='PA', iso3='PAN' WHERE nombre='Panamá' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='PG', iso3='PNG' WHERE nombre='Papúa Nueva Guinea' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='PY', iso3='PRY' WHERE nombre='Paraguay' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='PE', iso3='PER' WHERE nombre='Perú' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='PL', iso3='POL' WHERE nombre='Polonia' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='PT', iso3='PRT' WHERE nombre='Portugal' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='GB', iso3='GBR' WHERE nombre='Reino Unido' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='CF', iso3='CAF' WHERE nombre='República Centroafricana' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='CZ', iso3='CZE' WHERE nombre='República Checa' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='CG', iso3='COG' WHERE nombre='República del Congo' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='CD', iso3='COD' WHERE nombre='República Democrática del Congo' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='DO', iso3='DOM' WHERE nombre='República Dominicana' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='RW', iso3='RWA' WHERE nombre='Ruanda' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='RO', iso3='ROU' WHERE nombre='Rumanía' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='RU', iso3='RUS' WHERE nombre='Rusia' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='WS', iso3='WSM' WHERE nombre='Samoa' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='KN', iso3='KNA' WHERE nombre='San Cristóbal y Nieves' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='SM', iso3='SMR' WHERE nombre='San Marino' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='VC', iso3='VCT' WHERE nombre='San Vicente y las Granadinas' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='LC', iso3='LCA' WHERE nombre='Santa Lucía' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='ST', iso3='STP' WHERE nombre='Santo Tomé y Príncipe' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='SN', iso3='SEN' WHERE nombre='Senegal' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='RS', iso3='SRB' WHERE nombre='Serbia' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='SC', iso3='SYC' WHERE nombre='Seychelles' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='SL', iso3='SLE' WHERE nombre='Sierra Leona' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='SG', iso3='SGP' WHERE nombre='Singapur' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='SY', iso3='SYR' WHERE nombre='Siria' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='SO', iso3='SOM' WHERE nombre='Somalia' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='LK', iso3='LKA' WHERE nombre='Sri Lanka' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='ZA', iso3='ZAF' WHERE nombre='Sudáfrica' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='SD', iso3='SDN' WHERE nombre='Sudán' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='SS', iso3='SSD' WHERE nombre='Sudán del Sur' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='SE', iso3='SWE' WHERE nombre='Suecia' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='CH', iso3='CHE' WHERE nombre='Suiza' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='SR', iso3='SUR' WHERE nombre='Surinam' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='TH', iso3='THA' WHERE nombre='Tailandia' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='TZ', iso3='TZA' WHERE nombre='Tanzania' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='TJ', iso3='TJK' WHERE nombre='Tayikistán' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='TL', iso3='TLS' WHERE nombre='Timor Oriental' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='TG', iso3='TGO' WHERE nombre='Togo' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='TO', iso3='TON' WHERE nombre='Tonga' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='TT', iso3='TTO' WHERE nombre='Trinidad y Tobago' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='TN', iso3='TUN' WHERE nombre='Túnez' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='TM', iso3='TKM' WHERE nombre='Turkmenistán' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='TR', iso3='TUR' WHERE nombre='Turquía' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='TV', iso3='TUV' WHERE nombre='Tuvalu' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='UA', iso3='UKR' WHERE nombre='Ucrania' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='UG', iso3='UGA' WHERE nombre='Uganda' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='UY', iso3='URY' WHERE nombre='Uruguay' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='UZ', iso3='UZB' WHERE nombre='Uzbekistán' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='VU', iso3='VUT' WHERE nombre='Vanuatu' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='VA', iso3='VAT' WHERE nombre='Vaticano' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='VE', iso3='VEN' WHERE nombre='Venezuela' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='VN', iso3='VNM' WHERE nombre='Vietnam' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='YE', iso3='YEM' WHERE nombre='Yemen' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='DJ', iso3='DJI' WHERE nombre='Yibuti' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='ZM', iso3='ZMB' WHERE nombre='Zambia' AND iso2 IS NULL;
|
||||
UPDATE paises SET iso2='ZW', iso3='ZWE' WHERE nombre='Zimbabue' AND iso2 IS NULL;
|
||||
|
||||
-- ===== Índices útiles =====
|
||||
CREATE INDEX IF NOT EXISTS idx_continentes_code ON continentes(code);
|
||||
CREATE INDEX IF NOT EXISTS idx_categorias_slug ON categorias(slug);
|
||||
CREATE INDEX IF NOT EXISTS idx_paises_iso2 ON paises(iso2);
|
||||
CREATE INDEX IF NOT EXISTS idx_paises_iso3 ON paises(iso3);
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue