You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			53 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Markdown
		
	
			
		
		
	
	
			53 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Markdown
		
	
| # 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.
 |