Backend da aplicação LocalHub, uma plataforma mobile de divulgação e descoberta de comércios locais com funcionamento inspirado em redes sociais.
A proposta do sistema é permitir que o usuário, com base em sua localização, visualize estabelecimentos comerciais próximos e explore publicações feitas por esses comércios em categorias como restaurantes, lojas de roupas, shoppings, mercados, entre outras.
O backend do LocalHub é responsável por fornecer a infraestrutura da aplicação, incluindo:
- gerenciamento de dados dos comércios;
- organização por categorias;
- disponibilização de publicações para o feed;
- integração com banco de dados PostgreSQL;
- documentação da API com Swagger;
- geocodificação reversa para sugerir endereço a partir de latitude/longitude.
A documentação técnica complementar fica em:
docs/
├── README.md
├── backend-architecture.md
└── database.md
- LocalHub - Backend
- Node.js
- Express
- PostgreSQL
- Swagger
- Docker
- Docker Compose
- OpenStreetMap/Nominatim
Este é o fluxo recomendado para executar o backend.
O docker-compose.yml sobe dois serviços:
postgres: banco de dados PostgreSQL;backend: aplicação Node.js/Express.
git clone https://github.com/JSangaleti/LocalHub_Back-end.git
cd LocalHub_Back-endSe estiver trabalhando durante a sprint, utilize a branch de desenvolvimento:
git checkout developmentdocker compose up -d --buildEsse comando constrói a imagem da aplicação e sobe os containers do backend e do PostgreSQL.
Depois que os containers estiverem rodando, execute:
docker compose exec backend npm run db:initEsse comando aplica as migrations e executa o seed inicial no banco.
- API: http://localhost:3000
- Health check: http://localhost:3000/api/health
- Swagger: http://localhost:3000/docs
Após npm run db:init ou npm run db:seed, o sistema possui um único usuário administrador:
| Campo | Valor |
|---|---|
admin@admin.com |
|
| Senha | admin123 |
Não é possível criar outro usuário admin pelo cadastro público (POST /api/auth/register).
Para acompanhar os logs do backend:
docker compose logs -f backendPara acompanhar os logs do PostgreSQL:
docker compose logs -f postgresdocker compose downCaso seja necessário apagar o volume do PostgreSQL e recriar o banco do zero:
docker compose down -v
docker compose up -d --build
docker compose exec backend npm run db:initAtenção: o comando
docker compose down -vremove os volumes do Docker, apagando os dados locais do banco.
Use este fluxo apenas se quiser rodar a API diretamente na máquina, fora do container, mantendo somente o PostgreSQL no Docker.
npm installCrie ou ajuste o arquivo .env na raiz do projeto:
PORT=3000
PROJECT_NAME=localhub
DB_HOST=localhost
DB_PORT=5432
DB_USER=postgres
DB_PASSWORD=postgres
DB_NAME=localhubdb
NOMINATIM_BASE_URL=https://nominatim.openstreetmap.org
NOMINATIM_USER_AGENT=LocalHub_Back-end/1.0 (https://github.com/JSangaleti/LocalHub_Back-end)Em modo local, o DB_HOST deve ser localhost, pois a aplicação está rodando fora do Docker.
A geocodificação reversa usa OpenStreetMap/Nominatim.
| Variável | Obrigatória | Valor padrão | Função |
|---|---|---|---|
NOMINATIM_BASE_URL |
Não | https://nominatim.openstreetmap.org |
URL base do serviço de geocodificação reversa. |
NOMINATIM_USER_AGENT |
Não | LocalHub_Back-end/1.0 (https://github.com/JSangaleti/LocalHub_Back-end) |
Identificação enviada ao Nominatim nas requisições. |
Mesmo tendo valor padrão no código, é recomendado configurar NOMINATIM_USER_AGENT de forma identificável, principalmente em ambientes compartilhados.
docker compose up -d postgresNão use docker compose up -d neste fluxo, pois esse comando também sobe o container do backend e pode causar conflito com o npm run dev usando a mesma porta 3000.
npm run db:initnpm run devAcesse:
- API: http://localhost:3000
- Health check: http://localhost:3000/api/health
- Swagger: http://localhost:3000/docs
No Docker Compose, as variáveis do backend são definidas diretamente no serviço backend.
Dentro do Docker, o backend deve se conectar ao banco usando:
DB_HOST=postgresIsso acontece porque postgres é o nome do serviço do banco no docker-compose.yml.
Em execução local, o backend deve usar:
DB_HOST=localhostOs arquivos de banco ficam em src/database:
schema.sql: estrutura relacional inicial;seed.sql: dados iniciais para ambiente local;migrations/*.sql: migrations versionadas da estrutura do banco;run-sql.js: executor para aplicar schema, migrations e seed usando as variáveis de ambiente do projeto.
Scripts disponíveis:
npm run db:schema
npm run db:migrate
npm run db:seed
npm run db:init| Script | Função |
|---|---|
npm run db:schema |
Aplica o schema |
npm run db:migrate |
Executa migrations pendentes |
npm run db:seed |
Insere dados iniciais |
npm run db:init |
Executa migrations e seed |
No Docker, execute os scripts dentro do container do backend:
docker compose exec backend npm run db:initEm modo local, execute diretamente na máquina:
npm run db:initO backend possui um endpoint auxiliar para sugerir endereço a partir de latitude e longitude.
Esse recurso foi pensado para o fluxo do frontend em que o usuário seleciona um ponto no mapa. Depois que o ponto é confirmado, o app envia as coordenadas para o backend, e a API retorna uma sugestão de endereço estruturado.
GET /api/locations/reverse?lat=-24.0463&lng=-52.3780Parâmetros:
| Parâmetro | Obrigatório | Descrição |
|---|---|---|
lat |
Sim | Latitude do ponto selecionado. Deve estar entre -90 e 90. |
lng |
Sim | Longitude do ponto selecionado. Deve estar entre -180 e 180. |
Também é aceito lon como alternativa para lng.
curl "http://localhost:3000/api/locations/reverse?lat=-24.0463&lng=-52.3780"{
"address": "Rua Brasil",
"addressNumber": null,
"neighborhood": "Centro",
"city": "Campo Mourão",
"state": "PR",
"postalCode": "87300-000",
"country": "Brasil",
"latitude": -24.0463,
"longitude": -52.378,
"formattedAddress": "Rua Brasil - Centro - Campo Mourão - PR",
"provider": {
"name": "Nominatim",
"displayName": "Rua Brasil, Centro, Campo Mourão, Paraná, Brasil",
"licence": "Data © OpenStreetMap contributors, ODbL 1.0."
}
}| Status | Quando ocorre |
|---|---|
400 |
lat ou lng ausente, inválido ou fora da faixa permitida. |
404 |
O provedor não encontrou endereço para as coordenadas informadas. |
429 |
O limite de requisições do serviço de geocodificação foi atingido. |
502 |
O serviço externo de geocodificação está indisponível. |
500 |
Erro interno ao processar a geocodificação reversa. |
- Chame esse endpoint apenas quando o usuário confirmar o ponto no mapa.
- Não chame esse endpoint continuamente durante o arraste do mapa.
- O endereço retornado é uma sugestão e pode precisar de correção manual.
- O número do estabelecimento deve ser confirmado ou preenchido pelo usuário.
- O backend usa cache simples em memória para reduzir chamadas repetidas ao serviço externo.
Todos os endpoints estão documentados no Swagger:
http://localhost:3000/docs
As rotas principais são registradas a partir de /api:
/api/health
/api/auth
/api/users
/api/categories
/api/stores
/api/posts
/api/uploads
/api/locations/reverse
A documentação técnica do backend fica na pasta docs/.
Arquivos principais: