API REST com NESTJS do ZERO a AWS com TERRAFORM e Github Actions

1.14k views15769 WordsCopy TextShare
Petrus de Melo DEV
Neste vídeo eu vou te ensinar a desenvolver uma API Rest, com autenticação, utilizando NestJS, types...
Video Transcript:
E aí pessoal seja bem-vindo ao primeiro vídeo do canal Petros de Melo Dev e no vídeo de hoje nós vamos desenvolver juntos um api rest utilizando Nash DS typescript dynamodb e de quebra ainda vamos provisionar Nossa aplicação na WS utilizando terraform cdk e Git Hub Actions então sem mais delongas vem comigo antes da gente iniciar a nossa aplicação e o nosso projeto eu queria fazer um overview aqui sobre arquitetura tá então nós vamos ter aqui um elastic Beans Talk que é basicamente um recurso da WS que é muito parecido com o hiroku a gente vai
ter o Dynamo Deb inicialmente local e depois na aws eles vão se comunicar utilizando aws SDK toda a infraestrutura vai ser provisionada automaticamente por terraform e nós vamos ter no nosso repositório um workflow do github Actions para automatizar os deploys esse actor aqui tá representando os nossos clientes então pode ser um outro sistema pode ser um frontend desenvolvido em angula ou em react isso não importa porque a gente vai estar desenvolvendo daqui para baixo e aqui são algunas das aplicações que a gente vai estar utilizando aí ou tecnologias tá então nodejs na versão mais recente
typescript nest que vai ser o nosso Framework vamos documentar as nossas rotas com sweger e vamos utilizar aí a autenticação jwt para uma ou duas das nossas rotas Beleza então se você já tá super interessado para aprender tudo isso aqui não esquece de se inscrever deixar o seu like e deixar o seu comentário e no final do vídeo se você tiver alguma dúvida Comenta aí embaixo que eu vou ter o maior presente de responder como eu te falei nós vamos fazer isso do zero Então vamos instalar todas as ferramentas necessárias e criar o nosso repositório
aqui em conjunto o nome do repositório aqui vai ser 001 api rest com nest s do0 aws com terraform porque é o tema do vídeo e 001 porque o primeiro vídeo do canal Vamos deixar público e vamos criar Esse repositório já vou puxar a minha o meu terminal para cá vamos tirar esse arquitetura aqui por enquanto se a gente precisar voltar a gente volta e eu vou criar uma pasta aqui com o mesmo nome do repositório Então mkd vamos dar um CD aqui já tô nela e aí eu vou rodar esses comandos aqui então ele
vai iniciar aí um readm para mim vai iniciar o repositório e vai fazer o primeiro commit ele já fez tudo isso aqui e vamos aí abrir no vs code que é o editor que eu vou estar utilizando aqui ao longo do vídeo Então a primeira ferramenta que nós vamos instalar aqui é o node version Manager então você pode ir abrir o seu Google aí colocar node version Manager ou apenas nvm que você vai encontrar aqui no primeiro resultado esse cara para que que esse cara serve esse cara serve para gerenciar versões do node na sua
máquina vem aqui nessa nessa tag zinha aqui installing and updating e vai ter aqui dois comandos você só precisa rodar um deles Tá então vamos Vamos tentar com esse aqui primeiro eu vou abrir o terminal logo direto aqui dentro do vs code vou colar vai dar tudo certo se esse comando falhar aqui você tenta o segundo dito isso o comando nvm já tem que est disponível na sua máquina Vamos dar um Clear aqui para limpar o terminal e agora eu posso dar um nvm use na verdade install primeiro 20 que aí ele vai instalar a
versão 20 do node ele acabou de fazer a instalação a partir desse momento o node já tem que est disponível para mim assim como o npm também vamos agora instalar o nestjs clii então se você botar no Google aqui Nash JS primeiro resultado Esse vai ser o Framework que nós vamos utilizar ele é um Framework extremamente completo existem outros no mercado mas esse é o que a gente vai utilizar aqui porque ele já provém tudo que a gente quer vamos entrar aqui na documentação descer aqui até cli eu vou vir aqui em overview e copiar
este comandinho aqui npm install Men G porque Global nestjs cli vamos copiar vamos voltar aqui para o vs code vou só colar Então já instalou levou aí cerca de 12 segundos e a partir desse momento o comando nest tem que ficar disponível no seu terminal Beleza o que é que nós vamos fazer aqui vamos olhar para cá voltar para cá você pode dar uma olhada aqui nos comandos básicos e aqui ele tá falando sobre o novo projeto né então nest New my nest Project então vou fazer isso aqui só que ao invés disso eu vou
chamar só de api então nest new api ele vai me perguntar algumas coisas aqui eu quero utilizar o npm então ele já terminou a instalação fez a instalação de todos os pacotes necessários aqui a gente vai fazer algumas pequenas modificações eu vou abrir aqui no Finder vou entrar nesse carinha aqui contrl shift ponto para mostrar os arquivos ocultos e eu vou começar excluindo o Git e o Git Aliás o Git ignor eu vou manter mas vou começar excluindo o Git Porque eu já tenho um Git nessa pasta certo então o Git tá iniciado no meu
diretório raiz tá aqui por isso que eu excluí segunda coisa que a gente vai fazer aqui a gente vai entrar aqui em ES lint Vamos alterar umas regrinhas aqui a regra que nós vamos adicionar aqui é então tá aqui explicit function return Type error eu quero obrigar esse retorno e aqui no TS config também vamos fazer uma pequena modificação adicionando pefs então no final aqui eu vou adicionar esses pefs aqui @root e @root asterisco se eu não estiver enganado tudo deve funcionar do jeito que eu espero a partir de agora senão a gente vai resolvendo
aí ao longo do vídeo Beleza então eu já tenho o nestjs instalado aqui a aplicação tá prontinha vamos entrar nessa pasta api e vamos rodar um npm Run start Vamos abrir aqui o local host acho que é na porta 3.000 É isso aí então a gente já tem o hello world do Nash JS mas eu vou fechar eu vou fechar esse carinho aqui vou fazer fazer mais uma modificação nesse start Dev eu vou adicionar também o debug então eu gosto que esse start Dev tenha o debug aqui já como padrão e lá no Main eu
vou fazer o seguinte eu vou dar um const o gith Hub CoPilot já tava já fez essa sugestão eu vou usar essa porta aqui ao invés da porta 31000 padrão porque no futuro eu vou precisar injetar essa porta dinamicamente lá na aws e a outra coisa que eu vou fazer aqui eu vou dar um console.log e vou colocar aqui servidor está rodando nessa porta aqui vamos começar então desenvolvendo a nossa aplicação eu vou criar algumas pastinhas aqui eu vou criar a nossa pasta Controller vou criar a nossa pasta service e vou criar a nossa pasta
repository vou excluir esses app Controller app servers vou tirar esse cara de cá vamos tirar ele de cá também a partir desse momento eu tenho uma aplicação mais enxuta e nós vamos seguir o arquitetura n Tier Tá então vamos voltar aqui pro nosso drw e a arquitetura n Tier é basicamente isso aqui eu vou ter Controller chamando os nossos Services chamando os nossos repositórios a única questão que a gente vai começar a entender aqui é que acoplamento com http morre no Controller do Controller por serviço do serviço por repositório a gente vai tentar construir isso
aqui agnóstico os nossos serviços vão cuidar da nossa regra de negócio O nosso repository vai fazer interface com o nosso banco de dados não precisa desses caras tão grandes né então vamos dar uma diminuída aqui e aqui a gente vai adicionar também uma outra um outro carinha que é o nosso domain ou entity como você queira chamar tá então a gente vai ter basicamente essa arquitetura que a gente vai utilizar aqui tá então o nosso banco de dados vem aqui o repositório se comunica com banco de dados o serviço recebe o repositório esses dois essas
duas camadas vão Man objetos de domínio e o nosso Controller vai ser uma espécie de adaptador de entrada para o nosso serviço perfeito então a gente já criou aqui controla serviço repositório eu vou criar também uma outra pastinha aqui chamada domain antes da gente construir vamos entender o que é que vai ser essa aplicação essa aplicação vai ser uma aplicação muito simples a gente vai criar um usuário Então vai ser um post users a gente vai get users passando o ID a outra rota vai ser get users bar me que essa aqui vai ser autenticada
Então essa aqui requer autenticação a outra rota que a gente quer aqui também vai ser post out login Então essas são as únicas quatro rotas que a gente vai fazer essa aqui é a única autenticada todas as outras são livres Então vamos Começando aqui com esse Create user vou vir aqui criar um users PC controller. TS Export Class users Controller vamos importar aqui o Controller do nest barcom beleza esse carinha aqui vai ser users e vamos colocar aqui uma rota pública ass get users get users Não não quero essa sugestão não eu vou só botar
um ok a gente só quer chamar essa rota lá para ver se tá tudo certo vou dar um post vou dar um um void vou dar um void não um n e aqui eu vou dar um return Ok true Então esse essa rota aqui Teoricamente já está pronta que eu vou fazer é importar esse objeto dentro do meu App module feito isso vamos iniciar Nossa aplicação start Dev Então já tá iniciando aqui para o nosso http client eu vou utilizar um cara chamado Bruno e a gente vai criar uma coleção nova aqui eu vou chamar
essa coleção de 001 vamos chamar essa coleção com o mesmo nome aqui do vídeo e vamos colocar dentro do nosso projeto workspace wsv 001 vou criar uma nova request aqui vou dizer test request post local host 2. 3000 bar users Vamos criar e vamos rodar esse carinha aqui tá faltando aqui http Agora sim beleza então tá funcionando então ok true a nossa aplicação já tá respondendo conforme queremos então Vamos definir aqui agora nos nossos objetos vou criar uma pastinha aqui chamada dto Aqui eu vou criar um Create user request pdto PTS Export Class Create user
request dto o que que esse cara vai ter já tá me sugerindo aqui meio password mas eu quero mais coisas first Name last name eu vou colocar só só name acho que é suficiente e vou colocar também aqui um Create user response pdto PTS e aqui eu vou ter vamos parar esse terminal aqui Export Class Create user response dto a única coisa que eu vou responder é um um ID Então tá aqui os meus dois objetos vamos utilizar esses objetos Create user Ele vai esperar um user create user bug do tipo Create user request eu
preciso usar uma anotação aqui chamada bar pra ele mapear corretamente a única coisa que eu vou fazer aqui dar um console P log pra gente ver esse objeto vindo certinho e eu V responder com esse carinha aqui então eu vou responder um Create user response de ti então você observa que tem terminologia de http aqui no controlador e tá tudo certo porque o controlador é suposto a ser um http adapter vamos retornar aqui só um ID um Random id pra gente ver esse carinha vou iniciar enquanto ele tá iniciando vou trazer para cá então eu
vou dar vou enviar aqui e vamos ficar observando o nosso terminal aqui embaixo beleza Random id e ele foi vazio porque eu realmente não mandei nada então vamos ver aqui em bu eu vou mandar um Jason e aí eu vou agora sim name Petros dem Melo e-mail Petros dem melo@gmail.com não me mandem spans e vou mandar um password beleza salvar essa request só que eu vou chamar ela em vez de test request eu vou chamar de criar usuário né então rename criar Create user tudo certinho Vamos mandar e eu recebi aqui a request E aí
só que a gente tem duas coisas para fazer aqui agora né A primeira coisa que eu quero é vamos documentar as rotas e outra coisa eu quero validar os campos essas duas coisas que eu quero aqui porque vocês viram que eu enviei vazio e funcionou Mas não é isso que eu quero se eu enviar alguma coisa vazia que não faz sentido eu quero que a api me responda 400 Bad request Então o que a gente vai fazer é o seguinte a gente vai começando vir aqui terminar a minha aplicação vou instalar um cara chamado nestjs
sweger vai instalar esse carinha aí instalou e a partir de agora eu posso usar api tags users esse carinha basicamente vai fazer a categorização do meu controlador Embaixo de uma tag lá no sweger aqui eu vou usar um response api response é esse carinha aqui ele já me sugeriu 201 mas eu vou trocar para http status created description tá user created E aí ele já tá me sugerindo aqui um tipo aí aqui dentro a gente vai entrar em id e vamos colocar um api property que também vem lá do nests swager e aqui eu vou
dizer example description ID of the created user beleza aí aqui dentro temos três propriedades Então temos o Api property só que aqui tem um porém isso aqui essas propriedades que nós estamos utilizando apenas coment as rotas então a gente acabou de fazer isso aqui a gente ainda falta validar os campos Vamos testar se tá tudo certo para isso eu vou ter que vir aqui no m e a gente vai ter que fazer algumas alteraçõ zinhas aqui tá a primeira alteração é essa aqui antes do app. listener a gente vai adicionar esse document builder aqui ó
e aí nós vamos criar um documento tô pegando isso aqui da minha fila Mas você pode vi você pode vir aqui se quiser na documentação do njs então Open api na introdução você vai ver tudo isso aqui que eu tô fazendo Beleza então a mesma coisa que eu tô fazendo aqui vamos importar o swag module então Estou adicionando aqui algumas coisas customizadas apenas para e questões de CDN que a gente pode ter alguns problemas com com esses arquivos na WS então tô adicionando aqui links públicos E aí tá pronto Teoricamente tá pronto eu só vou
adicionar outro console log aqui no final pra gente ter o link do sweger também lá quando api iniciar Beleza então npm está deve Então tudo certinho Teoricamente eu já tenho que entrar aqui e ele já deu certo eu já tenho o meu post aqui com a documentação de retorno e de request bug também já tenho aqui os meus esquemas de request response mas se eu enviar uma request inválida vamos supor eu quero enviar aqui um e-mail vou enviar sem e-mail ele ainda tá me retornando o Random ID eu quero que ele me retorne um 400
e a partir de agora a gente vai fazer faz aqui o validar os campos Então vamos para esse carinha aqui para validar os campos a gente vai ter que instalar um cara chamado Class validator e Class Transformer e a partir de agora a gente pode vir aqui e dizer Esse name ele é is not empt o e-mail também não pode ser vazio e o password também não pode ser vazio só isso aqui é suficiente não pra gente fazer isso aqui funcionar nós temos que vir aqui no Main E aqui depois de definir a aplicação eu
vou adicionar isso aqui ó app.use Global pipes New validation Pipe Transform true o que que esse carinha vai fazer ele vai pegar o objeto Jason e vai instanciar como esse tipo aqui então esse tipo aqui ele não está apenas definindo o formato ele vai ser uma Instância dessa Classe A outra coisa é o White list true O que é que esse White list true tá fazendo aqui caso eu não adicione o White list true se tiver propriedades extras aqui como por exemplo last name esse last name vai entrar lá para o objeto também mas se
eu colocar esse White list true ele vai limpar todas as propriedades extras que o cliente mande por algum erro então ele só vai considerar efetivamente as propriedades que estiverem anotadas com alguma validação o e-mail aqui eu também quero um is e-mail e a partir de agora npm Run start Dev a minha aplicação precisa já estar devolvendo um erro caso eu mande alguma coisa vou mandar do jeito que tá aqui aqui ó e-mail vazio então ele já tá dizendo aqui que o e-mail não pode ser vazio aliás que e-mail o nome da propriedade precisa ser um
e-mail e que e-mail não pode ser vazio Se eu mandar qualquer coisa ele vai mandar só um erro de volta agora e-mail precisa ser um e-mail então um Bad request eu não invoco nem o meu serviço caso a validação não passe Então vou colocar aqui agora Petros demmel @gmail.com e vou enviar e agora ele tá me retornando Random ID novamente e eu consigo ver aqui no console que eu tenho um objeto do tipo Create user request dto tenho um objeto desse tipo aqui no meu bar dito isso vamos agora então desenvolver o nosso serviço vamos
aqui users pron service.ts Export Class users service e vou colocar um Public assn Create user ele tá me sugerindo aqui utilizar os mesmos objetos ó Create user request eu não vou fazer isso a gente vai discutir já já por eu vou apenas fazer isso aqui ele tá pedindo um retorno a aqui em cima eu preciso anotar com injectable senão ele não vai ficar disponível para ser injetado como dependência E aí aqui eu vou definir uma interface Create user params nome e-mail e password é exatamente o que eu quero Vou colocar aqui params é esse tipo
aqui vou dar um console. log no params vou pegar esse user service aqui e vou adicionar no meu App module como provider senão ele não fica disponível na cadeia de injeção de dependência do Nash JS então tenho serviço agora eu já posso receber o serviço como injeção de dependência constructor Private read only user service vamos importar ele aqui e agora ao invés de fazer isso aqui eu vou com created user ID await des puser service Create user e eu vou desestruturar aqui esse cara do meu objeto de request e agora eu vou retornar um ID
created US ID esse carinha aqui tá com tipo de retorno errado né então vou retornar só um string E aí a partir de agora eu vou retornar só um Random ID ao invés de retornar esse objeto aqui aqui o erro já já foi resolvido E aí ao invés de retornar um um objeto JavaScript eu vou dar um New created userid Porque sim tá eu eu gosto de tipos tá então vou fazer dessa forma aqui e Teoricamente o nosso controlador está pronto beleza vamos ver se tá tudo funcionando eu vou fechar aqui o meu Main vou
fechar aqui o meu module eu espero que quando deu um Run start Dev ele continue funcionando do jeito que eu quero que funcione vamos vir aqui para o Bruno e tá aí Random ID agora vocês podem observar que o meu console.log tá logando os parâmetros ele não é mais do tipo objeto created user request de to E aí por qu Por que não compartilhar o mesmo objeto do controlador indo pro serviço porque o controlador tem conhecimento do protocolo http aqui coincidiu deles terem a mesma assinatura então eu preferi eu escolhi conscientemente repetir escrever mais código
para que o acoplamento entre o controlador e o serviço fosse menor de forma que agora a interface dos dois podem evoluir independentemente certo então tudo é uma questão de acoplamento e coesão então pra gente dar continuidade eu parei aqui o serviço e eu vou instalar aqui um cara agora chamado npm install uid ele vai gerar id pra gente e aí eu vou dar um Import aqui vifor uid from e o uid você pode usar o vifor se você quiser diretamente mas é só porque eu realmente gosto que as coisas estejam com o nome aí mais
semântico Então já fiz a instalação Ele tá reclamando aqui porque eu não instalei os tipos Então vou copiar essa linha aqui npm install save Dev types uuid vou colar aqui e aí depois ele vai parar de reclamar aqui como parou agora porque ele já sabe os tipos que esse cara vai ter né então quando eu passar o mouse por cima aqui ele tá dizendo que vai retornar um string vou dar um npm start Run Então vamos ver aqui o que é que o nosso Bruno vai retornar eu só espero que ele deixe de retornar aquele
Random ID que tava hardcoded aqui para retornar um uu ID eu vou enviar aqui agora e agora sim eu tenho esse yuu ID bom vou derrubar o nosso terminal aqui já temos essa rota pronta mas eu quero também que essa rota Salve esse cara em algum lugar então vou vir aqui no repositório vou criar um users repository PTS vamos vir aqui Export Class users repository esse carinha aqui também vai ser um inject table e eu vou ter aqui um Private users que eu vou inicialmente fazer em memória e vamos ter aqui um Public assim beleza
é isso aqui que eu quero antes da gente continuar porque eu não não existe esse objeto user Vamos criar ele aqui user. read only created at Public read only updated at esse aqui não vai ser read only porque pode ser atualizável ele pode ser não ele será atualizável o que não vai ser atualizável aqui é o id o nome eu também não quero atualizar o e-mail também não quero atualizar e o password não vamos fazer mas tem lógica que o usuário tem a opção de atualizar o que eu vou fazer eu vou fazer um um
trickz inho aqui do JavaScript Object P assign 10 esse init aqui mas eu Quero adicionar algumas propriedades padrão então eu vou usar esta assinatura aqui do assign o ID vai ser uu ID então Import vamos ver se ele vai já fez isso para mim não mas ele fez errado né eu quero vi for as u ID o Create at vai ser New Date o update at vai ser New date então se eu passar o ID ele vai terminar se objeto aqui ele vai usar o ID que for passado se eu não passar ele vai atribuir
um novo se eu passar um created ele vai utilizar o que foi passado senão vou atribuir o novo e assim por diante também aqui no init tá caso você não queira utilizar essa assinatura aqui peral user porque aí você tá dizendo que o name o e-mail e o password podem ser opcionais você pode criar uma interface aqui em cima passe props Pronto ele já tá sugerindo aqui beleza então tem essas propriedades aqui que são obrigatórias o resto é de beleza já temos o usuário aqui e agora sim eu vou importar o usuário no meu repositório
e lá no meu serviço eu vou invocar o meu repositório vou receber como injeção de dependência ele é o meu Private read only user repository e aqui eu vou instanciar o meu usuário const New const user igual New user eu vou desestruturar eu prefiro sempre ter uma postura mais que evita ambiguidade aqui eu vou esperar o meu await user repository create user então eu vou retornar agora o user.id Teoricamente tem que est tudo pronto eu vou dar npm Run start Dev não está funcionando por quê Porque eu não importei o user repository como provider lá
no meu App modle Então a gente vai vir aqui no app e vai adicionar ele aqui esse erro aqui tem que sumir beleza deu tudo certo vamos voltar aqui no Bruno eu vou enviar e tá tudo funcionando então vamos fazer o seguinte eu vou criar um debugger porque eu quero ver esse objeto lá vamos criar aqui Create Launcher nodejs eu vou modificar esse carinha você pode copiar o meu aqui que vai dar certo certo eu vou dar o start aqui então Teoricamente o debugger tá acoplado quero mandar a minha request novamente e eu vou botar
um Break Point aqui e eu quero ver esse usuário lá que a gente salvou antes então vou enviar novamente Esse é o que tá vindo agora esse é o que eu enviei e eu vou passar aqui o mouse em cima de 10 PR user e eu tenho aqui o meu banco de dados Então tá aqui ó fe o usuário que eu criei antes eu vou soltar esse carinha ele foi se embora temos algumas regras de negócio que precisam ser testadas eu não posso criar dois usuários com o mesmo e-mail e aqui ele está permitindo que
eu faça isso então o que eu vou fazer o seguinte eu vou terminar o meu processo aqui aqui no meu repositório eu vou dar um Public assin get user by email ele já está me sugerindo aqui alguma coisa então vou retornar um user ou um undefined então ele já tá fazendo essa verificação aqui vou utilizar esse método aqui agora verificar se esse e-mail está disponível então con user exists Muito obrigado Git Hub Pilot carregou aqui para mim user repository pronto get user by ID tô passando aqui params pronto e-mail massa US exists que eu vou
fazer aqui if US exists throw New error Então vamos rodar a nossa aplicação de novo Lembrando que toda vez que a gente derruba a aplicação e sobe o nosso banco de dados em memória é recarregado então eu não tenho mais aqueles dois usuários lá que eu criei eu preciso fazer a criação novamente eu vou simplesmente enviar aqui ele me retornou um objeto 8e vou enviar de novo e agora sim ele deu 500 porque eu não mapei esse erro para uma resposta nós vamos fazer o seguinte em vez de erro aqui vamos utilizar o bad request
Exception do Nash JS e agora sim Lembrando que o meu servidor reiniciou novamente então vou enviar a primeira vez ele criou o usuário vou enviar a segunda vez e agora ele tá me retornando um Bad request dizendo user already exists ou seja Esse e-mail não pode ser utilizado na verdade eu vou até modificar aqui para email a Reading mus que fica mais semântico a outra coisa que eu quero fazer aqui eu vou fazer já de imediato é o seguinte eu não posso salvar esse password do jeito que ele tá aqui é contra as boas práticas
então o que que a gente vai fazer aqui vamos derrubar esse cara e a gente vai instalar um carinha aqui chamado bcrypt Então esse BPT Ele trabalha com uma criptografia que não é possível reverter por isso que é seguro salvar um password que foi encriptado ou rachado no banco de dados porque não é reversível não é possível pegar um HAS do banco de dados e verificar o password que gerou aquele hash então daqui eu vou fazer o seguinte Import PR BPT E aí ele tá reclamando aqui que eu não tenho os tipos em copiar esse
npm save Dev hash esse hash ele me retornou a promise e a gente vai usar ele aqui para rar o password Então vai ser a wait hash password e esse valor aqui é o Salt eu não vou entrar em detalhes aqui do que que esse Salt mas deixa ele como 10 e ao invés de usar o password exis do jeito que veio a gente vai colocar esse password hash aqui vamos apenas rodar aqui npm Run e ver se tá tudo funcionando eu vou criar aqui novamente Beleza vou mandar de novo e agora e-mail já tá
em uso e eu vou colocar lá novamente no meu repositório Vou colocar aqui que eu sei que ele vai rodar primeiro E aí no d. user vamos ver o que é que ele tem lá no lugar do password tá aqui ó ele tem esse hash aqui esse hash não é reversível não é possível pegar esse valor aqui e reverter e descobrir qual é a senha do usuário acho que tá bem legal até agora vamos voltar para cá eu já tenho post users vamos ver o get users by ID vamos fazer rapidinho isso aqui Public get
user by ID que eu quero ID eu não vou retornar um usuário não é uma boa prática ter uma entidade um objeto de domínio chegando até o controlador então aqui eu vou colocar ID ou melhor user ID vai ser do tipo string eu vou mapear esse cara desse jeito aqui que ele tá indo então é uma rota get dois pontos user id e aqui eu tenho que dizer que este objeto aqui este parâmetro precisa ser mapeado do user ID Vamos colocar aqui void vamos dar só um conso P log aqui no user ID vamos dar
agora npm Run start só pra gente ver se tá tudo funcionando voltamos aqui para o nosso Bruno vou criar uma nova rota aqui get user by ID http 2 Bar localhost 3 users e vamos colocar aqui 10 Create vou enviar ele me retornou 200 e deu um console 10 aqui me retornou 200 vazio porque realmente não tem nada então não tô retornando nada é realmente o que eu estava esperando vamos criar um ambiente eu vou chamar de local esse ambiente aqui adicionar variável nome host local http pontos bar bar local host 3000 salvar aí a
partir de agora em vez de ficar fazendo isso aqui eu vou só chamar o rxo E aí quando a gente tiver os nossos ambientes locais e não locais a gente só vai criar um outro carinha lá e tá tudo funcionando tá aqui o 10 que é que eu espero aqui então eu espero que o meu const user result vai ser igual a wait this user get byid não existe ainda mas a gente vai fazer isso já já então vamos criar aqui dentro do meu dto um get user byid p response response p dto.ts Export Class
get user by Eid response que é que esse cara vai ter vai ter um ID um name um e-mail beleza Create atd at só que esse cara aqui vai ser um string porque eu estou mapeando um objeto de resposta do HTML não é um objeto interno da aplicação não tem por você date vamos utilizar os nossos api properties aqui bom então rapidamente eu já fiz aqui o mapeamento da resposta eu também verifiquei aqui que eu não tô seguindo o padrão de nomenclatura nos arquivos de dto então rapidamente vou vou renomear todos eles para os padrões
aqui que o nestjs adotou então Acabei de renomear aqui Create user request dto Create user response dto get user by response dto o método ainda tá reclamando aqui porque a gente não criou o que a gente vai fazer aqui antes de criar é um return New get user Bad respon to na verdade vou mapear esse cara para cá como retorno vou adicionar um api response aqui pra gente ter swager então ok user found vou colocar esse objeto aqui para ele mapear certinho como eu falei antes isso virar documentação lá do sweger e aqui nesse objeto
Vamos criar um Construtor aqui Construtor recebendo parâmetros aqui então vamos resolver isso aqui rapidamente vamos entrar aqui no serviço no serviço o que que a gente vai fazer eu vou criar um método Public né então recebe um string retorna o usuário esse método também não existe no repositório se o usuário não existe ele dá um Bad request senão ele responde o ID eu pessoalmente não gosto de responder deu um objeto de entidade um objeto de domínio ao controlador e deixar sobre responsabilidade do controlador manusear esse objeto Eu acho que o domínio precisa morrer no serviço
o serviço responde um subconjunto do domínio Então o que a gente vai fazer aqui a gente vai criar um interface tá user é suficiente e vou colocar aqui ele já me sugeriu ID name email cre at update at beleza aí a invés de user a gente vai responder esse a user esse carinha aqui ele tem que ser do tipo user e a aqui eu vou desestruturar o user do jeito que ele sugeriu vou desestruturar e agora vamos resolver isso aqui então vou abrir o meu repositório vou dar aqui um E aí só uma curiosidade aqui
por que que eu tô usando já Promise e a s se não nenhum processo assíncrono aqui ainda porque a gente vai instalar o Dynamo DB e vai fazer essa conexão entre aplicação e Dynamo DB E aí sim vai ser tudo Promise tudo assíncrono então para evitar retrabalho eu já tô fazendo isso aqui dessa forma update Vamos ajeitar isso aqui né deu certo beleza ele já parou de reclamar aqui já parou de reclamar aqui não assim claro né então Vamos alterar aqui esse carinha para params e vai ser do próprio tipo e agora sim a gente
vai fazer essa forma aqui e eu espero que user ID name pronto tudo certinho tudo funcionando ão desestruturado aqui tô me respondendo um objeto tá tudo mapeado o serviço também pegando um objeto que é do tipo user né Você opcionalmente pode colocar aqui um dois pontos user caso você queira deixar mais explícito ainda mas não é necessário mesma coisa aqui né vamos rodar a nossa aplicação npm Run start Dev ver se tá tudo funcionando Lembrando que ainda estamos utilizando o banco em memória Então vamos abrir aqui o Bruno e aí eu vou criar um usuário
ele me retornou esse ID aqui eu vou mandar aqui o get user byid eu espero um not found Então tá aqui user not found Beleza mas se eu mandar D aqui não testei ainda vamos ver se vai dar certo já me retornou aqui o meu usuário Petros de Melo tudo certinho Create at quando foi criado perfeito Então já temos a segunda rota funcionando que é essa aqui então essas duas aqui já estão criadas eu vou querer agora O Alf P login Beleza então vamos trabalhar agora com autenticação para fazer autenticação O que que a gente
vai fazer eu vou vamos criar um novo controlador aqui chamado al. Controller PTS Export Class al Controller esse carinha vai ser um Public Sync login eu vou retornar por enquanto um token tá eu vou criar logo um dto aqui então vai ser authenticate user. dto.ts Export authenticate user Quest O que é que eu espero eu espero um Public e-mail e um Public password eu só vou dar um api property aqui então vou copiar esse objeto aqui vou dizer que o meu bar credentials é do tipo authenticate user dto tá reclamando aqui porque eu não tenho
Promise Vamos botar um n aqui por enquanto não tô usando essas credenciais para nada ele tá reclamando vou dar só um log nelas e aí aqui eu tenho que usar um Controller vou também usar o meu iepi tags e aqui eu vou importar esse carinha lá no app module Controller teor amente eu já tenho uma rota login Aliás não tenho porque eu não botei aqui push né então agora sim que eu tenho push out login ele já tem que me retornar esse token aqui vamos ver aqui npm Run start Dev vamos ver se tá tudo
certinho aí vou vir aqui no Bruno agora eu vou criar um folder authentication vou criar outro folder Zinho aqui users vou mover esses dois aqui para cá tá E aí agora sim novo request aqui para authenticate ou login né login ele vai ser do tipo post E aí vai ser aqui host eu vou chamar o meu host a login eu acho que eu estou exigindo N é isso eu já estou exigindo aqui estou mesmo então um objeto se eu passar um bar vazio ele tem que dar 400 que a gente já configo isso no nest
Beleza então vou dar aqui um Raw Jason e aí eu vou mandar as minhas credenciais e-mail Petr de Melo @gmail.com e password password e vamos ver se isso aqui já vai funci funcionar então enviei ele me retornou esse tokem aqui tá então fiz o console.log das credenciais só pra gente ver que tá tudo funcionando e agora sim com as credenciais na mão Vamos criar o nosso serviço eu vou vir aqui no serviço aí vou criar o serviço aqui al PR service.ts Export Class vamos parar aqui o servidor al service ele é um Jack table beleza
é um Jack table vou criar uma interface aqui chama chamado credentials E aí ele vai ser e-mail password E aí sim eu vou colocar aqui credentials e aí o que que eu vou fazer eu vou mover aquele Token para cá só pra gente manter tudo funcionando return Beleza eu vou dizer que ele vai tornar um string vou dar um conso pon log mais uma vez nas nossas credenciais E aí eu vou pegar esse al service vou receber ele aqui como injeção de dependência E aí sim ess link config ajeitando tudo vou terar esse carinha aqui
e vou dar um return 10. al service p credentials como vocês sabem eu prefiro deixar tudo mais explícito E aí o que que a gente vai fazer esse cara tá me retornando um token um string não é isso que eu quero tá eu vou armazenar isso aqui no nesse nessa variável aqui variável token vou dar uma wait aqui porque isso aqui é uma Promise E aí eu vou mapear esse controlador para authenticate response.to PTS e esse carinha aqui é minha request né então vamos feito isso o que que eu vou fazer vou copiar esse essa
classe aqui vou colocar para cá então em vez de request é response access token então jwt token vamos fazer o seguinte return New ortar esse carinha aqui beleza Ele tá reclamando porque não tem aquele Construtor Então vamos botar esse Construtor aqui acho que é suficiente ao invés disso eu passo só o token aqui vamos ver se tá tudo funcionando o meu serviço tá mocado ainda mas acredito que tudo tem que estar funcionando ainda na verdade não porque o off service não foi adicionado como provider né então vamos adicionar o al service como provider aqui e
agora sim vamos ver se tá tudo funcionando como antes vou enviar e espero retornar um access token como é que tá nosso api lá nosso Sueg então eu já tenho aqui aquele api tag se torna essa categoria aqui ó então lembra que a gente usou duas @tag lá em cima de cada controlador Então tá aqui users e al já tenho aqui o get certinho e o al certinho mas não é isso que eu quero né Eu quero realmente criar um token de verdade se o usuário enviou as credenciais corretamente então o que que a gente
vai fazer aqui meu controlador Tá certo eu vou receber no meu off service Vamos mudar um uma injeção de dependência aqui ele vai receber o meu user repository porque eu quero capturar um usuário por e-mail não é isso então vamos ver aqui con user e US weit 10. user repository get my by mail vamos desestruturar aqui das minhas credenciais beleza só para ficar mais bonitinho aqui mesmo vamos tirar esse e-mail aqui que a gente vai fazer o seguinte esse usuário aqui pode não existir Então a gente tem duas possibilidades aqui para dar um erro né
o primeiro usuário não existe o segundo usuário existe e o password é errado são essas duas possibilidades a gente vai testar as duis em conjunto se nenhuma dessas possibilidades estiver certo então o usuário existe o p Word é correto e a gente vai retornar um token Beleza então o que que eu vou fazer aqui eu preciso importar um carinha lá do BPT que é Import from BPT é o compare Beleza então o que que a gente vai fazer aqui eu tenho usuário e agora eu vou dar um const password match vai ser igual a wait
com password E aí user password só que esse usuário pode ser vazio esse usuário pode ser nulo né ele pode ser undefined então eu vou fazer o seguinte vou só passar um opit chain aqui e um vazio porque aí eu posso agora fazer um if dessa forma aqui economizando linhas né preciso fazer dois ifs para o mesmo erro se o usuário não existe ou o password não Matte né só que esse erro aqui a gente vai utilizar um erro específico do NS que é o unauthorized Exception Beleza ainda não tô gerando o token dinamicamente eu
só quero ver se essa lógica Inicial aqui vai funcionar Então vamos startar o o meu a minha aplicação voltar aqui pro Bruno e o que que acontece eu vou enviar isso aqui eu não tenho esse usuário criado ainda lembra porque nós estamos utilizando banco em memória então eu já Espero que ele dê um retorno de credenciais inválidas Então tá aqui invalid credentials porque porque eu não cri esse usuário Então vamos criar o usuário agora tá aqui minha rota Create user eu vou enviar agora eu tenho esse usuário então eu vou até copiar o ID aqui
e vamos chamar ele aqui para ver se ele vem direitinho agora sim e agora que o usuário existe eu vou tentar me autenticar com ele eu espero receber o token mocado que eu coloquei lá então agora sim tá aqui ó access token mocado do jeito que eu coloquei lá eu quero agora criar um token de verdade então vamos fazer o seguinte para fazer isso eu preciso instalar um cara chamado nestjs jwt é esse cara que eu preciso aqui e aí enquanto ele tá instalando aí a gente vai vir aqui no app module e a gente
vai fazer o Import aqui do jwt module resister global é a única coisa que eu vou passar Global true dentro do meu serviço aqui agora eu vou ter a ão de uma outra dependência é o Private read only jwt servers É isso aí do NS jwt aí aqui eu vou ter que const token vai ser igual a 10 p é um await né await 10. jwt service sign token que que a gente vai fazer aqui então são dois objetos aqui é o payload e as options Vamos criar esse payload aqui em cima payload vai ser
o conteúdo do Token Tá o que que eu vou colocar no token eu vou colocar não vou chamar de de ID eu vou chamar de Sub para respeitar os padrões do jwt então sub é o user ID vou colocar o name vou colocar o e-mail vou colocar também um expiration e vou também colocar o iat que é o momento que o token foi criado tá faltando a a vírgula aqui né pra gente ficar organizado Vamos criar um objeto token payload eu vou criar aqui na minha raiz vou criar uma pastinha aqui aqui chamada shared aí
aqui eu vou colocar um types.ts e eu vou exportar um interface token payload vamos agora utilizar esse carinha aqui certo a gente fica tudo organizado o payload eu passei aqui eu quero agora as options as options vai ser o qu basicamente o Secret é a única option que eu vou passar no momento Teoricamente ele vai criar esse token e eu vou responder esse token e de onde é que tá vindo esse Secret na vida real ele vai vir de um ambiente externo de um cofre certo você pode usar várias ferramentas várias estratégias de gerenciamento de
dados sensíveis aqui vai ser uma uma constante na nossa aplicação Não faça isso em produção mas a gente precisa ganhar tempo então vou dar uma constantes aqui PTS vou exportar essa constante tá faltando o Consta aqui né vou apagar esse carinha daqui vou importar das constantes acho que aqui já é suficiente pra gente criar o nosso token então o que que eu vou fazer eu vou adicionar também uma outra propriedade aqui que é o aud stram is é basicamente Quem fez o cara tá quem foi que assinou esse token E aí pra gente fazer uma
uma brincadeirinha aqui eu vou botar esse udio aqui botar se inscreve no canal e Ative o Sininho Obrigado gilot Petros de Melo Dev se inscreva no canal e Ative o Sininho ótimo audience tá aqui vamos ver se tá tudo certo npm Run start Dev vamos vir aqui no Bruno o meu usuário ainda não foi criado Lembrando que toda vez que apliação derruba a gente tem que recriar porque estamos fazendo em memória vou enviar isso aqui se eu copiar esse ID aqui vamos tentar aqui Enviar esse ID que foi da vez anterior da execução anterior ele
não achou se eu enviar aqui o novo ID Agora sim ele achou e agora eu vou tentar me autenticar vamos ver se vai dar certo né então deu certo ele já criou um token aqui eu vou copiar esse token e a gente vai entrar num carinha aqui chamado jwt.io pra gente ver se esse token quais informações que esse token tem lá Então tá aqui falando Qual o algoritmo o tipo E aí ele tá falando ó o sub o ID do usuário o nome tá falando aqui também quando inspira Então espira daqui a 1 hora foi
gerado no nesse momento 12:25 e tá aqui a audiência Petros de Melo deve se inscrever no canal e Ative o Sininho já temos aqui a nossa rota de login também e a gente só precisa agora fazer a última rota da aplicação que vai ser a rota que vai exigir autenticação e a rota que vai devolver o usuário autenticado users P Controller vou criar mais um método aqui vou dizer user ID na verdade não é isso eu vou querer a minha request Então vou colocar a minha request a isso aqui ele é festify request já já
a gente ajeita isso aqui da minha request eu espero que ela tenha um user ID porque esse método só vai funcionar ele só vai ser executado quando usuário estiver autenticado ele tem que ter ele vai respeitar um contrato que eu vou definir Vamos definir logo esse contrato então aqui em types eu vou dar um Export Inter Face authenticated request o que que esse cara vai ter ele vai ter um user.id do tipo string quer um tipo porque ele vai ser isso aqui e f Fire request vamos importar o f Fire request não tenho ainda porque
eu não instalei então npm install NS plataform ffy Beleza agora que ele instalou eu preciso fazer uma modificação aqui no app então aqui vou passar New fastify adapter npm install fastify static beleza eu também tenho que instalar aqui o festify Agora sim eu tenho o festify request aqui disponível tá então vai ser a minha Authenticator request ele vai ser basicamente FF request Com Adição do user id e agora sim eu tenho essa interface ou esse tipo disponível para ser utilizado lá no meu controlador eu vou usar ele aqui eu vou renomear esse cara para Get
Me e vou usar esse tipo aqui vou botar um Get Me eu vou copiar esse api response e vou dar um Promise com esse retorno aqui para ele parar de reclamar se eu startar a aplicação do jeito que está agora não vai funcionar porque eu não criei ainda os mewes de autenticação se a gente a gente criar aqui o mediaware de autenticação eu vou criar aqui dentro do shared Public decorator PTS e a gente vai definir esse decorator como isso aqui ó Vamos definir essa constante então Public Hand Point metadata e aqui sim você pode
olhar na documentação do do nests eu estou fazendo exatamente do jeito que tá lá esse decorator vai ser o utilizado para decorar os controladores que são públicos aqui no meu user Controller Create user eu quero que ele seja público vou copiar esse cara aqui dizer que esse aqui também é Public esse aqui não é beleza o me não é Public no al Controller Eu também quero que ele seja Public para fazer agora que esse metadado realmente altere o comportamento da aplicação eu tenho que criar um cara chamado out FRG PTS eu vou copiar esse self
guard da aplicação que eu já fiz aqui certo para gravar esse vídeo para vocês pra gente ganhar tempo então já copiei mas eu vou te explicar que é que cada coisa faz então o que é que eu tô fazendo eu estou definindo uma regra de quem é que pode chamar um controlador esse método vai ser executado E aí o que é que o método tá fazendo ele captura do controlador o metadado que eu adicionei que é esse aqui Public se for público ou seja se o metadado existe e tá marcado como true ele vai dizer
deixa esse cara acessar então retorna true se não for público aí agora sim ele vai começar a fazer as validações ele vai pegar a request aí vai extrair o token da request se o token não existe ele devolve unauthorized Exception mesma exceção que a gente colocou lá na autenticação se o token existe ele vai usar o meu jwt service para verificar a assinatura E aí se tudo der certo nessa linha aqui de dentro do payload vai ter o sub que é equivalente ao ID do usuário e eu vou colocar o id na request se essa
linha aqui der errado vai cair no catch mas isso aqui não é suficiente Eu preciso chegar lá no meu App module eu preciso adicionar esse cara como um provider app guard E aí use Class off guard Teoricamente é isso Teoricamente essa rota já está funcionando e já está exigindo autenticação npm Run start Dev beleza deu certo vamos vir aqui agora na nossa aplicação Bruno vamos criar o nosso usuário criar o usuário certo ou seja tá público vamos capturar esse ID aqui pra gente ver se isso aqui continua público também continua público o login eu quero
que também seja público ou seja ele tem que ter um token aqui eu quero passar minhas credenciais ele vai me devolver um token ele devolveu um token então também tá público e agora vamos criar aqui uma nova request get authenticated user a URL vai ser host bar users bar me Create E aí eu vou enviar essa request primeiro sem autenticação E aí tá aqui autored então NS tá dizendo ó você não tem autorização para fazer isso Beleza então vamos vir aqui em al agora eu quero passar um bar token E aí eu vou colocar o
token que eu copiei da outra request aqui do login então copiei esse token aqui vou passar aqui vamos ver se ele vai me responder agora com o meu usuário que é isso que ele tem que fazer então Ele já respondeu então você tá até agora Assistindo e você gostou de ver isso aqui deixa o seu comentário porque a gente vai passar agora pra próxima fase nós vamos instalar o Dynamo DB localmente criar todo Nossa o nosso repositório sem ser em memória agora se conectando com Dynamo real e seguir com projeto nós vamos começar a utilizar
o Dynamo Deb para fazer a persistência de dados do da nossa aplicação Então vamos vir aqui pra nossa arquitetura O que que a gente fez até o momento a gente fez o nosso serviço só que eu quero que o nosso serviço quando subir e cair eu não tenha que ficar recreando o usuário toda vez então essa parte tá pronta aqui vamos adicionar agora aqui o Dynamo inicialmente local porque nós não temos ainda toda a infraestrutura na WS provisionada para que a gente faça isso nós vamos precisar instalar o docker Você só coloca aqui no Google
docker clica aqui nessa opção docker desktop E baixa aí de acordo com o seu sistema operacional então eu já tenho ela aqui na verdade então você só faz o download aí faz a instalação uma vez que o docker tiver aberto iniciado você vai pesquisar agora no Google um cara chamado Dynamo Deb local vim aqui direto no docker Hub você vai copiar esse link aqui ó esse comando aqui vamos entrar aqui na no vs code e eu vou rodar esse carinha aqui só que eu vou adicionar um menos D depois do Run aqui eu vou adicionar
o menos D porque eu não quero que ele e prenda o meu terminal eu vou executar ele já criou aqui o meu contêiner se eu voltar para cá o meu contêiner tá Running só que agora eu preciso de uma interface gráfica para gerenciar o Dynamo Então você já tem um contêiner rodando ali simulando Dynamo Deb você vai pesquisar aqui vem no Google aqui você vai pesquisar Dynamo Deb admin Então já tá no meu histórico aqui ó você vai só copiar esse comando aqui e vamos rodar Esse comando deu certo 6 segundos rapidinho Mas a partir
de agora depois que você rodar Esse comando você vai ter o o comando Dynamo DB admin disponível na sua máquina local apontando para o Dynamo DB local você não precisa fazer nenhuma configuração ele já vai pegar by default as configurações ó tá aqui ó então Database end Point tá apontando aqui para o Dynamo 8000 e tá dizendo que o Dynamo admin tá ouvindo nessa porta aqui então se a gente chegar lá no naquela porta local host 2. 8001 eu já tenho que vem a interface aqui do Dynamo admin para eu conseguir sem precisar ficar usando
linha de comando criar tabelas e tudo mais você precisa ter aws credenciais configuradas para que o dynam DB funcione mesmo que você não esteja utilizando Dynamo Real lá na WS você precisa para a a WS cli funcionar corretamente ali por baixo dos panos a gente vai fazer o download da wsl Você só coloca aí no Google vai ser o primeiro resultado ou o segundo resultado aí depende muito de onde você tiver pesquisando você vai vir aqui vai baixar a versão mais recente para o seu sistema operacional então só segue aqui as instruções dessa página que
vai dar tudo certo depois que você seguir as instruções você vai você vai ter disponível aqui a WS como uma cli é no seu terminal então se eu der um version aqui ele vai me dizer aws men men version E aí agora sim ele tá me dizendo que eu tô utilizando a versão 2.15 da WS cli uma vez que você já tiver a WS cli configurada na sua máquina a gente precisa fazer a configuração das credenciais inicialmente a gente vai utilizar credenciais falsas ou burras você vai abrir aqui o Code na sua pasta do usuário
pon aws E aí vai ter esse arquivozilla aí 1 2 3 credenciais burras não não existe nenhuma conta WS vinculada a isso aqui mas é necessário ter essas credenciais para que o dynam Deb local funcione corretamente eu vou dar um Clear aqui aws dynam DB list tables e eu tô passando endpoint local ele vai me mostrar que eu não tenho nada se a gente não tivesse configurado aquelas credenciais burras ele ia dar uma exceção aqui de credencial E aí eu vou normalmente aqui Create table Vamos colocar colocar aqui Dev users hash attribute basicamente a chave
primária aqui ID é a nossa chave primária do tipo string não vamos utilizar o Range id e Mas vamos precisar de um de um ID secundário esse ID secundário vai ser o e-mail Então vou chamar aqui esse de e-mail index e o hash attribute name é e-mail então ele vai ter por definição pelo menos dois atributos mas a gente sabe que vai ter outros mas os outros eu não preciso me importar com isso no momento vou dar um submit Ele tá reclamando aqui que eu não coloque aqui o que é que significa o hash attribute
Type aqui do e-mail você tem que colocar string que vai dar certo aí agora apertei no botão errado vamos dar o submate eu tenho Dev users como a minha tabela aqui se eu voltar aqui no meu terminal vamos lá no vs code eu vou rodar o mesmo comandinho aqui agora eu agora tenho uma tabela Dev users Então vamos fazer então a conexão do nosso da nossa api com o Dynamo eu vou dar um Clear aqui para começar eu preciso instalar um conjunto de dependências no nosso projeto eu preciso instalar lá o awssdk client dynam DB
e eu preciso instalar o awssdk útil dynam DB feito isso vamos lá no nosso repositório users repository e agora não quero mais nada em memória eu quero conexão com Dynamo então eu vou criar aqui um objeto chamado client Dynamo de B client é exatamente isso o a construção do objeto mas quando se trata do Dynamo local eu preciso passar o end Point Então o que eu vou fazer aqui é o seguinte eu vou passar region e vou passar end Point só que eu só vou passar isso aqui se eu tiver uma determinada variável que const
local development local development eu vou dizer que ela é falsa então se eu não passar nada ela é falsa se local development for true eu vou passar esse valor seão vai ser undefined porque aí esse objeto aqui vai funcionar tanto local quanto lá na WS eu vou receber isso aqui também por variável tá então vou dizer que o meu WS region vai ter esse valor eu vou receber das varáveis de ambiente senão ele vai ter esse valor como Def E aí eu vou também passar esse essa variável aqui e agora que eu tenho Dynamo client
Agora sim por exemplo no Create user eu não vou mais 10. user. push eu vou executar um comando contra SDK do Dynamo tá então vou apagar logo esse carinha aqui vamos Apagar todos os métodos aqui para ele obrigar a gente fazer tudo certinho const Command vai ser igual a new idem já já a gente vai PR a gente vai dar um await client P send Command eu vou ter o table name users mas eu vou pré fixar isso aqui com o ambiente então eu vou também pegar o environment name vai ser Dev tá então eu
vou prefixar esse carinha aqui beleza o table name E aí também o item eu vou até pegar o que ele tá sugerindo para te explicar aqui no dynam Deb todos os objetos são desse tipo aqui você tem o a propriedade apr idade é um objeto em si que tem um s se for string um n se for Number e assim por diante eu não quero ter que trabalhar com esse nível de abstração quer eu trabalhar com Jason então para isso a gente vai importar um cara chamado Marshall Ian Marshall do Dynamo útil eu vou basicamente
utilizá-lo eu vou pegar o user Marshall idem aqui eu preciso passar algumas configurações que é remove undefined values e convert Class instance to Map esse método tá pronto a gente vai testar já já mas eu também quero criar esses carinhas aqui então esse carinha vai ser Command vai ser New query Command e aí eu vou colocar o meu table name aqui só que eu quero também colocar um index name porque eu quero pesquisar por e-mail utilizando o index Que Nós criamos eu já tenho o meu comando E aí o que é que eu vou fazer
eu vou executar o meu comando só que ao invés eu não vou desestruturar não Eu vou fazer um response aqui normal eu vou fazer um if response items se ele não existia ou se o Len for igual a zero eu já vou devolver um undefined se não ele tá me sugerindo isso aqui mas não é isso que eu quero porque eu estou fazendo um cast do user não é o que eu quero eu vou criar uma Instância um interface aqui chamado user Record esse user Record vai mapear o tipo do objeto lá do Dynamo para
mim ele vai ter não é user ID é só ID e-mail password name created at também updated at o meu Record tem esse esse valor E aí sim user Record vai ser isso e agora return New user passando não quero user Record eu vou desestruturar o meu user Record já está pronto e vamos fazer agora o get user by ID const Command iG New get idem Command então table name vai ser a mesma coisa E aí o Key eu vou passar o ID tô passando o user ID essa parte de baixo aqui é muito parecida
não é exatamente igual porque no Carry ele é assume que pode vir mais de um item mas no get idem é só um item então ele vai ter uma ligeira diferença nisso aqui nessa nesse if aqui então não é items é item E aí não é Len é só isso aqui se ele não existir aí eu já retorno defined senão eu vou copiar esse carinha aqui eu posso até criar um método privado para fazer isso aqui retornar 10 ponto do user Record copiar essa linha aqui substituir aqui em cima também vamos vir aqui no package
Jason e aí aqui eu vou dar um unset só para evitar qualquer problema vamos voltar pro Bruno aqui criou o meu usuário tá então eu tenho esse ID aqui que foi criado vamos vir aqui no Brave eu tenho aqui o meu local rosto 8081 funcionando eu vou clicar aqui no Dev users e eu já tenho o meu usuário persistido tá aqui Petros dem Melo @gmail Create edet Aparentemente está com problema né então vamos corrigir isso primeira coisa que eu vou fazer excluir esse cara vou excluir esse cara vou chegar lá no repositório e aqui no
Create user ao invés de passar o meu objeto user eu vou desestruturar não tem necessidade não tenho necessidade de passar isso aqui eu vou adicionar essa opção aqui como parâmetro que é o conditional Expression attribute not exist e agora sim eu acho que se eu enviar minha request então enviei Ele criou esse usuário esse ID vamos lá no Brave eu vou só dar um search aqui e agora sim eu tenho creade at como string aqui update at como string aqui a informação tá persistia no banco Vamos tentar agora capturar um usuário por ID vamos ver
se tá tudo certo eu vou passar o ID que eu acabei de criar esse ID já tá vindo do banco de dados então vou fazer o seguinte eu vou até derrubar e levantar a aplicação novamente porque eu quero garantir que ele está vindo do banco de dados e não de um banco em memória que a gente se livrou vou executar Espero que esteja funcionando mas se tiver algum bug a gente corrige então envie aí ele tá trazendo end aí os dados vamos fazer o seguinte vamos enviar um um ID aqui que não existe eu vou
pegar um uu ID aqui que a gente não criou só pra gente enviar user not found porque não existe esse usuário lá vamos criar mais um usuário tô o tempo todo criando o meu nome aqui eu vou dizer John e aí eu vou dizer que é John @gmail.com e vou criar Ele criou tenho aqui agora mais um usuário Então esse aqui não existe esse aqui existe Vamos chegar lá no Dynamo admin voltar no Dev users e agora eu tenho aqui dois usuários beleza vamos tentar fazer autenticação Então esse usuário existe aqui a gente já criou
então se tiver tudo certo ele tem que funcionar se ele levantar alguma exceção a gente já ajeita deu tudo certo vamos olhar lá no jwt.io Petros Dev se inscreva no canal Ative o Sininho e por último vamos ver o Get Me Vamos criar um login para o John do eu vou executar e agora eu vou copiar esse token vou vir aqui pro get authenticated user vou trocar o token e aqui ele tem que trocar o usuário autenticado porque outro usuário Então tá aí John do bom pessoal na primeira versão desse vídeo eu tinha feito testes
unitários para todas essas classes mas o vídeo está ficando longo mais longo do que eu imaginei que seria então eu vou deixar os testes unitários no repositório você pode acessar o repositório aí e acessar os testes unitários mas eu vou seguir para a próxima parte aqui que é a criação da infraestrutura na WS com terraform cdk e Git Hub a nossa aplicação tá pronta e a gente quer disponibilizar essa aplicação agora na WS para começar nós vamos vir aqui no Google e vamos procurar cdk terraform ou cdk TF é suficiente você vai achar aqui esse
primeiro link então você vem aqui com Install cdcf e a gente vai copiar um comandinho aqui para instalar o cdk cli então copia esse carinha aí vai no teu terminal faz a instalação aqui na raiz do projeto eu vou criar infra então vamos sair aqui Clear vamos sair pra nossa raiz vamos vamos entrar infra E aí eu vou rodar sindicate F eit template typescript ele vai me fazer algumas perguntas aqui então Project name infra então 001 api rest colocar isso aqui traço infra description deixar vazio mesmo terraform Cloud não vamos usar não quero utilizar um
projeto que já existe não quero enviar Crash vou utilizar WS de provider E aí terminou e aí eu vou instalar essa dependência aqui ó npm install cdcf provider aws WS aqui que é o tema do vídeo o meu projeto ele veio dessa forma aqui mas a gente vai dar uma reorganizado eu vou excluir esses testes aqui excluir esse help Jess config também eu vou excluir esse setup de Jason eu vou excluir eu vou vir aqui no package e vou fazer uma cópia dos plugins de slink Vamos pesquisar aqui SL link então tem todos esses aqui
ó copiar esses carinhas aqui então tá aí Devid dependence também o prier vou copiar vou copiar ele para cá E aí depois disso eu vou só copiar esse S lint aqui esse PRY aqui também e vou botar aqui já estamos aqui na pasta vou dar um npm instal para ele instalar as dependências e eu vou criar uma pastinha aqui chamada stacks e aqui a gente vai definir as nossas stacks eu tenho aqui o o Main esse Main precisa ser mantido e eu vou começar definindo o meu Project pack.ou começar exportando uma classe Project stack que
estende a terraform stack anotação é essa aqui nós vamos definir todos os nossos recursos dentro do Construtor quero uma interface interface de propriedades aqui o environment name aí vai ser um string E aí eu vou receber aqui um props vamos chamar o super aqui passando o scope e o ID esse construct aqui eu preciso importar e aí sim eu vou copiar esse Project stack aqui e eu não vou instanciar essa classe aqui inst o app e eu dou um New Project stack app e eu vou passar aqui environment name deve vamos importar esse cara em
aqui e aí por que que normalmente a gente passa algumas propriedades porque eu poderia uma vez que todos os meus recursos estão definidos aqui eu posso depois vir aqui e criar outros ambientes né então vou ter um ambiente por exemplo de prod E aí você não precisa fazer mais nada você só vai executar o terraform ele vai fazer tudo para você exatamente do jeito que você fez deve então a automação a segurança governabilidade utilizando infes code é muito maior não é o que a gente vai fazer agora então deve Project stack vamos começar definindo os
nossos recursos a gente precisa criar o banco de dados a gente precisa criar as permissões e a gente precisa criar a aplicação utilizando elastic be install Então vamos voltar aqui pra arquitetura a gente vai criar esse obtin aqui ó dynam Deb para fazer isso aqui eu tenho que fazer um New Dynamo Deb table esse carinha aqui ó e aí aqui eu tenho que passar algumas coisas coisas esse carin aqui eu vou chamar de users table V passar aqui o name users hash Key vai ser o ID Só que eu não quero users eu quero prefixar
com o nome da minha do meu environment então vou dar um props props p environment name Vamos desestruturar esse carinha aqui do props E aí a gente só usa o environment name a hash Key é o ID eu preciso passar dois atributos eu preciso passar o id e preciso passar também o e-mail porque eu vou utilizar esse e-mail como chave do meu global índice o Billing mode vai ser pay request e eu vou vir aqui Global secondary index e vou criar aqui um índice então ele já tá me sugerindo aqui qual é o name e-mail
index igual a gente fez lá no Dynamo admin eu tô dizendo qual é o hash Key e-mail e a outra coisa que eu preciso aqui é criar o meu provider então New aws provider eu vou receber esse region também como parâmetro Teoricamente a gente tá com uma aplicação pronta aqui para executar e criar um banco de dados certo errado por qu porque eu preciso configurar ess credenciais da WS lembra que a gente tinha entrado lá no code aws credentials E aí a gente tinha colocado algumas informações aqui o terraform vai utilizar essas informações para executar
a stack que a gente criou então se eu vier dentro do meu Main ele tá pedindo uma região agora eu vou passar a região que eu quero que seja criado e executar essa aplicação então CD cate F apply E aí eu vou passar esse nomezinho aqui ó Dev Project stack ele tem que dar um erro de credencial ele vai dizer Cara eu tô pegando essa credencial que você configu aqui não tá servindo de nada the Security to included in the request é inválido o token de segurança está inválido inclusive posso fazer um teste aqui que
é aws STS get color identity ele vai me passar uma informação de quem é o usuário que tá chamando e aí eu tenho que receber um resultado de invalid client token vamos entrar aqui no console da WS então o que que a gente vai fazer eu vou entrar numa conta pessoal minha e a gente vai fazer testes lá depois eu excluo Tudo beleza estou aqui no meu console da aws vamos clicar aqui em serviços iam E aí eu vou aqui em users e eu tenho aqui por exemplo já um usuário criado eu vou entrar nesse
cara vou clicar em Security credentials esse usuário Já possui administrador então aqui eu vou entrar em Security credentials e vou criar aqui um access Token para utilizar como se like vou clicar aqui I understand the above recommendation vou copiar esse valor aqui aqui vou colocar lá nas minhas credenciais Vou colocar aqui ó no lugar do ABC Então eu tenho access ke ID access Secret ID então salvei as credenciais no momento que eu vier agora e rodar aws STS get color identity eu já tenho que receber que eu estou autenticado como usuário Petros de Melo eu
já sou capaz de rodar CD cate F apply com essa stack aqui como eu sei que ele vai funcionar eu quero mostrar para você que não existe nenhuma tabela do dynam lá vamos voltar aqui em serviços e procurar aqui ó Dynamo Deb eu posso vir aqui em explorar items eu tenho duas tabelas aqui mas não tenho nenhuma tabela Dev users Então vou vir aqui agora e vou aplicar o cdic f apply ele vai me mostrar aqui uma previsão do que vai ser criado ó approve e pronto foi criado levou aí mais ou menos 24 segundos
se eu voltar aqui agora no console eu vou atualizar e eu vou ter o Dev users aqui criado eu vou voltar lá então pro meu vs code a gente vai prar AP agora para o Dynamo do ambiente vamos vir aqui em repository users repository vamos tirar esse local development true vamos vir aqui em package eu vou tirar esse carinha aqui tirar esse carinha aqui npm Run start Dev Aparentemente tudo certo vamos vir aqui agora no Bruno e eu vou criar um usuário ele levou um pouquinho mais de tempo 611 msos porque agora tem uma tem
uma request né para o Dynamo Deb e eu vou voltar aqui atualizar ver se esse usuário foi criado lá e foi o ID B3 é 8 como vocês podem ver aqui ó B3 é 8 vamos copiar esse ID aqui verificar se esse ID existe vou enviar se eu devolver o ID anterior Eu recebo um not found porque o usuário não existe lá no banco eu vou tentar me autenticar aqui com esse usuário e tudo certo tudo funcionando só que agora dynamodb online na WS tá então a gente definiu aqui o Dynamo table E agora o
que que a gente precisa fazer a gente precisa criar permissões pra nossa aplicação acessar o Dynamo table con trusted policy New data aws iam policy document Então trusted policy document vou chamar esse Car trusted policy document e aqui embaixo eu vou escrever o meu permissions policy document então ele tá permitindo Dynamo item e Dynamo Carry mas eu vou só adicionar um asterisco aqui porque eu quero que ele permita o Dynamo asterisco ou seja qualquer tipo de api que a WS tem para o Dynamo ele vai permitir nessa Police para este recurso aqui então não quero
para todas as tabelas se eu deixar o asterisco lá vai ficar para todas as tabelas eu quero para esse recurso aqui então vou dar um cons damo debit table E aí aqui eu consigo adicionar um ponto arn Para eu não ter problemas com indexes e outras variações eu vou colocar um asterisco no final tá então a gente vai fazer assim e aí vamos entender um pouco aqui como funciona WS por baixo dos panos tá a gente vai criar uma iam policy E aí como é que funciona essa policy ela é uma entidade da WS e
a m Row na verdade a gente vai criar ela agora ela é uma entidade da WS para gerenciar permissões e o que que a gente adiciona a gente diz no trusted policy trusted policy a pergunta aqui é Quem pode assumir Então o que a gente tá falando aqui em cima no trusted police é exatamente isso Quem pode assumir essa role o permission policy o que essa Row pode fazer eu tô definindo isso aqui eu tô dizendo que o sc2 pode assumir essa Row que a gente vai criar e quando ele assumir essa Row essa Row
pode executar qualquer operação do dynam Deb dentro dessa tabela aqui então o que eu vou fazer aqui agora é criar a minha policy const iam polic é igual a new iam polic tá vamos importar esse cara des e a m Police isso efetivamente é um recurso da WS Então se a gente entrar lá no console e vi aqui em am eu vou ter entidades uma delas é usuários como a gente já viu a gente vai ter a rows e a gente vai ter as policies tá então eu vou criar uma policy e atribuir essa policy
a uma Row e a m Police eu vou chamar ela de application Police mas eu vou prefixar com environment E aí se a gente tiver várias aplicações a gente pode nomear essa Police de acordo com a aplicação E aí aqui eu tô dizendo o que é que essa Police faz e agora vamos criar a nossa iam Roll New iam Roll eu vou importar 10 iam Roll a gente vai dizer que o assume Roll Police é aquele documento lá em cima eu vou criar um name aqui também pref fixando environment name application Roll nós vamos utilizar
um Construtor iam Row policy attachment eu vou colocar apontar Qual é a policy que é essa aqui e qual é Row que eu out estou atribuindo então basicamente nós estamos criando uma entidade criando uma outra entidade e fazendo o attachment de uma entidade na outra vou dar aqui C cate F apply Dev Project stack não tô na pasta certa então vou abrir aqui outro terminal do lado e agora sim cdk apply bom ele apareceu aqui para mim o resumo da operação eu vou aplicar isso aqui tá beleza deu tudo certo então se eu vier aqui
agora no console eu atualizar isso aqui eu tenho que ter uma Row nova e tá aqui ó Dev application Row Beleza se eu acessar essa Row aqui lembra que eu falei que tinha duas o trusted policy document está aqui ó trusted relationships e dentro das permissões eu tenho a Police que foi criada E se eu abrir a policy eu tenho o que que aquela Police pode fazer e antes da gente criar a nossa aplicação eu preciso adicionar mais policies nessa Row aqui então vou copiar da minha fila e vou botar aqui embaixo e vou explicar
exatamente o que que o que é que a gente vai fazer vou copiar esse atributo aqui colocar aqui a WS tem customers managed policies e managed policies ou aws managed policies e qual é a diferença delas basicamente a WS managed policies são policies que eles criaram e disponibilizam pra gente então tá aqui uma lista a gente precisa de todas essas aqui pra aplicação ter permissão de rodar ali no S2 ele vai criar alguns recursos por baixo dos panos se eu atualizar aqui e rodar novamente o comando ele deve rodar bem rapidinho vamos aprovar ele criou
rapidinho aqui vamos voltar pro Brave E aí em vez de ter uma Police eu espero ter seis uma que eu criei e cinco que eu adicionei que já existiam então ele tá atualizando as policies e tá aí ó essa Row tá pronta para ser utilizada e aí a gente vai criar a nossa aplicação bstock eu vou começar criando a nossa aplicação const application equals New elastic Bean stock application é esse Construtor aqui mesmo a gente vai colocar um description então o name aqui é que eu vou pré fixar com environment vou adicionar aqui um app
version Life cycle a gente vai colocar aqui S Row é aquela iam Row arn e vamos colocar aqui delete source from S3 through isso aqui é suficiente e aí aqui embaixo a gente tem que criar um instance profile a gente vai colocar aqui o name o name precisa ser exatamente esse aqui do jeito que tá aqui senão não funciona e a row é aquela que a gente criou E aí agora a gente vai criar o nosso environment então const environment vamos Import tá esse cara a gente vai colocar o Tier é o Web Server o
name eu vou colocar esse aqui que ele tá sugerindo mesmo Solution Solution stack name não vou utilizar esse aqui eu preciso utilizar um específico tá e eu vou copiar da minha fila aqui colar aqui porque senão não dá certo então tem que ser esse 64 bits Amazon Linux 2023 isso pode mudar inclusive se você tiver utilizando esse aqui replica no vídeo e não tiver dando certo tiver recebendo um not found alguma coisa assim vai lá na documentação porque isso aqui pode mudar também de tempos em tempos e aí eu vou colocar conjunto de settings o
primeiro setting que eu vou colocar aqui vai ser names Space aws out scaling launch configuration desse jeito aqui eu vou colocar name o iam exatamente instance profile do jeito que tá aqui o velho a gente vai passar aquele instance profile name que foi colocado Além disso eu vou passar namespace aws pra gente ganhar tempo eu vou copiar aqui do minha cola e eu vou explicar o que é que cada coisa faz esses carinhas aqui estão basicamente configurando os logs né do STD Então os logs ali do nosso console vai para um Cloud watch que ele
cria por debaixo dos panos e a gente vai ter acesso e eu tô criando aqui também variáveis de ambiente tô passando aqui a variável environment com esse valor tô passando também a variável no color true que é basicamente para o nest JS não ficar colocando cores nesses logs aqui lá na WS e tô passando region igual o region a gente tá recebendo dinamicamente lá também na aplicação aqui no repository tá então aws region acabamos até de encontrar uma diferença aqui né Então em vez de region vamos passar aws region que é para bater com o
que a gente tá esperando na aplicação E aí ele tá reclamando porque a gente criou um environment mas a gente não passou a aplicação tá então application E aí eu tô apontando agora para o application que eu criei aqui em cima Esse environment aqui eu preciso trocar né Ele tá reclamando a o a única coisa que eu vou fazer aqui Depois deste construtor é criar um New terraform output porque eu quero ver eu quero saber qual é o RL do environment que foi criado aparentemente tá tudo certo eu vou rodar o comando e esse comando
já tem que criar toda a infraestrutura necessária para rodar a nossa aplicação nodejs eu vou rodar essa aplicação Esse comando aqui então tá aqui o terraform plan vou dar um approve então Acabei de aplicar aqui e eu vou copiar esse link aqui agora e vou abrir lá no navegador e eu já tenho que ver aqui uma página de Welcome da do elastic Be stal Então como vocês podem ver a gente já tem aqui a página de Welcome do elastic Be Talk e eu preciso agora criar a nossa automação utilizando github Actions para atualizar o servidor
com a nossa aplicação para isso vamos criar uma p aqui dentro da raiz P github dentro dela vai o workflow E aí a gente vai criar o nosso primeiro workflow aqui eu vou chamar ele de backend Pim eu vou colocar o nome então name Deploy backend elastic be stock vamos utilizar propriedade on que que ela define ela define quando o workflow vai ser trig eu poderia colocar aqui quando enviar uma atualização para m ou coisa do tipo criar uma feature Branch mas eu quero deixar vazio no momento pra gente trigar manualmente ele já tá me
sugerindo aqui Jobs e eu quero ter dois Jobs inicialmente eu quero ter o job de build e quero ter o Deploy Dev no build ele já tá até que sugerindo bem aqui eu vou aceitar eu vou dizer que esse build ele roda no Ubuntu latest então o Agent que o Git Hub Actions vai usar lá vai est rodando a última versão do Ubuntu eu vou colocar um nome nesse job eu vou chamar de build application e eu também vou colocar um defaults todo comando que esse Job rodar ele vai rodar dentro de uma determinada pasta
aqui do meu repositório no meu caso aqui é iepi que é exatamente a nossa pastinha aqui de dentro e aí a gente tem um step primeiro é o checkout do código ele tá certinho aqui mas a gente vai usar a versão 4ro que é a versão mais recente eu vou setar o node a versão que eu quer a 20 e também existe o Action setup node na versão 4 e aí eu tenho que instalar as dependências eu vou rodar npm C eu vou rodar também os testes no meu caso aqui por enquanto a gente não
tem teste nenhum mas antes da gente subir eu vou adicionar alguns testes aqui e aí ele vai rodar o build vai buildar essa aplicação Então veja que é como se a gente tivesse ali no no terminal rodando npm Run tests npm Run build E aí eu vou utilizar um outro step aqui que é o upload build artifact o que que esse cara vai fazer ele vai criar um ambiente compartilhado entre um Job e outro e vai fazer o upload do artefato nesse ambiente compartilhado e vai iniciar o outro Job então é o que eu quero
fazer aqui eu quero ter um Job que vai buildar e um outro que vai fazer o release porque eventualmente a gente pode ter um Job para cada ambiente com testes de fumaça com com regressão estratégias que a gente pode ter E aí vamos começar a definir aqui o Deploy Dev eu vou também dar um name para ele eu vou chamar de Deploy Dev environment eu vou dizer que ele também roda no ubom to latest eu vou dizer que ele depende do build e Vou definir os steps aqui então quais vão ser os steps ele não
vai fazer checkout ele vai fazer o download direto não precisa de checkout o name do artefato é artefato e o pef vai ser artefato também na versão 4 tá certinho e aí só para explicar aqui no build tá criando essa esse artefato mas ele vai copiar tudo que tiver dentro do API respeitando essas regras aqui então tudo que tiver dentro do API asterisco exceto source Test e o node modules ou seja ele vai pegar basicamente o dis e os arquivos aqui do package né esses arquivos aqui da raiz fez o download aqui do artefato vamos
passar agora pro próximo step que é zipar o artefato Zip artefact for deployment ele vai rodar um CD artefato porque eu tô baixando o meu artefato nesse pef aqui ele vai entrar nessa pasta e aí ele vai rodar o comando Zip - R que é recursivamente service P zip em tudo que tiver dentro do artefato também existe uma Action de alto nível pra gente utilizar aqui que é Deploy to elastic Bean stock preciso de um access Key e de um Secret application Dev api tem que ser exatamente do jeito que tá lá então vamos usar
atualizar isso aqui para respeitar o que a gente fez aqui na stack esse carinha aqui é o nome da aplicação e do environment e a version Label vai ser esse aqui com o deployment package Zip workflow precisa ser no plural aqui tá em vez de workflow é o workflows então vamos fazer um Fix aqui tá sincronizando vamos voltar para lá e vamos atualizar aqui entrar no Actions eu tenho aqui o Deploy backend to elastic be stal Só que tem um porém eu preciso setar as permissões se eu rodar aqui ele vai Executar tudo certinho eu
acho né e quando ele tentar deployar a aplicação lá no elastic be stock né ele vai tomar um not authorized nós vamos voltar aqui na nossa aplicação e a gente vai criar um usuário para o github primeira coisa que eu vou fazer é criar um usuário const github Actions user é igual a new iam user e aqui a única coisa que a gente precisa é do nome ele vai criar um usuário giub actions que a gente vai utilizar esse github Actions user eu vou atribuir uma Police diretamente a ele vou dar permissão total porque eu
não quero passar muito tempo aqui discutindo níveis de permissão em produção Não faça isso então tenho já o documento e a gente tem que criar agora uma policy tá então constam policy github Actions vai ser igual a new iam policy E aí eu vou criar essa policy com o nome Git Hub actions policy pré-fixado com o environment name e passando essa policy json aqui aqui embaixo eu vou criar um iam user policy attachment bom então já aplicou aqui ele tem que ter criado o nosso iam user policy a nossa policy e o nosso usuário vamos
voltar para cá eu já tinha vindo aqui offline e já tinha atualizado então por isso que tá aqui ó Dev github Actions tá então esse usuário acabou de ser criado aqui com o Dev github Actions policy a gente vai vir aqui em Security credentials e vai ar um access Key aqui já está aqui vamos no github settings Secrets and variables Actions e agora sim eu vou criar um repository Secret Então vou criar aqui um repository Secret vou copiar o nome que a gente colocou lá no backend Emil que é esse carinha aqui ó aws access
ke ID Vou colocar aqui vamos copiar o valor vamos adicionar esse segredo Vamos criar mais um segredo aqui copiar aws CET access Key colocar aqui e copiar esse valor aqui add Secret Beleza já temos aí o access Key e o access o Secret Key tem que vir aqui no Actions vamos trigar o nosso Deploy e vamos rodar e vamos ver se vai dar certo se a nossa aplicação vai ser deplo para aws então vamos esperar aí o build tá buildando a aplicação Tá instalando as dependências Talvez os testes falhem aqui já que não tem nenhum
teste lá tá então se falhar a gente faz o ajuste n Como eu disse eles fal porque não foi encontrado nenhum teste né então vamos ajustar isso aqui rapidamente expect to be true a única coisa que eu vou fazer aqui vamos rodar npm Run test aqui só pra gente ver se tá tudo Run test Lembrando que eu vou adicionar os testes em seguida offline Quando você vê lá no repositório vai est tudo lá agora sim vamos lá trigar o nosso workflow novamente tá rodando os testes aí não tem teste né Só tem aquele dump teste
que a gente viu tá buildando a aplicação já budou a aplicação tá fazendo do artefato pronto Terminou o build vamos ver o Deploy aqui ele fez o download do artefatos tá fazendo o Deploy lá enquanto ele tá fazendo o Deploy aqui vamos rapidamente aqui no nosso Bruno vamos criar um novo environment vou chamar de aws Dev no HOST vamos adicionar host aqui apontando para a nossa variável que a gente sempre pega aqui no output do infra que é esse aqui ó Então esse é o host que a gente espera que a nossa aplicação responda tá
então já atualizei bom ele falhou aqui no Deploy né Vamos descobrir o que que aconteceu tá faltando uma coisa muito importante aqui a gente precisa criar um arquivo proc file eu vou rodar npm C SL production eu não estou mandando lá no github Actions as dependências eu quero que ele instale novamente porque só as dependências de produção e aí ele executa o o start prod Então vamos fazer rapidamente isso aqui Fix Create profile vamos sincronizar e trigar novamente a nossa pipeline lá beleza ele já Buu a aplicação tá fazendo aqui o download do artefato já
fez o download do artefato e tá fazendo o Deploy lá para o elastic bein stock eu espero que vá funcionar agora já que a gente adicionou o arquivo lá que estava faltando bom aplicação Deploy então vamos fazer o teste lá agora no Bruno eu já estou na WS environment aqui então ele já está apontando para aws eu vou enviar aqui uma request tá aí e-mail já em uso vamos fazer o seguinte vamos Vamos criar um novo usuário aqui fulano de tal vamos ver se esse usuário vai ser criado lá na no dynam Deb fulano de
tal @gmail.com espero que esse cara seja criado e aí foi criado aqui vamos abrir aqui aws agora vim aqui em dynam Deb na minha tabelinha de usuários dev users na verdade eu quero vir aqui em explore items Dev users e agora eu tenho aqui fulan de tal foi criado dinamicamente pela aplicação Então vamos capturar esse cara e verificar aqui que tá tudo certo então tá aí fano de tal apontando pra aws e é isso pessoal primeiro vídeo do canal conteúdo muito legal muito denso Espero que você tenha gostado Espero que você tenha se divertido porque
eu me diverti deixa o seu like deixa o seu comentário manda para todos os seus amigos pede para eles se inscreverem tá porque a gente vai ter muito conteúdo legal Aqui deixa aí embaixo o que que você quer aprender que eu vou te ensinar de um jeito muito bacana do começo ao fim conteúdo que você não vai ver por aí fácil e é isso abraço [Música]
Copyright © 2025. Made with ♥ in London by YTScribe.com