https://github.com/renanjava/testes-escola-de-ti
https://github.com/renanjava/testes-escola-de-ti
Last synced: 3 months ago
JSON representation
- Host: GitHub
- URL: https://github.com/renanjava/testes-escola-de-ti
- Owner: renanjava
- Created: 2025-02-14T03:44:10.000Z (over 1 year ago)
- Default Branch: main
- Last Pushed: 2025-02-14T23:29:19.000Z (over 1 year ago)
- Last Synced: 2025-02-15T00:18:26.688Z (over 1 year ago)
- Language: TypeScript
- Size: 99.6 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README

Sistema de Delivery para Padarias
📌 Visão Geral
Este é o back-end de um sistema de delivery para padarias, desenvolvido em TypeScript utilizando o framework NestJS. O projeto inclui diversas funcionalidades essenciais para um sistema de delivery moderno, tais como:
-
Autenticação com JWT Tokens: Utiliza JSON Web Tokens para autenticação segura e eficiente. -
Controle de Acesso Baseado em Papéis: Implementa controle de acesso granular com base em papéis de usuário, permitindo a criação de rotas específicas para administradores, gerentes e usuários comuns. -
Rotas Privadas e Públicas: Diferencia rotas que requerem autenticação de rotas acessíveis publicamente. -
Administração de Padarias: Administradores podem criar padarias e designar gerentes responsáveis. -
Gerenciamento de Produtos: Gerentes podem adicionar produtos apenas às padarias que possuem permissão. -
Relacionamentos entre Entidades: Relacionamentos bem definidos entre usuários, padarias e produtos. -
Envio de E-mails: Integração com serviços de envio de e-mails para notificações e recuperação de senha. -
Clean Architecture: Arquitetura desacoplada com princípios de Clean Architecture e Hexagonal Architecture (adapters). -
Funcionalidades de Login e Registro: Permite que novos usuários se registrem e usuários existentes façam login para acessar funcionalidades protegidas. -
Integração com Docker: A aplicação está disponível no DockerHub, facilitando a implantação e execução em ambientes de produção. -
Manipulação de Banco de Dados com Prisma: Utiliza Prisma como ORM para interações eficientes e seguras com o banco de dados PostgreSQL. -
Testes Automatizados: Inclui testes unitários, de integração e E2E para garantir a qualidade e a estabilidade do código.
🔥 Stack Utilizada
-
Node.js: v20.12.2 -
NestJS: v11.0.10 -
JWT: @nestjs/jwt v11.0.0 -
Bcrypt: v5.1.1 -
Class Transformer: v0.5.1 -
Class Validator: v0.14.1 -
Jest: v29.7.0 -
Prettier: v3.4.2 -
Prisma: v6.4.0 -
ESLint: v9.20.1 -
Faker.js: v9.5.0 -
Supertest: v6.3.3 -
UUID: v9.0.0
🚀 Tecnologias Utilizadas
-
Linguagem: TypeScript
- Adiciona tipagem estática e melhora a segurança e produtividade no desenvolvimento.
-
Framework: NestJS
- Framework modular baseado em Node.js, ideal para aplicações escaláveis.
-
Autenticação: JWT e Bcrypt
- JWT para autenticação baseada em tokens e Bcrypt para hash seguro de senhas.
-
Transformação de Dados: Class Transformer
- Facilita a conversão de objetos entre classes e DTOs automaticamente.
-
Validação de Dados: Class Validator
- Permite validar dados de entrada usando decorators simples e intuitivos.
-
Testes: Jest e Supertest
- Jest para testes unitários e de integração, e Supertest para testes de integração de APIs.
-
Padronização de Código: Prettier e ESLint
- Prettier para formatação automática e ESLint para análise de boas práticas.
-
ORM: Prisma
- Facilita o mapeamento de entidades e operações com banco de dados de forma intuitiva.
-
Fakes e Mocking: Faker.js
- Gera dados fictícios realistas para criação de cenários de testes.
-
CI/CD: GitHub Actions
- Pipeline automatizado garante qualidade e integridade do código antes do merge.
- Geração de artefatos Docker e push para Docker Hub.
-
Containerização: Docker e DockerHub
- Docker para criar contêineres e DockerHub para armazenar e distribuir imagens Docker.
-
Controle de Versão: Git e GitHub
- Git para controle de versão e GitHub para hospedagem de repositórios e integração contínua.
-
Controle de Acesso: RBAC
- Implementa controle de acesso baseado em papéis (Role-Based Access Control).
-
UUID
- Usado para gerar e armazenar UUIDs, garantindo que não haverá repetição e que não serão fáceis de descobrir.
📂 Estrutura do Projeto
/src
|-- application/ # Camada de aplicação (use cases, DTOs, errors)
|-- domain/ # Camada de domínio (entidades e interfaces)
|-- infrastructure/ # Camada de infraestrutura (controllers, adapters, pipes, repositories)
|-- main.ts # Arquivo principal da aplicação
🌀 Design Patterns
-
Singleton: Usando a injeção de dependências do Nest.js, por padrão, ele já aplica o Singleton, as dependências que ele gerencia são únicas. Tenho o PrismaService localizado emsrc/infrastructure/services/orm/prisma.service.tsonde eu passo a responsabilidade para o framework instanciar e através dos módulos (o núcleo da aplicação), eu uso a mesma instância gerenciada pelo Nest.js, portanto, tenho apenas uma conexão com o banco de dados, a funçãoonModuleInit() -
Factory Method:
Na classe UserService localizada emsrc/infrastructure/services/user/user.service.ts, eu instanciava os UseCases diretamente em cada método. No entanto, apliquei o padrão de design Factory para centralizar a criação das instâncias. Agora, todos os UseCases são instanciados na própria classe, e um único método é responsável por retornar as instâncias já criadas. Portanto, a Controller deixa de utilizar uma service e usa apenas uma Factory, a UserService foi deletada.
-
Strategy: Na rota de login, a AuthService localizada emsrc/infrastructure/services/auth/auth.service.tsutiliza o padrão Strategy para encapsular a lógica de autenticação. Definimos uma interfaceAuthStrategycom um método abstratoauthenticate. Duas implementações foram criadas:BasicAuth, que executa o caso de uso para buscar o usuário, valida a senha e gera um token JWT; eGoogleAuth, que implementa a autenticação via Google e retorna um token. A AuthService depende apenas da interfaceAuthStrategy, permitindo a utilização deBasicAuth,GoogleAuthou outras estratégias sem modificar o código.
🔀 Git Flow
- Apenas a branch
mainrepresenta o ambiente de produção. -
Ninguém pode fazer push direto paramain, apenas via Pull Request. - Cada desenvolvedor deve criar sua branch no formato:
dev/nome - Após finalizar a implementação, deve abrir um Pull Request para
main. - O PR só será aceito se passar na pipeline de CI/CD
🚀 Workflows e Jobs de CI/CD
-
basic-check: Verificação básica de código (testes unitários, linter e testes de integração). Acionado em todo push para qualquer branch, excetomain. -
advanced-check: Verificação avançada de código (testes E2E). Acionado em PRs para a branchmain. -
push-dockerhub: Geração e push de imagens Docker. Acionado em PRs paramain(gera artefato) e em push paramain(push para DockerHub).
🛠️ Instalação do Projeto
- Clone o repositório:
git clone https://github.com/renanjava/testes-escola-de-ti - Acesse o diretório do projeto:
cd testes-escola-de-ti - Instale as dependências:
npm install - Configure as variáveis de ambiente:
cp .env.example .env
🖥️ Como Rodar a API
- Certifique-se de ter o Docker instalado e em execução.
- Faça o pull da imagem Docker:
docker pull renancesu/cafe-com-type:latest - Suba os contêineres:
npm run docker:up
📚 Rotas da API
Autenticação
-
POST /auth/login: Autentica um usuário e retorna um token JWT. -
POST /auth/register: Registra um novo usuário.
Admin
-
POST /admin/bakery: Cria uma nova padaria. -
PATCH /admin/bakery/:id/manager: Define um gerente para uma padaria. -
GET /admin/users: Lista todos os usuários.
Gerente
-
POST /manager/product: Adiciona um produto à padaria gerenciada. -
GET /manager/products: Lista produtos da padaria gerenciada.
Usuário
-
GET /user: Retorna o perfil do usuário autenticado. -
PATCH /user: Atualiza o perfil do usuário autenticado.
Produtos
-
GET /products: Lista todos os produtos disponíveis. -
GET /products/:id: Retorna detalhes de um produto específico.
⚙️ Testes
- Para rodar os testes unitários:
npm run test:unit - Para rodar os testes de integração:
npm run test:int - Para rodar os testes de ponta a ponta (E2E):
npm run test:e2e - Para rodar os testes com cobertura de código:
npm run test:cov
📄 Licença
Este projeto está licenciado sob a Licença MIT. Veja o arquivo LICENSE para mais detalhes.