# PRD — Usuários, senha e sessão | Campo | Valor | |-------|--------| | **Produto** | Pizza Digital | | **Versão app auditada** | v0.5.0 | | **Ambiente** | https://pizza.itecnologys.com · VM125 · loja `pizza-digital-piloto` | | **Spec de origem** | `docs/SPEC-USUARIOS.md` | | **Módulo** | Auth + equipe | | **Rotas UI** | `/login` `/admin/equipe` `/forgot-password` `/reset-password` | | **APIs** | `/api/auth/*` `/api/users/*` | | **Data** | 2026-11-09 | | **Estilo** | PRD operacional detalhado (visão de desenvolvedor) | | **Audiência** | Dev / QA / Product | > Como ler: cada seção descreve o **processo real** (o que o sistema faz hoje), > com passos de usuário, chamadas de API, regras de negócio e estados. > Status: ✅ construído · ⚠️ parcial · ⏳ especificado / não entregue · 🐛 gap observado. ## 1. Entidades `User`, `AuthToken`, `PushDevice`, `NotifyLog`, `UserCapability` ## 2. Processo — login 1. UI `/login` (demo: `pdv@pizza.local` / `805353` + storeSlug) 2. `POST /api/auth/login` { email, password, storeSlug } 3. Valida hash bcrypt; incrementa `failedLoginAttempts` 4. 5 falhas → `lockedUntil` +15 min 5. Sucesso → JWT + user + capabilities 6. `GET /api/auth/me` para refresh de sessão ## 3. Processo — política de senha 1. `GET /api/auth/password-policy` 2. Regras: ≥8, 1 upper, 1 lower, 1 dígito, sem local-part email 3. Código: `password-policy.ts` ## 4. Processo — CRUD equipe 1. Cap `staff.view` lista `GET /api/users` 2. Cap `staff.manage` cria `POST /api/users` (role, áreas, jobTitle) 3. Criar gestor extra exige `owners.manage` 4. Pode aplicar template na criação 5. `POST /api/users/:id/send-reset` dispara token reset ## 5. Processo — forgot / reset 1. `POST /api/auth/forgot-password` → resposta genérica 2. Token `password_reset` TTL 60 min 3. `POST /api/auth/reset-password` consome token, limpa lockout 4. `POST /api/auth/change-password` (autenticado) ## 6. Aceite - ✅ Login/lockout/policy/CRUD/reset stub - ⏳ SMTP/push produção (RF-USR-10) ## 7. Camada de serviço (AuthService) | Método | Fluxo | |--------|-------| | `login` | storeSlug+email+senha → JWT; lockout | | `me` | Rehidrata user+caps | | `requestPasswordReset` | Token genérico | | `resetPassword` | Consome token | | `changePassword` | Autenticado | UsersService: list/meta/create/update/sendReset/pushDevice.