API RESTful desenvolvida com NestJS para a plataforma IbiVibe, conectando aplicações mobile e web para gestão de cidades, negócios, eventos e conteúdo multimídia na região do Ibiapaba.
- Autenticação e Autorização: Registro, login/logout com JWT, refresh tokens e autenticação por cookies seguros.
- Gestão de Contas Unificada: Modelo único que combina dados de autenticação e perfil (slug, display_name, bio, avatar_url, type).
- Contas Personalizadas: Contas pessoais e empresariais com interesses e preferências.
- Cidades: Cadastro de cidades com localização geográfica (PostGIS), imagens de capa e categorias.
- Negócios (Businesses): Gestão de estabelecimentos comerciais com CNPJ, categorias, múltiplas localizações e reach level.
- Eventos: Criação e gerenciamento de eventos com datas, tipo (simple/featured), localização e categorias.
- Categorias: Sistema hierárquico de categorias para cidades, negócios e eventos.
- Leads: Captura e gestão de leads (residentes, turistas, empresários).
- Mídia: Upload e gestão de imagens/vídeos usando Cloudflare R2 CDN.
- Busca: Pesquisa unificada por cidades, negócios e eventos.
- Favoritos: Sistema de favoritos para cidades, eventos e negócios.
- Interesses: Gestão de interesses por categoria para contas.
- Documentação: API documentada com Swagger (disponível em ambiente de desenvolvimento).
- NestJS: Framework Node.js para construção de APIs escaláveis.
- TypeScript: Tipagem estática para maior segurança e manutenibilidade.
- Prisma: ORM moderno com suporte a PostgreSQL.
- PostgreSQL + PostGIS: Banco de dados relacional com suporte a dados geoespaciais.
- JWT: Autenticação baseada em tokens com suporte a refresh tokens.
- Cloudflare R2: Armazenamento de mídia com CDN público.
- Swagger/OpenAPI: Documentação interativa da API.
O projeto utiliza PostgreSQL com Prisma como ORM. Principais entidades:
- account: Modelo unificado que combina dados de autenticação e perfil (email, telefone, senha, slug, display_name, bio, avatar_url, type).
- business: Negócios associados a contas do tipo business (CNPJ, reach level, account_id).
- city: Cidades com localização geográfica (Point PostGIS), capa e descrição.
- event: Eventos com datas, tipo, owner (account_id) e localização.
- media: Mídia associada a contas, cidades ou eventos.
- category: Categorias hierárquicas para classificação de entidades.
- account_interest: Interesses de contas em categorias de negócios e eventos.
- account_favorite: Favoritos de contas (cidades, eventos, negócios).
- lead: Leads capturados através de formulários (residentes, turistas, empresários).
POST /auth/login- Autenticação de usuárioPOST /auth/register- Registro de novo usuárioPOST /auth/refresh- Renovação de tokenPOST /auth/logout- LogoutGET /auth/check-unique- Verificar uniqueness de camposGET /auth/me- Dados do usuário autenticado
GET /accounts- Listar todas as contas (paginado)GET /accounts/:id- Obter conta por IDPATCH /accounts/:id- Atualizar conta (incluindo campos de perfil)DELETE /accounts/:id- Remover contaGET /accounts/:id/interests- Obter interesses da contaPATCH /accounts/:id/interests- Atualizar interesses da conta
Nota: O
accountIdé extraído automaticamente do token JWT no headerAuthorization. Não é necessário passá-lo via path, query ou body.
GET /cities- Listar cidadesGET /cities/:id- Obter cidade por IDGET /cities/:id/media- Obter mídias da cidade
GET /categories- Listar categoriasGET /categories/parents- Listar categorias raizGET /categories/parents/:id/children- Listar subcategoriasGET /categories/:id- Obter categoria por IDPATCH /categories/:id- Atualizar categoriaDELETE /categories/:id- Remover categoria
POST /businesses- Criar negócioGET /businesses- Listar negóciosGET /businesses/:id- Obter negócio por IDPATCH /businesses/:id- Atualizar negócioDELETE /businesses/:id- Remover negócioGET /businesses/:id/media- Obter mídias do negócio
POST /events- Criar eventoGET /events- Listar eventosGET /events/:id- Obter evento por IDPATCH /events/:id- Atualizar eventoDELETE /events/:id- Remover evento
POST /leads- Criar leadGET /leads- Listar leadsGET /leads/:id- Obter lead por IDPATCH /leads/:id- Atualizar leadDELETE /leads/:id- Remover lead
POST /media/upload- Upload de mídia (Cloudflare R2)DELETE /media/:key- Remover mídia
GET /search- Busca unificada por cidades, negócios e eventos
git clone https://github.com/1manuelc/ibivibe-api.git
cd ibivibe-apinpm install
# ou
pnpm install
# ou
yarn installCrie um arquivo .env na raiz do projeto:
NODE_ENV="development"
PORT="3000"
SECRET_KEY="sua-chave-secreta-aqui"
DB_USER="seu-usuario"
DB_PASSWORD="sua-senha"
DB_NAME="ibivibe"
DB_PORT="5432"
DATABASE_URL="postgresql://usuario:senha@localhost:5432/ibivibe"
R2_ENDPOINT="https://..."
R2_ACCESS_KEY="..."
R2_SECRET_KEY="..."
R2_BUCKET="ibivibe-media"
R2_PUBLIC_URL="https://cdn.seudominio.com.br"Certifique-se de ter PostgreSQL rodando com a extensão PostGIS habilitada.
npx prisma migrate dev --name initnpm run start:devA API estará disponível em:
- API:
http://localhost:3000/api - Documentação Swagger:
http://localhost:3000/docs
npm run build- Compila o projeto TypeScriptnpm run lint- Executa o linternpm run lint:fix- Corrige problemas do linter automaticamente com Oxlintnpm run fmt- Formata código com Oxfmtnpm run fmt:check- Verifica formataçãonpm run start- Inicia em modo produçãonpm run start:dev- Inicia em modo desenvolvimento com hot-reloadnpm run db:migrate- Executa migrações em produçãonpm run db:migrate:dev- Executa migrações em desenvolvimentonpm run db:studio- Abre Prisma Studionpm run db:seed- Popula o banco com dados iniciaisnpm run test:unit- Executa testes unitáriosnpm run test:unit:cov- Executa testes com coveragenpm run test:e2e- Executa testes end-to-end
A API utiliza JWT com cookies seguros. O fluxo:
- Registro:
POST /auth/register - Login:
POST /auth/login - Requisições autenticadas: Envie o token no header
Authorization: Bearer <token> - Refresh:
POST /auth/refreshpara renovar tokens expirados
Todas as requisições são validadas usando class-validator e class-transformer, garantindo integridade dos dados. Erros retornam mensagens claras e estruturadas.
A API permite requisições das seguintes origens:
http://localhost:3001https://ibivibe.com.brhttps://www.ibivibe.com.brhttps://ibivibe-landingpage.vercel.app
O projeto segue a arquitetura modular do NestJS:
src/
├── modules/
│ ├── accounts/ - Gestão de contas unificadas
│ ├── auth/ - Autenticação e JWT
│ ├── businesses/ - Negócios/Estabelecimentos
│ ├── categories/ - Categorias hierárquicas
│ ├── cities/ - Cidades com geolocalização
│ ├── events/ - Eventos
│ ├── favorites/ - Sistema de favoritos
│ ├── leads/ - Leads e contato
│ ├── medias/ - Upload e gestão de mídia
│ ├── search/ - Busca unificada
│ └── app/ - Módulo raiz
├── common/ - Componentes compartilhados
├── utils/ - Funções utilitárias
└── main.ts - Ponto de entrada
@nestjs/core,@nestjs/common,@nestjs/platform-express@prisma/client,@prisma/adapter-pgjsonwebtoken,@types/jsonwebtokenargon2- Hash de senhasclass-validator,class-transformer@aws-sdk/client-s3- Integração com R2swagger-ui-express,@nestjs/swagger
typescriptjest,@nestjs/testingeslint,prettieroxlint,oxfmt
MIT