An open API service indexing awesome lists of open source software.

https://github.com/renanjava/testes-escola-de-ti


https://github.com/renanjava/testes-escola-de-ti

Last synced: 3 months ago
JSON representation

Awesome Lists containing this project

README

          

![Badge em Desenvolvimento](http://img.shields.io/static/v1?label=STATUS&message=EM%20DESENVOLVIMENTO&color=GREEN)

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 em src/infrastructure/services/orm/prisma.service.ts onde 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ção onModuleInit()


  • Factory Method:
    Na classe UserService localizada em src/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 em src/infrastructure/services/auth/auth.service.ts utiliza o padrão Strategy para encapsular a lógica de autenticação. Definimos uma interface AuthStrategy com um método abstrato authenticate. 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; e GoogleAuth, que implementa a autenticação via Google e retorna um token. A AuthService depende apenas da interface AuthStrategy, permitindo a utilização de BasicAuth, GoogleAuth ou outras estratégias sem modificar o código.

🔀 Git Flow



  • Apenas a branch main representa o ambiente de produção.


  • Ninguém pode fazer push direto para main, 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, exceto main.


  • advanced-check: Verificação avançada de código (testes E2E). Acionado em PRs para a branch main.


  • push-dockerhub: Geração e push de imagens Docker. Acionado em PRs para main (gera artefato) e em push para main (push para DockerHub).

🛠️ Instalação do Projeto



  1. Clone o repositório:
    git clone https://github.com/renanjava/testes-escola-de-ti

  2. Acesse o diretório do projeto:
    cd testes-escola-de-ti

  3. Instale as dependências:
    npm install

  4. Configure as variáveis de ambiente:
    cp .env.example .env

🖥️ Como Rodar a API



  1. Certifique-se de ter o Docker instalado e em execução.

  2. Faça o pull da imagem Docker:
    docker pull renancesu/cafe-com-type:latest

  3. 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.