# Base de datos, PRAGMAs y migraciones PRAGMAs por defecto (src/db.ts) - busy_timeout = 5000 ms - journal_mode = WAL (si no es soportado, SQLite ajusta) - synchronous = NORMAL - wal_autocheckpoint = 1000 - foreign_keys = ON Formato de timestamps - Persistencia como 'YYYY-MM-DD HH:MM:SS[.mmm]'. - Uso de strftime('%Y-%m-%d %H:%M:%f', 'now') en inserciones/updates. Esquema funcional (resumen) - users - user_id (PK), created_at, updated_at. - user_aliases - alias (PK), user_id (FK → users), source, created_at, updated_at. - groups - id (PK, JID), name, active (boolean), last_verified (timestamp). - allowed_groups - group_id (PK, JID), label (TEXT | null), status ('pending'|'allowed'|'blocked'), discovered_at, updated_at, discovered_by (TEXT | null). - group_members - group_id (FK → groups), user_id (FK → users), is_admin (boolean), is_active (boolean), first_seen_at, last_seen_at, last_role_change_at. - user_preferences - user_id (FK → users), reminder_freq ('daily'|'weekly'|'weekdays'|'off'), reminder_time ('HH:MM' | null), last_reminded_on ('YYYY-MM-DD' | null), updated_at. - tasks - id (PK autoinc), description, due_date ('YYYY-MM-DD' | null), group_id (JID | null), created_by (user_id), created_at. - task_assignments - task_id (FK → tasks), user_id (FK → users), assigned_by (user_id), assigned_at. - response_queue - id (PK), recipient (user_id/JID), message (texto), metadata (JSON | null), status ('queued'|'processing'|'sent'|'failed'), attempts (int), next_attempt_at (timestamp | null), last_error (TEXT | null), last_status_code (INT | null), created_at (timestamp), updated_at (timestamp). Nota: El detalle exacto está en las migraciones (src/db/migrations). Usa tableHasColumn para detectar columnas en migraciones idempotentes. Migraciones - Política up-only con checksum estático por migración. - Migrator.migrateToLatest(instancia, opciones) se invoca en initializeDatabase() y en server.start(). - Tests utilizan Database(':memory:') y initializeDatabase(memdb) para asegurar el esquema. Integridad y rendimiento - foreign_keys = ON asegura relaciones consistentes. - WAL mejora concurrencia de lectura/escritura. - busy_timeout y synchronous=NORMAL balancean seguridad y rendimiento.