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>
89 lines
2.6 KiB
SQL
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);
|