
Vamos falar um pouco sobre o conteúdo do treinamento e para quem é esse curso
Git é um sistema de controle de versões distribuído, usado principalmente no desenvolvimento de software, mas pode ser usado para registrar o histórico de edições de qualquer tipo de arquivo.
Nessa aula iremos configurar alguns atalhos (aliases) para agilizar alguns comandos que são muito recorrentes no desenvolvimento.
O EditorConfig ajuda a manter um código consistente para vários desenvolvedores que trabalham no mesmo projeto em várias IDEs e Sistemas Operacionais diferentes.
Vamos mostrar quais plugins e ferramentas o instrutor Rodrigo Manguinho usa para melhorar sua produtividade como programador.
TypeScript é um superset do JavaScript desenvolvido pela Microsoft que adiciona tipagem e alguns outros recursos a linguagem.
Nessa aula iremos configurar e entender como escolher o Target adequado para sua aplicação.
TypeScript é um superset do JavaScript desenvolvido pela Microsoft que adiciona tipagem e alguns outros recursos a linguagem.
Nessa aula iremos configurar e entender como funciona o sistema de módulos do Typescript e também aprender a configurar paths.
TypeScript é um superset do JavaScript desenvolvido pela Microsoft que adiciona tipagem e alguns outros recursos a linguagem.
Nessa aula iremos configurar e entender como funciona o Strict Mode e como ele pode ajudar a melhorar bastante a qualidade do código.
O ESLint é uma ferramenta que analisa o código e aponta quaisquer problemas que encontrar. Ele pode encontrar bugs, áreas potencialmente problemáticas, estilos de codificação ruins e questões de estilo.
Nessa aula iremos configurar o Eslint para garantir a qualidade e padronização do código, principalmente quando trabalhamos em equipe. Vamos seguir o padrão Standard do JS.
Jest é um poderoso Framework de Testes em JavaScript com um foco na simplicidade.
Nessa aula iremos configurar o Jest para podermos escrever os testes usando Typescript.
Segue em anexo a aula o código do Snippet usado no treinamento para criar o bloco do describe de forma rápida.
O LintStaged permite rodar scripts somente nos arquivos que estão na stage area do Git.
O Husky facilita a criação de hooks para o Git.
Nessa aula iremos criar alguns scripts e integrá-los a essas duas ferramentas para evitar de subir código defeituoso para o controle de versão.
Nessa aula iremos dar início ao desenvolvimento do projeto utilizando Clean Architecture. Vamos analisar o primeiro caso de uso, Login com Facebook, e depois criar os componentes correspondentes. Esses componentes pertencem ao Domain Layer, que é a camada onde ficam as funcionalidades (features) e as entidades com as regras de negócio da aplicação.
Nessa aula iremos criar a primeira classe concreta, a implementação da feature do Login com Facebook. Vamos seguir a metodologia do TDD e sempre escrever os testes antes do código de produção.
Vamos entender também como utilizar dublês de teste (test doubles).
Além disso vamos mostrar como fazer para não acoplar APIs de terceiros diretamente em nossas classes de negócio.
Nessa aula iremos mostrar algumas outras alternativas para mockar uma dependência sem ser criando o test double manualmente.
Nessa aula iremos mostrar como isolar a criação do SUT (System Under Test) para proteger os testes contra futuras mudanças na classe. A primeira forma é usando o design pattern Factory. A segunda é utilizando o evento beforeEach do Jest. Vamos entender as duas maneiras e ver as vantagens e desvantagens de cada abordagem.
Nessa aula iremos criar testes relacionados a criação da conta do usuário. Para evitar que isso seja feito de verdade em nosso teste, iremos desacoplar essa criação com o uso de interfaces.
Além disso iremos mostrar uma forma muito elegante de reduzir o número de dependências no construtor com a utilização do Intersection Types do Typescript.
Nessa aula iremos fazer uma importante análise do código para perceber quando o Service está fazendo coisas demais. Detalhes de implementação devem ser movidos para a Infra.
Nessa aula irei mostrar a técnica do Spike para poder fazer experimentos no código antes de aplicar os testes.
Além disso iremos mover a parte de regras de negócio de dentro do Service para a Entity, no domain layer.
Nessa aula iremos mostrar uma forma mais elegante de testar o FacebookAuthenticationService. Da forma que foi feito tivemos que testar esse Service em integração com a entidade do FacebookAccount, tendo que repetir testes.
Podemos melhorar isso mockando essa entidade. Mockar classes instanciadas dentro da classe que estamos testando sempre é mais difícil, mas as vezes é necessário. Nesse caso faz sentido o Service criar seu próprio Model, criando essa dependência direta.
Nessa aula iremos mostrar como desacoplar o Service da criação de token de acesso.
Além disso iremos colocar a parte de regra de negócio do tempo de expiração em uma entidade no domínio.
Nessa aula iremos integrar o Service com o AccessToken Entity pegando o tempo de expiração definido no domínio. Além disso iremos retornar o valor gerado dentro do AccessToken.
Nessa aula iremos mostrar como testar que o Service não irá tratar erros de infraestrutura. Esses erros serão repassados para a camada de aplicação.
Nessa aula iremos apresentar o documento de diagramas atualizado com as últimas classes criadas.
Além disso iremos mostrar uma forma de otimizar os testes utilizando o beforeAll do Jest.
Nessa aula iremos explicar o fluxo para obter os dados de um usuário através da API do Facebook.
Além disso iremos testar a primeira chamada para obter o Token da Empresa.
Nessa aula iremos finalizar todos os testes da API do Facebook para obter os dados do usuário corretamente e retorná-los da forma que definimos em nossa interface.
Nessa aula iremos adicionar Generics do Typescript ao HttpGetClient permitindo ter um melhor controle sobre a classe que está utilizando esse componente.
Além disso vamos aplicar alguns refactorings no FacebookApi para deixar o código mais elegante.
Nessa aula iremos ver o diagrama de dependências atualizado.
Além disso irei dar dicas para quem tiver problemas com o code coverage.
Nessa aula iremos criar a implementação concreta da interface do HttpGetClient, definida pelo FacebookApi, utilizando o axios. Vamos ver como mockar essa dependência para evitar requests reais em ambiente de testes.
Nessa aula iremos mostrar como criar a implementação concreta do TokenGenerator utilizando o JWT para gerar tokens de acesso com expiração.
Nessa aula iremos mostrar como testar o banco de dados Postgres, usando uma versão in-memory. Dessa forma podemos aplicar testes de integração bem rápidos e sem precisar de comunicação externa.
Vamos ver também como criar um repositório com o TypeORM de forma que não precisa acoplar suas entidades de domínio a detalhes de implementação dessa biblioteca.
Nessa aula iremos finalizar os testes do load.
Logo após iremos organizar os arquivos e movê-los para os locais corretos e mover a criação do SUT e do banco em memória para os locais devidos. Vamos ver alguns possíveis problemas e como evitá-los.
Nessa aula iremos aplicar o que foi dito na aula do Service: mover a lógica de criar ou atualizar para o repositório.
No caso do Postgres iremos fazer operações distintas para criar ou atualizar.
Nessa aula iremos dar início a criação do Controller que irá validar os dados do request para autenticação com Facebook.
Vamos criar todos os casos de testes nessa aula.
Nessa aula iremos criar erros e helpers HTTP para melhorar a legibilidade do código.
Além disso vamos aumentar a confiança em nosso código removendo alguns tipos any e e usando o Generics no lugar.
Nessa aula iremos mostrar como isolar a validação do request em outro método e criar diferentes classes de validadores reutilizáveis.
Nessa aula iremos simplificar os testes do Controller do Login com Facebook mockando os Validators ao invés de testá-los em integração.
Nessa aula iremos refatorar o Controller para usar um Composite para fazer a validação do Request.
Nessa aula iremos refatorar o Controller para usar o Fluent Builder para fazer compor a validação de forma mais declarativa.
Nessa aula iremos deixar o Controller mais elegante e menos verboso, isolando coisas comuns em templates.
Nessa aula irei mostrar uma estratégia para poder rodar testes isolados.
Além disso iremos configurar uma nova conta no Facebook para usar sua API.
Nessa aula iremos testar de fato a API do Facebook fazendo um request real.
Além disso iremos corrigir um bug que foi encontrado durante o teste de integração.
Nessa aula iremos criar e configurar uma API Rest com Express.
Nessa aula iremos criar a instância do FacebookLogin Controller e de todas as suas dependências utilizando o padrão de projeto Factory.
Nessa aula iremos aplicar o Adapter Pattern para desacoplar os dados do request da biblioteca do express do Controller do Facebook.
Além disso vou mostrar um pouco da diferença de uma abordagem mais funcional em comparação com a orientada a objetos.
Pausa para fazer algumas melhorias no código!
Nessa aula iremos criar um teste de integração para testar todos os componentes que fazem parte da feature de login com facebook trabalhando juntos.
Nessa aula iremos mostrar como integrar a API com um banco de dados real, no caso iremos utilizar o ElephantSQL (PostgreSQL as a Service) para simular um banco que já existe.
Além disso iremos testar a API com tokens reais do facebook para ver se ela funciona corretamente sem nenhum tipo de mock.
Pequenos ajustes encontrados no projeto.
Nessa aula iremos mostrar uma outra forma de organizar o código, mantendo as camadas e nomes mais próximos dos sugeridos pelo Robert Martin.
Nessa aula iremos mostrar uma outra forma de manter a arquitetura desacoplada, sem precisar das features do domínio. Vamos converter os use cases para funções e manter a inversão de dependência através de type alias.
Nessa aula iremos mostrar que o use case não deveria retornar uma Entity e sim um DTO.
Nessa aula iremos entender a motivação de adicionar esse middleware de autenticação no projeto e falar um pouco dos padrões de projeto Chain of Responsibility, Proxy e Decorator, e como eles se aplicam nos middlewares do express.
Nessa aula iremos criar o use case para obter um usuário através do token de acesso.
Vamos também discutir sobre um anti-pattern chamado Middle Man/Feature Envy.
Nessa aula iremos falar um pouco sobre Anti-Patterns (ou Code Smells) e mostrar alguns exemplos no código desenvolvido de como evitá-los.
Nessa aula iremos ver como validar o token com a lib JWT e retornar a key que foi usada na criação desse token.
Nessa aula iremos desenvolver o código e os testes do middleware de autenticação.
Nessa aula iremos criar um adapter para comunicar o middleware desenvolvido na aula passada a biblioteca do express.
Nessa aula iremos criar um teste de integração para testar o funcionamento do middleware de autenticação de ponta a ponta.
Nessa aula iremos aplicar um refactoring para remover o anti pattern Middle Man.
Nessa aula iremos dar uma dica de como rodar sua aplicação de forma mais prática usando o ts-node-dev. Com ele conseguimos executar um código em typescript sem precisar ficar fazendo o processo de build e start. Além disso vamos mostrar como integrar isso para usar breakpoints em nosso código.
Nessa aula iremos fazer mais alguns ajustes na arquitetura.
Nessa aula iremos explicar as regras de negócio que serão implementadas nesse caso de uso.
Nessa aula iremos garantir que o UseCase se comunique corretamente com o FileStorage, enviando os dados corretos e evitando que imagens sejam sobrescritas por terem o mesmo identificador.
Nessa aula iremos seguir com os testes e garantir a integração correta com o repositório de UserProfile. Tem que gravar a url da imagem recebida pelo LocalStorage ou limpar o campo, caso não tenha sido enviada uma imagem.
Nessa aula iremos criar os testes necessários para atender as regras de negócio definidas no use case. Vamos inicialmente criar as regras dentro do use case e depois vamos migrar para uma entidade.
Nessa aula iremos mover os testes relacionados a regra de negócio para a Entidade UserProfile.
Nessa aula iremos finalizar o componente do ChangeProfilePicture UseCase adicionando os testes que faltaram.
Nessa aula iremos mostrar uma situação interessante onde o test coverage não bate 100% por causa de uma limitação do Typescript.
Nesse curso irei demonstrar na prática como criar uma API em NodeJs utilizando Typescript, Postgres e seguindo as melhores metodologias do mercado. Se você está cansado de cursos básicos e quer realmente aprender sobre conteúdos avançados e relevantes como: Design Patterns, Clean Architecture, SOLID, DDD e TDD, você está no lugar certo. O objetivo maior desse treinamento é fazer você sair da sua zona de conforto e ver que existem muitas coisas a serem estudadas para se tornar um líder técnico ou um arquiteto de software.
Esse curso é voltado para desenvolvedores plenos, sêniors ou arquitetos que buscam evoluir seus estudos em arquitetura de software.
O curso só é recomendado pra quem já possui experiência nesses tópicos de arquitetura ou para alunos que já fizeram algum de meus outros cursos.
O objetivo desse curso é aprofundar ainda mais no uso correto de Test Driven Development, Clean Architecture, Clean Code, Design Patterns, Programação Orientada a Objetos, SOLID Principles, mostrando mais exemplos e cobrindo diversos tópicos pelos alunos que não foram abordados no primeiro treinamento, pois estavam fora da pauta.
Nesse treinamento vamos mostrar como usar frameworks como TypeORM na Clean Architecture de forma correta. Vamos mostrar também como fazer integração com APIs de terceiros. Vamos usar recursos mais avançados do Typescript que não foram usados no primeiro treinamento. Vamos mostrar outras formas de usar o TDD, com ferramentas que auxiliam a criação de mocks.
Esse curso fará você evoluir mais do que anos de faculdade. Mostrarei pra você, de forma objetiva, todos os conhecimentos que obtive ao longo dos anos de minha carreira. Você terá a oportunidade de evoluir em semanas ou meses o que um programador sênior leva anos para aprender.