pizza-digital/docs/SPEC-USUARIOS.md
Admin d669f56398 Import Pizza Digital SPECs and docs from Obsidian vault sync
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-11-09 19:52:34 +00:00

88 lines
2.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# SPEC — Usuários, senha e sessão
| Campo | Valor |
|-------|--------|
| **Produto** | Pizza Digital |
| **Capítulo** | Equipe / Auth |
| **Versão** | 0.1.0 |
| **Data** | 2026-10-20 |
| **Owner** | Roger / iTecnologys |
| **UI** | `/admin/equipe` · `/forgot-password` · `/reset-password` |
| **API** | `/api/users` · `/api/auth/*` |
| **Irmã** | [`SPEC-MATRIZ-ACESSO.md`](SPEC-MATRIZ-ACESSO.md) |
---
## 1. Objetivo
Cadastrar quem opera a loja (PDV, KDS, despacho, gestor), com senha forte, bloqueio por tentativa, recuperação e vínculo à matriz de acesso.
---
## 2. Modelo
```text
User
email, name, role (gestor|pdv|kds|despacho)
jobTitle, areas[], phone, active
passwordHash, mustChangePassword, passwordChangedAt
failedLoginAttempts, lockedUntil, lastLoginAt
profileTemplateKey ← rótulo do último modelo aplicado
AuthToken password_reset | invite | email_verify
PushDevice token web/app
NotifyLog email | push (auditoria de envio)
UserCapability fonte da verdade no vínculo (SPEC matriz)
```
---
## 3. Requisitos
| ID | Requisito | Status |
|----|-----------|--------|
| RF-USR-01 | CRUD equipe (`staff.view` / `staff.manage`) | **feito** |
| RF-USR-02 | Cargo (`jobTitle`) + áreas (`pdv`, `kds`, `despacho`, `admin`, …) | **feito** |
| RF-USR-03 | Política de senha: ≥8, maiúscula, minúscula, dígito; sem o local-part do e-mail | **feito** |
| RF-USR-04 | Lockout: 5 falhas → 15 min (`lockedUntil`) | **feito** |
| RF-USR-05 | Recuperação por e-mail (link 60 min) + stub push | **feito** (SMTP produção opcional) |
| RF-USR-06 | Convite / `mustChangePassword` no primeiro acesso | **feito** |
| RF-USR-07 | Aplicar template da matriz no cadastro | **feito** |
| RF-USR-08 | Gestor extra exige `owners.manage` | **feito** |
| RF-USR-09 | Desbloquear conta (`unlock`) | **feito** |
| RF-USR-10 | SMTP/push reais em produção | **stub** |
---
## 4. Política de senha (congelada)
```text
minLength 8 · max 128
1 maiúscula · 1 minúscula · 1 dígito
não contém o e-mail
maxFailedAttempts 5 · lockMinutes 15
resetTokenTtlMinutes 60
```
Código: `apps/api/src/auth/password-policy.ts`.
---
## 5. Fluxos
1. Gestor cria usuário em `/admin/equipe` → hash bcrypt → opcional convite.
2. Login `/api/auth/login` incrementa falhas; 5× bloqueia 15 min.
3. Esqueci senha → `AuthToken.password_reset` → e-mail com link (resposta genérica, não vaza existência).
4. Reset consome token, valida política, limpa lockout.
---
## 6. Fora desta SPEC
- SSO / SAML
- 2FA TOTP (fase futura)
- Multi-loja no mesmo login
---
*Satélite. Produto pai: SPEC.md v0.3.5.*