o teste técnico é uma etapa crucial para os processos seletivos de desenvolvedor Então nesse vídeo a gente vai resolver mais um desafio técnico para vaga back end e dessa vez é o desafio de uma das maiores empresas de Tecnologia do mundo a Uber Então bora para mais um vídeo da série de vídeos resolvendo o desafio técnico aqui do canal [Música] Então já tô aqui com o desafio aberto para a gente dar uma olhada nos pré-requisitos e o que que a gente vai precisar fazer nesse desafio e o desafio que eu escolhi para o vídeo de
hoje é um desafio do Uber e eu vou mostrar para vocês onde eu encontrei esse desafio então o Uber tem um perfil no github que se chama Uber Arcade onde eles guardam vários projetos Open Stories que não recebem mais suporte ou não recebem novas atualizações e aqui dentro desse perfil Uber caibro vocês vão encontrar vários repositórios de projetos ou pensar se do Uber E aí foi aqui que eu encontrei esse repositório contendo desafios técnicos do Uber esses desafios técnicos são um pouco mais antigos então justamente por estarem aqui disponibilizados de forma bem fortes eu acredito
que eles não utilizam mais esses desafios E aí vocês devem estar se perguntando tá E por que que a gente vai usar desafio antigo bom é muito difícil a gente encontrar os desafios que as empresas usam atualmente normalmente os desafios que as empresas usam atualmente para os processos seletivos elas não disponibilizam de formas para os candidatos não copiarem a solução de outras pessoas ou não ficarem sabendo como é que vai ser o desafio para não ter aí vantagens e desvantagens enfim escolha da empresa mas é muito interessante a gente usar desafios antigos da empresa para
praticar né para treinar e também para aprender um pouco mais sobre o processo seletivo dessa empresa Então vamos dar uma lida agora aqui como é que funciona esse desafio do Uber Então vamos ler aqui a descrição do desafio a primeira coisa que eles falam é aqui ó se você não tem nenhum código para compartilhar você pode trabalhar em um dos code challenge descritos abaixo então aqui bem interessante provavelmente eles faziam um processo seletivo onde tu podia levar um projeto pessoal que tu já tinha criado e explicar ele durante a entrevista explicar o que que tu
tinha feito como é que tu tinha arquitetado etc É bem interessante eu acho que planeja isso tá e depois eles dizem o seguinte por favor Organize fácil design teste documento e faço o Deploy do seu código como se ele estivesse indo para a produção então e vim para nós o link do repositório aí em seguida a gente tem aqui a aba de Fechou spek então eles dizem assim ó Prototype One of the projects então cria um protótipo de um dos seguintes projetos então eles dão quatro ideias de projetos e a gente pode escolher qualquer um
desses quatro para fazer o nosso protótipo para o nosso código e enviar para eles então Os projetos que eles deram aqui de sugestão foi o projeto the parter times SF movies é meio service e food Trucks e depois eles completam desde o ex Andy up you então aí o x e a interface é totalmente com você sinta-se livre né se você gosta para ser criativo e adicionar novas features que sejam úteis para os usuários então aqui eles deixam bem abertos essa questão de interface aí para quem tiver fazendo o desafio para front Angel full steck
por exemplo vai ter que criar interface vai ter que fazer um design né de todo o layout ali da aplicação então eu já dei uma lida aqui nessas quatro ideias de projetos que eles sugerem para tu fazer e eu escolhi para o vídeo de hoje a gente fazer o e-mail service Porque como a gente está focando aqui mas numa vaga como se a gente tivesse aplicando para uma vaga de back end eu acho que essa aqui seria a melhor opção ou uma das melhores opções para quem estivesse escolhendo aí a vaga de back end aí
esse e-mail service consiste em cria um serviço que aceita a informação necessária e envia e-mails esse seu serviço deve prover uma abstração entre dois diferentes e meio Services providez então para quem não sabe é meio Services providez basicamente são serviços né funcionam como apis que a gente usa para disparar e-mails então a gente faz o nosso cadastro nesse meio service provar a gente autentica o nosso e-mail lá e aí a gente utiliza que esses e-mails Services providers disponibilizam para fazer envios de e-mails de forma automatizada aí a gente conecta a nossa aplicação a esses e-mails
Services providers e consegue disparar e-mails pela nossa aplicação de forma automatizada e aqui o que a gente vai precisar fazer é criar um e-mail service que se conecta com esse meio service provider e faz o disparo de e-mails então aqui bem interessante bem back end mesmo E outra coisa que a gente tem que notar aqui já lendo esse desafio é que esse desafio já mostra que provavelmente dentro do Uber eles têm Diferentes microsofts né eles trabalham com micro serviços E por que isso porque aqui o desafio consiste em só a gente criar um serviço para
disparo de email e provavelmente eles devem ter isso lá dentro que aí outros serviços usam esses serviços para o de e-mail para disparar e-mails por exemplo serviço de pagamentos se conecta né faz a comunicação com o serviço de e-mail para disparar e-mails para os usuários quando ocorrer o pagamento o serviço reserva de viagens né de Trips né do Uber quando reserva uma viagem também dispara um e-mail para o usuário todos esses microsurfs que precisam disparar uma notificação via e-mail para o usuário devem usar o e-mail service deles que eles têm lá dentro então isso aqui
a gente já consegue observar uma tendência do Uber né para utilização de microsofts aqui pelo desafio a gente já consegue perceber isso e aqui em seguida eles dão um exemplo de mais e-mails providers né a gente pode utilizar então eles falam que o do Sandy Bridge o meu Gun os parques post e a Amazon 6 que é Amazon 5 é meio service o que a gente vai usar hoje é o Amazon CS tá a gente vai abrir aqui o nosso dashboard da Amazon também vamos fazer toda a configuração do zero e uma coisa interessante aqui
que a gente tem que se atentar é que eles frisaram aqui o seguinte ó você deve prover uma abstração para dois diferentes é meio Services providez aqui eu vou fazer só com um pro vídeo não ficar muito longo mas o que que a gente vai fazer a gente vai desenvolver todo o nosso Candy Seguindo os princípios de arquitetura limpa Então a gente vai criar as nossas camadas vamos dividir nossos módulos vamos fazer a comunicação através do nosso interface adapters E aí a nossa aplicação não vai ficar dependente de qual e-mail serve se provado eu tô
usando então se eu quiser trocar o Amazon CS pelo Sandy Grid ou pelo meio-gam basta eu criar nova classe ali do Sandy Grid ou do meio-gan que implementa a interface que eu criei e plugar ela e começar a utilizar o cor da minha aplicação a minhas regras de negócio nada Vou precisar mudar Só Vou precisar mudar essa camada aqui mais de Fora implementar a interface que eu vou ter definido e aí partir para utilização então quando a gente for ali para o código vai ficar mais claro para vocês o que eu tô falando mas isso
aqui é uma coisa que eu percebi lendo o desafio que é o que eles querem aqui que a gente faça essa divisão né das camadas corretamente que a gente Siga os princípios de nextector por causa dessas pistinhas que eles foram deixando aqui ao longo da descrição do desafio então quando a gente foi implementar no código vai ficar mais claro e aí aqueles completam que todos esses e-mails servos aqui que eles listaram são tem teste grátis né é só criar sua conta e criar uma conta de teste para utilizar Então agora que a gente já entendeu
os requisitos funcionais né O que que a gente vai precisar fazer vamos ver os requisitos técnicos então aqui ó arquitetura vai ser separada entre back end e frontiend e você deve prover uma comunicação via Jason e numa Pirelli então para comunicar o frontiendi o back end tem que ser ali através do Jason né usando a uma então eles completam sinta-se livre para usar qualquer outra tecnologia que provém né arquitetura de cliente e serviço então aqui Eles não falam nem clientes servidores já falam clientes serviço então novamente a gente vê aqui uma tendência para Michael Services
Na minha opinião tá então eles dizem assim ó escolha uma das trilhas técnicas a seguir que melhor casa com as suas Skills técnicas Então esse desafio aqui é Um Desafio bem interessante é um que serve tanto para full steck back Angel front end porque eles dão quatro ideias de projetos que tu vai ter que criar O protótipo tu vai escolher um desses quatro projetos e aí tu escolhe o que melhor vai destacar as suas Skills dependendo da trilha que tu tiver escolhendo Então se tu tá escolhendo full step tu vai escolher uma das ideias ali
dos projetos que tu consegue fazer o backing o front end de uma forma legal se tu tá escolhendo a trilha de backend que é o nosso caso tu vai escolher uma das ideias de projeto que mais vai destacar os teus conhecimentos de backing que foi o nosso caso a gente escolheu o e-mail service e a mesma coisa pro frontiend e aqui né Vamos ler Qual é o requisito para trilha de backy end para quem você deve incluir um frontinho de mínimo por exemplo um estética que viu ou Docs então aqui é interessante eles querem que
pelo menos eles consigam ver né os resultados ali da execução do teu backing que consiga se comunicar com ele ver o que que ele tá retornando né através de uma estética viu por exemplo ou ipdox para deixar tudo detalhadinho como funciona esse também E aí eles escreva documento e teste a sua EPI como se tivesse sendo usada por outros serviços então novamente aqui a tendência para microcerves já desenvolve o teu back-ind pensando que outros serviços vão estar utilizando esse também Candy então ele tem que estar bem escrito tem que estar documentado tem que ter testes
né para garantir que tá funcionando bem interessante e aqui vamos ler os requisitos técnicos específicos para beckend então aqui eles colocam o seguinte ó a gente acredita que não existe uma melhor tecnologia né a tecnologia que melhor se encaixa Para tudo uma boa engenharia é sobre escolher a ferramenta certa para o trabalho certo então escolher a melhor ferramenta que vai te ajudar para que ele certo cenário para que ele certo problema e estar constantemente aprendendo sobre né novas ferramentas novas tecnologias aí eles completam a sinta-se livre para mencionar no seu redmi quanta experiência Você tem
quaisquer que você escolheu a gente vai levar isso em consideração na hora de fazer o review do seu código então sei lá ó eu tenho cinco anos de experiência em Java eles vão pegar mais forte nisso foi o cara tem cinco anos de experiência em Java tem que ser um código bem escrito agora se eu tentei me desafiar tentei fazer em gol e eu não tenho nenhuma experiência em Gol coloco lá vocês vão ver pô o cara tentou se desafiar não conhece golo já fez um bagulho bacana tem alguns errinhos mas já fez algo legal
então bem interessante essa forma deles aqui de avaliar tu tem Duas escolhas tu pode escolher uma que tu não tem tanto experiência e aí tu pode ali ter alguns errinhos ou uma que tu tem muita experiência mas aí tu vai ter que entregar algo bem escrito né bem arquitetado com design bonito de código etc e aí eles mencionam aqui algumas tecnologias que eles são familiares né que provavelmente já tem projetos lá dentro do Uber com Essas tecnologias aí tem Python java script Rubi PHP Gol ser mais rascau e Java senta se livre para usar qualquer
web fmwork se você escola escolher um filme work que gera código boler Plate por favor detalhe no seu redmi Qual o código foi escrito por você e qual código foi gerado pelo firmwork então aqui bem interessante Eles querem ver o que que foi que a gente fez mesmo o que que a gente escreveu e a linguagem que a gente vai escolher para resolver o desafio hoje vai ser o Java Então a gente vai utilizar a java com Spring para criar o nosso e-mails Então bora para o código então eu já abri aqui o springite a
laser para a gente iniciar o nosso projeto Spring eu vou escolher aqui o maven para ser o nosso gerenciador de pacotes a linguagem é Java vamos adicionar aqui as dependências Então a primeira dependência que eu vou adicionar o Spring Dead Tools né para adicionar a Live Reload restarts aplicação automática etc vamos adicionar também o Spring web porque a gente vai desenvolver uma epy rastul então a gente precisa desse módulo do spring spring web vamos adicionar também o lombok para gerar código baile Plate para gerar gathers de forma automática não sei se a gente vai utilizar
mas já vamos adicionar porque eu costumo usar em todos os projetos Java e é isso de dependências inicialmente é a gente vai precisar também adicionar dependência do e-mail Service pro Viber que a gente for utilizar no nosso caso vai ser o aws 6 né assim por meio service mas a gente vai adicionar depois porque aqui no springite a lazer não tem essa biblioteca a gente adiciona depois lá na mão no nosso punches ml e aqui eu vou colocar só o nome do nosso projeto Então vou chamar de e-mail service aqui vai ser e-mail service também
e aqui ponto exemplo não vou botar ponto Keeper beleza Uber code challenge é aqui vamos gerar o nosso projeto então vou clicar aqui em janelate beleza ele já baixou aqui então Vamos abrir meus downloads já descompactei aqui a pasta do e-mail Service Vamos abrir essa pasta lá dentro do nosso inteligente então vou abrir aqui o inteligente tô abrindo aqui o projeto dentro da inteligente Pronto já tá aberto e a primeira coisa que a gente vai fazer é adicionar a dependência do aws 6 aqui no nosso XML então aqui depois do springboot Starter test eu vou
adicionar a nossa dependência do aws6 Então vou colar aqui eu já tinha copiado a dependência para quem tiver acompanhando aí pausa o vídeo copia aqui o nome da dependência o grupo aí o artifx a versão para depois conseguir fazer o download aí no projeto de vocês e aí para a gente instalar de fato a gente vai ter que dar o Reload aqui comer então vou clicar nesse botãozinho aqui que aparece mas a gente clicar aqui na direita em maven ficar em meio service depende-se e abrir aqueles dependências a gente já consegue verificar se ele baixou
ou não essa nova dependência aqui para mim já tá aparecendo Amazon WS ssdk 6 né que é o SDK do 5 é meio service que a gente vai usar no nosso projeto beleza a instalação do pacote já foi concluído e a gente pode partir para criar o nosso código Então a primeira camada que a gente vai criar aqui a camada acorda Nossa aplicação é a camada Central essa camada ela vai reunir as regras de negócio e os casos de uso da nossa aplicação o caso de uso define o que o nosso app faz mas não
como ele faz então isso é agnóstico a implementação de fato então a gente está protegendo os nossos casos de uso as nossas regras de negócio de como é implementado por fora que depois vai ser usando a ws6 ou Sandy Bridget etc então primeiro a gente vai se concentrar no Core no núcleo da nossa aplicação e descrever o que ela faz descrever as regras de negócio que é enviar e-mail recebendo um subject então um assunto do e-mail um from um two e o body o from o from não o from vai ser nós nossa aplicação então
só recebe o sul né para quem que tem que enviar e o body que é a mensagem de fato que vai conter dentro do nosso e-mail então vou abrir aqui dentro da pasta sorte manjava e aqui com um ponto keeper. é meio service a gente vai criar um novo pacote então New Packet que a gente vai chamar de cor onde vai ficar os casos de uso né e as regras de negócio da nossa aplicação aqui dentro de cor eu vou criar uma New javaclass né então aqui em eu Java cless que vai chamar é meio
Sander you Case esse meu e-mail Sender os kiss na verdade não vai ser uma classe assim uma interface que a gente vai implementar depois e dentro dessa interface eu vou ter um método que vai ser o e-mail esse meu Center meio vai receber uma string que é o two o mais string que é o subject e uma string que é o body né que é o corpo do e-mail e aqui vai ser voz de não vai retornar nada beleza a gente já definiu aqui o caso de uso principal da nossa aplicação que é enviar e-mail
recebe um true e tem esse método aqui send e-mail Beleza então só para entender o que que a gente fez aqui a gente definiu uma interface que vai ser o contrato que define o comportamento da nossa aplicação então isso aqui a gente tá falando do mais alto nível da nossa funcionalidade a gente só definiu o contrato e agora a gente vai partir para criar as outras camadas onde a gente vai fazendo a implementação Então a gente vai criar a camada de aplicação a gente vai criar a camada de adapters tudo isso aqui Seguindo os princípios
de Clear e agora o lado aqui do nosso pack de cor a gente vai criar outro pack né que vai representar outra camada do nosso aplicação que vai ser a camada de application mesmo então aqui eu vou criar application e essa camada contém a implementação dos nossos casos de uso então no core na camada-core a gente definiu os casos de uso a gente mantém as regras de negócio da nossa aplicação Então isso é agnóstico a implementação é só o que a nossa aplicação Faz mesmo e aí na camada de aplicação a gente vai implementar esses
casos de uso Então a gente vai de fato ali pegar aquela interface e implementar ela numa classe e uma coisa interessante aqui da gente entender é que a camada application só conhece a camada cor e a camada cor não conhece ninguém Então corre realmente o núcleo ele como se fosse o centro da Terra dentro dele não existe ninguém é só ele e ele não conhece ninguém que tá de fora a camada de aplicação fica em volta dessa minha camada cor então a única coisa que ela vai conhecer é a minha camada cor ela só vai
implementar as interfaces que estão no corda da minha aplicação só vai implementar meus casos de uso mas ela não vai conhecer ninguém de fora também então ela não vai conhecer por exemplo o nosso e-mail serve se provider que é o 6 ela só vai conhecer uma interface ela só conhece a né que depois no final quando a gente criar as próximas camadas vai ser no fim né vai ser o aws 6 que a gente vai implementar ali mas essas camadas aqui não sabem disso de fora né não sabe o que tá por fora dela delas
por volta então lembra que eu falei para vocês que a gente ia escrever a nossa aplicação dividida em camadas de forma que se a gente criasse trocar o nosso e-mail serve Se provar a gente só ia precisar criar uma classe para esse meio service provider e implementar a interface o resto da nossa aplicação não ia precisar mudar nada então é esse ponto aqui a gente vai criando as nossas camadas abstraindo tudo né criando as interfaces e deixando tudo divididinho da forma correta Seguindo os princípios de clineactactor né isso aqui eu digo forma correta de acordo
com aquele nextector então aqui dentro do meu application eu vou criar uma nova Java classe que eu vou chamar de meu e-mail Sender Service e aqui vai ser uma classe de fato Então essa camada aqui de application ela conecta o corda minha aplicação com o mundo externo Então ela serve aí como uma ponte né ela vai implementar de fato ali o corda a nossa aplicação e esse nosso e-mail Center service implementa então implementos o nosso e-mail Sander you scace e aqui ele tá me mostrando um erro porque a gente precisa implementar aquele método e-mail Então
vou colocar aqui implemento métodos sendo e-mail e ele já vai implementar aqui para mim tá E agora o que que a gente faz aqui eu já chamo o SDK da WS aqui dentro não Não era essa camada ainda então essa camada aqui de aplicação também só vai depender de uma abstração então aqui a gente vai definir que ela vai ter uma dependência que vai chamar e-mail Singer Gateway por causa de portão de entrada para o mundo de fora tá Eu gosto de chamar dessa forma então o e-mail Sander Gateway e aqui ela vai receber via
Construtora então autor serve-se então que eu tô definindo o Construtor da minha classe eu recebo por parâmetro um e-mail Sander Gateway isso aqui e meio e faço o meu diz ponto em meio Sander gater e recebeu o e-mail gate e aquele também indicando um erro porque essa classe aqui é meu cender Gateway não existe né a gente está usando aqui uma classe que não existe então a gente vai ter que implementar ela para ele parar de me lançar esse erro então aqui a gente vai criar um novo pacote além do application e além do core
que a gente vai chamar de adapters essa camada aqui é a camada de interface adapters Então essa camada né de adaptadores de interface vai adaptar o mundo de Fora para uma interface E aí a minha aplicação vai depender dessa interface e não do mundo de Fora Como assim aqui para o meu e-mail Sander service não depender diretamente do aws ssdk ou do swing Grid ou do Meio gan lá para ele não ter essa dependência direta aqui ele vai depender de uma interface essa interface é uma interferência adapta que eu creio é um computador de interface
então eu vou criar essa interface definir ela e o meu serviço depende dela e depois quando eu for criar a classe do aws que vai fazer o envio do e-mail e vai usar o aws ssdk Essa é minha classe vai implementar essa interface então eu vou fazer com que eu não dependa diretamente da WS e sim aws implemente a interface que eu defini e o meu serviço dependa dessa interface que eu defini e tudo isso a gente chama de um interface adapta então é outra camada aqui que a camada de adapta-se então aqui dentro eu
vou criar uma nova Java Classic na verdade vai ser uma interface e vai chamar e-mail Sender Gateway então aqui dentro vou criar sempre Face e basicamente o que que vai ter aqui dentro dessa minha interface vai ter um método void que também vai se chamar centro de e-mail e vai receber uma string two uma string que é o subject e uma string que é o body agora vocês podem estar se perguntando tá Fê mas isso aqui não é exatamente igual aquela outra interface lá que a gente definiu no nosso you scase Sim nesse caso é
exatamente igual Mas qual é a diferença prática né qual é a diferença desses dois aqui na teoria o e-mail Sender use representa a lógica de negócios da nossa aplicação então aqui é alto nível tá isso aqui é agnóstico é implementação agnóstico em implementação e agnóstico é infraestrutura já o e-mail Center gatewart aqui está representando um contrato para que a nossa aplicação interaja com serviços de fora com os e-mails Services providers que no caso vai ser a ws6 ou send Grid por exemplo então aqui eles são iguais as duas interfaces Mas elas representam coisas diferentes dentro
do nosso código então aqui muito bem elas poderiam ser coisas diferentes também poderia essa interface poderia ser diferente dessa porque elas não representam a mesma coisa representa o caso de uso da nossa aplicação é regra de negócio já esse é meio Sander Gateway representa o contrato da minha aplicação com o serviço o provedor de serviço ali de meios que eu vou usar entendeu é diferente aqui no caso eu resolvi definir da mesma forma mas eu poderia aqui definir com outro nome diferente e aqui dentro do meu e-mail Sanders eu vou fazer diz e-mail Sandra Gateway
e aqui eu vou passar o tu o subject e o body e aqui Faltou o ponto então diz Ponto beleza aqui eu tô só chamando o meu a minha implementação desse e-mail Sander Gate e agora a gente vai criar a camada de infraestrutura essa camada é responsável por interagir com serviços né estruturas externas e no nosso caso vai ser onde a gente vai implementar a comunicação com a ws6 então aqui eu vou criar um novo pacote ao lado desses aqui que eu já criei que vai chamar infra pode ser infort enfim como vocês preferirem chamar
eu vou chamar de infra para não ficar um nome muito grande e aqui dentro de infra eu vou criar um novo pacote para deixar a minha infra relacionada ao aws 6 então aqui eu vou criar um pacote chamado de seis e aí dentro desse pacote seis eu vou criar uma Java classe que eu vou chamar de seis e-mails Fê por que que tu criou aqui um novo pacote seis porque o aws6 pode não ser o único serviço externo que a minha aplicação tá usando eu posso estar usando por exemplo aí pi do Google também aí
piá do Facebook aí piá do Instagram outros serviços dentro do meu da minha própria empresa então outro micro serviço dentro do Uber Enfim eu posso ter comunicações com vários outros serviços externos então aqui uma boa prática a gente criar um novo pacote para cada um desses serviços externos para fazer ali a camada de infraestrutura que vai se comunicar com esse serviço então aqui eu criei o pacote de infra que vai conter toda essa parte que é responsável por fazer a comunicação com serviços externos e dentro de infravo criando né pacotinhos para cada um dos serviços
que eu tô usando dentro da minha aplicação e essa minha classe aqui seis é meio cender vai implementar então implementos a nossa interface lá de gator Então o meu e-mail Sander Gateway que é a interface que o meu e-mail Sander service depende então aqui a gente vai implementar os métodos que ele já tá me acusando aqui um erro porque eu não tô implementando e aqui dentro a gente vai ter o nosso método e-mail e aí o que que a gente vai ter aqui dentro da nossa Classe A Primeira coisa vai ser a dependência do SDK
da WS né que agora a gente vai usar ele enfim de fato então aqui eu vou ter Private final Amazon 5 e meio service vai ser o meu aws não Amazon 56 service aí Vou definir o Construtor também da minha classe então aqui Public 6 é meio Sander vai receber por parâmetro um Amazon sem por meio service recebe meio service para eu receber aqui essa minha dependência e aqui a gente coloca a notação de autolyart para indicar que isso aqui vai ser injetado automaticamente pelo Spring né então a gente não vai em nenhum momento criar
Estância dessa minha classe criar uma Instância do aws e fazer injeção nessa classe através dos Construtor quem vai ficar responsável disso vai ser o Spring e para quem ainda não conhece muito bem Spring para quem tá aprendendo Spring já tem vários vídeos de Springer aqui no canal eu vou deixar o link aqui do card de um vídeo onde a gente constrói uma aplicação do zero uma aplicação full steck usando Java Spring react nesse vídeo eu expliquei vários conceitos base do Spring então se você tá aprendendo Spring agora eu recomendo fortemente você assistir esse vídeo então
depois que terminar o vídeo aqui do desafio parte para esse vídeo aqui de spring que você vai aprender muito eu vou deixar o link aqui no card e agora vamos implementar esse nosso método aqui sendo meio usando finalmente o SDK né para enviar o nosso e-mail Então a primeira coisa que a gente vai precisar fazer é montar a nossa request que a gente vai enviar para WS como é que a gente vai fazer isso a gente vai definir aqui uma variável que vai ser do tipo send e-mail Quest que vem de dentro da biblioteca da
WS e aqui eu vou dar o nome para essa minha variável de request e eu vou fazer um 11 e-mail Quest esse meu sendo é meu request a gente vai montando ele então aqui primeira parâmetro que eu vou passar para ele é com o if Stories Então quem é quem tá enviando esse e-mail né quem é a origem e aqui a gente coloca o nosso e-mail o e-mail que a gente vai cadastrar lá na WS então que eu vou colocar lives Fernando aqui peper@gmail.com depois a gente tem que passar o if Destination Então quem é
que vai receber esse meu e-mail e aqui dentro eu vou fazer um mil desse Nation with passando o meu tio que é o e-mail que eu recebi por parâmetro e por fim a gente vai fazer um ifi Messenger Então qual vai ser a mensagem desse meu e-mail e aqui dentro eu vou fazer um New message e essa minha mensagem a gente vai ter que passar para ela o subject o assunto da mensagem e o corpo da mensagem então aqui a gente vai fazer um with subject passando um mil content e passando meu subjector e um
if Body passando um mil Body with e aqui o meu Body que é uma string vocês podem ver aqui ó que se eu fizesse ponto with é Mel a gente ia conseguir passar um HTML então além de mandar um e-mail de texto poderia mandar um template HTML aqui de e-mail mas no nosso caso a gente vai só passar um texto e aqui ele tá me dando erro quando eu passei o body porque eu não posso passar ali diretamente aqui eu tenho que fazer um mil contos também E aí passar o body para transformar ele num
conta que é o tipo que esse Body aqui recebe e agora que a gente já colocou a mensagem o destino e a origem o nosso request está pronto então a gente já pode terminar aqui e fazer o envio do e-mail Então como é que a gente vai fazer eu vou fazer um try Cat aqui então try eu vou colocar o cat caso de algum erro e aqui dentro do nosso try eu vou fazer um descontos e meio service Amazon sempre é meio service ponto é meio passando o request bem fácil pronto E caso dê algum
erro então aqui eu vou colocar um Cat e o erro que pode dar aqui é o Amazon service Exception que eu vou chamar de Exception caso desse erro eu vou pegar o erro e vou lançar uma nova sessão troll new e-mail e-mail service Exception essa exceção ainda não existe mas a gente vai criar ela agora então e-mail pronto e agora a gente vai precisar criar essa exceção mas para o envio do nosso e-mail era isso deixa eu ver se não faltou nada aqui na nossa Classe A aqui a gente tem que decorar essa nossa classe
com a notação de service para o Spring entender que isso é um service conseguir fazer as injeções de dependência depois e lá na nossa aplicação no nosso application dentro do nosso e-mail Sander service a gente também tem que colocar anotação de service porque isso aqui também é um serviço e depois Spring não vai conseguir identificar caso a gente não coloca essa anotação aqui beleza então agora vamos partir para a criação da nossa exceção esse e-mail service Exception ou qualquer outra exceção personalizada da nossa aplicação fazem parte ao corda Nossa aplicação porque são exceções relacionadas à
nossa lógica e a nossa regra de negócios só que deu um erro no momento de enviar e-mail eu tirei essa dependência aqui do aws tá eu peguei a exceção da WS mas eu relevei isso e a maior exceção aqui é que teve uma exceção no momento de enviar o meu e-mail que faz parte da minha regra da minha lógica de negócio então essa nossa exceção aqui é meio service Exception eu vou colocar lá dentro da nossa camada cor então aqui eu vou criar um novo pacote New Packet que eu vou chamar de exceptions e aqui
dentro eu vou criar uma New Java cless que eu vou chamar de e-mail service Exception essa minha e-mail serve cception vai estender a classe runtime Exception que vem do Java e aqui a gente vai definir basicamente os construtores dessa minha classe então aqui Public é meio service Exception vai receber por parâmetro uma string que a mensagem e aí vai fazer um super passando essa mensagem e outra forma também aqui que a gente pode fazer para criar essa minha exceção é da mesma forma defini um outro Construtor e-mail serve esse Exception vou receber uma string metas
Mas eu também vou receber um trollow que é a causa dessa minha exceção e aqui eu vou fazer super passando a mensagem passando a causa esse super aqui basicamente está chamando o Construtor da classe que eu tô estendendo como eu tô estendendo a classe Grand time Maxion quando eu faço super eu chamo o consultório dessa classe e passa mensagem e monta essa exceção e agora lá no nosso e-mailcender a gente vai importar essa exceção beleza e aqui eu posso passar só a mensagem a gente definir um Construtor que recebe sua mensagem ou poderia passar aqui
a causa da exceção também passando essas seption eu vou passar aqui porque depois caso o lance essa exceção fica mais fácil da gente divulgar e ver o que que aconteceu beleza para nossa camada de infraestrutura era isso a gente já criou aqui a nossa exceção personalizada também e agora vamos criar o nosso Controller que vai receber as requisições http e vai fazer a chamada de todos esses carinhas aqui para disparar o e-mail Então agora eu vou criar um novo pacote que eu vou chamar de controllers que vai conter os controlos da nossa aplicação então aqui
controllers e aqui dentro eu vou criar o meu javaclass que eu vou chamar de e-mail Sander Controller esse meu e-mail Sender Controller vou ter que decorar com anotação de rest Controller para indicar para o Spring que é um Controller West né E aqui um request mapping para indicar qual entepoint que isso aqui fica escutando então aqui fica escutando beleza aqui dentro a gente vai precisar de algumas dependências então aqui Private final email service que vou chamar de e-mail Service e aqui eu vou criar o Construtor da minha classe autolite Public e-mail Sander Controller e aqui
eu vou receber um e-mail Sander service e-mail service eu vou fazer 10 pontos recebeu o meu e-mail service beleza aí dessa forma eu já vou ter o meu e-mail serve para fazer o disparos de e-mails se vocês perceberem aqui esse meu controle não tá dependendo lá da minha implementação do 6 é meio service que é o da Amazon aqui eu tô dependendo do meu e-mail Sender service quem é o meu e-mail Sander service é a minha implementação lá da minha do meu e os cases que tá dentro da minha camada application então aqui tá o
meu e-mail Sander service que implemento depende de um e-mail Sandra Gateway e o meu 6 é meio cender que aqui o daws ele implementa esse gato então é aqui que vai entrar a WS entendeu então quando o meu controle estancial é meio cender service no caso o Spring vai fazer isso e vai injetar no meu controle esse meu e-mail como dependência um Gateway E aí o Spring vai vir e vai injetar essa classe aqui 6 é meio Sander que é o do meu da WS como é que ele vai injetar isso Fê bom porque eu
defini aqui que essa classe implementa a interface e meio Sandler Gate como o meu e-mail Sander service Depende de uma classe que depende dessa interface e aqui eu coloquei como autoward ou seja o próprio Spring vai fazer essa injeção de dependência o que que o Spring vai fazer ele vai procurar alguma classe que implemente essa interface aqui que essa classe depende e ele vai encontrar o meu 6 é meio cender que implementa essa interface E aí vai conseguir fazer a injeção tudo de forma automática então aqui em nenhum momento a gente vai precisar criar as
estâncias e passando as instâncias por parâmetro para o consultor para ir criando as nossas classes etc não tudo isso a gente tá delegando para o Spring a gente só precisa fazer esse controle né através das interfaces e através aqui dos autoward para indicar onde o Spring deve injetar o que que ele deve injetar etc então aqui o meu ponto de da minha aplicação vai ser o meu controle o meu controle Depende de um e-mail Sander service que é o me implementação do use Case a minha implementação do Wilson Case depende do interface adeptor que é
o meu e-mail Sander Gateway E aí o meu lá o minha classe da WS implementa essa interface então ela vai ser injetada aqui no meu e-mail Center service que vai ser usado pelo meu controle pode ter ficado meio confuso mas eu espero que agora com essa explicação tenha ficado um pouco mais claro como é que vai ser o fluxo aqui da nossa aplicação Então agora que a gente já tem aqui o nosso e-mail Sandler service a gente vai criar um novo método que vai ser decorado com um post mapping que eu vou chamar de cena
e-mail esse Meu método ele vai retornar um responde do tipo string e aqui ele vai receber por parâmetro um request Body que vai ser do tipo e-mail request e eu vou chamar de request esse nosso e-mail Quest a gente vai precisar criar porque a gente ainda não criou mas aqui vamos primeiro fazer implementação do nosso centro é meio então o que que eu vou fazer aqui eu vou fazer um troycast também então trai Cat email service seption que eu vou chamar Deception e aqui eu vou fazer um desse ponto é meio Sander service ponto meu
.tu request.subit e request.bori do meu e-mail E aí depois que eu fizer o envio do e-mail vou fazer um return responde Ok passando uma string que vai ser e-mail e aqui caso de algum erro eu vou fazer um return responde responde status é que eu vou passar este status ponto e aqui eu vou passar um body com e-mail Beleza então aqui a gente já formatou a nossa resposta de sucesso e a nossa resposta de erro e agora a gente precisa criar esse nosso e-mail equest para enfim finalizar aqui o nosso controle esse nosso e-mail Quest
também vai ficar dentro do Corda a nossa aplicação porque ele tá relacionado a nossa regra de negócio então aqui o que que a gente deve receber como informação né lembra que lá na descrição do desafio ó se eu abrir aqui de novo o nosso challenge ele dizia aqui ó que a nossa nosso service deve aceitar a informação necessária e enviar e-mails isso aqui é a nossa regra de negócio a informação necessária esse nosso request aqui com o tio com subject com o body então isso aqui vai fazer parte do corda na nossa aplicação então aqui
eu vou criar uma New javaclass que vai ser um Record eu vou chamar de e-mail request e aqui basicamente dentro desse meu recorder a gente vai ter uma string que vai ser o two uma string que é o subject e uma string que é o body e aqui a gente vai importar o nosso e-mail Quest ele já vai parar de dar erro então agora a gente já tem todos as camadas da nossa aplicação bem definidas a gente tem a camada aqui de application que tem implementação do nosso wheelscase a camada de adapters que faz adaptação
do mundo externo para nossa aplicação a camada de infraestrutura que faz a comunicação de fato com serviços externos que no caso é com SDK da WS para fazer a comunicação com cinco e-mails service o corda Nossa aplicação que concentra a parte que diz respeito a nossa regra de negócio e casos de uso na nossa aplicação e a camada de controles né que a camada de entrada através da comunicação http ali para nossa aplicação e agora a última coisa que a gente vai fazer é a configuração do SDK da WS aqui dentro da nossa aplicação e
depois a configuração lá no Consul da WS para que a gente consiga fazer o disparo de e-mails usando os serviços da WS Então a primeira coisa que a gente vai fazer aqui dentro da nossa aplicação é colocar Chaves de acesso dentro do nosso application Então vou colar aqui eu já tinha copiado O que que a gente precisa mas basicamente O que que a gente vai precisar passar aqui é o excessq a secretski e a riggion é a região onde está rodando o nosso serviço a Secret é a chave Secreta de acesso e o access é
a chave de acesso isso aqui tudo hoje eu já vou mostrar para vocês como vocês conseguem pegar lá no painel de vocês Da WS essas minhas chaves aqui eu vou tirar depois do vídeo que o vídeo for ao ar então elas não vão estar mais funcionando vocês vão precisar criar a própria conta de vocês lá na WS e fazer a configuração do serviços mas eu já vou mostrar como é que vocês conseguem fazer isso então colocando Aqui as nossas Chaves e acesso a gente vai precisar fazer outra configuração dentro da nossa aplicação também então aqui
dentro da nossa pasta infra ponto 6 eu vou criar uma nova classe que eu vou chamar de aws6 config essa classe basicamente vai ser para que a gente consiga fazer com que o Spring faça a Estância São correta da classe né da Amazon faça a instanciação correta do nosso cliente A ws6 então lá na nossa classe e-mail aqui o 6 é meio Sander a gente depende Desse nosso Amazon sim por meio service que vem de dentro da sdks e aqui no spring a gente vai precisar mostrar para ele como é que ele cria a distância
correta desse cara aqui porque ele não sabe como criar e a gente vai fazer isso através dessa classe aqui de configuração então aqui eu vou anotar essa classe com a anotação configuration para o Spring saber que ele precisa executar essa classe Antes de iniciar a aplicação para ver qual a configuração o que que ele precisa fazer e aqui eu vou criar um método que eu vou anotar com anotação @bim né para indicar que ele precisa fazer essa configuração vai ser um método público que vai retornar um a amazon simbo É meio service e o nome
desse método vai ser a Amazon sim para mim é service basicamente o que ele vai fazer um retorne a Amazon sim por meio service Clint builder então para montar um cliente e aqui ponto Standard ponto build então basicamente só criar que a Estância desse cliente então como essa minha esse Meu método aqui retorna uma classe do tipo Amazon sim por meio service quando o meu 6 é meu Sender aqui dizer que ele precisa dessa classe que é desse tipo Amazon 5 é meio service e o Spring tem que fazer injeção automaticamente ele já vai procurar
onde é que eu acho que uma classe desse tipo eu tenho alguma config aí ele vai achar que ó eu tenho uma classe que tem um método que retorna uma classe desse tipo então ele já vai saber que ele vai precisar chamar esse método aqui para criar Instância dessa classe então é basicamente isso que a gente tá fazendo aqui beleza dentro da nossa aplicação era isso que a gente precisava fazer agora a gente vai fazer as configurações lá dentro do nosso consultor da WS Então já tô logada aqui dentro do meu painel da WS e
a primeira coisa que a gente vai fazer é verificar o nosso e-mail dentro do Simple e-mail Service para que a gente consiga fazer os disparos através do nosso e-mail Então vou aqui eu vou aqui Pesquisar na barra de busca por 6 ele já vai aparecer aqui ó Amazon 5 por meio service a gente vai clicar para vocês terem acesso ao painel da WS basta vocês criarem uma conta tá para criar conta é totalmente gratuito eu tô usando aqui só as coisas que são gratuitas dentro da WS para a gente resolver aqui o nosso teste e
aqui dentro do painel do CS a gente vai vir aqui em identidades verificadas se vocês verem aqui eu não tenho nenhuma identidade verificada Então vou vir aqui criar identidade aqui vai ser um endereço Gmail Então vai ser o e-mail que eu vou fazer os disparos e aqui eu vou precisar colocar Qual é esse meu e-mail meu e-mail é lives que perdeve@gmail.com e aqui criarem identidade que que ele vai fazer ele vai disparar um e-mail para esse meu o e-mail que eu coloquei aqui eu vou ter que verificar esse e-mail lá através do e-mail que eles
me enviarem se verificar tudo correto eu já vou conseguir fazer disparos Gmail através desse e-mail aqui então eu vou entrar aqui no meu inbox já recebi um e-mail da WS vou clicar no link de verificação Beleza acho que já verificou deixa eu ver aqui É acho que já verificou vou vir aqui vou dar um Reload verificado pronto minha identidade já tá verificada eu já consigo fazer disparos de emails através desse e-mail aqui porque eu já provei que sou eu agora o que que a gente vai precisar fazer aqui dentro do CS era isso a gente
só precisava verificar a nossa conta aqui a minha conta tá rodando em formato de testes Então não é um formato de produção e quando tá rodando em formato de testes ele sempre roda na região da Norte Virgínia dos Estados Unidos que é aquela região lá que a gente colocou no inteligey que é o meu e o West With One Caso vocês estejam usando já a versão de produção já tem um pedido acesso à produção em lançado os serviços seja de vocês para a produção Vocês conseguem verificar qual é a região que ele tá rodando através
desse botão aqui ó se vocês verem ele já mostra para mim que eu tô aqui selecionado a região do ano e essa região que vocês vão precisar colocar lá no application aqui eu vou manter a região de testes porque quando tu envia para a produção aí o serviço pode acabar se tornando pago tu vai precisar fazer algumas config a mais e eu acho que não cabe aqui no vídeo para para o desafio isso aí seria mesmo para mandar a nossa aplicação para a produção então a gente aqui vai manter no ambiente de testes agora a
gente vai entrar em outros serviços que é o WS e AM que é o serviço de gerenciamento e de contas né de usuários de autenticação etc e aqui dentro a gente vai clicar em usuários e vamos criar um novo usuário que vai representar lá a nossa aplicação aqui o meu usuário vai ser chamado teste back end da Uber próximo adicionar o usuário um grupo não que eu não vou e eu vou colocar vou anexar políticas diretamente a única política que eu quero dar para esse usuário o único acesso que eu quero dar para ele é
o acesso ao 6 de resto das coisas da WS ele não vai poder fazer mais nada ele só vai conseguir acessar o meu servo meus cinco é meu service então eu vou anexar essa política aqui para o meu usuário beleza e vou criar esse usuário pronto criei meu usuário agora eu vou criar uma chave de acesso para esse meu usuário Então vou vir aqui clicar em criar a chave de acesso aí ele vai perguntar aqui né Para qual o caso de uso desse meu usuário aqui o caso de uso é para uma aplicação em execução
e aqui no caso eu vou colocar que vai ser uma aplicação que vai ter executando dentro da WS Mas a gente não vai chegar a fazer o Deploy quando eu seleciono essa opção ele me diz assim ó alternativa recomendada é atribuir um role né não criar um novo usuário porque usuário seria para quem fosse acessar mas caso seja um próprio serviço da WS que for acessar algo que tá rodando no serviço da WS a gente consegue fazer conceder brolys que é outra forma da WS te conceder acesso E aí essa é a prática recomendada para
esse caso mas aqui também por questão de teste para ser mais rápido e mais prático eu vou criar um usuário normal mas a gente fosse fazer o Deploy mesmo do nosso serviço lá no nosso é meio service dentro de um ec2 da WS por exemplo seria mais fácil para esse meu ec2 para que o S2 consiga fazer a comunicação com cess mas isso aí é assunto para outro vídeo também eu vou seguir aqui com a opção mais prática para o vídeo de hoje então vou criar aqui tem que clicar no comprendo Beleza uma etiqueta de
descrição então aws SDK Java que vai ser para isso que eu vou usar essa chave de acesso né criar chave de acesso então aqui eu vou copiar a minha chave de acesso vou colar aqui em access aqui e a nossa Secret que vou copiar ela também e vou colar aqui em Secrets que beleza vamos concluir depois que a gente concluir a gente não vai conseguir mais acessar essa chave secreta então é interessante vocês fazerem o download já ou copiarem em algum lugar seguro porque depois que a gente colocar aqui em concluído a gente não vai
conseguir mais acessar essa chave secreta e para ter uma chave secreta a gente vai precisar criar uma do zero de novo né excluir essa daqui criar uma do zero Caso vocês tenham perdido essa chave secreta então aqui eu vou clicar em concluído Beleza então agora vamos fazer o teste da nossa aplicação mas eu vou vir aqui no meu inteligi e uma coisa que eu percebi aqui dentro do meu 6 no meu 6 é meio cender é que eu coloquei meu e-mail de forma errada então aqui é lives Que perdeve@gmail.com beleza agora a gente já pode
iniciar Nossa aplicação Então vou vir aqui na minha classe de entrada e meio service application e vou iniciar minha aplicação pronto a minha aplicação já iniciou com sucesso então eu vou abrir o nosso insumo né Para a gente disparar uma requisição para o indie Point de envio de e-mails e testar se tá tudo funcionando então eu vou abrir aqui o meu insônia dentro do meu insônia Eu Já criei uma Collection e aqui eu vou criar uma nova etcprierequest que vai ser do tipo post e eu vou disparar essa requisição para louco ao host dois pontos
porta 8080 que a porta de fundo Spring barra e pi/email que é o Point lá que a gente tinha definido aqui eu vou mandar um Jason e vou colar aqui o Jason que eu já tinha deixado copiado para ser mais prático aqui a gente tem que se atentar numa coisa como a gente tá no modo de testes lá dentro da WS a gente só consegue disparar e-mails para as identidades verificadas como eu só tenho uma identidade verificada lá que é a minha própria que é meu próprio e-mail eu só vou conseguir enviar e-mails para mim
mesma mas caso vocês queiram testar enviar e-mail de um e-mail para o outro vocês vão ter que verificar esse e-mail lá dentro da WS vão ter que colocar ele lá e aceitar a requisição que eles mandarem lá para o e-mail para ter identidade verificada isso porque a gente tá numa mente de testes tá então no ambiente de testes só pode fazer em vídeo e e-mail para identidades verificadas quando vocês estiverem em produção levarem a aplicação para produção que ali tem o promotor né para promover para a produção Aí sim vocês vão poder enviar e-mail do
e-mail de vocês para qualquer e-mail não só para e-mails unificados mas quando é mente testes é só e-mail verificado então caso queira enviar para um e-mail sem ser o de vocês vai ter que verificar ele lá dentro para que funcione no ambiente de testes então aqui eu tô passando two o subject e o body é isso vamos disparar que a requisição e vamos ver se vai funcionar mandar aqui Senna beleza é meio sendo sucesso falei então vamos entrar lá no nosso no nosso Gmail para ver se funcionou se a gente recebeu o e-mail e aqui
eu vi que eu mandei sendo sucesso falei mas na verdade é centro então vou até trocar aqui no meu controle para sempre para deixar certinho o inglês é sento que seria no passado Beleza então vou abrir aqui o meu navegador lá no meu Gmail para ver se a gente recebeu o e-mail se a gente vê aqui ó eu recebi um e-mail de mim mesmo né E aqui um Hello from test vamos disparar um novo e-mail trocando esse corpo aqui então Hello from vídeo Back e Uber então aqui vou disparar a requisição de novo beleza aqui
vou dar um Reload me hellofram vídeo back an de Uber tá funcionando a nossa aplicação e a gente já finalizou o nosso desafio para o Uber Claro teriam algumas coisas aqui que a gente precisaria fazer ainda para o desafio tá 100% A primeira coisa seria adicionar testes unitários porque eles frisaram bastante lá na descrição do desafio né que é interessante ter testes unitários e outra coisa aqui também que a gente vai precisar fazer é adicionar documentação que eles frisaram lá também bastante que é bem importante né ter a documentação porque esse nosso serviço vai ser
usado por outro serviços né na teoria Então tem que ter essa documentação bem detalhada para que as outras pessoas consigam entender como nosso serviço funciona e utilizar ele mas aqui por se tratar de um vídeo para o vídeo não ficar muito longo eu não vou fazer essas partes né da documentação e dos Testes Mas a gente pode deixar por exemplo a parte dos testes unitários para outro vídeo que algo que vocês têm pedido bastante aqui no canal vocês querem vídeo de teste unitário em Java Eu já vi vários comentários Então se tu tá aí assistindo
e quer ver um vídeo de teste unitário em Java deixa aqui nos comentários para me motivar ainda mais para eu criar E aí esse vídeo de testes sanitários que eu já tô prometendo algum tempo para vocês mas para esse Desafio Foi isso a gente já terminou a nossa aplicação já fizemos a conexão com a WS Tá tudo funcionando direitinho e lembrando para quem tá aprendendo Java pela primeira vez senti um pouco perdido nesse vídeo eu vou deixar o link aqui no card para o vídeo onde eu expliquei todos os conceitos base do Java Spring para
você que tá aprendendo pela primeira vez bom galera para Esse vídeo foi isso Eu espero que vocês tenham gostado se você gostou não esqueça de deixar seu like e se inscrever aqui no canal porque o like a inscrição de vocês são muito importantes para apo do canal e permitir que eu continue produzindo cada vez mais conteúdos de programação e Tecnologia de forma gratuita eu vou deixar aqui na descrição do vídeo o link do repositório Contendo a descrição do desafio e eu vou deixar aqui na descrição do vídeo também o link para o livro arquitetura limpa
então para quem tá vendo aí arquitetura limpa pela primeira vez e quer aprender mais sobre esses princípios de arquitetura Eu recomendo fortemente a leitura desse livro que é um clássico da programação e muito importante para quem for trabalhar com backing eu vou deixar o link do livro aqui na descrição do vídeo eu gostaria de aproveitar esse momento para agradecer todos os membros aqui do canal então muito obrigado pelo carinho de vocês pelo suporte por todo o apoio que vocês dão aqui para o canal Eu agradeço muito especial a todos os membros sêniors aqui do canal
então muito obrigada Márcio filho Marco Duarte Daniel Henrique Guilherme Henrique Leonardo Machado Acredite dá mais o Gomes Maurício pra do Lucas Martins Vinícius canalles Rogério Oliveira Mr bike Flávio Santos Frank Santos André Brito Luiz Felipe Cícero e Rafael Kenzo Vocês são muito especiais aqui para o