API Reference: Autenticacao

Base URL: /api/auth


POST /api/auth/signup

Cadastra um novo usuario. Status inicial: PENDENTE (nao consegue logar ate ser aprovado).

Permissao: Publica

Body

{
  "nome": "Joao da Silva",
  "email": "[email protected]",
  "senha": "Senha123",
  "cpf": "123.456.789-00",
  "telefone": "(27) 99999-9999",
  "dataNascimento": "1990-05-15",
  "endereco": {
    "cep": "29000-000",
    "rua": "Rua das Flores",
    "numero": "42",
    "complemento": "Apto 101",
    "bairro": "Centro",
    "cidade": "Vitoria",
    "estado": "ES"
  },
  "competencias": [
    { "microId": "uuid-da-competencia", "nivel": "AVANCADO" }
  ],
  "consentimentoLgpd": true,
  "codigoReferral": "MBL-ES-A1B2"
}

Validacoes (Zod)

  • nome: min 3 caracteres
  • email: formato valido
  • senha: min 8 chars, 1 maiuscula, 1 numero
  • cpf: formato 000.000.000-00
  • consentimentoLgpd: deve ser true

Response 201

{
  "message": "Cadastro realizado com sucesso. Aguarde aprovacao.",
  "usuario": {
    "id": "uuid",
    "nome": "Joao da Silva",
    "email": "[email protected]",
    "status": "PENDENTE",
    "codigoReferral": "MBL-ES-X7K2"
  }
}

POST /api/auth/login

Autentica o usuario. Retorna JWT. Verifica status antes de autenticar.

Permissao: Publica

Body

{
  "email": "[email protected]",
  "senha": "Senha123"
}

Response 200

{
  "accessToken": "eyJhbGci...",
  "refreshToken": "xxx",
  "expiresIn": 3600,
  "usuario": {
    "id": "uuid",
    "nome": "Joao da Silva",
    "cargo": "MEMBRO",
    "nucleoId": "uuid"
  }
}

Erros

  • 401: Email ou senha invalidos
  • 403: Cadastro pendente / rejeitado / suspenso

GET /api/auth/me

Retorna perfil completo do usuario logado, incluindo competencias e plano.

Permissao: Autenticado

Header: Authorization: Bearer token

Response 200

{
  "id": "uuid",
  "nome": "Joao da Silva",
  "email": "[email protected]",
  "cargo": "MEMBRO",
  "saldo_capixacoins": 1500,
  "planos": { "id": "uuid", "nome": "Free" },
  "usuario_competencias": [
    {
      "nivel_proficiencia": "AVANCADO",
      "competencias_micro": {
        "id": "uuid", "nome": "Edicao de Video",
        "competencias_macro": { "id": "uuid", "nome": "Digital" }
      }
    }
  ],
  ...
}

POST /api/auth/approve

Aprova um cadastro pendente. Credita 100 CC ao referral (se existir). Gera entrada no feed e notificacao. Envia email de boas-vindas via Resend.

Permissao: COORDENADOR ou ADMINISTRADOR

Body

{ "usuarioId": "uuid-do-usuario" }

Response 200

{ "message": "Usuario aprovado com sucesso" }

Side Effects

  • Status do usuario muda para ATIVO
  • 100 CC creditadas ao referral (se existir)
  • Entrada no feed: "Bem-vindo ao nucleo!"
  • Notificacao push para o usuario
  • Email de boas-vindas enviado via Resend (template HTML com nome do nucleo e instrucoes de primeiro acesso)

POST /api/auth/reject

Rejeita um cadastro pendente (soft delete — status muda para REJEITADO). Envia email de rejeicao via Resend.

Permissao: COORDENADOR ou ADMINISTRADOR

Body

{ "usuarioId": "uuid-do-usuario" }

Side Effects

  • Status do usuario muda para REJEITADO
  • Email de rejeicao enviado via Resend (template HTML informando que o cadastro nao foi aprovado)

Cargos Retornados

O campo cargo retornado nos endpoints de login e me pode ser um dos seguintes valores:

  • MEMBRO — Usuario base
  • LIDER_PROJETO — Lider de projeto
  • PORTA_VOZ — Membro com permissoes de comunicacao (comunicados, enquetes, emails, tarefas, IA)
  • COORDENADOR — Gerente do nucleo
  • ADMINISTRADOR — Acesso total ao nucleo
  • SUPER_ADMIN — Acesso irrestrito a todos os nucleos

POST /api/auth/refresh

Renova o access token usando o refresh token.

Permissao: Publica

Body

{ "refreshToken": "xxx" }

Response 200

{
  "accessToken": "eyJhbGci...",
  "refreshToken": "novo-refresh",
  "expiresIn": 3600
}

POST /api/auth/forgot-password

Envia email de recuperacao de senha. Nao revela se o email existe ou nao (seguranca).

Permissao: Publica

Body

{ "email": "[email protected]" }

Response 200

{ "message": "Se o email estiver cadastrado, voce recebera um link de recuperacao." }

PATCH /api/auth/dismiss-first-login

Marca primeiro_login como false (usado apos onboarding tour).

Permissao: Autenticado