Campos
| Campo | Tipo | Descrição |
|---|---|---|
userId | UUID | Identificador único |
googleProviderId | String? | ID do provedor Google OAuth |
name | String | Nome completo do usuário |
email | String? | Email do usuário (único, opcional) |
phoneIso | String | Código ISO do país do telefone |
phoneDdi | String | DDI do telefone |
phoneNumber | String | Número do telefone |
phoneVerified | Boolean | Indica se o telefone foi verificado. Default: false |
emailVerified | Boolean | Indica se o email foi verificado. Default: false |
password | String? | Credencial protegida da senha. Nulo para contas OAuth-only ou ainda pendentes |
avatar | String? | Object key do avatar no storage |
status | UserStatus | Status da conta. Default: ACTIVE |
createdBy | UUID? | Usuário que criou o registro, quando aplicável |
createdAt | DateTime | Data de criação |
updatedBy | UUID? | Usuário que fez a última atualização, quando aplicável |
updatedAt | DateTime | Data da última atualização |
deletedBy | UUID? | Usuário que removeu o registro, quando aplicável |
deletedAt | DateTime? | Data de remoção |
phoneDdi + phoneNumber é único em todo o sistema.
Relacionamentos
- Has one (optional) Customer (perfil de passageiro)
- Has one (optional) Driver
- Relaciona-se com múltiplas UserSession
- Relaciona-se com múltiplos Membership (vínculo com organizações via roles)
- Relaciona-se com múltiplos Employee (vínculo operacional com Companies)
- Relaciona-se com múltiplos OTP
- Relaciona-se com múltiplos Order (como responsável pela criação —
soldBy) - Relaciona-se com múltiplos Invite (emitidos e recebidos)
Regras de Negócio
- O telefone (
phoneDdi+phoneNumber) é obrigatório e único — é o identificador primário de login. - O
emailé opcional, mas único quando preenchido. O login por username aceita email ou telefone. passwordé nulo para usuários autenticados exclusivamente via Google OAuth e para contasPENDING(criadas sem senha, ativadas por Invite).googleProviderIdé único quando preenchido.- Usuários
BLOCKEDnão podem autenticar nem renovar sessão. - Ao bloquear um usuário, sessões ativas devem ser revogadas para interromper a cadeia de acesso.
- Documento, data de nascimento e endereços de passageiro vivem em Customer, não no
User. - Claims de acesso como
access:ops,access:bkoeaccess:driversão derivados no Profile a partir de Memberships e vínculos operacionais.
Enums
UserStatus
| Valor | Descrição |
|---|---|
PENDING | Conta criada sem senha — aguarda ativação por Invite |
ACTIVE | Conta ativa e apta a autenticar |
BLOCKED | Conta bloqueada e impedida de autenticar ou renovar sessão |