trading-platform-database-v2/ddl/schemas/audit/tables/05-api_request_logs.sql
rckrdmrd 45e77e9a9c feat: Initial commit - Database schemas and scripts
DDL schemas for Trading Platform:
- User management
- Authentication
- Payments
- Education
- ML predictions
- Trading data

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-18 04:30:23 -06:00

50 lines
1.9 KiB
SQL

-- ============================================================================
-- AUDIT SCHEMA - Tabla: api_request_logs
-- ============================================================================
-- Log de requests a la API (para debugging y análisis)
-- ============================================================================
CREATE TABLE IF NOT EXISTS audit.api_request_logs (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
-- Request
request_id UUID NOT NULL,
method VARCHAR(10) NOT NULL,
path VARCHAR(500) NOT NULL,
query_params JSONB,
headers JSONB,
body_size INTEGER,
-- Actor
user_id UUID REFERENCES auth.users(id) ON DELETE SET NULL,
api_key_id UUID,
ip_address INET NOT NULL,
user_agent TEXT,
-- Response
status_code INTEGER NOT NULL,
response_size INTEGER,
response_time_ms INTEGER NOT NULL,
-- Contexto
service_name VARCHAR(50),
version VARCHAR(20),
error_code VARCHAR(50),
error_message TEXT,
-- Timestamps
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
-- Índices optimizados para consultas de análisis
CREATE INDEX idx_api_logs_user ON audit.api_request_logs(user_id);
CREATE INDEX idx_api_logs_path ON audit.api_request_logs(path);
CREATE INDEX idx_api_logs_status ON audit.api_request_logs(status_code);
CREATE INDEX idx_api_logs_created ON audit.api_request_logs(created_at DESC);
CREATE INDEX idx_api_logs_ip ON audit.api_request_logs(ip_address);
CREATE INDEX idx_api_logs_slow ON audit.api_request_logs(response_time_ms) WHERE response_time_ms > 1000;
CREATE INDEX idx_api_logs_errors ON audit.api_request_logs(status_code) WHERE status_code >= 400;
COMMENT ON TABLE audit.api_request_logs IS 'Log de requests HTTP para análisis y debugging';
COMMENT ON COLUMN audit.api_request_logs.body_size IS 'Tamaño del body en bytes (no se guarda contenido por seguridad)';