Sistema fullstack de Help Desk para cadastro de usuarios, autenticacao, abertura de tickets, comentarios e controle de atendimento por papeis.
- Node.js
- Express
- TypeScript
- Prisma
- PostgreSQL
- Zod
- JWT
- bcryptjs
- Jest
- Supertest
- OpenAPI/Swagger
- GitHub Actions
- React
- React Router
- Axios
- Bootstrap
- Vite
- Registro e login de usuarios.
- Rota para consultar usuario autenticado (
GET /auth/me). - Autenticacao com JWT.
- Autorizacao por papeis (
USER,AGENT,ADMIN). - Protecao contra acesso direto indevido a tickets de outros usuarios.
- Criacao, busca e listagem de tickets.
- Filtros e paginacao na listagem de tickets.
- Atualizacao de status, prioridade e responsavel do ticket por agente ou admin.
- Cancelamento de ticket com regras de permissao.
- Criacao e listagem de comentarios em tickets.
- Gerenciamento de usuarios por admin.
- Validacao de entrada com Zod.
- Tratamento global de erros com
AppErrore middleware de erro. - Documentacao da API com OpenAPI/Swagger.
- Testes e2e com Jest e Supertest.
- CI com GitHub Actions.
- Seed para criar o primeiro usuario admin.
- Interface web para login, dashboard e gerenciamento de tickets.
- Persistencia da sessao no navegador e recuperacao do usuario autenticado.
- Integracao do frontend com as rotas protegidas da API.
backend/src
app.ts
server.ts
errors/
middlewares/
modules/
auth/
users/
tickets/
comments/
prisma/
O fluxo principal segue a separacao:
routes -> middlewares -> controllers -> schemas -> services -> repositories -> Prisma -> PostgreSQL
frontend/src
contexts/
pages/
routes/
services/
types/
App.tsx
main.tsx
O frontend separa as responsabilidades da seguinte forma:
pages -> services -> Axios -> API REST
pages: telas e interacoes do usuario.services: chamadas HTTP para o backend.types: contratos TypeScript dos dados enviados e recebidos.contexts: estado global de autenticacao.routes: protecao e organizacao da navegacao.
- Node.js
- PostgreSQL
- npm
- Navegador moderno
Crie um arquivo .env dentro de backend:
DATABASE_URL="postgresql://postgres:SUA_SENHA@localhost:5432/helpdesk?schema=public"
AUTH_SECRET="sua_chave_secreta"
PORT=3000Entre na pasta do backend:
cd backendInstale as dependencias:
npm installValide o schema do Prisma:
npx prisma validate --schema src/prisma/schema.prismaRode as migrations:
npx prisma migrate dev --schema src/prisma/schema.prismaCrie o primeiro admin:
npm run seedInicie o servidor:
npm run devA API roda por padrao em:
http://localhost:3000
A documentacao Swagger fica em:
http://localhost:3000/docs
Em outro terminal, instale e inicie o frontend:
cd frontend
npm install
npm run devO frontend roda por padrao em:
http://localhost:5173
Para apontar o frontend para outra API, crie frontend/.env com:
VITE_API_URL=http://localhost:3000npm run devRoda a API em desenvolvimento.
npm run buildCompila o TypeScript.
npm run startRoda a versao compilada.
npm run seedCria ou atualiza o usuario admin inicial.
npm testRoda os testes automatizados do backend.
Os testes atuais sao testes de integracao HTTP, entao precisam do PostgreSQL rodando e do DATABASE_URL configurado no .env.
O seed cria o seguinte usuario:
email: admin@helpdesk.com
senha: admin123
role: ADMIN
Use esse usuario para fazer login e acessar rotas administrativas.
Rotas protegidas exigem o header:
Authorization: Bearer TOKENO token e gerado no login ou registro.
USER
Usuario comum. Pode criar tickets e comentarios.
AGENT
Atendente. Pode alterar status, prioridade e responsavel de tickets.
ADMIN
Administrador. Pode gerenciar usuarios e tambem executar acoes de atendimento.
GET /docsAbre a documentacao visual da API com Swagger.
GET /healthVerifica se a API esta rodando.
POST /auth/registerCria um usuario comum e retorna token.
Body:
{
"name": "Usuario",
"email": "user@email.com",
"password": "user123"
}POST /auth/loginFaz login e retorna token.
Body:
{
"email": "admin@helpdesk.com",
"password": "admin123"
}GET /auth/meRetorna o usuario autenticado usando o token JWT enviado no header Authorization.
Todas as rotas de users exigem ADMIN.
GET /usersLista usuarios.
GET /users/:idBusca usuario por id.
POST /usersCria usuario com role definido por admin.
Body:
{
"name": "Agente HelpDesk",
"email": "agent@helpdesk.com",
"password": "agent123",
"role": "AGENT"
}Todas as rotas de tickets exigem usuario autenticado.
GET /ticketsLista tickets com filtros e paginacao.
Query params opcionais:
status
priority
createdById
assignedToId
page
limit
GET /tickets/:idBusca ticket por id.
POST /ticketsCria ticket. O createdById vem do token, nao do body.
Body:
{
"title": "Problema no notebook",
"description": "Notebook nao liga",
"priority": "HIGH"
}PATCH /tickets/:id/statusAtualiza status. Exige AGENT ou ADMIN.
Body:
{
"status": "IN_PROGRESS"
}O status CANCELED nao e aceito nessa rota. Cancelamento tem rota propria para aplicar regras especificas.
PATCH /tickets/:id/cancelCancela ticket.
Regras:
USERpode cancelar apenas tickets criados por ele.AGENTeADMINpodem cancelar qualquer ticket.- ticket resolvido nao pode ser cancelado.
- ticket ja cancelado nao pode ser cancelado novamente.
PATCH /tickets/:id/priorityAtualiza prioridade. Exige AGENT ou ADMIN.
Body:
{
"priority": "MEDIUM"
}PATCH /tickets/:id/assignAtribui responsavel. Exige AGENT ou ADMIN.
Body:
{
"assignedToId": "id-do-usuario"
}Todas as rotas de comments exigem usuario autenticado.
Usuarios comuns so podem criar e listar comentarios de tickets criados por eles.
Agentes e admins podem acessar comentarios de qualquer ticket.
POST /comments/:ticketId/commentsCria comentario em um ticket. O authorId vem do token, nao do body.
Body:
{
"content": "Comentario sobre o andamento do ticket."
}GET /comments/:ticketId/commentsLista comentarios de um ticket.
Login admin:
curl -X POST http://localhost:3000/auth/login -H "Content-Type: application/json" -d '{"email":"admin@helpdesk.com","password":"admin123"}'Listar usuarios com token admin:
curl http://localhost:3000/users -H "Authorization: Bearer TOKEN_ADMIN"Criar agente:
curl -X POST http://localhost:3000/users -H "Content-Type: application/json" -H "Authorization: Bearer TOKEN_ADMIN" -d '{"name":"Agente HelpDesk","email":"agent@helpdesk.com","password":"agent123","role":"AGENT"}'Criar ticket:
curl -X POST http://localhost:3000/tickets -H "Content-Type: application/json" -H "Authorization: Bearer TOKEN" -d '{"title":"Problema no notebook","description":"Notebook nao liga","priority":"HIGH"}'Atualizar status do ticket:
curl -X PATCH http://localhost:3000/tickets/ID_DO_TICKET/status -H "Content-Type: application/json" -H "Authorization: Bearer TOKEN_AGENT" -d '{"status":"IN_PROGRESS"}'Consultar usuario autenticado:
curl http://localhost:3000/auth/me -H "Authorization: Bearer TOKEN"Listar tickets com filtros e paginacao:
curl "http://localhost:3000/tickets?status=OPEN&page=1&limit=10" -H "Authorization: Bearer TOKEN"Cancelar ticket:
curl -X PATCH http://localhost:3000/tickets/ID_DO_TICKET/cancel -H "Authorization: Bearer TOKEN"O projeto usa:
AppErrorpara erros esperados da aplicacao.errorMiddlewarepara centralizar respostas de erro.ZodErrorpara erros de validacao.
Exemplos:
400 - Dados invalidos
401 - Nao autenticado
403 - Sem permissao
404 - Recurso nao encontrado
409 - Conflito, como email ja cadastrado
500 - Erro interno inesperado
Backend MVP funcional com autenticacao, autorizacao, tickets, comentarios, gerenciamento de usuarios, validacao, tratamento de erros, documentacao, testes e CI.
Frontend em desenvolvimento com login, sessao autenticada, rotas protegidas, dashboard, listagem e criacao de tickets, detalhes, comentarios e controles de atendimento por papel.
Proximos passos possiveis:
- concluir o gerenciamento de usuarios no frontend;
- adicionar filtros e paginacao na interface;
- adicionar testes automatizados e CI do frontend;
- melhorar a navegacao e o acabamento visual;
- decidir estrategia de deploy;
- melhorar empacotamento da documentacao Swagger para producao;
- adicionar logs estruturados;
- adicionar refresh token.