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>
582 lines
16 KiB
SQL
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 $$;
|