Saltar al contenido principal

RF69: Usuario canjea recompensa

Descripción

Como usuario autenticado, quiero canjear una recompensa disponible para obtener su beneficio (p. ej. descuento en la suscripción, contenido premium, insignia).

El canje valida que la recompensa esté disponible, no expirada y pertenezca al usuario; al canjearla cambia su estado a redeemed y aplica el beneficio. Es idempotente para evitar doble canje.

CampoValor
MóduloRewards Module
ActorUsuario autenticado
EndpointPOST /rewards/:id/redeem
PrecondicionesSesión activa; la recompensa está disponible y pertenece al usuario
PrioridadBaja (post-MVP)
EtapaMBI 2
Requisitos relacionadosRF67, RF68, RF33

Reglas de negocio

  • RN-69.1 — Solo el dueño (user_id del JWT) puede canjear su recompensa.
  • RN-69.2 — Solo se puede canjear una recompensa en estado available y no expirada.
  • RN-69.3 — El canje es idempotente/transaccional: una recompensa no se canjea dos veces (control de concurrencia).
  • RN-69.4 — Si el beneficio es un descuento de suscripción, se aplica vía Stripe (cupón/crédito) de forma consistente.
  • RN-69.5 — El canje se registra para auditoría.

Validaciones de entrada

CampoReglasMensaje de error
idObligatorio. Recompensa del usuario, available y vigente."Recompensa no disponible." (404/409)
AuthorizationBearer válido."Sesión no válida." (401)

Criterios de aceptación

Escenario 1: Canje exitoso

Dado que tengo una recompensa disponible y vigente, Cuando la canjeo, Entonces el sistema la marca como redeemed, Y aplica el beneficio correspondiente, Y responde 200 OK, Y registra el canje.

Escenario 2: Recompensa ya canjeada (idempotencia)

Dado que la recompensa ya fue canjeada, Cuando intento canjearla de nuevo, Entonces el sistema responde 409 Conflict sin aplicar el beneficio otra vez.

Escenario 3: Recompensa expirada

Dado que la recompensa venció, Cuando intento canjearla, Entonces el sistema responde 409 con "Esta recompensa ya expiró".

Escenario 4: Recompensa ajena o inexistente (seguridad)

Dado que envío el id de una recompensa que no es mía o no existe, Cuando intento canjearla, Entonces el sistema responde 404 Not Found.

Escenario 5: Doble canje concurrente (consistencia)

Dado que envío dos solicitudes de canje simultáneas para la misma recompensa, Cuando el backend las procesa, Entonces solo una tiene éxito; la otra recibe 409 (control de concurrencia).

Criterios no funcionales

  • Operación transaccional con control de concurrencia; respuesta < 1 s.
  • Auditoría del canje; comunicación TLS 1.2+.

Diagrama de secuencia