168 lines
4.9 KiB
PL/PgSQL
Executable file
168 lines
4.9 KiB
PL/PgSQL
Executable file
-- =====================================================
|
|
-- EMERGES TES - Funciones y Triggers
|
|
-- FASE 1: Infraestructura Base
|
|
-- =====================================================
|
|
--
|
|
-- Funciones auxiliares y triggers para automatizar
|
|
-- tareas comunes del sistema.
|
|
-- =====================================================
|
|
|
|
-- =====================================================
|
|
-- FUNCIÓN: Actualizar updated_at automáticamente
|
|
-- =====================================================
|
|
CREATE OR REPLACE FUNCTION emerges_content.update_updated_at_column()
|
|
RETURNS TRIGGER AS $$
|
|
BEGIN
|
|
NEW.updated_at = NOW();
|
|
RETURN NEW;
|
|
END;
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
-- Trigger para content_items
|
|
DROP TRIGGER IF EXISTS trg_content_items_updated_at ON emerges_content.content_items;
|
|
CREATE TRIGGER trg_content_items_updated_at
|
|
BEFORE UPDATE ON emerges_content.content_items
|
|
FOR EACH ROW
|
|
EXECUTE FUNCTION emerges_content.update_updated_at_column();
|
|
|
|
-- Trigger para content_relations
|
|
DROP TRIGGER IF EXISTS trg_content_relations_updated_at ON emerges_content.content_relations;
|
|
CREATE TRIGGER trg_content_relations_updated_at
|
|
BEFORE UPDATE ON emerges_content.content_relations
|
|
FOR EACH ROW
|
|
EXECUTE FUNCTION emerges_content.update_updated_at_column();
|
|
|
|
-- Trigger para users
|
|
DROP TRIGGER IF EXISTS trg_users_updated_at ON emerges_content.users;
|
|
CREATE TRIGGER trg_users_updated_at
|
|
BEFORE UPDATE ON emerges_content.users
|
|
FOR EACH ROW
|
|
EXECUTE FUNCTION emerges_content.update_updated_at_column();
|
|
|
|
-- =====================================================
|
|
-- FUNCIÓN: Crear snapshot de versión al actualizar
|
|
-- =====================================================
|
|
CREATE OR REPLACE FUNCTION emerges_content.create_version_snapshot()
|
|
RETURNS TRIGGER AS $$
|
|
BEGIN
|
|
-- Si la versión cambió, crear snapshot
|
|
IF NEW.version > OLD.version THEN
|
|
INSERT INTO emerges_content.content_versions (
|
|
content_id,
|
|
version,
|
|
content,
|
|
content_markdown,
|
|
title,
|
|
status,
|
|
validated_by,
|
|
validated_at,
|
|
clinical_source,
|
|
created_by
|
|
) VALUES (
|
|
NEW.id,
|
|
OLD.version, -- Versión anterior
|
|
OLD.content,
|
|
OLD.content_markdown,
|
|
OLD.title,
|
|
OLD.status,
|
|
OLD.validated_by,
|
|
OLD.validated_at,
|
|
OLD.clinical_source,
|
|
NEW.updated_by
|
|
);
|
|
|
|
-- Actualizar latest_version
|
|
NEW.latest_version = NEW.version;
|
|
END IF;
|
|
|
|
RETURN NEW;
|
|
END;
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
-- Trigger para content_items
|
|
DROP TRIGGER IF EXISTS trg_content_items_version_snapshot ON emerges_content.content_items;
|
|
CREATE TRIGGER trg_content_items_version_snapshot
|
|
BEFORE UPDATE ON emerges_content.content_items
|
|
FOR EACH ROW
|
|
WHEN (NEW.version > OLD.version)
|
|
EXECUTE FUNCTION emerges_content.create_version_snapshot();
|
|
|
|
-- =====================================================
|
|
-- FUNCIÓN: Obtener contenido validado por tipo
|
|
-- =====================================================
|
|
CREATE OR REPLACE FUNCTION emerges_content.get_validated_content(
|
|
p_type VARCHAR DEFAULT NULL,
|
|
p_level VARCHAR DEFAULT NULL,
|
|
p_category VARCHAR DEFAULT NULL
|
|
)
|
|
RETURNS TABLE (
|
|
id VARCHAR,
|
|
type VARCHAR,
|
|
level VARCHAR,
|
|
title VARCHAR,
|
|
short_title VARCHAR,
|
|
content JSONB,
|
|
content_markdown TEXT,
|
|
category VARCHAR,
|
|
subcategory VARCHAR,
|
|
priority VARCHAR,
|
|
age_group VARCHAR,
|
|
version INTEGER,
|
|
validated_at TIMESTAMP WITH TIME ZONE,
|
|
clinical_source VARCHAR,
|
|
updated_at TIMESTAMP WITH TIME ZONE
|
|
) AS $$
|
|
BEGIN
|
|
RETURN QUERY
|
|
SELECT
|
|
ci.id,
|
|
ci.type,
|
|
ci.level,
|
|
ci.title,
|
|
ci.short_title,
|
|
ci.content,
|
|
ci.content_markdown,
|
|
ci.category,
|
|
ci.subcategory,
|
|
ci.priority,
|
|
ci.age_group,
|
|
ci.version,
|
|
ci.validated_at,
|
|
ci.clinical_source,
|
|
ci.updated_at
|
|
FROM emerges_content.content_items ci
|
|
WHERE ci.status = 'validated'
|
|
AND (p_type IS NULL OR ci.type = p_type)
|
|
AND (p_level IS NULL OR ci.level = p_level)
|
|
AND (p_category IS NULL OR ci.category = p_category)
|
|
ORDER BY ci.updated_at DESC;
|
|
END;
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
-- =====================================================
|
|
-- FUNCIÓN: Verificar actualizaciones disponibles
|
|
-- =====================================================
|
|
CREATE OR REPLACE FUNCTION emerges_content.check_updates(
|
|
p_last_sync TIMESTAMP WITH TIME ZONE
|
|
)
|
|
RETURNS TABLE (
|
|
content_id VARCHAR,
|
|
type VARCHAR,
|
|
version INTEGER,
|
|
updated_at TIMESTAMP WITH TIME ZONE
|
|
) AS $$
|
|
BEGIN
|
|
RETURN QUERY
|
|
SELECT
|
|
ci.id,
|
|
ci.type,
|
|
ci.version,
|
|
ci.updated_at
|
|
FROM emerges_content.content_items ci
|
|
WHERE ci.status = 'validated'
|
|
AND ci.updated_at > p_last_sync
|
|
ORDER BY ci.updated_at DESC;
|
|
END;
|
|
$$ LANGUAGE plpgsql;
|
|
|