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,24 @@
|
||||
package infra
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
"fmt"
|
||||
"time"
|
||||
)
|
||||
|
||||
// SessionCleanup elimina todas las sesiones con expires_at < ahora.
|
||||
// Retorna el numero de filas eliminadas.
|
||||
func SessionCleanup(db *sql.DB) (int64, error) {
|
||||
if db == nil {
|
||||
return 0, fmt.Errorf("session_cleanup: db nil")
|
||||
}
|
||||
res, err := db.Exec("DELETE FROM sessions WHERE expires_at < ?", time.Now().Unix())
|
||||
if err != nil {
|
||||
return 0, fmt.Errorf("session_cleanup: delete: %w", err)
|
||||
}
|
||||
n, err := res.RowsAffected()
|
||||
if err != nil {
|
||||
return 0, fmt.Errorf("session_cleanup: rows_affected: %w", err)
|
||||
}
|
||||
return n, nil
|
||||
}
|
||||
Reference in New Issue
Block a user