trading-platform-database-v2/ddl/schemas/users/tables/003_user_settings.sql
rckrdmrd b86dfa2e06 [DDL] feat: Sprint 1 - Add 12 tables for users, admin, notifications, market_data
## New Tables Created (Sprint 1 - DDL Roadmap Q1-2026)

### users schema (4 tables):
- profiles: Extended user profile information
- user_settings: User preferences and configurations
- kyc_verifications: KYC/AML verification records
- risk_profiles: Trading risk assessment profiles

### admin schema (3 tables):
- admin_roles: Platform administrative roles
- platform_analytics: Aggregated platform metrics
- api_keys: Programmatic API access keys

### notifications schema (1 table):
- notifications: Multi-channel notification system

### market_data schema (4 tables):
- tickers: Financial instruments catalog
- ohlcv_5m: 5-minute OHLCV price data
- technical_indicators: Pre-calculated TA indicators
- ohlcv_5m_staging: Staging table for data ingestion

## Features:
- Multi-tenancy with RLS policies
- Comprehensive indexes for query optimization
- Triggers for computed fields and timestamps
- Helper functions for common operations
- Views for dashboard and reporting
- Full GRANTS configuration

Roadmap: orchestration/planes/ROADMAP-IMPLEMENTACION-DDL-2026-Q1.md

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-16 19:41:53 -06:00

142 lines
4.5 KiB
SQL

-- ============================================================================
-- SCHEMA: users
-- TABLE: user_settings
-- DESCRIPTION: Configuraciones y preferencias de usuario
-- VERSION: 1.0.0
-- CREATED: 2026-01-16
-- SPRINT: Sprint 1 - DDL Implementation Roadmap Q1-2026
-- ============================================================================
-- Tabla de Configuraciones de Usuario
CREATE TABLE IF NOT EXISTS users.user_settings (
-- Identificadores
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID NOT NULL UNIQUE REFERENCES users.users(id) ON DELETE CASCADE,
tenant_id UUID NOT NULL REFERENCES tenants.tenants(id) ON DELETE CASCADE,
-- Configuraciones de UI
ui_settings JSONB NOT NULL DEFAULT '{
"theme": "dark",
"sidebar_collapsed": false,
"dashboard_layout": "default",
"charts_theme": "dark",
"compact_mode": false,
"animations_enabled": true
}'::JSONB,
-- Configuraciones de Trading
trading_settings JSONB NOT NULL DEFAULT '{
"default_leverage": 1,
"risk_per_trade_percent": 2,
"default_stop_loss_pips": 50,
"default_take_profit_pips": 100,
"confirmation_required": true,
"one_click_trading": false,
"sound_enabled": true
}'::JSONB,
-- Configuraciones de Notificaciones
notification_settings JSONB NOT NULL DEFAULT '{
"email": {
"enabled": true,
"signals": true,
"trades": true,
"account": true,
"marketing": false,
"digest": "daily"
},
"push": {
"enabled": true,
"signals": true,
"trades": true,
"price_alerts": true
},
"sms": {
"enabled": false,
"critical_only": true
}
}'::JSONB,
-- Configuraciones de Privacidad
privacy_settings JSONB NOT NULL DEFAULT '{
"profile_visibility": "private",
"show_in_leaderboard": false,
"share_performance": false,
"allow_follow": false
}'::JSONB,
-- Configuraciones de Seguridad
security_settings JSONB NOT NULL DEFAULT '{
"session_timeout_minutes": 30,
"remember_devices": true,
"login_notifications": true,
"suspicious_activity_alerts": true
}'::JSONB,
-- Configuraciones de Datos de Mercado
market_data_settings JSONB NOT NULL DEFAULT '{
"default_symbols": ["EURUSD", "GBPUSD", "XAUUSD"],
"default_timeframe": "H1",
"price_decimals": 5,
"volume_display": "lots"
}'::JSONB,
-- Preferencias de reportes
report_settings JSONB NOT NULL DEFAULT '{
"default_period": "monthly",
"include_closed_trades": true,
"currency_display": "USD"
}'::JSONB,
-- Metadata
metadata JSONB DEFAULT '{}'::JSONB,
-- Timestamps
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
COMMENT ON TABLE users.user_settings IS
'Configuraciones y preferencias personalizables del usuario';
COMMENT ON COLUMN users.user_settings.ui_settings IS
'Configuraciones de interfaz: tema, layouts, preferencias visuales';
COMMENT ON COLUMN users.user_settings.trading_settings IS
'Configuraciones de trading: leverage, risk, confirmaciones';
COMMENT ON COLUMN users.user_settings.notification_settings IS
'Preferencias de notificaciones por canal';
-- Indices
CREATE INDEX IF NOT EXISTS idx_user_settings_user_id
ON users.user_settings(user_id);
CREATE INDEX IF NOT EXISTS idx_user_settings_tenant_id
ON users.user_settings(tenant_id);
-- GIN index para busquedas en JSONB
CREATE INDEX IF NOT EXISTS idx_user_settings_ui_gin
ON users.user_settings USING GIN (ui_settings);
CREATE INDEX IF NOT EXISTS idx_user_settings_notif_gin
ON users.user_settings USING GIN (notification_settings);
-- Trigger para updated_at
DROP TRIGGER IF EXISTS user_settings_updated_at ON users.user_settings;
CREATE TRIGGER user_settings_updated_at
BEFORE UPDATE ON users.user_settings
FOR EACH ROW
EXECUTE FUNCTION users.update_user_timestamp();
-- RLS Policy para multi-tenancy
ALTER TABLE users.user_settings ENABLE ROW LEVEL SECURITY;
CREATE POLICY user_settings_tenant_isolation ON users.user_settings
FOR ALL
USING (tenant_id = current_setting('app.current_tenant_id', true)::UUID);
-- Grants
GRANT SELECT, INSERT, UPDATE ON users.user_settings TO trading_app;
GRANT SELECT ON users.user_settings TO trading_readonly;