Saltar al contenido principal

Profile Management

CampoValor
Handleradmin/handlers/profile.go
Ruta base/admin/profile
Modelouser_profiles, user_sessions
EstadoImplementado

Descripción

El módulo de perfil permite a los usuarios administradores gestionar su información personal, avatar, cambio de contraseña, y revisar sesiones activas. Incluye middleware de sesión que actualiza last_seen en cada request.


Endpoints

MétodoRutaAcción
GET/admin/profileVer perfil
PUT/admin/profileActualizar perfil
POST/admin/profile/avatarSubir avatar
DELETE/admin/profile/avatarEliminar avatar
PUT/admin/profile/passwordCambiar contraseña
GET/admin/profile/sessionsListar sesiones activas
DELETE/admin/profile/sessions/:idRevocar sesión

Campos

UserProfile

CampoTipoDescripción
idUUIDIdentificador único
user_idUUIDUsuario asociado
namestringNombre completo
emailstringEmail (read-only, viene de auth)
avatar_urlstringURL del avatar
phonestringTeléfono
timezonestringZona horaria
languagestringIdioma preferido
created_attimestampFecha de creación
updated_attimestampÚltima actualización

UserSession

CampoTipoDescripción
idUUIDIdentificador único
user_idUUIDUsuario propietario
token_hashstringSHA-256 del JWT
devicestringDispositivo detectado
ipstringDirección IP
last_seentimestampÚltimo request
expires_attimestampExpiración del token
created_attimestampInicio de sesión

Middleware de Sesión

El SessionMiddleware() se ejecuta en cada request autenticado:

func (h *ProfileHandler) SessionMiddleware() gin.HandlerFunc {
// 1. Extraer user_id del JWT
// 2. Calcular SHA-256 del token
// 3. Detectar dispositivo del User-Agent
// 4. Upsert session (actualiza last_seen)
// 5. Cargar avatar_url en contexto
}

Avatar

  • Se almacena en ObjectStorage (S3/GCS)
  • Se sirve a través de /admin/media/proxy/{key}
  • El avatar_url se setea en el contexto para el header
  • Se soportan formatos: JPG, PNG, WebP
  • Tamaño máximo: 2MB

Notas

  • El email es read-only (viene de la autenticación)
  • Las sesiones se auto-actualizan con last_seen en cada request
  • Revocar una sesión invalida el JWT (por token_hash)
  • El middleware parsea el User-Agent para mostrar dispositivo legible
  • La zona horaria y idioma se usan para formatear fechas en la UI