57 lines
1.9 KiB
PL/PgSQL
57 lines
1.9 KiB
PL/PgSQL
-- migrate:up
|
|
|
|
-- Tabla para manejar conversaciones que requieren intervención humana
|
|
CREATE TABLE human_takeovers (
|
|
id SERIAL PRIMARY KEY,
|
|
tenant_id UUID NOT NULL REFERENCES tenants(id) ON DELETE CASCADE,
|
|
chat_id TEXT NOT NULL,
|
|
|
|
-- Info del takeover
|
|
pending_query TEXT NOT NULL, -- La query/producto que no se encontró
|
|
reason TEXT NOT NULL DEFAULT 'product_not_found', -- Razón del takeover
|
|
context_snapshot JSONB, -- Snapshot del contexto al momento del takeover
|
|
|
|
-- Estado
|
|
status TEXT NOT NULL DEFAULT 'pending', -- 'pending', 'responded', 'cancelled'
|
|
|
|
-- Respuesta del humano
|
|
human_response TEXT, -- Texto de la respuesta
|
|
responded_at TIMESTAMPTZ,
|
|
responded_by TEXT, -- Email/ID del usuario que respondió
|
|
|
|
-- Metadatos
|
|
created_at TIMESTAMPTZ DEFAULT NOW(),
|
|
updated_at TIMESTAMPTZ DEFAULT NOW(),
|
|
|
|
-- Índices
|
|
CONSTRAINT valid_status CHECK (status IN ('pending', 'responded', 'cancelled'))
|
|
);
|
|
|
|
-- Índice para buscar takeovers pendientes por tenant
|
|
CREATE INDEX idx_takeovers_pending ON human_takeovers(tenant_id, status, created_at DESC)
|
|
WHERE status = 'pending';
|
|
|
|
-- Índice para buscar por chat_id
|
|
CREATE INDEX idx_takeovers_chat ON human_takeovers(tenant_id, chat_id, created_at DESC);
|
|
|
|
-- Función para actualizar updated_at
|
|
CREATE OR REPLACE FUNCTION update_takeover_timestamp()
|
|
RETURNS TRIGGER AS $$
|
|
BEGIN
|
|
NEW.updated_at := NOW();
|
|
RETURN NEW;
|
|
END;
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
CREATE TRIGGER takeover_updated_trigger
|
|
BEFORE UPDATE ON human_takeovers
|
|
FOR EACH ROW EXECUTE FUNCTION update_takeover_timestamp();
|
|
|
|
-- migrate:down
|
|
|
|
DROP TRIGGER IF EXISTS takeover_updated_trigger ON human_takeovers;
|
|
DROP FUNCTION IF EXISTS update_takeover_timestamp();
|
|
DROP INDEX IF EXISTS idx_takeovers_chat;
|
|
DROP INDEX IF EXISTS idx_takeovers_pending;
|
|
DROP TABLE IF EXISTS human_takeovers;
|