workspace-v1/projects/gamilit/database/seeds/dev/audit_logging/01-audit-logs.sql
Adrian Flores Cortes 967ab360bb Initial commit: Workspace v1 with 3-layer architecture
Structure:
- control-plane/: Registries, SIMCO directives, CI/CD templates
- projects/: Gamilit, ERP-Suite, Trading-Platform, Betting-Analytics
- shared/: Libs catalog, knowledge-base

Key features:
- Centralized port, domain, database, and service registries
- 23 SIMCO directives + 6 fundamental principles
- NEXUS agent profiles with delegation rules
- Validation scripts for workspace integrity
- Dockerfiles for all services
- Path aliases for quick reference

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-23 00:35:19 -06:00

582 lines
16 KiB
SQL

-- =====================================================
-- GLIT Platform - Audit Logging Seeds
-- =====================================================
-- Schema: audit_logging
-- Description: Audit logs, system logs históricos demo
-- Dependencies: auth schema (users)
-- =====================================================
SET search_path TO audit_logging, auth, public;
DO $$
DECLARE
admin_id UUID;
instructor_id UUID;
student1_id UUID;
student2_id UUID;
student3_id UUID;
BEGIN
-- =====================================================
-- OBTENER USER IDs
-- =====================================================
SELECT id INTO admin_id FROM auth.users WHERE email = 'admin@glit.edu.mx';
SELECT id INTO instructor_id FROM auth.users WHERE email = 'instructor@demo.glit.edu.mx';
SELECT id INTO student1_id FROM auth.users WHERE email = 'estudiante1@demo.glit.edu.mx';
SELECT id INTO student2_id FROM auth.users WHERE email = 'estudiante2@demo.glit.edu.mx';
SELECT id INTO student3_id FROM auth.users WHERE email = 'estudiante3@demo.glit.edu.mx';
-- =====================================================
-- AUDIT LOGS: Logs de acciones importantes
-- =====================================================
INSERT INTO audit_logging.audit_logs (
actor_id, action, resource_type, resource_id,
changes, actor_ip, actor_user_agent,
severity, status,
additional_data, created_at
) VALUES
-- ============ ADMIN ACTIONS ============
-- Admin: Creación de system settings
(
admin_id,
'create',
'system_settings',
gen_random_uuid(),
'{
"before": null,
"after": {
"setting_key": "ml_coins_welcome_bonus",
"setting_value": "100"
}
}'::jsonb,
'192.168.1.100',
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/120.0.0.0',
'info',
'success',
'{
"category": "system_configuration",
"impact": "medium",
"automated": false,
"context": "Initial platform setup"
}'::jsonb,
NOW() - INTERVAL '15 days'
),
-- Admin: Actualización de feature flag
(
admin_id,
'update',
'feature_flags',
gen_random_uuid(),
'{
"before": {"is_enabled": false, "rollout_percentage": 0},
"after": {"is_enabled": true, "rollout_percentage": 100}
}'::jsonb,
'192.168.1.100',
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/120.0.0.0',
'info',
'success',
'{
"flag_name": "missions_system",
"impact": "high",
"reason": "Production rollout",
"approved_by": "admin@glit.edu.mx"
}'::jsonb,
NOW() - INTERVAL '14 days'
),
-- Admin: Creación de achievement
(
admin_id,
'create',
'achievements',
gen_random_uuid(),
'{
"before": null,
"after": {
"achievement_code": "reading_master",
"achievement_name": "Maestro Lector",
"ml_coins_reward": 500,
"xp_reward": 250
}
}'::jsonb,
'192.168.1.100',
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/120.0.0.0',
'info',
'success',
'{
"category": "gamification",
"impact": "medium",
"automated": false
}'::jsonb,
NOW() - INTERVAL '13 days'
),
-- Admin: Intento fallido de eliminar módulo (protegido)
(
admin_id,
'delete',
'modules',
gen_random_uuid(),
'{
"before": {"module_code": "MOD-01-LITERAL", "module_name": "Comprensión Literal"},
"after": null,
"error": "Cannot delete module with active exercises"
}'::jsonb,
'192.168.1.100',
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/120.0.0.0',
'warning',
'failure',
'{
"constraint_violated": "fk_exercises_module",
"active_exercises_count": 15,
"automated": false,
"error_code": "CONSTRAINT_VIOLATION"
}'::jsonb,
NOW() - INTERVAL '5 days'
),
-- Admin: Bulk user role update
(
admin_id,
'bulk_update',
'users',
NULL,
'{
"users_affected": 3,
"changes": {
"role": "student",
"is_active": true
}
}'::jsonb,
'192.168.1.100',
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/120.0.0.0',
'info',
'success',
'{
"operation": "activate_students",
"automated": false,
"execution_time_ms": 250
}'::jsonb,
NOW() - INTERVAL '10 days'
),
-- ============ INSTRUCTOR ACTIONS ============
-- Instructor: Creación de aula
(
instructor_id,
'create',
'classrooms',
gen_random_uuid(),
'{
"before": null,
"after": {
"classroom_name": "2° A - Comprensión Lectora",
"classroom_code": "2A-LECT-2025",
"grade_level": "2nd_grade",
"max_students": 30
}
}'::jsonb,
'10.0.2.50',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 Safari/605.1.15',
'info',
'success',
'{
"school": "SF-015-CDMX",
"automated": false,
"context": "New semester setup"
}'::jsonb,
NOW() - INTERVAL '12 days'
),
-- Instructor: Asignación de estudiante a aula
(
instructor_id,
'create',
'classroom_members',
gen_random_uuid(),
'{
"before": null,
"after": {
"classroom_code": "2A-LECT-2025",
"student_email": "estudiante1@demo.glit.edu.mx",
"role": "student",
"enrollment_date": "2025-10-21"
}
}'::jsonb,
'10.0.2.50',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 Safari/605.1.15',
'info',
'success',
'{
"enrollment_type": "manual",
"automated": false,
"classroom_size": 1
}'::jsonb,
NOW() - INTERVAL '11 days'
),
-- Instructor: Actualización de mission assignment
(
instructor_id,
'update',
'mission_assignments',
gen_random_uuid(),
'{
"before": {"due_date": "2025-11-10"},
"after": {"due_date": "2025-11-15"}
}'::jsonb,
'10.0.2.50',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 Safari/605.1.15',
'info',
'success',
'{
"mission_code": "MISSION-LITERAL-01",
"reason": "Student request for extension",
"automated": false
}'::jsonb,
NOW() - INTERVAL '3 days'
),
-- ============ STUDENT ACTIONS ============
-- Student1: Login exitoso
(
student1_id,
'login',
'auth_session',
gen_random_uuid(),
'{
"login_method": "email_password",
"mfa_used": false,
"session_created": true
}'::jsonb,
'192.168.1.45',
'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 Chrome/120.0.0.0',
'info',
'success',
'{
"session_duration_hours": 8,
"device_type": "desktop",
"browser": "Chrome",
"os": "Linux"
}'::jsonb,
NOW() - INTERVAL '1 hour'
),
-- Student1: Completó ejercicio (achievement unlock)
(
student1_id,
'achievement_unlocked',
'user_achievements',
gen_random_uuid(),
'{
"achievement": {
"achievement_code": "first_steps",
"achievement_name": "Primeros Pasos",
"tier": "bronze"
}
}'::jsonb,
'192.168.1.45',
'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 Chrome/120.0.0.0',
'info',
'success',
'{
"ml_coins_awarded": 50,
"xp_awarded": 25,
"automated": true,
"trigger": "exercise_completion_count"
}'::jsonb,
NOW() - INTERVAL '30 minutes'
),
-- Student2: Password reset request
(
student2_id,
'password_reset_request',
'auth_session',
gen_random_uuid(),
'{
"reset_token_sent": true,
"email_sent": true
}'::jsonb,
'192.168.1.67',
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/120.0.0.0',
'info',
'success',
'{
"reset_method": "email",
"token_expiry_hours": 24,
"automated": true
}'::jsonb,
NOW() - INTERVAL '8 hours'
),
-- Student3: Failed login attempt
(
student3_id,
'login',
'auth_session',
gen_random_uuid(),
'{
"login_method": "email_password",
"error": "Invalid credentials"
}'::jsonb,
'192.168.1.89',
'Mozilla/5.0 (iPhone; CPU iPhone OS 16_0 like Mac OS X) AppleWebKit/605.1.15 Mobile/15E148',
'warning',
'failure',
'{
"attempt_number": 2,
"max_attempts": 5,
"device_type": "mobile",
"automated": false
}'::jsonb,
NOW() - INTERVAL '2 hours'
),
-- ============ SYSTEM ACTIONS ============
-- System: Scheduled backup
(
NULL,
'backup',
'database',
NULL,
'{
"backup_type": "automated",
"size_mb": 450,
"duration_seconds": 45,
"status": "completed"
}'::jsonb,
'127.0.0.1',
'PostgreSQL Backup Scheduler v1.0',
'info',
'success',
'{
"backup_location": "/backups/glit_dev_2025-11-02.sql.gz",
"automated": true,
"retention_days": 30,
"compression": "gzip"
}'::jsonb,
NOW() - INTERVAL '6 hours'
),
-- System: Data cleanup job
(
NULL,
'cleanup',
'database',
NULL,
'{
"tables_cleaned": ["audit_logs", "system_logs"],
"records_deleted": 1500,
"retention_days": 90
}'::jsonb,
'127.0.0.1',
'GLIT Cleanup Service v1.0',
'info',
'success',
'{
"automated": true,
"execution_time_seconds": 12,
"freed_space_mb": 25
}'::jsonb,
NOW() - INTERVAL '12 hours'
)
ON CONFLICT DO NOTHING;
-- =====================================================
-- SYSTEM LOGS: Logs del sistema
-- =====================================================
INSERT INTO audit_logging.system_logs (
log_level, component, message,
error_code, stack_trace,
additional_data, created_at
) VALUES
-- ============ INFO LOGS ============
-- Info: Aplicación iniciada
(
'info',
'application',
'GLIT application started successfully',
NULL,
NULL,
'{
"version": "1.0.0",
"environment": "development",
"startup_time_ms": 1250,
"node_version": "v20.11.0",
"postgres_version": "15.5"
}'::jsonb,
NOW() - INTERVAL '1 day'
),
-- Debug: Database connection pool
(
'debug',
'database',
'Connection pool initialized',
NULL,
NULL,
'{
"pool_size": 20,
"min_connections": 5,
"max_connections": 50,
"idle_timeout_ms": 30000
}'::jsonb,
NOW() - INTERVAL '1 day' + INTERVAL '2 seconds'
),
-- Info: Cache initialized
(
'info',
'cache',
'Redis cache connected successfully',
NULL,
NULL,
'{
"redis_version": "7.2.0",
"connection_time_ms": 45,
"max_memory_mb": 256
}'::jsonb,
NOW() - INTERVAL '1 day' + INTERVAL '5 seconds'
),
-- Info: Scheduled job completed
(
'info',
'scheduler',
'Daily achievement recalculation completed',
NULL,
NULL,
'{
"users_processed": 5,
"achievements_updated": 12,
"duration_seconds": 3.5,
"next_run": "2025-11-03T00:00:00Z"
}'::jsonb,
NOW() - INTERVAL '2 hours'
),
-- ============ WARNING LOGS ============
-- Warning: Slow query detected
(
'warning',
'database',
'Slow query detected',
'SLOW_QUERY_001',
NULL,
'{
"query": "SELECT * FROM progress_tracking.exercise_attempts WHERE student_id = $1 ORDER BY attempted_at DESC",
"duration_ms": 2500,
"threshold_ms": 1000,
"optimization_suggested": true,
"suggested_index": "idx_exercise_attempts_student_attempted"
}'::jsonb,
NOW() - INTERVAL '12 hours'
),
-- Warning: Cache miss rate high
(
'warning',
'cache',
'High cache miss rate detected',
'CACHE_MISS_HIGH',
NULL,
'{
"miss_rate_percentage": 45,
"threshold_percentage": 30,
"total_requests": 10000,
"cache_hits": 5500,
"cache_misses": 4500
}'::jsonb,
NOW() - INTERVAL '4 hours'
),
-- ============ ERROR LOGS ============
-- Error: Failed to send email
(
'error',
'email_service',
'Failed to send welcome email',
'EMAIL_SEND_FAILURE',
'at EmailService.send (email.service.ts:45)\nat UserController.register (user.controller.ts:123)\nat Layer.handle (express/lib/router/layer.js:95)',
'{
"recipient": "test@example.com",
"error": "SMTP connection timeout",
"retry_count": 3,
"smtp_host": "smtp.example.com",
"smtp_port": 587
}'::jsonb,
NOW() - INTERVAL '6 hours'
),
-- Error: API rate limit exceeded
(
'error',
'api_server',
'Rate limit exceeded for endpoint',
'RATE_LIMIT_EXCEEDED',
NULL,
'{
"endpoint": "/api/exercises/search",
"client_ip": "203.0.113.42",
"requests_count": 150,
"limit": 100,
"window_seconds": 60,
"action_taken": "Request blocked"
}'::jsonb,
NOW() - INTERVAL '3 hours'
),
-- Error: Database connection failed
(
'error',
'database',
'Database connection attempt failed',
'DB_CONNECTION_FAILED',
'Error: connect ECONNREFUSED 127.0.0.1:5432\nat TCPConnectWrap.afterConnect (net.js:1144:16)',
'{
"host": "localhost",
"port": 5432,
"database": "glit_dev",
"retry_attempt": 1,
"max_retries": 5
}'::jsonb,
NOW() - INTERVAL '18 hours'
),
-- ============ DEBUG LOGS ============
-- Debug: API request details
(
'debug',
'api_server',
'API request received',
NULL,
NULL,
'{
"method": "GET",
"path": "/api/modules",
"query_params": {"grade_level": "2nd_grade"},
"actor_id": "' || student1_id || '",
"response_time_ms": 45,
"status_code": 200
}'::jsonb,
NOW() - INTERVAL '15 minutes'
)
ON CONFLICT DO NOTHING;
RAISE NOTICE 'Audit logging seeds completed successfully';
RAISE NOTICE '- % audit_logs inserted', (SELECT COUNT(*) FROM audit_logging.audit_logs);
RAISE NOTICE '- % system_logs inserted', (SELECT COUNT(*) FROM audit_logging.system_logs);
END $$;