michangarrito/database/schemas/11-messaging.sql
rckrdmrd 48dea7a5d0 feat: Initial commit - michangarrito
Marketplace móvil para negocios locales mexicanos.

Estructura inicial:
- apps/backend (NestJS API)
- apps/frontend (React Web)
- apps/mobile (Expo/React Native)
- apps/mcp-server (Claude MCP Server)
- apps/whatsapp-service (WhatsApp Business API)
- database/ (PostgreSQL DDL)
- docs/ (Documentación)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-07 04:41:02 -06:00

89 lines
2.6 KiB
SQL

-- =============================================================================
-- MICHANGARRITO - 11 MESSAGING
-- =============================================================================
-- WhatsApp y notificaciones
-- =============================================================================
-- Conversaciones
CREATE TABLE IF NOT EXISTS messaging.conversations (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
tenant_id UUID REFERENCES public.tenants(id),
phone_number VARCHAR(20) NOT NULL,
contact_name VARCHAR(100),
conversation_type VARCHAR(20) NOT NULL,
status VARCHAR(20) DEFAULT 'active',
last_message_at TIMESTAMPTZ,
last_message_preview TEXT,
unread_count INTEGER DEFAULT 0,
wa_conversation_id VARCHAR(100),
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
CREATE INDEX idx_conversations_tenant ON messaging.conversations(tenant_id);
CREATE INDEX idx_conversations_phone ON messaging.conversations(phone_number);
CREATE TRIGGER update_conversations_updated_at
BEFORE UPDATE ON messaging.conversations
FOR EACH ROW EXECUTE FUNCTION update_updated_at();
-- Mensajes
CREATE TABLE IF NOT EXISTS messaging.messages (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
conversation_id UUID NOT NULL REFERENCES messaging.conversations(id) ON DELETE CASCADE,
direction VARCHAR(10) NOT NULL,
message_type VARCHAR(20) NOT NULL,
content TEXT,
media_url TEXT,
media_mime_type VARCHAR(50),
processed_by_llm BOOLEAN DEFAULT false,
llm_response_id UUID,
tokens_used INTEGER,
wa_message_id VARCHAR(100),
wa_status VARCHAR(20),
wa_timestamp TIMESTAMPTZ,
error_code VARCHAR(20),
error_message TEXT,
created_at TIMESTAMPTZ DEFAULT NOW()
);
CREATE INDEX idx_messages_conversation ON messaging.messages(conversation_id);
CREATE INDEX idx_messages_wa ON messaging.messages(wa_message_id);
-- Notificaciones
CREATE TABLE IF NOT EXISTS messaging.notifications (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
tenant_id UUID NOT NULL REFERENCES public.tenants(id) ON DELETE CASCADE,
user_id UUID REFERENCES auth.users(id),
notification_type VARCHAR(50) NOT NULL,
channels TEXT[] NOT NULL,
title VARCHAR(100) NOT NULL,
body TEXT NOT NULL,
data JSONB,
push_sent BOOLEAN DEFAULT false,
push_sent_at TIMESTAMPTZ,
whatsapp_sent BOOLEAN DEFAULT false,
whatsapp_sent_at TIMESTAMPTZ,
read_at TIMESTAMPTZ,
created_at TIMESTAMPTZ DEFAULT NOW()
);
CREATE INDEX idx_notifications_tenant ON messaging.notifications(tenant_id);
CREATE INDEX idx_notifications_user ON messaging.notifications(user_id);