Projeto desenvolvido para a disciplina de Engenharia de Software II, uma aplicação web mobile-first que conecta clientes a profissionais de serviços locais (elétrica, hidráulica, pintura, marcenaria, jardinagem, entre outros).
O Zelo resolve um problema cotidiano: encontrar um profissional confiável para serviços domésticos costuma depender de indicação ou de listagens genéricas, sem forma clara de avaliar em quem confiar. O app centraliza esse processo, permitindo que o cliente navegue por categorias de serviço, veja o perfil de profissionais e inicie uma contratação em poucos passos.
O fluxo cobre a jornada completa de contratação:
- O cliente busca um profissional por tipo de serviço
- Abre uma solicitação de contratação (hire) e negocia por propostas (valor + rodada) até chegar a um acordo
- A proposta é aceita e o serviço é confirmado
- O pagamento é processado
- Cliente e profissional trocam mensagens em um chat vinculado à contratação
O backend expõe uma API REST responsável por usuários, profissionais (workers), tipos de serviço, contratações, propostas, mensagens, pagamentos e fotos, persistindo tudo em PostgreSQL via Drizzle ORM. O frontend consome essa API para oferecer uma experiência mobile-first com autenticação, busca de profissionais, chat e histórico de contratações.
O backend segue os princípios de Clean Architecture, com regra de dependência estrita: o domínio não depende de nada externo, a camada de aplicação (use cases) depende apenas do domínio, a infraestrutura implementa as interfaces do domínio e a apresentação (controllers HTTP) depende apenas dos use cases.
Back-end
- Node.js + TypeScript
- Fastify 5 — Servidor HTTP
- Drizzle ORM — Acesso ao PostgreSQL (schema, migrations e queries tipadas)
- PostgreSQL 18
- JSON Web Tokens (access token + refresh token) — Autenticação
- bcrypt — Hash de senhas
- Zod — Validação de entrada
- tsyringe — Injeção de dependências
- Vitest — Testes unitários e de integração
- Biome — Lint e formatação
Front-end
- React 19 + Vite 8
- React Router 7
- Axios — Consumo da API
- react-hot-toast — Notificações
Infraestrutura
- Docker Compose — Orquestração do banco PostgreSQL e do back-end
- Node.js 20+ e Yarn
- Docker e Docker Compose
Crie um arquivo .env na raiz do projeto com:
POSTGRES_USER=user
POSTGRES_PASSWORD=password
POSTGRES_DB=zelo
POSTGRES_HOST=localhost
POSTGRES_PORT=5432
HTTP_PORT=8000
NODE_ENV=development
MAX_SESSIONS=3
JWT_SECRET=uma-chave-secreta
FRONTEND_DOMAIN=http://localhost:5173docker compose up -dA API sobe em http://localhost:8000.
Alternativamente, para desenvolver localmente sem Docker:
cd back-end && yarn install && yarn dev(com o PostgreSQL já rodando e o.envconfigurado).
cd front-end
npm install
npm run devA aplicação fica disponível em http://localhost:5173.
cd back-end
yarn test-
🔐 Autenticação Cadastro e login com JWT (access + refresh token) e renovação automática de sessão
-
🧰 Profissionais e Tipos de Serviço Cadastro de profissionais (workers), associação a tipos de serviço e busca por categoria
-
🤝 Contratação e Propostas Abertura de uma contratação (hire) e negociação por rodadas de propostas até o aceite
-
💬 Chat Troca de mensagens entre cliente e profissional vinculada a cada contratação
-
💳 Pagamentos Processamento de pagamento vinculado à contratação, com controle de status
-
🖼️ Upload de Fotos Upload de foto de perfil do usuário e de fotos de portfólio do profissional
-
📜 Histórico Listagem de contratações e de contratações anteriores por usuário
| Recurso | Rota base | Descrição |
|---|---|---|
| Auth | POST /sign-in, POST /sign-up, POST /renew-token |
Login, cadastro e renovação de token |
| Usuários | PATCH /user, POST /user/photo |
Atualização de dados e foto de perfil |
| Profissionais | /worker |
Cadastro de worker e associação de tipos de serviço |
| Fotos do Profissional | /worker/photo |
Upload, listagem e remoção de fotos |
| Tipos de Serviço | /service-type |
Criação e busca de categorias de serviço |
| Contratações | /hire |
Criação, listagem e atualização de status |
| Propostas | /proposal |
Envio, listagem e aceite de propostas por contratação |
| Mensagens | /message |
Envio e listagem de mensagens do chat de uma contratação |
| Pagamentos | /payment |
Processamento e consulta de pagamento |
zelo/
│
├── back-end/ # API REST (Fastify + TypeScript)
│ ├── src/
│ │ ├── domain/ # Entidades, interfaces de repositório, erros de domínio
│ │ ├── app/use-cases/ # Regras de negócio (um caso de uso por ação)
│ │ ├── infra/ # Conexão com o banco, schema Drizzle, repositórios e providers
│ │ ├── presentation/http/ # Controllers Fastify e middlewares
│ │ └── common/ # Configuração de ambiente (env)
│ ├── tst/
│ │ ├── unit/ # Testes unitários (entidades e use cases)
│ │ ├── integration/ # Testes de integração (ex.: ciclo de vida da contratação)
│ │ └── mocks/ # Repositórios e providers em memória para testes
│ └── drizzle/ # Migrations do banco de dados
│
├── front-end/ # Aplicação web (React + Vite)
│ └── src/
│ ├── pages/ # Telas: auth, home, workers, hire, profile
│ ├── api/ # Client HTTP (Axios)
│ ├── context/ # Contexto de autenticação e sessão
│ └── components/ # Componentes de UI compartilhados
│
├── docs/ # Documentação do projeto (proposta, requisitos, diagramas, design)
│
└── docker-compose.yml # Orquestração do banco de dados e do back-end