Uma plataforma completa de gerenciamento agrícola com dashboard inteligente, gestão de leads, propriedades rurais e distribuição de mapas geográficos.
- Clonar o repositório e instalar dependências
git clone https://github.com/alyssonlcss/marketShare.git
cd marketShare
cd backend && npm install
cd ../frontend && npm install- Configurar o banco PostgreSQL e o .env do backend
- Criar o banco
marketshare_dbe o usuáriomarketshare_user(ver seção "Configuração do Banco de Dados PostgreSQL"). - Criar o arquivo
backend/.envconforme o exemplo daquela seção.
- Carregar dados de teste
cd marketShare # pasta raiz, se ainda não estiver nela
psql -U marketshare_user -d marketshare_db -f dados-para-testes-insert/test-data.sql- Subir o backend (NestJS)
cd backend
npm run start:dev- Subir o frontend (Angular)
cd frontend
npm start- Logar no sistema
- Acesse
http://localhost:4200. - Use o usuário de teste (ver seção "Usuário de Teste (Login)").
- Dashboard operacional
- Visão geral de leads ativos, status e distribuição por área produtiva.
- Painel "Cartografia agro" com mapa geográfico das propriedades (Google Maps).
- Painel "Concentração territorial" com leads por município e detalhes de propriedades/leads.
- Gestão de Leads
- Listagem, filtros por nome e status, criação de novos leads via modal.
- Associação entre lead e propriedade rural.
- Gestão de Propriedades Rurais
- Listagem com cultura, hectares, município e link com o lead responsável.
- Drawer lateral com detalhes do lead associado à propriedade.
- Gestão de Produtos e Aderência
- Lista de produtos com filtros.
- Tabela de "Propriedades com match de cultura" mostrando aderência entre cultura da propriedade e categoria do produto.
- Drawer de lead associado à propriedade selecionada.
- Autenticação e Atribuição por Distribuidor
- Login com JWT, proteção de rotas e interceptação de chamadas HTTP.
- Filtros por atribuição (atribuído / não atribuído ao distribuidor atual) refletidos no dashboard, leads, propriedades e produtos.
- Backend
- NestJS 11 (TypeScript), arquitetura modular por domínio (auth, lead, propriedade-rural, produto, distribuidor).
- TypeORM com PostgreSQL.
- Validação com class-validator e autenticação com Passport (local + JWT).
- Frontend
- Angular 21 (standalone components).
- PrimeNG (tabelas, selects, layout) + PrimeFlex + PrimeIcons.
- Google Maps via @angular/google-maps.
- Estilização com SCSS e design focado em painel operacional agro.
- Qualidade e Testes
- Backend: Jest para testes unitários e e2e de API.
- Frontend: Karma/jasmine para unit tests e Playwright para testes e2e de interface.
- Ferramentas de apoio
- Node.js + npm para scripts de build/test.
- VS Code com extensões recomendadas para NestJS, Angular e banco de dados.
- Node.js: v20.0.0 ou superior
- npm: v11.6.0 ou superior (incluído no Node.js)
- PostgreSQL: v14 ou superior
- Git: para versionamento
node --version # deve retornar v20.x.x ou superior
npm --version # deve retornar 11.x.x ou superior
psql --version # deve retornar PostgreSQL 14.x ou superior- Baixe em: https://www.postgresql.org/download/windows/
- Siga o instalador
- Importante: Anote a senha do usuário
postgres
brew install postgresql
brew services start postgresqlsudo apt update
sudo apt install postgresql postgresql-contrib
sudo systemctl start postgresql# Conectar como superusuário
psql -U postgres
# Dentro do psql, executar:
CREATE USER marketshare_user WITH PASSWORD 'sua_senha_segura';
CREATE DATABASE marketshare_db OWNER marketshare_user;
# Conceder privilégios completos
GRANT ALL PRIVILEGES ON DATABASE marketshare_db TO marketshare_user;
# Sair
\qCriar arquivo backend/.env:
# Database
DATABASE_HOST=localhost
DATABASE_PORT=5432
DATABASE_USER=marketshare_user
DATABASE_PASSWORD=sua_senha_segura
DATABASE_NAME=marketshare_db
# JWT Secret
JWT_SECRET=sua_chave_jwt_super_secreta_com_minimo_32_caracteres
JWT_EXPIRATION=7d
# API
API_PORT=3000
NODE_ENV=developmentO script de dados de teste em dados-para-testes-insert/test-data.sql cria um usuário padrão para acessar o sistema em ambiente de desenvolvimento.
Após executar o script SQL no banco (veja a seção "Dados de Teste (SQL)"), utilize as credenciais abaixo na tela de login do frontend:
- E-mail:
alyssonlcss@gmail.com - Senha:
minhaSenha123
Essas credenciais são apenas para uso local/de desenvolvimento e não devem ser usadas em produção.
Para acelerar os testes locais, o repositório inclui um script SQL com dados de exemplo em dados-para-testes-insert/test-data.sql.
Esse script cria:
- Distribuidores e usuários de exemplo com credenciais de acesso.
- Leads (atribuídos e não atribuídos) com CPFs, telefones e e-mails válidos.
- Propriedades rurais em municípios de MG, com culturas e hectares.
- Produtos com categorias usadas para cálculo de "match de cultura".
No diretório raiz do projeto:
psql -U marketshare_user -d marketshare_db -f dados-para-testes-insert/test-data.sql- Ajuste o usuário (
-U) e o banco (-d) se tiver usado outros nomes na criação do banco. - Após rodar o script, você terá um usuário de teste para login (veja o próprio arquivo SQL para e-mail/senha) e dados suficientes para explorar todas as telas do sistema.
- ES7+ React/Redux/React-Native snippets (dsznajder.es7-react-js-snippets)
- ESLint (dbaeumer.vscode-eslint)
- Prettier - Code formatter (esbenp.prettier-vscode)
- Nest Snippets (fivepointseven.nest-snippets)
- Thunder Client (rangav.vscode-thunder-client) - para testar APIs
- Postman (Postman.postman-for-vscode)
- Angular Language Service (Angular.ng-template)
- Angular Snippets (johnpapa.Angular2)
- Prettier - Code formatter (esbenp.prettier-vscode)
- ESLint (dbaeumer.vscode-eslint)
- Thunder Client (rangav.vscode-thunder-client)
- CSS Peek (pranaygp.vscode-css-peek)
- GitLens (eamodio.gitlens)
- Git Graph (mhutchie.git-graph)
- Todo Tree (Gruntfuggly.todo-tree)
- Thunder Client (rangav.vscode-thunder-client)
- pgAdmin ou DBeaver (aplicativos desktop) para administrar o PostgreSQL, inspecionar tabelas e rodar SQL manualmente.
- SQLTools (mtxr.sqltools) ou Database Client (cweijan.vscode-database-client2) para gerenciar o banco diretamente pelo VS Code.
- Recomenda-se configurar uma conexão para o banco
marketshare_dbpara visualizar facilmente as tabelas geradas pelo TypeORM e os dados inseridos pelo script de testes.
Instalar tudo de uma vez:
code --install-extension dsznajder.es7-react-js-snippets \
dbaeumer.vscode-eslint \
esbenp.prettier-vscode \
fivepointseven.nest-snippets \
rangav.vscode-thunder-client \
Postman.postman-for-vscode \
Angular.ng-template \
johnpapa.Angular2 \
pranaygp.vscode-css-peek \
eamodio.gitlens \
mhutchie.git-graph \
Gruntfuggly.todo-treegit clone https://github.com/alyssonlcss/marketShare.git
cd marketSharecd backend
npm installcd ../frontend
npm installCriar backend/.env com as variáveis do PostgreSQL (veja seção acima).
Criar frontend/.env se necessário (geralmente não é obrigatório para desenvolvimento local).
Terminal 1 - Backend:
cd backend
npm run start:devSerá acessível em: http://localhost:3000
Terminal 2 - Frontend:
cd frontend
npm startSerá acessível em: http://localhost:4200
# Terminal principal
npm run start:dev:all # Se configurado em scripts de raiz{
"@nestjs/common": "^11.0.1",
"@nestjs/config": "^4.0.2",
"@nestjs/core": "^11.0.1",
"@nestjs/jwt": "^11.0.2",
"@nestjs/passport": "^11.0.5",
"@nestjs/typeorm": "^11.0.0",
"bcryptjs": "^3.0.3",
"class-validator": "^0.14.3",
"passport-jwt": "^4.0.1",
"passport-local": "^1.0.0",
"pg": "^8.16.3",
"typeorm": "^0.3.28"
}{
"@angular/core": "^21.0.0",
"@angular/forms": "^21.0.0",
"@angular/google-maps": "^21.0.6",
"@angular/router": "^21.0.0",
"primeng": "^21.0.2",
"primeicons": "^7.0.0",
"rxjs": "~7.8.0"
}marketShare/
├── backend/ # API NestJS
│ ├── src/
│ │ ├── auth/ # Autenticação JWT
│ │ ├── lead/ # Módulo de Leads
│ │ ├── propriedade-rural/ # Módulo de Propriedades
│ │ ├── produto/ # Módulo de Produtos
│ │ ├── distribuidor/ # Módulo de Distribuidores
│ │ └── ...
│ ├── .env # Variáveis de ambiente
│ └── package.json
│
├── frontend/ # App Angular
│ ├── src/
│ │ ├── app/
│ │ │ ├── features/
│ │ │ │ ├── dashboard/ # Dashboard principal
│ │ │ │ ├── leads/ # Gerenciamento de leads
│ │ │ │ ├── propriedades/ # Gerenciamento de propriedades
│ │ │ │ ├── mapa-propriedades/ # Mapa Google Maps
│ │ │ │ └── ...
│ │ │ ├── core/
│ │ │ │ ├── guards/
│ │ │ │ ├── interceptors/
│ │ │ │ ├── models/
│ │ │ │ └── services/
│ │ │ └── ...
│ │ └── styles/ # Estilos globais
│ ├── .env # Variáveis de ambiente (opcional)
│ └── package.json
│
├── .gitignore
└── README.md
npm start # Rodar em produção
npm run start:dev # Modo desenvolvimento com watch
npm run start:debug # Modo debug
npm run build # Build para produção
npm run test # Executar testes
npm run test:cov # Testes com cobertura
npm run lint # ESLint
npm run format # Prettiernpm start # Modo desenvolvimento (port 4200)
npm run build # Build para produção
npm run watch # Watch mode
npm test # Testes unitários
npm run e2e # Testes end-to-end (Playwright)
npm run serve:ssr:marketshare-frontend # SSRO projeto possui testes automatizados tanto no backend quanto no frontend.
No diretório backend:
cd backend
# Testes unitários (services, controllers, etc.)
npm test
# Testes e2e da API (rotas reais subindo um app Nest em memória)
npm run test:e2eOs arquivos de teste ficam em src/**/*.spec.ts (unitários) e em test/**/*.e2e-spec.ts (e2e, conforme configuração do Jest).
No diretório frontend:
cd frontend
# Testes unitários (componentes, serviços)
npm test
# Primeiro uso do Playwright: instalar browsers
npx playwright install
# Testes end-to-end (login, dashboard, leads, propriedades, produtos)
npm run e2e- Os testes unitários ficam em
src/app/**/*.spec.ts. - Os testes e2e estão em frontend/e2e, cobrindo:
- Autenticação e acesso ao dashboard.
- Fluxos de lista e filtro de leads.
- Listagem e detalhes de propriedades e drawer de "Lead associado".
- Tela de produtos com aderência por cultura e drawer de lead.
Dica: execute primeiro o script de dados de teste para garantir que as telas tenham conteúdo suficiente e que os cenários e2e encontrem os registros esperados.
URL base em desenvolvimento: http://localhost:3000
POST /auth/login- Corpo:
{ "email": string, "password": string }. - Retorna um
access_token(JWT) e os dados básicos do usuário. - Deve ser usado pelo frontend para autenticar e armazenar o token.
- Corpo:
GET /lead- Lista leads visíveis para o distribuidor do usuário autenticado.
- Aceita filtros via query string (por exemplo, status, atribuição, etc.).
GET /lead/:id- Detalhes de um lead específico.
POST /lead- Cria um novo lead (usa
CreateLeadDtopara validação de campos obrigatórios).
- Cria um novo lead (usa
PATCH /lead/:id- Atualiza parcialmente um lead existente.
DELETE /lead/:id- Remove um lead (retorna
204 No Contentem caso de sucesso).
- Remove um lead (retorna
GET /propriedade-rural- Lista propriedades rurais vinculadas ao distribuidor/usuário autenticado, com filtros opcionais.
GET /propriedade-rural/:id- Detalhes de uma propriedade específica (incluindo relação com lead/distribuidor).
POST /propriedade-rural- Cria uma nova propriedade rural.
PATCH /propriedade-rural/:id- Atualiza dados da propriedade.
DELETE /propriedade-rural/:id- Remove uma propriedade (retorna
204 No Content).
- Remove uma propriedade (retorna
GET /produto- Lista produtos do distribuidor atual, com suporte a filtros (por categoria, etc.).
GET /produto/:id- Detalhes de um produto.
POST /produto- Cria novo produto vinculado ao distribuidor do usuário autenticado.
PATCH /produto/:id- Atualiza dados do produto.
DELETE /produto/:id- Remove um produto (retorna
204 No Content).
- Remove um produto (retorna
GET /distribuidor- Lista distribuidores cadastrados (útil para administração ou telas de configuração).
Todos os endpoints (exceto
/auth/login) exigem cabeçalhoAuthorization: Bearer <token>com o JWT obtido no login.
O projeto utiliza Google Maps API para exibir propriedades rurais geograficamente.
- Ir para Google Cloud Console
- Criar novo projeto
- Ativar Maps JavaScript API e Places API
- Gerar uma chave API
- Adicionar no
frontend/index.html:
<script async
src="https://maps.googleapis.com/maps/api/js?key=SUA_API_KEY&libraries=maps,marker">
</script>O projeto usa JWT (JSON Web Tokens) para autenticação.
POST http://localhost:3000/auth/login
Content-Type: application/json
{
"email": "usuario@example.com",
"password": "senha123"
}Resposta:
{
"access_token": "eyJhbGc...",
"user": { "id": 1, "email": "usuario@example.com" }
}# Matar processo na porta 3000
# Windows
netstat -ano | findstr :3000
taskkill /PID <PID> /F
# Linux/macOS
lsof -ti:3000 | xargs kill -9- Verificar se PostgreSQL está rodando
- Confirmar variáveis de ambiente em
backend/.env - Testar conexão:
psql -U marketshare_user -d marketshare_db -h localhost
cd frontend
npm install
npm run build- Verificar se backend está rodando em
http://localhost:3000 - Verificar CORS em
backend/src/main.ts - Abrir DevTools (F12) e verificar aba Network
Para dúvidas ou problemas:
- Criar issue no repositório
- Revisar logs do backend/frontend
- Consultar documentação: NestJS Docs, Angular Docs
UNLICENSED - Projeto privado