Este é um projeto de API GraphQL para o "Bytebank Pro", um sistema de backend para microfrontends. A API é construída com Node.js, TypeScript, Apollo Server, Express e MongoDB.
O sistema oferece funcionalidades de autenticação de usuários, incluindo registro e login com senhas criptografadas, e gerenciamento de transações financeiras. Os usuários autenticados podem criar, ler, atualizar e deletar suas próprias transações, além de visualizar um resumo com o saldo e a discriminação dos tipos de transação. A API também inclui paginação para a listagem de transações, garantindo um desempenho eficiente. A autenticação é realizada via JSON Web Tokens (JWT), e as rotas protegidas são acessíveis apenas com um token válido.
O projeto está configurado para ser executado com Docker, tanto para o banco de dados MongoDB quanto para a própria API, e inclui um modo de desenvolvimento com hot reload para facilitar a codificação.
- Autenticação de Usuário: Registro e login seguros com JWT.
- Gerenciamento de Transações: Operações de CRUD (Criar, Ler, Atualizar, Deletar) para transações financeiras.
- Resumo Financeiro: Endpoint para obter o saldo atual e um resumo das transações.
- Paginação: Suporte para paginação na listagem de transações.
- Segurança: Senhas criptografadas e rotas protegidas por autenticação.
- CORS Inteligente: Configuração automática de CORS baseada no ambiente (desenvolvimento vs produção).
As seguintes tecnologias foram utilizadas na construção desta API:
- Node.js
- TypeScript
- GraphQL com Apollo Server
- Express.js
- MongoDB com Mongoose
- Docker
- TypeGraphQL para a construção de schemas e resolvers
- JWT (JSON Web Token) para autenticação
- Bcrypt.js para criptografia de senhas
A estrutura de pastas do projeto está organizada da seguinte forma:
/
├── src/
│ ├── config/
│ │ └── index.ts
│ ├── middleware/
│ │ └── index.ts
│ ├── models/
│ │ └── index.ts
│ ├── resolvers/
│ │ └── index.ts
│ ├── schema/
│ │ └── index.ts
│ ├── types/
│ │ └── index.ts
│ ├── utils/
│ │ └── index.ts
│ └── index.ts
├── .env.example
├── .gitignore
├── docker-compose.yml
├── Dockerfile
├── .prettierignore
├── nodemon.json
├── package-lock.json
├── package.json
├── README.md
├── vitest.config.ts
└── tsconfig.json
Pré-requisitos:
- Node.js (versão >=18.0.0)
- Docker
Passo a passo:
-
Clone o repositório:
git clone https://github.com/Brendhon/bytebank-api.git
-
Navegue até o diretório do projeto:
cd bytebank-api -
Instale as dependências:
npm install
-
Crie um arquivo
.envna raiz do projeto com base no.env.example. Você pode usar o seguinte comando para copiar o arquivo de exemplo:cp .env.example .env
O arquivo
.envdeve conter as seguintes variáveis:MONGO_URI=mongodb://localhost:27017/bytebankdb PORT=4000 JWT_SECRET=seu_segredo_jwt NODE_ENV=development # Adicione os domínios permitidos separados por vírgula. Caso não forneça, o CORS permitirá todas as origens. ALLOWED_ORIGINS=https://yourdomain.com,https://www.yourdomain.com
A API implementa uma configuração de CORS (Cross-Origin Resource Sharing) que se adapta automaticamente ao ambiente de execução:
- Permite todas as origens: Durante o desenvolvimento (
NODE_ENV !== "production"), o CORS permite requisições de qualquer origem. - Credentials habilitado: Permite envio de cookies e headers de autorização.
- Apenas domínios permitidos: Em produção (
NODE_ENV === "production"), apenas os domínios listados na variávelALLOWED_ORIGINSsão aceitos. - CORS aberto se não houver domínios: Caso a variável
ALLOWED_ORIGINSnão seja fornecida, o CORS permitirá todas as origens, mesmo em produção. - Verificação de origem: Cada requisição tem sua origem verificada contra a lista de domínios permitidos.
- Requisições sem origem: Permite requisições sem origem (útil para apps mobile e testes com curl).
Desenvolvimento:
NODE_ENV=development
# ALLOWED_ORIGINS não é necessário em desenvolvimentoProdução:
NODE_ENV=production
ALLOWED_ORIGINS=https://bytebankpro.com,https://www.bytebankpro.com,https://app.bytebankpro.comModo de Desenvolvimento (com Hot Reload):
Este modo é ideal para o desenvolvimento, pois o servidor reinicia automaticamente a cada alteração no código.
# Inicia o container do MongoDB e a API
npm run devQuando terminar de desenvolver, você pode parar o container do MongoDB com:
npm run dev:stopModo Docker Completo: Este modo executa toda a aplicação em containers Docker, simulando um ambiente de produção.
# Constrói e inicia os containers
docker compose upPara forçar a reconstrução das imagens, utilize:
docker compose up --buildA API estará disponível em http://localhost:4000/graphql.
Este projeto possui integração contínua configurada com GitHub Actions. Sempre que há um merge na branch main, é automaticamente:
- 🔨 Buildada uma nova imagem Docker
- 🏷️ Criadas tags baseadas na versão do
package.json - 📦 Publicada no Docker Hub como
brendhon/bytebank-api-graphql
Você pode usar as imagens publicadas diretamente:
# Versão específica (recomendado)
docker pull brendhon/bytebank-api-graphql:1.0.0
docker run -p 4000:4000 brendhon/bytebank-api-graphql:1.0.0
# Sempre a versão mais recente
docker pull brendhon/bytebank-api-graphql:latest
docker run -p 4000:4000 brendhon/bytebank-api-graphql:latest📖 Para mais detalhes sobre configuração de CI/CD, troubleshooting e estratégias de deploy, consulte: docs/DOCKER_CI_CD.md
npm run dev: Inicia a API em modo de desenvolvimento com hot reload.npm run dev:stop: Para o container do MongoDB.npm start: Executa a API em modo de produção (requer compilação prévia).npm run build: Compila o código TypeScript.npm run format: Formata o código com o Prettier.npm test: Executa os testes automatizados.
Este projeto está sob a licença MIT. Veja o arquivo LICENSE para mais detalhes.