{"id":25529182,"url":"https://github.com/renanjava/testes-escola-de-ti","last_synced_at":"2026-03-16T04:32:40.946Z","repository":{"id":277616440,"uuid":"932524405","full_name":"renanjava/testes-escola-de-TI","owner":"renanjava","description":null,"archived":false,"fork":false,"pushed_at":"2025-02-14T23:29:19.000Z","size":102,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-02-15T00:18:26.688Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/renanjava.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2025-02-14T03:44:10.000Z","updated_at":"2025-02-14T23:29:22.000Z","dependencies_parsed_at":"2025-02-15T00:18:30.613Z","dependency_job_id":"58cf5751-b34e-44b6-a00c-01eb90f7da8f","html_url":"https://github.com/renanjava/testes-escola-de-TI","commit_stats":null,"previous_names":["renanjava/testes-escola-de-ti"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/renanjava%2Ftestes-escola-de-TI","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/renanjava%2Ftestes-escola-de-TI/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/renanjava%2Ftestes-escola-de-TI/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/renanjava%2Ftestes-escola-de-TI/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/renanjava","download_url":"https://codeload.github.com/renanjava/testes-escola-de-TI/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":239753636,"owners_count":19691152,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-02-19T23:31:53.285Z","updated_at":"2026-03-16T04:32:40.939Z","avatar_url":"https://github.com/renanjava.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"![Badge em Desenvolvimento](http://img.shields.io/static/v1?label=STATUS\u0026message=EM%20DESENVOLVIMENTO\u0026color=GREEN)\n\n\u003ch1\u003eSistema de Delivery para Padarias\u003c/h1\u003e\n\n\u003ch2\u003e📌 Visão Geral\u003c/h2\u003e\n\u003cp\u003eEste é 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:\u003c/p\u003e\n\u003cul\u003e\n    \u003cli\u003e\u003cstrong\u003eAutenticação com JWT Tokens:\u003c/strong\u003e Utiliza JSON Web Tokens para autenticação segura e eficiente.\u003c/li\u003e\n    \u003cli\u003e\u003cstrong\u003eControle de Acesso Baseado em Papéis:\u003c/strong\u003e 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.\u003c/li\u003e\n    \u003cli\u003e\u003cstrong\u003eRotas Privadas e Públicas:\u003c/strong\u003e Diferencia rotas que requerem autenticação de rotas acessíveis publicamente.\u003c/li\u003e\n    \u003cli\u003e\u003cstrong\u003eAdministração de Padarias:\u003c/strong\u003e Administradores podem criar padarias e designar gerentes responsáveis.\u003c/li\u003e\n    \u003cli\u003e\u003cstrong\u003eGerenciamento de Produtos:\u003c/strong\u003e Gerentes podem adicionar produtos apenas às padarias que possuem permissão.\u003c/li\u003e\n    \u003cli\u003e\u003cstrong\u003eRelacionamentos entre Entidades:\u003c/strong\u003e Relacionamentos bem definidos entre usuários, padarias e produtos.\u003c/li\u003e\n    \u003cli\u003e\u003cstrong\u003eEnvio de E-mails:\u003c/strong\u003e Integração com serviços de envio de e-mails para notificações e recuperação de senha.\u003c/li\u003e\n    \u003cli\u003e\u003cstrong\u003eClean Architecture:\u003c/strong\u003e Arquitetura desacoplada com princípios de Clean Architecture e Hexagonal Architecture (adapters).\u003c/li\u003e\n    \u003cli\u003e\u003cstrong\u003eFuncionalidades de Login e Registro:\u003c/strong\u003e Permite que novos usuários se registrem e usuários existentes façam login para acessar funcionalidades protegidas.\u003c/li\u003e\n    \u003cli\u003e\u003cstrong\u003eIntegração com Docker:\u003c/strong\u003e A aplicação está disponível no DockerHub, facilitando a implantação e execução em ambientes de produção.\u003c/li\u003e\n    \u003cli\u003e\u003cstrong\u003eManipulação de Banco de Dados com Prisma:\u003c/strong\u003e Utiliza Prisma como ORM para interações eficientes e seguras com o banco de dados PostgreSQL.\u003c/li\u003e\n    \u003cli\u003e\u003cstrong\u003eTestes Automatizados:\u003c/strong\u003e Inclui testes unitários, de integração e E2E para garantir a qualidade e a estabilidade do código.\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003ch2\u003e🔥 Stack Utilizada\u003c/h2\u003e\n\u003cul\u003e\n    \u003cli\u003e\u003cstrong\u003eNode.js\u003c/strong\u003e: v20.12.2\u003c/li\u003e\n    \u003cli\u003e\u003cstrong\u003eNestJS\u003c/strong\u003e: v11.0.10\u003c/li\u003e\n    \u003cli\u003e\u003cstrong\u003eJWT\u003c/strong\u003e: @nestjs/jwt v11.0.0\u003c/li\u003e\n    \u003cli\u003e\u003cstrong\u003eBcrypt\u003c/strong\u003e: v5.1.1\u003c/li\u003e\n    \u003cli\u003e\u003cstrong\u003eClass Transformer\u003c/strong\u003e: v0.5.1\u003c/li\u003e\n    \u003cli\u003e\u003cstrong\u003eClass Validator\u003c/strong\u003e: v0.14.1\u003c/li\u003e\n    \u003cli\u003e\u003cstrong\u003eJest\u003c/strong\u003e: v29.7.0\u003c/li\u003e\n    \u003cli\u003e\u003cstrong\u003ePrettier\u003c/strong\u003e: v3.4.2\u003c/li\u003e\n    \u003cli\u003e\u003cstrong\u003ePrisma\u003c/strong\u003e: v6.4.0\u003c/li\u003e\n    \u003cli\u003e\u003cstrong\u003eESLint\u003c/strong\u003e: v9.20.1\u003c/li\u003e\n    \u003cli\u003e\u003cstrong\u003eFaker.js\u003c/strong\u003e: v9.5.0\u003c/li\u003e\n    \u003cli\u003e\u003cstrong\u003eSupertest\u003c/strong\u003e: v6.3.3\u003c/li\u003e\n    \u003cli\u003e\u003cstrong\u003eUUID\u003c/strong\u003e: v9.0.0\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003ch2\u003e🚀 Tecnologias Utilizadas\u003c/h2\u003e\n\u003cul\u003e\n    \u003cli\u003e\u003cstrong\u003eLinguagem: TypeScript\u003c/strong\u003e\n        \u003cul\u003e\n            \u003cli\u003e\u003csmall\u003eAdiciona tipagem estática e melhora a segurança e produtividade no desenvolvimento.\u003c/small\u003e\u003c/li\u003e\n        \u003c/ul\u003e\n    \u003c/li\u003e\n    \u003cli\u003e\u003cstrong\u003eFramework: NestJS\u003c/strong\u003e \n        \u003cul\u003e\n            \u003cli\u003e\u003csmall\u003eFramework modular baseado em Node.js, ideal para aplicações escaláveis.\u003c/small\u003e\u003c/li\u003e\n        \u003c/ul\u003e\n    \u003c/li\u003e\n    \u003cli\u003e\u003cstrong\u003eAutenticação: JWT e Bcrypt\u003c/strong\u003e \n        \u003cul\u003e\n            \u003cli\u003e\u003csmall\u003eJWT para autenticação baseada em tokens e Bcrypt para hash seguro de senhas.\u003c/small\u003e\u003c/li\u003e\n        \u003c/ul\u003e\n    \u003c/li\u003e\n    \u003cli\u003e\u003cstrong\u003eTransformação de Dados: Class Transformer\u003c/strong\u003e \n        \u003cul\u003e\n            \u003cli\u003e\u003csmall\u003eFacilita a conversão de objetos entre classes e DTOs automaticamente.\u003c/small\u003e\u003c/li\u003e\n        \u003c/ul\u003e\n    \u003c/li\u003e\n    \u003cli\u003e\u003cstrong\u003eValidação de Dados: Class Validator\u003c/strong\u003e \n        \u003cul\u003e\n            \u003cli\u003e\u003csmall\u003ePermite validar dados de entrada usando decorators simples e intuitivos.\u003c/small\u003e\u003c/li\u003e\n        \u003c/ul\u003e\n    \u003c/li\u003e\n    \u003cli\u003e\u003cstrong\u003eTestes: Jest e Supertest\u003c/strong\u003e \n        \u003cul\u003e\n            \u003cli\u003e\u003csmall\u003eJest para testes unitários e de integração, e Supertest para testes de integração de APIs.\u003c/small\u003e\u003c/li\u003e\n        \u003c/ul\u003e\n    \u003c/li\u003e\n    \u003cli\u003e\u003cstrong\u003ePadronização de Código: Prettier e ESLint\u003c/strong\u003e \n        \u003cul\u003e\n            \u003cli\u003e\u003csmall\u003ePrettier para formatação automática e ESLint para análise de boas práticas.\u003c/small\u003e\u003c/li\u003e\n        \u003c/ul\u003e\n    \u003c/li\u003e\n    \u003cli\u003e\u003cstrong\u003eORM: Prisma\u003c/strong\u003e \n        \u003cul\u003e\n            \u003cli\u003e\u003csmall\u003eFacilita o mapeamento de entidades e operações com banco de dados de forma intuitiva.\u003c/small\u003e\u003c/li\u003e\n        \u003c/ul\u003e\n    \u003c/li\u003e\n    \u003cli\u003e\u003cstrong\u003eFakes e Mocking: Faker.js\u003c/strong\u003e \n        \u003cul\u003e\n            \u003cli\u003e\u003csmall\u003eGera dados fictícios realistas para criação de cenários de testes.\u003c/small\u003e\u003c/li\u003e\n        \u003c/ul\u003e\n    \u003c/li\u003e\n    \u003cli\u003e\u003cstrong\u003eCI/CD: GitHub Actions\u003c/strong\u003e \n        \u003cul\u003e\n            \u003cli\u003e\u003csmall\u003ePipeline automatizado garante qualidade e integridade do código antes do merge.\u003c/small\u003e\u003c/li\u003e\n            \u003cli\u003e\u003csmall\u003eGeração de artefatos Docker e push para Docker Hub.\u003c/small\u003e\u003c/li\u003e\n        \u003c/ul\u003e\n    \u003c/li\u003e\n    \u003cli\u003e\u003cstrong\u003eContainerização: Docker e DockerHub\u003c/strong\u003e \n        \u003cul\u003e\n            \u003cli\u003e\u003csmall\u003eDocker para criar contêineres e DockerHub para armazenar e distribuir imagens Docker.\u003c/small\u003e\u003c/li\u003e\n        \u003c/ul\u003e\n    \u003c/li\u003e\n    \u003cli\u003e\u003cstrong\u003eControle de Versão: Git e GitHub\u003c/strong\u003e \n        \u003cul\u003e\n            \u003cli\u003e\u003csmall\u003eGit para controle de versão e GitHub para hospedagem de repositórios e integração contínua.\u003c/small\u003e\u003c/li\u003e\n        \u003c/ul\u003e\n    \u003c/li\u003e\n    \u003cli\u003e\u003cstrong\u003eControle de Acesso: RBAC\u003c/strong\u003e \n        \u003cul\u003e\n            \u003cli\u003e\u003csmall\u003eImplementa controle de acesso baseado em papéis (Role-Based Access Control).\u003c/small\u003e\u003c/li\u003e\n        \u003c/ul\u003e\n    \u003c/li\u003e\n    \u003cli\u003e\u003cstrong\u003eUUID\u003c/strong\u003e \n        \u003cul\u003e\n            \u003cli\u003e\u003csmall\u003eUsado para gerar e armazenar UUIDs, garantindo que não haverá repetição e que não serão fáceis de descobrir.\u003c/small\u003e\u003c/li\u003e\n        \u003c/ul\u003e\n    \u003c/li\u003e\n\u003c/ul\u003e\n\n\u003ch2\u003e📂 Estrutura do Projeto\u003c/h2\u003e\n\u003cpre\u003e\n  /src\n  |-- application/        # Camada de aplicação (use cases, DTOs, errors)\n  |-- domain/             # Camada de domínio (entidades e interfaces)\n  |-- infrastructure/     # Camada de infraestrutura (controllers, adapters, pipes, repositories)\n  |-- main.ts             # Arquivo principal da aplicação\n\u003c/pre\u003e\n\n\u003ch2\u003e🌀 Design Patterns\u003c/h2\u003e\n\u003cul\u003e\n    \u003cli\u003e\u003cstrong\u003eSingleton:\u003c/strong\u003e 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 \u003ccode\u003esrc/infrastructure/services/orm/prisma.service.ts\u003c/code\u003e 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 \u003ccode\u003eonModuleInit()\u003c/code\u003e\u003c/li\u003e\n    \u003cli\u003e\u003cstrong\u003eFactory Method:\u003c/strong\u003e\n    Na classe UserService localizada em \u003ccode\u003esrc/infrastructure/services/user/user.service.ts\u003c/code\u003e, 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.\n    \u003c/li\u003e\n    \u003cli\u003e\u003cstrong\u003eStrategy:\u003c/strong\u003e Na rota de login, a AuthService localizada em \u003ccode\u003esrc/infrastructure/services/auth/auth.service.ts\u003c/code\u003e utiliza o padrão Strategy para encapsular a lógica de autenticação. Definimos uma interface \u003ccode\u003eAuthStrategy\u003c/code\u003e com um método abstrato \u003ccode\u003eauthenticate\u003c/code\u003e. Duas implementações foram criadas: \u003ccode\u003eBasicAuth\u003c/code\u003e, que executa o caso de uso para buscar o usuário, valida a senha e gera um token JWT; e \u003ccode\u003eGoogleAuth\u003c/code\u003e, que implementa a autenticação via Google e retorna um token. A AuthService depende apenas da interface \u003ccode\u003eAuthStrategy\u003c/code\u003e, permitindo a utilização de \u003ccode\u003eBasicAuth\u003c/code\u003e, \u003ccode\u003eGoogleAuth\u003c/code\u003e ou outras estratégias sem modificar o código.\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003ch2\u003e🔀 Git Flow\u003c/h2\u003e\n\u003cul\u003e\n    \u003cli\u003eApenas a branch \u003ccode\u003emain\u003c/code\u003e representa o ambiente de produção.\u003c/li\u003e\n    \u003cli\u003e\u003cstrong\u003eNinguém pode fazer push direto para \u003ccode\u003emain\u003c/code\u003e\u003c/strong\u003e, apenas via \u003cstrong\u003ePull Request\u003c/strong\u003e.\u003c/li\u003e\n    \u003cli\u003eCada desenvolvedor deve criar sua branch no formato:\u003cbr\u003e\u003ccode\u003edev/nome\u003c/code\u003e\u003c/li\u003e\n    \u003cli\u003eApós finalizar a implementação, deve abrir um Pull Request para \u003ccode\u003emain\u003c/code\u003e.\u003c/li\u003e\n    \u003cli\u003eO PR \u003cstrong\u003esó será aceito se passar na pipeline de CI/CD\u003c/strong\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003ch2\u003e🚀 Workflows e Jobs de CI/CD\u003c/h2\u003e\n\u003cul\u003e\n    \u003cli\u003e\u003cstrong\u003ebasic-check:\u003c/strong\u003e Verificação básica de código (testes unitários, linter e testes de integração). Acionado em todo push para qualquer branch, exceto \u003ccode\u003emain\u003c/code\u003e.\u003c/li\u003e\n    \u003cli\u003e\u003cstrong\u003eadvanced-check:\u003c/strong\u003e Verificação avançada de código (testes E2E). Acionado em PRs para a branch \u003ccode\u003emain\u003c/code\u003e.\u003c/li\u003e\n    \u003cli\u003e\u003cstrong\u003epush-dockerhub:\u003c/strong\u003e Geração e push de imagens Docker. Acionado em PRs para \u003ccode\u003emain\u003c/code\u003e (gera artefato) e em push para \u003ccode\u003emain\u003c/code\u003e (push para DockerHub).\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003ch2\u003e🛠️ Instalação do Projeto\u003c/h2\u003e\n\u003col\u003e\n    \u003cli\u003eClone o repositório:\u003cbr\u003e\u003ccode\u003egit clone https://github.com/renanjava/testes-escola-de-ti\u003c/code\u003e\u003c/li\u003e\n    \u003cli\u003eAcesse o diretório do projeto:\u003cbr\u003e\u003ccode\u003ecd testes-escola-de-ti\u003c/code\u003e\u003c/li\u003e\n    \u003cli\u003eInstale as dependências:\u003cbr\u003e\u003ccode\u003enpm install\u003c/code\u003e\u003c/li\u003e\n    \u003cli\u003eConfigure as variáveis de ambiente:\u003cbr\u003e\u003ccode\u003ecp .env.example .env\u003c/code\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\n\u003ch2\u003e🖥️ Como Rodar a API\u003c/h2\u003e\n\u003col\u003e\n    \u003cli\u003eCertifique-se de ter o Docker instalado e em execução.\u003c/li\u003e\n    \u003cli\u003eFaça o pull da imagem Docker:\u003cbr\u003e\u003ccode\u003edocker pull renancesu/cafe-com-type:latest\u003c/code\u003e\u003c/li\u003e\n    \u003cli\u003eSuba os contêineres:\u003cbr\u003e\u003ccode\u003enpm run docker:up\u003c/code\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\n\u003ch2\u003e📚 Rotas da API\u003c/h2\u003e\n\u003ch3\u003eAutenticação\u003c/h3\u003e\n\u003cul\u003e\n    \u003cli\u003e\u003ccode\u003ePOST /auth/login\u003c/code\u003e: Autentica um usuário e retorna um token JWT.\u003c/li\u003e\n    \u003cli\u003e\u003ccode\u003ePOST /auth/register\u003c/code\u003e: Registra um novo usuário.\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003ch3\u003eAdmin\u003c/h3\u003e\n\u003cul\u003e\n    \u003cli\u003e\u003ccode\u003ePOST /admin/bakery\u003c/code\u003e: Cria uma nova padaria.\u003c/li\u003e\n    \u003cli\u003e\u003ccode\u003ePATCH /admin/bakery/:id/manager\u003c/code\u003e: Define um gerente para uma padaria.\u003c/li\u003e\n    \u003cli\u003e\u003ccode\u003eGET /admin/users\u003c/code\u003e: Lista todos os usuários.\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003ch3\u003eGerente\u003c/h3\u003e\n\u003cul\u003e\n    \u003cli\u003e\u003ccode\u003ePOST /manager/product\u003c/code\u003e: Adiciona um produto à padaria gerenciada.\u003c/li\u003e\n    \u003cli\u003e\u003ccode\u003eGET /manager/products\u003c/code\u003e: Lista produtos da padaria gerenciada.\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003ch3\u003eUsuário\u003c/h3\u003e\n\u003cul\u003e\n    \u003cli\u003e\u003ccode\u003eGET /user\u003c/code\u003e: Retorna o perfil do usuário autenticado.\u003c/li\u003e\n    \u003cli\u003e\u003ccode\u003ePATCH /user\u003c/code\u003e: Atualiza o perfil do usuário autenticado.\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003ch3\u003eProdutos\u003c/h3\u003e\n\u003cul\u003e\n    \u003cli\u003e\u003ccode\u003eGET /products\u003c/code\u003e: Lista todos os produtos disponíveis.\u003c/li\u003e\n    \u003cli\u003e\u003ccode\u003eGET /products/:id\u003c/code\u003e: Retorna detalhes de um produto específico.\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003ch2\u003e⚙️ Testes\u003c/h2\u003e\n\u003cul\u003e\n    \u003cli\u003ePara rodar os testes unitários:\u003cbr\u003e\u003ccode\u003enpm run test:unit\u003c/code\u003e\u003c/li\u003e\n    \u003cli\u003ePara rodar os testes de integração:\u003cbr\u003e\u003ccode\u003enpm run test:int\u003c/code\u003e\u003c/li\u003e\n    \u003cli\u003ePara rodar os testes de ponta a ponta (E2E):\u003cbr\u003e\u003ccode\u003enpm run test:e2e\u003c/code\u003e\u003c/li\u003e\n    \u003cli\u003ePara rodar os testes com cobertura de código:\u003cbr\u003e\u003ccode\u003enpm run test:cov\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003ch2\u003e📄 Licença\u003c/h2\u003e\n\u003cp\u003eEste projeto está licenciado sob a Licença MIT. Veja o arquivo \u003ca href=\"LICENSE\"\u003eLICENSE\u003c/a\u003e para mais detalhes.\u003c/p\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frenanjava%2Ftestes-escola-de-ti","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frenanjava%2Ftestes-escola-de-ti","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frenanjava%2Ftestes-escola-de-ti/lists"}