Hub 360 Docs

Hub 360 Bug Tracker

Plataforma completa de gestao e documentacao de bugs. Formulario publico de report, dashboard autenticado com filtros, notas internas e audit log.

Next.js 16 Supabase Tailwind CSS 4 TypeScript Playwright

Stack Tecnologica

Next.js 16 (App Router)

Framework React com server components, API routes e renderizacao hibrida.

Supabase

Backend-as-a-Service com PostgreSQL, Auth, Storage e Row Level Security.

Tailwind CSS 4

Framework CSS utility-first para estilizacao rapida e responsiva.

TypeScript

Tipagem estatica em todo o projeto para seguranca e produtividade.

Playwright

Framework de testes E2E com 64 testes cobrindo UI, API e seguranca.

Vercel

Deploy automatico com CI/CD integrado ao GitHub.

Estrutura de Arquivos

hub360-bugs/
-- Paginas
  src/app/page.tsx              # Redirect -> /login
  src/app/login/page.tsx        # Tela de login
  src/app/dashboard/page.tsx    # Dashboard principal
  src/app/report/[slug]/page.tsx # Form publico de report

-- API Routes
  src/app/api/auth/route.ts          # Autenticacao
  src/app/api/bugs/route.ts          # Listar / criar bugs
  src/app/api/bugs/[id]/route.ts     # Detalhe / atualizar bug
  src/app/api/bugs/[id]/notes/route.ts # Notas internas
  src/app/api/upload/route.ts        # Upload de arquivos

-- Componentes
  src/components/BugDrawer.tsx    # Drawer de detalhes
  src/components/StatusBadge.tsx  # Badge de status
  src/components/SeverityBadge.tsx # Badge de severidade

-- Libs
  src/lib/auth.ts              # Helpers de auth (client)
  src/lib/supabase-browser.ts  # Client Supabase (browser)
  src/lib/supabase-server.ts   # Client Supabase (server)
  src/lib/utils.ts             # Utilitarios
  src/types/index.ts           # Tipos TypeScript

-- Database
  setup-db.sql                 # Schema SQL completo
  seed.mjs                     # Dados de seed
  supabase/config.toml         # Config Supabase CLI

-- Testes
  tests/app.spec.ts            # 64 testes Playwright
  playwright.config.ts         # Config Playwright

Login

Tela de autenticacao para membros da equipe. Valida credenciais via Supabase Auth e armazena sessao no localStorage.

Credenciais de Teste

NomeEmailSenhaPapel
Ricardo Mendesadmin@hub360.com.brHub360@2025Admin
Ana Souzadev@hub360.com.brHub360@2025Dev
Carlos Limapm@hub360.com.brHub360@2025PM

Fluxo

Email + Senha
->
POST /api/auth
->
Supabase Auth
->
localStorage
->
/dashboard

Dashboard

Painel principal autenticado para visualizacao e gestao de bugs. Requer login.

Funcionalidades

Filtros Multiplos

Projeto, status, severidade, responsavel e busca por titulo com debounce de 300ms.

Ordenacao

Colunas clicaveis: titulo, status, severidade, data de criacao. Toggle asc/desc.

Cards de Status

Contadores clicaveis por status. Mostram total de bugs em cada estado.

Bug Drawer

Painel lateral com detalhes, anexos, notas internas e audit log completo.

Paginacao

30 bugs por pagina com navegacao entre paginas.

Gestao de Bugs

Alterar status, atribuir responsavel e adicionar notas internas diretamente do drawer.

Status Disponiveis

Novo Em analise Em correcao Aguardando validacao Resolvido Fechado Reaberto

Severidades

Critica - App trava ou perde dados Alta - Funcionalidade importante quebrada Media - Problema contornavel Baixa - Detalhe visual ou melhoria

Formulario de Report

Formulario publico acessivel via /report/[slug]. Qualquer usuario pode reportar bugs sem precisar de login.

Campos do Formulario

CampoObrigatorioValidacao
Nome do reporterNao-
Email do reporterNao-
TituloSim5-200 caracteres
Onde encontrouSim3-300 caracteres
O que fez (passos)Sim5-1000 caracteres
O que esperavaSim5-1000 caracteres
O que aconteceuSim5-1000 caracteres
SeveridadeSimCritica, Alta, Media, Baixa
DispositivoNaoAuto-detectado
AnexosSim (min 1)Max 3 arquivos, 100MB cada. JPG, PNG, WebP, MP4, MOV, WebM

Recursos

  • Auto-save no localStorage a cada 500ms
  • Deteccao automatica de dispositivo (Android, iOS, Desktop)
  • Protecao contra duplicatas (idempotency key com janela de 5min)
  • Rate limiting: 10 envios por hora por IP
  • Tela de sucesso com numero do bug

Projetos de Teste

ProjetoSlugURL de Report
AZ-IBaz-ib/report/az-ib
Liscanliscan/report/liscan
NEX Solarnex-solar/report/nex-solar

API Reference

Todas as rotas de API estao em /api/*. Rotas autenticadas requerem header Authorization: Bearer <token>.

O token e obtido via POST /api/auth e retornado no campo session.access_token.
POST /api/auth

Autenticacao de membros da equipe. Retorna sessao e dados do usuario.

REQUEST BODY
{
  "email": "admin@hub360.com.br",
  "password": "Hub360@2025"
}
RESPONSE 200
{
  "success": true,
  "session": {
    "access_token": "eyJhbGci...",
    "refresh_token": "...",
    "expires_at": 1234567890
  },
  "user": {
    "id": "uuid",
    "email": "admin@hub360.com.br",
    "team_member": { /* TeamMember object */ }
  }
}
ERROS
StatusMotivo
400Email ou senha ausentes
401Credenciais invalidas
GET /api/bugs

Lista bugs com filtros, busca e paginacao. Requer autenticacao.

QUERY PARAMS
ParamTipoDefaultDescricao
pagenumber1Pagina atual
page_sizenumber30Itens por pagina
project_idUUID-Filtrar por projeto
statusstring-Filtrar por status (comma-separated)
severitystring-Filtrar por severidade
assigned_toUUID-Filtrar por responsavel
searchstring-Busca por titulo (full-text)
sort_bystringcreated_atCampo de ordenacao
sort_dirasc|descdescDirecao da ordenacao
RESPONSE 200
{
  "bugs": [
    {
      "id": "uuid",
      "number": 1,
      "title": "Botao nao responde",
      "status": "new",
      "severity": "critical",
      "created_at": "2025-03-18T...",
      "project": { "name": "AZ-IB" },
      "assignee": { "name": "Ana Souza" }
    }
  ],
  "total": 50,
  "page": 1,
  "page_size": 30,
  "total_pages": 2
}
POST /api/bugs

Cria um novo bug report. Rota publica (sem autenticacao).

REQUEST BODY
{
  "project_slug": "az-ib",
  "title": "Botao de login nao funciona",
  "where_found": "Tela de login > Botao Entrar",
  "steps_taken": "Abri o app, digitei email...",
  "expected_behavior": "Login bem-sucedido",
  "actual_behavior": "Nada acontece",
  "severity": "high",
  "device_info": "Samsung Galaxy A34 / Android 14",
  "reporter_name": "Joao",
  "reporter_email": "joao@email.com",
  "attachment_paths": [
    { "path": "az-ib/123-foto.png", "name": "foto.png", "type": "image/png", "size": 102400 }
  ]
}
RESPONSE 200
{
  "success": true,
  "bug": { "id": "uuid", "number": 42 },
  "duplicate": false
}
ERROS
StatusMotivo
400Campos obrigatorios ausentes ou invalidos
404Projeto nao encontrado
403Projeto inativo
429Rate limit excedido (max 10/hora/IP)
GET /api/bugs/:id

Retorna detalhes completos de um bug, incluindo anexos, notas e audit log. Requer autenticacao.

RESPONSE 200
{
  "id": "uuid",
  "number": 1,
  "title": "Botao nao responde",
  "status": "new",
  "severity": "critical",
  "version": 2,
  "where_found": "...",
  "steps_taken": "...",
  "expected_behavior": "...",
  "actual_behavior": "...",
  "project": { "name": "AZ-IB" },
  "assignee": { "name": "Ana Souza" },
  "attachments": [{ "file_name": "foto.png", "url": "https://signed..." }],
  "notes": [{ "content": "Investigando...", "author": {} }],
  "audit_log": [{ "action": "status_changed", "old_value": "new", "new_value": "analyzing" }]
}
PATCH /api/bugs/:id

Atualiza status, responsavel ou duplicata de um bug. Requer autenticacao. Usa optimistic locking.

REQUEST BODY
{
  "status": "analyzing",
  "assigned_to": "uuid-do-membro",
  "version": 2  // para optimistic locking
}
ERROS
StatusMotivo
400Status invalido ou nenhum campo enviado
401Nao autenticado
409Conflito de versao (outro usuario editou)
POST /api/bugs/:id/notes

Adiciona uma nota interna a um bug. Requer autenticacao. Apenas membros da equipe.

REQUEST BODY
{
  "content": "Investigando o problema. Parece ser memory leak."
}
RESPONSE 200
{
  "success": true,
  "note": {
    "id": "uuid",
    "content": "Investigando o problema...",
    "author": { "name": "Ana Souza" }
  }
}
POST /api/upload

Upload de arquivos para anexar a bug reports. Rota publica.

REQUEST

Content-Type: multipart/form-data

CampoTipoDescricao
fileFileArquivo para upload
project_slugstringSlug do projeto
LIMITES
  • Tamanho maximo: 100 MB por arquivo
  • Tipos permitidos: JPG, PNG, WebP, MP4, MOV, WebM
  • Maximo 3 arquivos por bug report

Banco de Dados

PostgreSQL via Supabase com Row Level Security, triggers automaticos e indices otimizados.

Tabelas

projects

ColunaTipoDescricao
idUUID PKIdentificador unico
nameTEXTNome do projeto
slugTEXT UNIQUEIdentificador URL-safe (regex validado)
descriptionTEXTDescricao (opcional)
is_activeBOOLEANProjeto ativo (default true)
created_atTIMESTAMPTZData de criacao

bugs

ColunaTipoDescricao
idUUID PKIdentificador unico
numberINTEGERNumero sequencial por projeto (auto-gerado)
project_idUUID FKReferencia ao projeto
titleTEXTTitulo (5-200 chars)
where_foundTEXTOnde encontrou (3-300 chars)
steps_takenTEXTPassos para reproduzir (5-1000 chars)
expected_behaviorTEXTComportamento esperado (5-1000 chars)
actual_behaviorTEXTComportamento real (5-1000 chars)
severityTEXTcritical, high, medium, low
statusTEXTnew, analyzing, fixing, awaiting_validation, resolved, closed, reopened
assigned_toUUID FKMembro responsavel (nullable)
versionINTEGERVersao para optimistic locking
device_infoTEXTInfo do dispositivo (nullable)
reporter_nameTEXTNome do reporter (nullable)
reporter_emailTEXTEmail do reporter (nullable)
reporter_ipINETIP do reporter
idempotency_keyTEXT UNIQUEChave anti-duplicata
created_atTIMESTAMPTZData de criacao
updated_atTIMESTAMPTZData de atualizacao (auto)

team_members

ColunaTipoDescricao
idUUID PKIdentificador unico
auth_user_idUUID FKReferencia ao auth.users do Supabase
nameTEXTNome do membro
emailTEXT UNIQUEEmail
roleTEXTdev, pm, admin
is_activeBOOLEANMembro ativo

bug_attachments

ColunaTipoDescricao
idUUID PKIdentificador
bug_idUUID FKBug associado (CASCADE)
file_nameTEXTNome do arquivo
file_typeTEXTMIME type
file_sizeBIGINTTamanho em bytes
storage_pathTEXTCaminho no Supabase Storage

bug_notes & bug_audit_log

TabelaDescricaoCampos-chave
bug_notesNotas internas (append-only)bug_id, author_id, content
bug_audit_logHistorico de mudancasbug_id, actor_id, action, old_value, new_value
rate_limitsControle de rate limitingip_address, endpoint, created_at

Triggers & Functions

TriggerTabelaDescricao
update_updated_at()bugsAtualiza updated_at automaticamente
generate_bug_number()bugsGera numero sequencial por projeto
log_bug_changes()bugsRegistra mudancas no audit log e incrementa versao
clean_old_rate_limits()rate_limitsRemove entradas com mais de 1 hora

Row Level Security (RLS)

TabelaAnonAuthenticated
projectsLeitura (ativos)CRUD completo
team_members-Leitura + gestao
bugs-Leitura + atualizacao
bug_attachments-Leitura
bug_notes-Leitura
bug_audit_log-Leitura

Seguranca

Fluxo de Autenticacao

1. Login
->
2. POST /api/auth
->
3. Supabase Auth
->
4. Token JWT
->
5. localStorage

Cada requisicao autenticada envia Authorization: Bearer <access_token>. O server valida via supabase.auth.getUser(token).

Rate Limiting

  • 10 submissoes por hora por IP
  • Rastreado por IP + endpoint na tabela rate_limits
  • Auto-limpeza de registros com mais de 1 hora
  • Retorna 429 Too Many Requests quando excedido

Protecao Anti-Duplicata

  • Hash gerado com: project_id + titulo + passos + IP + janela de 5 minutos
  • Constraint UNIQUE na coluna idempotency_key
  • Retorna o bug existente se duplicata detectada

Optimistic Locking

  • Campo version em cada bug
  • PATCH envia version atual do cliente
  • Se versao no banco diferir, retorna 409 Conflict
  • Incrementa automaticamente via trigger

Headers de Seguranca

HeaderValor
X-Frame-OptionsDENY
X-Content-Type-Optionsnosniff
Referrer-Policystrict-origin-when-cross-origin
Strict-Transport-Securitymax-age=63072000; includeSubDomains; preload

Testes

64 testes E2E com Playwright cobrindo toda a aplicacao.

Rodar testes: npx playwright test (requer server na porta 3333)

Cobertura

CategoriaTestesDescricao
Login Page5Form, credenciais invalidas, redirect, loading state, subtitle
Dashboard17Lista, filtros, busca, drawer, notas, status, ordenacao, logout
Bug Report Form14Validacao, submit, upload, remocao, severidade, auto-save
API Security6Auth obrigatoria, token invalido, validacao de campos
API Auth Edge Cases2Body vazio, resposta de sessao valida
API Bug Detail3Auth, token invalido, bug inexistente
API Patch Bug4Token invalido, status invalido, body vazio, update valido
API Notes4Auth, token invalido, content vazio, criacao valida
API Upload1Rejeita request sem arquivo
API Bugs List4Filtros: search, severity, sorting, status
Navigation1Root redirect para /login
Total64

Dados de Seed

O script seed.mjs popula o banco com dados de teste realistas.

Usuarios

NomeEmailPapel
Ricardo Mendesadmin@hub360.com.brAdmin
Ana Souzadev@hub360.com.brDev
Carlos Limapm@hub360.com.brPM

Projetos

NomeSlugDescricao
AZ-IBaz-ibApp bancario AZ-IB
LiscanliscanApp Liscan iOS
NEX Solarnex-solarPlataforma de financiamento solar

Inclui 12 bugs de exemplo com severidades e status variados, e 4 notas internas de amostra.

Senha padrao de todos os usuarios de teste: Hub360@2025

Variaveis de Ambiente

Crie um arquivo .env.local na raiz do projeto:

NEXT_PUBLIC_SUPABASE_URL=https://seu-projeto.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=eyJhbGci...
SUPABASE_SERVICE_ROLE_KEY=eyJhbGci...
Nunca commite o .env.local no repositorio. Ele ja esta no .gitignore.