-- ===================================================== -- Tabla: notifications -- Schema: notifications -- Descripción: Notificaciones enviadas a usuarios (in-app, email, push) -- Relacionado: EXT-003 (Notificaciones Multi-Canal) -- Fecha: 2025-11-11 -- ===================================================== CREATE TABLE notifications.notifications ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), -- Usuario destinatario user_id UUID NOT NULL REFERENCES auth.users(id) ON DELETE CASCADE, -- Tipo de notificación -- Valores: 'achievement', 'mission', 'assignment', 'social', 'system', 'gamification' type VARCHAR(50) NOT NULL, -- Contenido title VARCHAR(255) NOT NULL, message TEXT NOT NULL, -- Datos adicionales (contexto específico del tipo) data JSONB DEFAULT '{}'::jsonb, -- Prioridad de la notificación -- Valores: 'low', 'normal', 'high', 'urgent' priority VARCHAR(20) DEFAULT 'normal', -- Canales de envío (array) -- Valores: 'in_app', 'email', 'push' channels VARCHAR(50)[] DEFAULT ARRAY['in_app'], -- Estado de la notificación -- Valores: 'pending', 'sent', 'read', 'failed' status VARCHAR(20) DEFAULT 'pending', -- Timestamps read_at TIMESTAMP, sent_at TIMESTAMP, created_at TIMESTAMP DEFAULT gamilit.now_mexico(), expires_at TIMESTAMP, -- Metadata adicional metadata JSONB DEFAULT '{}'::jsonb, -- Constraints CONSTRAINT chk_notif_type CHECK (type IN ('achievement', 'mission', 'assignment', 'social', 'system', 'gamification')), CONSTRAINT chk_notif_priority CHECK (priority IN ('low', 'normal', 'high', 'urgent')), CONSTRAINT chk_notif_status CHECK (status IN ('pending', 'sent', 'read', 'failed')) ); -- Índices CREATE INDEX idx_notif_user_id ON notifications.notifications(user_id); CREATE INDEX idx_notif_status ON notifications.notifications(status); CREATE INDEX idx_notif_type ON notifications.notifications(type); CREATE INDEX idx_notif_created_at ON notifications.notifications(created_at DESC); CREATE INDEX idx_notif_priority ON notifications.notifications(priority); -- Índice compuesto para notificaciones no leídas por usuario CREATE INDEX idx_notif_user_unread ON notifications.notifications(user_id, status) WHERE status IN ('pending', 'sent'); -- Índice para expiración CREATE INDEX idx_notif_expires_at ON notifications.notifications(expires_at) WHERE expires_at IS NOT NULL; -- Comentarios COMMENT ON TABLE notifications.notifications IS 'Notificaciones enviadas a usuarios (in-app, email, push web)'; COMMENT ON COLUMN notifications.notifications.type IS 'Tipo de notificación: achievement, mission, assignment, social, system, gamification'; COMMENT ON COLUMN notifications.notifications.data IS 'Datos adicionales en formato JSON (IDs relacionados, payload específico)'; COMMENT ON COLUMN notifications.notifications.channels IS 'Array de canales por los que se envió: in_app, email, push'; COMMENT ON COLUMN notifications.notifications.status IS 'Estado: pending, sent, read, failed'; COMMENT ON COLUMN notifications.notifications.expires_at IS 'Fecha de expiración (opcional, para notificaciones temporales)';