Scan de placa QR → perfil público + push con cooldown
Objetivo
Quien encuentra una mascota escanea el QR de la placa y ve info de contacto — sin necesitar login — mientras el dueño recibe un aviso, sin que escaneos repetidos lo saturen de notificaciones.
Cómo empieza
GET público en petid-landing a la página del código de la placa (sin JWT).
Pasos principales
- La página llama a
GetPublicPetProfileUseCase.execute(publicCode)enpetid-api(sin autenticación, ruta pública). - Busca el
PetTagporpublicCode, luego la mascota, el owner, suProfile,SettingsyTenant— todo en paralelo. - Arma el perfil:
emailsolo sisettings.showEmail,phonesolo sisettings.showPhone(toggles de “mascota perdida” en Settings del owner). - Si hay owner y
tag.canNotify(now)es true → marcalastNotifiedAt = nowy emitePetTagScannedEvent(push al owner).
Reglas de negocio
- Cooldown de 10 minutos (
NOTIFY_COOLDOWN_MS,pet-tag.entity.ts):canNotify()comparanow - lastNotifiedAt. SinlastNotifiedAt(primer scan) siempre notifica. El perfil se sigue mostrando en cada scan — lo que se throttlea es solo el push, no la visibilidad del perfil. - La visibilidad de contacto es por-mascota-vía-owner, no por-tag: es el
Settingsdel dueño, no algo configurable por placa individual.
Interacciones
petid-landing → petid-api (GetPublicPetProfileUseCase) → evento → petid-api/notification-api → push a petid-client.
Dónde seguir mirando
petid-api/src/domain/pet-tags/pet-tag.entity.ts(canNotify)petid-api/src/application/pet-tags/get-public-pet-profile.use-case.ts- Settings toggles:
petid-clientsettings.tsxsección “Mascota perdida” (showEmail/showPhone)
Casos especiales
- El endpoint es público — no hay guard, cualquiera con el código puede consultarlo. La única protección de datos sensibles es el toggle de visibilidad, no autenticación.
- Un scan mientras el cooldown está activo sigue devolviendo el perfil normalmente — el usuario que escaneó nunca sabe si se avisó o no al dueño.