codigo0/database/migrations/002_create_functions.sql

168 lines
4.9 KiB
PL/PgSQL

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