feat: session_create, session_validate, session_cleanup
Fase 3 del issue 0010 — sesiones SQLite como alternativa a JWT. - Tabla sessions creada con CREATE TABLE IF NOT EXISTS (autosetup) - Tokens de 32 bytes aleatorios (crypto/rand) codificados en hex (256 bits) - Indices en user_id y expires_at - Prepared statements para evitar SQL injection - SessionCleanup para eliminar expiradas periodicamente
This commit is contained in:
@@ -0,0 +1,47 @@
|
||||
---
|
||||
name: session_cleanup
|
||||
kind: function
|
||||
lang: go
|
||||
domain: infra
|
||||
version: "1.0.0"
|
||||
purity: impure
|
||||
signature: "func SessionCleanup(db *sql.DB) (int64, error)"
|
||||
description: "Elimina todas las sesiones expiradas de la tabla sessions. Retorna el numero de filas eliminadas. Ejecutar periodicamente (cada N horas) para evitar acumulacion."
|
||||
tags: [session, auth, sqlite, cleanup, infra]
|
||||
uses_functions: []
|
||||
uses_types: []
|
||||
returns: []
|
||||
returns_optional: false
|
||||
error_type: error_go_core
|
||||
imports: [database/sql, fmt, time]
|
||||
params:
|
||||
- name: db
|
||||
desc: "conexion SQL abierta a la BD de la app"
|
||||
output: "numero de sesiones eliminadas en esta ejecucion"
|
||||
tested: true
|
||||
tests: ["elimina solo sesiones expiradas, mantiene las activas"]
|
||||
test_file_path: "functions/infra/session_test.go"
|
||||
file_path: "functions/infra/session_cleanup.go"
|
||||
---
|
||||
|
||||
## Ejemplo
|
||||
|
||||
```go
|
||||
// En un ticker background de la app
|
||||
go func() {
|
||||
ticker := time.NewTicker(1 * time.Hour)
|
||||
defer ticker.Stop()
|
||||
for range ticker.C {
|
||||
n, err := SessionCleanup(db)
|
||||
if err != nil {
|
||||
log.Printf("cleanup error: %v", err)
|
||||
continue
|
||||
}
|
||||
log.Printf("sesiones expiradas eliminadas: %d", n)
|
||||
}
|
||||
}()
|
||||
```
|
||||
|
||||
## Notas
|
||||
|
||||
Impura — DELETE en SQLite, lee `time.Now()`. DELETE con prepared statement evita SQL injection. Es seguro ejecutar en paralelo con SessionCreate/SessionValidate (SQLite tiene locking por default en WAL mode). Ejecutar cada 1h es suficiente para la mayoria de apps; si la tabla crece mucho considerar tambien un DELETE parcial con LIMIT.
|
||||
Reference in New Issue
Block a user