API v1

Login

Android: LoginFragment · CodeConfirmationFragment · NewLoginViewModel

Ponto de entrada do app. Suporta autenticação por senha com JWT, biometria, OTP via SMS e seleção de empresa com propagação de permissões.

Fluxo de Autenticação

1

POST /v1/auth/login

Body: { "username": ..., "password": ... }. Retorna jwt_token, user_id, dados de empresas e permissões.

2

Seleção de empresa

Se o usuário tem acesso a múltiplas empresas, um diálogo de seleção é exibido. O company_id selecionado é persistido em SharedPreferences("selected_company").

3

Resolução de permissões

O LoginViewModel chama configPermsTree() e analyzePermissionIds() para resolver as permissões do usuário para a empresa selecionada. O resultado é salvo em SharedPreferences("DATA"), chave "perms_user".

4

Navegação

Redireciona para HomeFragment via NavController (nav_home).

Funcionalidades

FeatureDetalhe
Autenticação por senhaPOST /v1/auth/login → JWT + dados de empresas
Login biométricoLê JWT salvo em SharedPreferences("jwt_tokens"). Se expirado, redireciona para login por senha.
OTP via SMSFragment CodeConfirmationFragment — confirma código enviado ao celular cadastrado.
Seleção de empresacompany_id persistido após login. Usado em todas as chamadas subsequentes.
Lembrar senhaSalva credenciais em SharedPreferences("loginPrefs") com flag saveLogin.
Prominent DisclosureDiálogo obrigatório Google Play antes de solicitar permissão de localização.

Papéis de Usuário e Permissões

PapelFlag JSONPermissões resultantes
master"master": trueTodas as permissões da empresa via analyzeAllPermissions()
motorista"motorista": truePermissões fixas: ["1", "8", "93", "94"]
responsavel / padrão"responsavel": trueUnião de permissões diretas do usuário + permissões do setor via analyzePermissionIds()

Resolução de Permissões (detalhes)

// Para usuário master: todas as permissões
val perms = analyzeAllPermissions(config)

// Para motorista: conjunto fixo
val perms = setOf("1", "8", "93", "94")

// Para usuário padrão: usuário + setor combinados
val userPerms   = getUserPermissions(companyInfo)     // array "perm" no JSON
val sectorPerms = getSectorPermissions(sectors, sectorId)
val combined    = combinePermissions(userPerms, sectorPerms)
val perms       = analyzePermissionIds(config, categories, combined)
combinePermissions: se userPerms está vazio, usa só as do setor; se sectorPerms está vazio, usa só as do usuário; caso contrário faz a união dos dois conjuntos.

Persistência após Login

SharedPreferencesChaveConteúdo
jwt_tokensjwt_tokenBearer JWT para chamadas v1
DATAperms_userJSON array de IDs de permissão
DATAnome, cpf, company_names, user_perms_json, sectorsDados do usuário e empresas para o ConfigurationFragment
selected_companycompany_idEmpresa ativa — usada como filtro em todos os módulos
user_iduser_id, user_roleIdentificação e papel do usuário
mastermasterBoolean — acesso total
driverdriverBoolean — restringe navegação ao módulo motorista

Endpoints

POST /v1/auth/login
Autenticação principal. Body: { "username": "...", "password": "..." }. Retorna JWT, dados de empresas e estrutura de permissões.
POST /v1/auth/generate_access_token
Geração de token de acesso após validação OTP.
POST /v1/auth/refresh
Renovação do JWT expirado. Chamado automaticamente quando o biométrico detecta token expirado.