Resolvendo DESAFIO de VAGA BACKEND com Java Spring

331.16k views13282 WordsCopy TextShare
Fernanda Kipper | Dev
Nesse vídeo vou te mostrar como resolver um DESAFIO REAL de VAGA para desenvolvedor BACKEND. Esse de...
Video Transcript:
durante o processo seletivos para vaga de desenvolvedor é muito comum que as empresas solicitem que a gente Realize um teste técnico para colocar em prova o nosso conhecimento e para ver a forma Como escrevemos nosso código e Como resolvemos problemas Então nesse vídeo A gente vai ver o desafio mercandie de um dos maiores meios de pagamento do Brasil o picpay e a gente vai resolver esse desafio para que vocês consigam treinar para suas vagas de desenvolvedor backend então sem mais enrolações Bora para o vídeo [Música] então eu já tô com o desafio aqui aberto e
esse desafio está no repositório do github que tá de forma aberta então foi assim que eu consegui acessar o desafio Então vamos partir aqui já para os requisitos né entender como é que esse desafio funciona então vamos lá o objetivo do desafio é desenvolver o picpay simplificado e aqui tem uma descrição de como é que vai funcionar esse picpay simplificado então nós temos dois tipos de usuários os comuns e os Lojistas ambos tem carteira com dinheiro e realizam transferência entre eles vamos nos atentar somente ao fluxo de transferência entre dois usuários requisitos para ambos tipos
de usuário precisamos de nome completo CPF e senha CPF CNPJ e e-mails devem ser únicos no sistema sendo assim seu sistema deve permitir apenas seu cadastro com mesmo CPF ou endereço de e-mail então aqui a gente já tem uma validação que a gente vai precisar fazer CPF e e-mail são únicos e só pode ter um usuário cadastrado com esse valor aí o segundo requisito é assim ó usuários Podem enviar dinheiro Efetuar uma transferência para lojistas e entre o usuários Lojistas só recebem transferências não enviam dinheiro para ninguém então aqui mais uma validação que a gente
vai precisar fazer usuários que forem do tipo Lojistas não vão poder fazer transferências e apenas receber transferências validar se o usuário tem saldo antes da transferência então básico para conseguir fazer a transferência usuário tem que ter o saldo né disponível e aqui tem um requisito que eu achei bem interessante antes de finalizar a transferência deve se consultar um serviço autorizador externo usa esse Moque para simular então achei isso aqui bem legal porque simula né a conversa entre micro serviços provavelmente arquitetura deles funciona em micro serviços Ou eles têm alguns micro serviço apartados e eles querem
ver aqui como é que tu faria né Para te comunicar com um outro serviço então fazer a aplicação ali do picpay simplificado se comunicar com esse serviço de autorizador para pegar a resposta e ver se essa transação está autorizada ou não E se a gente abrir aqui o link do mock né fazer uma requisição de gesh ele retorna autorizado provavelmente isso aqui fica retornando sempre autorizado Em algum momento ele vai retornar um negado só para ver se a tua aplicação funciona então talvez aqui ele Deva ficar gerando valores aleatórios e gerem mais autorizados do que
negados mas em algum momento ele pode retornar um negado aqui eu acredito que seja mais ou menos isso depois ele diz assim a operação de transferência deve ser uma transação ou seja revertida em qualquer caso de inconsistência e o dinheiro deve voltar para a carteira do usuário que envia esse ponto aqui também é bem interessante só que quer dizer que a gente vai ter uma entidade né que vai ser a transação então além da gente mexer no belas do nosso usuário mal do que o usuário tem na sua carteira a gente vai ter que ter
uma forma de ter um recorde dessas transações guardar o histórico dessas transações porque em qualquer momento que deu alguma inconsistência algum problema a gente precisa reverter ela então isso aqui tá nos indicando que a gente vai precisar por exemplo ter uma tabela de transações se a gente for usar um banco de dados relacional aí ele continua não recebimento do pagamento o usuário lojista precisa receber uma notificação SMS enviada por um serviço de terceiro e eventualmente esse serviço pode estar indisponível em estável use esse Moque para simular o envio então aqui mais um serviço que a
gente vai precisar se comunicar e aqui ele já tá dizendo que é um serviço de terceiro né Por exemplo pode ser a trilho o sangue Grid que a gente vai utilizar para disparar os e-mails para os nossos usuários ou SMS quando a transação for concluída então aqui mais um serviço que a gente vai precisar que a nossa aplicação se comunica esse serviço deve ser então beleza A gente vai construir esses requisitos aqui vai continuando ele tem uma proposta de paylor faça uma proposta de payload se preferir temos um exemplo aqui aí tem aqui um post
trans Action né para fazer uma transação onde ele manda um velhue um Player que provavelmente é o pagador né e um pi que a quinta recebendo pagamento e acredito que esse quatro e quinze aqui seja um zaidiz eu acho que vai mudar isso daqui eu não gostei desse nome Player IPI eu preferia tipo sendar e receiver que eu acho que fica mais claro de entender né quem tá enviando quem tá recebendo mas agora a gente já defini isso quando a gente for construir o código e por fim vamos ver aqui a parte da avaliação então
o que que eles vão avaliar quando tiverem avaliando a nossa a nossa solução então Apresente a sua solução utilizando o firmware que você desejar justificando a sua escolha a tente a cumprir a maioria dos requisitos pois você pode cumprir os parcialmente durante a avaliação Vamos bater um papo a respeito do que faltou tá então aqui não tem formourt definido né então a gente pode fazer em Java pode fazer emoji pode fazer em fechar porque a gente preferir mas no caso aqui a gente vai construir em Java vamos fazer em Spring para colocar em prática também
nossos conhecimentos de spring em seguida ele tem assim o que será avaliado e o que valorizamos né então eles valorizam documentação Se for para vaga Sênior foque bastante no desenho de arquitetura código limpa organizado conhecimento de padrões ser consistente argumentar suas escolhas apresentar as soluções que domina A modelagem de dados manutenabilidade do código tratamento de erros cuidado com o itens de segurança arquitetura e carinho em desacopular os componentes outras camadas como serve esse repouso etc então só que um negócio bem interessante e vocês podem ver aqui esse desafio não específica né se é para uma
vaga de sênio ser uma vaga de pleno você é uma vaga de Júnior porque eu não tô participando do processo seletivo tá só peguei o desafio aqui para a gente ver entender como funciona os desafios e resolver nem apresentar uma solução então aqui ele não tá especificando se é uma vaga de Júnior sênio pleno então provavelmente eles podem usar esse mesmo desafio para diferentes níveis tanto para Júnior quanto para pleno quanto para Senior mas o que vai mudar é a forma como eles vão avaliar então aqui ó eles dizem se for vaga de Sênior foca
bastante na arquitetura então se for alguém que tá concorrendo para uma vaga de Sênior eles vão pegar bastante nesse ponto da arquitetura como a pessoa montou arquitetura do sistema fez a comunicação com os outros serviços desacoplou os componentes do código eles vão pegar muito mais isso provavelmente se for uma vaga de Júnior eles vão focar muito mais nas coisas essenciais né no básico ali do backing ver se a pessoa entendeu o problema se conseguiu propósito uma solução que funciona então eles podem focar também na questão de boas práticas no entendimento Geral do problema aí se
for um pleno por exemplo aí vão pedir talvez vão avaliar se tem testes unitários né como é que tá a utilização de design Peters Isso aqui é uma coisa que Júnior normalmente não conhece tanto mas um pleno já se exige mais e no Senior aí vão pegar mais essa coisa Claros arquitetura testes unitárias vão pedir que tenha tudo isso então o mesmo desafio pode servir para diferentes níveis né achei isso aqui bem interessante e aqui por fim eles têm o que não será avaliado então fluxo de cadastro de usuários e Lojistas então eles não vão
avaliar a questão do cadastro front-endi só vão avaliar aí justamente porque é Um Desafio de back Anger não faz sentido avaliar o frontiend e não vou avaliar também autenticação então a gente não vai focar nisso aqui já que eles não vão avaliar a gente vai fazer um cadastro bem básico não vamos ter autenticação e vamos focar aqui no que eles pediram né no desacoplamento dos componentes na comunicação com esse serviços ali e no cumprimento dos requisitos aqui das regras de negócio que eles estabeleceram para nós então bora colocar a mão no corte então como eu
falei a gente vai resolver esse desafio usando Spring Então já vou abrir aqui o site do springite a laser para iniciar o nosso projeto então como gerenciador das nossas dependências eu vou escolher o maven e já vamos adicionar aqui todas as dependências que a gente vai utilizar a primeira dependência é o Spring web né Para a gente desenvolver a nossa pay rastul usando Spring a segunda dependência é o JPA para a gente fazer a persistência dos nossos dados depois eu vou adicionar também o lombok para código border playk para gerar os gathers o seters os
construtores né tudo de forma mais simples para a gente não precisar ficar declarando esses métodos de forma repetitiva vou adicionar também o Spring deve Tools para ajudar no desenvolvimento ter Live Reload etc e por fim a gente vai utilizar o H2 da base então O H2 era base é um banco de dados em memória que vai nos ajudar com agilidade e a simplicidade então a gente poderia utilizar qualquer outro banco de dados real né Por exemplo ou mais seco mas para isso a gente vai precisar fazer a configuração desse banco de dados scrips de criação
de tabelas my grations mas nesse vídeo eu quero focar mais na parte da arquitetura do nosso sistema na comunicação com esse serviços que eles pediram para a gente fazer e na implementação das regras de negócio mas se você quer aprender como utilizar o post junto com o Spring como fazer a criação das mygrations já tem vídeo aqui no canal vou deixar o link aqui no card para vocês assistirem mas para resolver o desafio que hoje eu vou utilizar o H2 era bem isso que é um banco de dados de memória então basicamente toda vez que
a gente inicializa nosso projeto esse banco de dados inicializa de novo é como se fosse variáveis que estão em memória enquanto o código tá rodando quando para de rodar perde de tudo que foi salvo e esse banco de dados serve justamente para a gente realizar testes né então é utilizado muito para testes unitários e aqui como é um caso de um teste de uma vaga serve também porque a gente não precisa salvar de fato esses dados a gente só precisa ver se a nossa lógica tá funcionando e se as regras de negócio estão implementadas da
forma correta bom e adicionadas dependências a gente vai trocar aqui o nome do nosso projeto eu vou chamar de picpay simplificado aqui o arte Factor eu vou botar com esse nome também que eu vou colocar com um ponto picpay simplificado e aqui o pet name vou deixar com um ponto picpay simplificado e aqui projeto da vaga back Indy picpay pronto e agora a gente já pode gerar o nosso projeto Então vou vir aqui e clicar em janelate Pronto ele já finalizou o download então vou abrir aqui minhas pastas de downloads ele já descompactou aqui para
mim automático quando eu cliquei e a gente vai abrir essa pasta dentro do nosso Intel DJ pronto e vou abrir aqui downloads simplificada ele Já identificou para mim e abrir o nosso projeto Então a primeira coisa que eu vou fazer aqui dentro do nosso projeto é instalação das dependências Então vou vir aqui nesse cantinho direito vou clicar em Maverick e vou clicar aqui nesse botãozinho de Reload Quando eu fizer esse Reload ele vai identificar todas as dependências né do Projeto vai ver as que não estão instaladas e vai instalar caso necessário E se a gente
clicar aqui expandir esse dependences a gente vai ver que ele já tá listando todas as dependências do nosso projeto então aqui o lombok O H2 dele era base o Spring boot Starter web deve tudo JPA Então tá tudo aqui certinho e se a gente abrir aqui o nosso arquivo pum XML que é o que lista todas as dependências do nosso projeto a gente consegue ver que todas as dependências estão corretas aqui também caso tivesse alguma que não tenha sido instalado ou não foi encontrada não foi identificada ela ia ficar vermelhinha aqui o intelligey tem a
sua inteligência para mostrar né que a dependência não tá instalada corretamente aí ia ficar vermelho mas aqui tá tudo certo então a gente já pode começar o nosso código na primeira coisa que a gente vai fazer é a modelagem dos nossos dados Então a gente vai criar as classes que vão representar os nossos usuários e as transferências que foi os dois dados ali que eu consegui identificar na leitura dos requisitos caso mais para frente quando a gente vai desenvolvendo o projeto a gente identifica que exista outra Entidade a gente vai precisar criar também não tem
problema a gente cria mas de começo eu consigo enxergar que a gente vai ter o nosso usuário e as transferências então aqui dentro da pasta sarce Man Java e picpay simplificado eu vou criar um novo pacote um novo Packet que eu vou chamar de doman vai conter o domínio da minha aplicação o domínio vai ser composto pelo usuário e pela transação Por enquanto né depois pode ser que a gente precisa adicionar mais alguma coisa aqui então vou criar um novo pacote para o meu usuário meus usuários Então vou vir aqui criar user e dentro de
user eu vou criar uma nova Java classe eu vou chamar de user também essa minha classe vai ser uma entidade então Vai representar uma entidade lá na minha tabela no banco de dados então eu vou usar essa anotação aqui entre e eu vou dar um name para ela que vai ser users a gente não pode chamar de user porque user é uma palavra reservada normalmente dos bancos de dados ciclo Então vou chamar de users e aqui eu vou colocar anotação table também para dizer qual é o nome dessa tabela né que essa entidade está representando
então a tabela e users em seguida eu vou colocar outra anotação aqui gather para ele gerar os gathers e os setters dessa classe eu vou colocar anotação também de All args Construtora para ele criar o Construtor que receba todos os parâmetros da classe e o nowards que vai ser a chave primária dessa entidade aqui dessa tabela vamos declarar os campos né que vão ter dentro do meu usuário primeiro campo é o cão vou usar anotação aí de e aqui eu vou colocar generatite vale e a strated né a estratégia para geração desse valor então é
a gente que vai definir não vão nos mandar no corpo isso aqui é gerado de forma automática pelo nosso sistema e aqui a gente pode colocar Qual é a estratégia de geração eu vou usar uma estratégia aqui bem simples que é a estratégia de Generation Type ponto aí dentro que aqui basicamente ele vai gerando de forma incremental então é de um dois três quatro cinco Essa não é a forma mais segura vamos começar assim e depois a gente pode mudar para melhorar o nosso código né melhorar essa nossa modelagem de dados mas eu vou começar
com a geração do tipo aí dentro e aí eu vou criar aqui privates então meu ID é um atributo privado dessa classe é do tipo longa aquele também acusando um erro mas foi porque eu coloquei esse ponto e vírgula a gente já pode passar para o próximo atributo então em seguida eu vou ter também uma string que vai ser meu first Name outro string que vai ser meu Lessa name que vai formar o nome completo do meu usuário né o primeiro e o último nome e a gente vai ter também o documento que seria o
CPF e esse documento tem que ser único eu não posso ser nenhum outro usuário né com o mesmo documento não posso ter documentos duplicados então aqui eu vou colocar anotação e eu vou dizer que essa coluna tem que ser única Então vou colocar e o Nick como true em seguida eu vou criar outra Cola com o que vai ser o e-mail desse usuário então aqui string e-mail aqui tirar o ponto e vírgula também não tem que colocar pronto eu vou ter também uma string que é a minha password lá por que que eu tô colocando
essa peça fornece a gente não vai implementar autenticação porque que eu tô colocando porque lá na descrição do desafio se a gente abrir aqui ó ele dizia que os nossos usuários são compostos por nome completo CPF e-mail e senha e CPF CNPJ são únicos como ele pediu 100 aqui eu vou criar na modelagem dos meus dados mas a gente vai acabar não utilizando porque eu não vou implementar autenticação porque lá no próprio desafio ele disse aqui ó que não vai ser avaliado né autenticação então não faz sentido a gente implementar todo o serviço aqui de
autenticação que é um pouco mais Custoso um pouco mais demorado se não vai ser avaliado pode ser um diferencial né Na hora que tu tiver ali na entrevista né te aplicando para vaga mas aqui para o propósito do nosso vídeo A gente não vai implementar Mas já tem vídeo de spring Security aqui no canal como implementar né autenticação nas suas aplicações Spring eu vou deixar o link aqui no card bom continuando dentro do nosso usuário a gente vai ter outro Campo que vai ser do tipo Big décimo que é um desse mal grande que vai
ser o balance o valor que esse meu usuário tem o saldo desse usuário e por fim a gente vai ter aqui um outro Campo que vai ser o tipo desse meu usuário que eu vou chamar de user e a gente precisa criar esse tipo aqui user Type então aqui dentro do meu domínio user vou criar uma nova classe que eu vou chamar de user Pipe essa classe na verdade vai ser um Enem e user Type aqui dentro eu vou colocar como né usuários normais e merchan que seriam os Lojistas e aqui no meu user Eu
uso esse user Type como tipo e aqui eu posso colocar uma anotação então para dizer que esse campo aqui representa um desses valores do meu e-um né representa o merchan ou como e para o nosso usuário eu acho que é isso mas qualquer coisa a gente vai modificando ao longo que a gente for desenvolvendo nosso código então vou salvar aqui vou fechar e agora vamos criar a nossa trans Action então aqui dentro de nome eu vou criar um novo Packet não vai ser dentro de user vai ter Antigamente eu vou chamar de translation pronto aqui
dentro de transaction vou criar uma classe eu vou chamar de trans Action essa é a nossa classe também vai ser uma entidade então entre name trans Actions pelo mesmo motivo do users né user é uma palavra reservada trans Action também costuma ser uma palavra reservada nos bancos de dados ciclo então para a gente não ter problema mesmo que a gente não tá utilizando uma utilidades real é bom a gente utilizar o nome trans actions e não trans Action e aqui table eu vou dar um nome também de franjas também vou colocar os gatters o seters
o Awards code que vai ser off e aqui dentro da nossa Classe A gente vai criar o ID dessa classe que vai ser um generated veley com estratégia de Generation time aqui não tem tanto problema a transação um dois três quatro cinco acho que o problema maior é lá na classe de usuário mesmo mas depois a gente pode mudar aí eu vou ter aqui né o Private longo a gente vai ter também do tipo Big décimo o amaldi da nossa transação Então qual foi o valor dessas transação quanto foi transferido de um usuário para o
outro e falando em de um usuário para o outro a gente tem que ter uma referência para quem foi o Sander e para quem foi o receiver dessa transação então aqui eu vou criar um Private e user que vai ser o meu Sander e aqui esse user é da nossa classe user lá mesmo e aqui eu vou ter que colocar uma anotação Maine to one O que que significa que o usuário pode ter várias transações mas uma transação só pode ter um Sender e um receiver Então vou copiar aqui vou colocar a mesma coisa para
receiver então quando a gente coloca essa transição só que é de relação né em quantidades Racionais então a gente está criando uma relação com a tabela usuário a gente tá dizendo que essa relação é de muitos para um usuário pode ter muitas transações relacionadas a ele mas uma transação só pode estar vinculada um Slender e um receiver então a gente precisa dizer isso aqui no momento que a gente tá modelando o nosso banco de dados e aqui também eu vou colocar um Joy color como o Nem e aqui join Colin e por fim a gente
vai ter o nosso leitor loco date time que vai ser o time stamp times né de quando foi realizada essa nossa transação e para transação acho que é isso também então a gente já finalizou a criação das nossas duas entidades agora a gente vai configurar o nosso banco de dados em memória então a gente precisa aqui o JPA consiga fazer a conexão com o H2 como é que a gente vai fazer isso a gente vai mexer lá no nosso aplication onde a gente coloca algumas configurações do nosso projeto e eu vou colar aqui as configurações
aí vocês pausam o vídeo para copiar mas é basicamente para dizer qual é o URL do dele a base Qual o nome do dele a base Qual é o user password são configurações de fogo ali do H2 para a gente fazer essa conexão usando o JPA então só colando aqui essas configurações o JPA já vai conseguir fazer a conexão com o nosso banco de dados em memória e pronto a gente não precisa configurar mais nada relacionado ao banco de dados então é aqui que mora a simplicidade a facilidade que eu falei para vocês e a
gente consegue focar no desenvolvimento das regras de negócio então vou fechar aqui o application e a próxima coisa que a gente vai fazer é a criação das nossas classes de repouso né que são as classes responsáveis por fazer de fato as curies né no nosso banco de dados então eu vou fechar aqui o nosso Packet doman e vou criar um novo Packet dentro do nosso projeto picpay simplificado que eu vou chamar de repoustres repousters então aqui vai ficar todos os repositórios da nossa aplicação o primeiro repouso foi que a gente vai criar é o nosso
user repouso Então vai ser a classe que a gente vai usar para manipular a tabela de usuários né então aqui user repouster essa classe na verdade é uma interface então aqui é um público interface que estende extens o PPA repost E aí o JPA repost recebe dois tipos né o primeiro tipo é qual é a entidade Qual é a tabela que a gente que esse repositório vai manipular que a tabela de usuários e o segundo tipo é o tipo do ID da chave primária dessa tabela que no caso é um long lembra que lá na
nossa classe user a gente declarou que o ID era do tipo long pronto o nosso repositório de usuários está criado mas aqui eu vou adicionar mais alguns métodos que eu sei que a gente vai precisar então aqui eu vou criar um método que vai se chamar e vai receber por parâmetro uma Sting que é o documento e pronto só vou colocar isso aqui e a gente tem que colocar Qual o retorno disso aqui o retorno é do tipo option user então o que que é isso aqui eu tô criando um método definindo um método que
vai buscar pelos usuários pelo documento então por exemplo eu coloco um CPF eu quero buscar seus usuários está cadastrado na minha tabela isso aqui pode ou não retornar um usuário pode existir um usuário cadastrado com esses documentos ou não Por isso que eu coloquei esse option em volta porque não é certo porque eu vou sempre retornar um usuário só que é algo opcional E por que que eu sou declarei assim assinatura do método e não implementei nada porque o JPA é inteligente o suficiente para fazer isso para nós então quando a gente segue aqui um
padrão de sintaxe para declarar o método ele já consegue montar a curry na tabela né no banco de dados em Run time sem que a gente precisa fazer isso então que como eu coloquei fine user by documents Ele já sabe que né e user vai achar um usuário dentro dessa tabela vai aí ela coluna documento então ele já consegue montar a curva aqui para nós eu vou duplicar isso aqui vou criar um find user ai ai também não sei se a gente vai precisar mas aqui eu vou receber um que é o meu ID e
pronto depois a gente se a gente não utilizar a gente remove esses métodos aqui para não ficar né coisas não utilizadas e aqui eu vou fechar a uma coisa legal é a gente já inicializar o Git aqui no nosso repositório eu já Criei um monte de classes e eu ainda não fiz nenhum convite então normalmente em desafios técnicos né em testes de vagas pessoal dá uma olhada nisso também isso tem o costume de seguir Convenções de convite né se faz a organização do teu Git como é que tu criou as brantes né como é que
tu faz toda essa organização e o versionamento do teu código se algo bem importante então vamos criar o nosso repositório Git aqui dentro do nosso projeto Então vou vir aqui no terminal vou colocar Git e nit pronto ele inicializou o nosso kit dentro do nosso projeto vou limpar aqui vou abrir a aba de comics aqui do inteligente e vou ver todos os arquivos que ainda não foram comentados né que ainda não tem versão Então a primeira coisa que eu vou adicionar é todos esses arquivos aqui de configuração do projeto os testes ml essas classes que
a gente criou e ainda não vou comentar aplication eu vou comentar também mesmo tendo mexido nele eu vou comentar então aqui meu primeiro convite vai ser do tipo Fit eu vou chamar de first comete Eu sempre faço primeiro comente do meu repositório com chamando de first configuration Então na verdade eu vou chamar de Michel fique e vou comentar comente Pronto agora eu vou comentar essa criação do user aqui eu vou colocar como Fit Create criando a entidade de usuário né vou comentar e em seguida vou colocar mais um Fit que eu vou chamar de Creation
e por fim user repouster Pronto agora a gente já tem todos os comitis do nosso projeto feitos a gente já comentou todos esses arquivos que a gente criou a gente pode continuar a criação aqui dos nossos repouso Então agora eu vou criar mais uma classe na verdade é uma interface né que vai ser o meu transaction vai ser o repositório que vai fazer a manipulação na minha tabela de transações e aqui a gente vai ter que estender extens JPA repouster vamos passar por o primeiro parâmetro a nossa projections que é o tipo da chave primária
e pronto para o projection é isso eu não vejo nenhum método aqui que a gente vai precisar implementar agora mas de novo caso precise a gente muda depois então vou comentar aqui vou pegar a última mensagem pronto e vou comentar feito agora a gente já pode partir para criação dos nossos Services os Services vão concentrar as regras de negócio da nossa aplicação e as validações ali que foram pedidas nos requisitos Então vamos voltar lá e dar uma lidinha naqueles requisitos de novo eu vou abrir aqui de novo Nosso navegador vamos dar uma olhada aqui primeiro
nos requisitos para usuário vamos começar criando o serviço de usuário que eu acho que vai ser o mais simples e depois a gente faz o serviço de trans Action Então vamos lá para ambos tipos de usuário a gente precisa ter nome completo CPF e meio beleza seu sistema deve permitir apenas um cadastro com o mesmo CPF ou investimento então a gente pode fazer essa validação aqui no nosso user service Apesar de que por a gente ter adicionado aquele aquela configuração de unique para nossa tabela quando a gente tentar inserir algum dado que já tenha né
que já existe aquele documento aquele e-mail o próprio JPA vai lançar uma exceção Mas a gente pode fazer essa validação para evitar que o JPA lance uma exceção aí escolha Nossa a gente pode fazer a validação antes ou deixar a validação para o JPA e aqui seguindo na questão dos usuários aos usuários Podem enviar dinheiro efetuar a transferências para lojistas e usuários beleza lojista só recebem transferências não enviam dinheiro então isso aqui é uma validação que a gente vai ter que fazer Qual é o tipo do usuário para ver se ele pode realizar essa transferência
ou não e em seguida validar se o usuário tem saldo Então essas duas verificações do tipo do usuário né para realizar a transferência e do saldo a gente vai deixar dentro do nosso e usar service então vou abrir aqui o nosso inteligente e vou criar um novo Packet então aqui New Packet vou chamar de Services aqui dentro eu vou colocar o nosso user Service essa minha classe user service eu vou anotar com @service vou colocar essa notação para indicar para o Spring que é uma classe de serviço para ele conseguir fazer as injeções de dependência
depois da forma correta essa minha classe user service vai ter que ter acesso ao user repouso para pegar os usuários e fazer essa manipulação então aqui eu vou criar um Private e user repouster vai ser do tipo chamar só de repouster isso aqui é um atributo autowide então Spring vai ter que fazer injeção desse reposto aqui para mim e dentro dessa minha classe user service a gente vai ter que fazer a validação aquelas que o usuário pode fazer a transferência de acordo com o tipo e a verificação do belas então eu vou criar aqui o
método público que vai retornar voto que vai se chamar valide trans Action ou validay o que que ele vai receber por parâmetro aqui ele vai receber um user eu vou chamar que é o enviador né E vai receber também um big décimo que é o amante da transação aqui dentro eu vou ter que fazer if user na verdade ifcender ponto é diferente de user Type ponto eu vou lançar uma exceção Então se o tipo desse meu usuário foi diferente do tipo usuário comum ou seja vai ser lojista ou a que eu posso colocar se o
tipo for igual a lojista porque é só para lojista que eu mando esse a sessão né vai que depois cria um novo tipo de usuário que também pode fazer a transação então aqui eu só vou fazer a verificação para lojistas então se for lojista eu vou colocar um New Exception que vai ser usuário do tipo lojista não está autorizado a realizar transação pronto aqui ele tá me reclamando porque na assinatura do Meu método não coloquei que esse método pode lançar uma exceção Então vou colocar o mouse aqui por cima eu posso colocar aqui ó para
ele adicionar na assinatura do Meu método dele para de indicar um erro e a próxima validação que eu vou fazer é que se esse amaldi está dentro né do delas desse meu usuário se ele tem o saldo suficiente para fazer essa transferência então ifcender ponto get Bellas e aqui eu vou colocar o amante menor que zero Então se Quando eu fizer essa comparação o valor do belas for menor do que o valor do amaldi eu vou jogar uma outra exceção então para o new Exception também vou colar aqui o usuário não tem saldo suficiente ou
só Saldo insuficiente Saldo insuficiente Beleza depois a gente pode criar classes próprias né para lançar essas exceções em vez de lançar uma exceção comum aqui do Java uma exceção geral a gente pode criar nossas próprias classes de exceção para fazer o lançamento correto e o tratamento dessas exceções posteriormente que lá na descrição do desafio dizia também que isso seria avaliado Então se a gente vê aqui ó tratamento de erros né então a forma como a gente vai tratar essas exceções e retornar ela para o usuário é importante também depois a gente faz a criação dessas
nossas classes próprias de exceção e pronto é isso nosso validez ele vai validar se tiver algum problema ele vai lançar uma exceção Se não tiver problema nenhum ele vai passar mas aqui eu vou criar um novo método público também e vai retornar um user vai ser find user byed por que isso porque o meu eu vou ter que criar um projection service esse transexion service vai ter lá os seus usuários né vai ter a requisição com AIDS usuários eu não quero que o meu transection service tem acesso direto ao user repostrie os transexion service só
vai manipular o transexion repouso se ele quiser fazer manipulação a tabela de usuários ele usa o service então para eu não colocar o meu dependência de user repost lá no nosso trans Action service quando a gente criar eu vou implementar esse método aqui na nossa classe e user service E aí o transex só vai usar essa classe para fazer essa manipulação dos usuários então aqui Public e user né um long que é o id e aqui eu vou fazer desse ponto repouso e ponto find user byed aqui eu vou colocar um retorno na frente vou
passar o id e aqui eu vou colocar um orça Então se a gente não encontrar o usuário eu vou lançar uma exceção também então aqui New exception usuário não encontrado e aqui também ele tá me reclamando porque na assinatura do método não tem né a exceção só a gente adicionar aqui o Frozen Action que ele para de reclamar para de apontar erro e por fim eu vou adicionar mais um método nessa classe que vai ser um método para salvar um novo usuário né para fazer a criação desse usuário salvar ele no banco de dados fazer
a persistência desse usuário então aqui vai ser do tipo Public void save user vai receber por parâmetro um e user e aqui eu vou fazer isso Ponto repost save vou passar passar o usuário pronto aqui basicamente é só para persistir as alterações na no usuário né então depois que eu atualizar o belas desse usuário lá na transaction eu quero persistir isso no banco de dados eu vou fazer isso através desse método Safe user e é isso para o nosso Wizard service acho que é isso uma coisa que eu vou fazer agora é executar Nossa aplicação
para ver se ela não vai quebrar né aqui a gente ainda não tem nenhum controle não tem como a gente chamar essas classes aqui que a gente fez Mas a gente pode executar a aplicação só para ver se não vai lançar algum erro de build então que eu vou dar o Enem Box e vou iniciar a nossa aplicação para ver se ela inicializa de forma correta pronto a aplicação inicializou sem problemas então a gente não tem nenhum problema de build nenhum problema lá na modelagem do nossos dados no banco de dados que se tivesse algum
problema aqui nessas nossas entidades ele ia lançar um erro também no momento de fazer essa criação lá no nosso no nosso H2 dele a base como não lançou nenhum erro a gente criou certinho e agora a gente pode partir para criação do nosso transexion service então aqui na nossa pasta Services eu vou criar uma nova classe que eu vou chamar de transexion Service pronto vou anotar aqui vou colocar anotação de service para indicar para o Spring que é uma classe de serviço e vou primeiro começar declarando as dependências dessa classe então aqui ela vai precisar
de um e usar service vou chamar de service vai precisar também de um trans Action repostri e por enquanto é isso aí qualquer coisa a gente vai adicionando mais dependências aqui então eu vou criar aqui um método público que eu vou por enquanto vai ser void que vai ser createst trans Action vai ser o método que vai ser chamado para criar uma transação esse meu crates Action vai receber alguns parâmetros na verdade que ele vai receber só um parâmetro vai ser o meu transexion de ti ou me chamar de transexion Essa é minha trans Action
de tou é os dados que eu vou receber lá no payload né quando o usuário fizer requisição de post aqui vou abrir de novo o github para mostrar para vocês quando eu fizerem essa requisição de post aqui para o meu servidor enviando os dados da transação vou receber esse payload aqui e essa é minha classe transexion service vai receber esse payload aqui para fazer a criação da transação fazer as validações necessárias Então vou criar um novo pacote que eu vou chamar de tiosfer objects e aqui dentro vou criar um novo record que eu vou chamar
de translation de tio esse meu trans Action de toou vai ter um amalte que vai ser um big décimo a mão na verdade aqui pode ser amaldi ouve trocar para vela que é o que tem lá no github depois ele vai receber um longo que e um long que vai ser o receiver Então quem recebe quem tá enviando e quem recebe e aqui eu vou receber por parâmetro esse transexion a primeira coisa que a gente vai precisar fazer é pegar esse nosso usuário que é o Sander para fazer a validação sobre ele então aqui user
Sander vai ser desconto e user service e aqui ele já tá me indicando que essa que esse método pode lançar uma exceção então o que que eu vou fazer vou adicionar o lançamento dessa sessão na assinatura da minha classe então Aqui é do thousand seption tu tá só lançando essas exceções e quem vai tratar isso depois Calma que a gente vai criar uma classe depois que vai ser responsável por tratar todas essas exceções que a gente tá lançando Então por enquanto eu só tô passando as exceções para cima tô só pensando elas de volta mas
depois a gente vai ter uma classe que vai captar suas exceções vai ver qual é o tipo dessa exceção Qual é a mensagem vai retornar uma mensagem bonitinha para o nosso usuário Então por enquanto a gente tá só lançando para cima porque depois vai ter uma classe que vai captar essas exceções e aqui eu preciso importar o meu tipo user em seguida eu vou pegar o meu receiver também que eu vou precisar dele para atualizar o belas dele depois então aqui users Action e agora a gente pode fazer primeiro as validações do nosso usuário então
aqui eu vou colocar não aqui vou colocar user service Action vela então lembra lá que nosso user serve se a gente criou a nossa o nosso método de validação que vai verificar se o usuário é do tipo correto e se o amalto né se ele tem esse saldo lá na a carteira dele então aqui a gente vai fazer essa validação se essa validação não lançar nenhuma exceção a gente segue para a próxima linha e a próxima verificação que a gente vai ter que fazer essa essa transação tá autorizada lembra que lá na descrição do desafio
ele pede que a gente bata nesse serviço aqui né para consultar um serviço autorizador para consultar se a gente está autorizado para realizar a transferência só que poderia ser por exemplo um próprio serviço interno do picpay que é um autorizador para ver se tá tudo certo com sistema ou se está tudo certo com esse usuário enfim não sei mas aqui a gente vai ter que bater nesse serviço então voltando aqui para o nosso inteligente eu vou fazer um if vou ter que criar um novo método aqui então Publique tá aqui Public bullying autorais trans Action
na verdade que vai receber por parâmetro o user que vai ser o Sandra e um amalte não um big décimo que vai ser o vela e aqui eu vou ter que chamar aquele serviço terceiro como é que eu vou chamar isso eu vou chamar através de requisição http né porque ali ele nos deu um anti Point para a gente fazer a chamada então aqui para fazer uma requisição http dentro da minha classe eu vou usar o resto template então aqui eu vou colocar de novo uma nova dependência Private para fazer comunicações http entre serviços Então
ela simplifica bastante essas chamadas http e é bem facinho de utilizar então através dela a gente pode fazer chamadas http do tipo get tipo post tipo tudo que a gente precisar mas aqui para utilizar ela a gente vai ter que fazer uma configuração na nossa aplicação mas primeiro Vamos só construir a nossa lógica então a gente faz a configuração para conseguir utilizar então aqui dentro de autorais trans Action A gente vai ter que chamar o aquele anti Point usando o resto templates como é que a gente vai fazer isso a gente vai fazer restante e
aqui a gente tem que passar o URL aqui a minha URL eu vou passar hard coded Então vou colar ela aqui mas seria legal extrair isso para uma variável de ambiente Então deixa eu abrir aqui copiar URL pronto vou colar ela aqui e aqui eu vou passar também map ponto Class fica importar nosso map e aqui o que eu vou receber de volta é uma responsa do tipo eu vou chamar de responsa não autorization aí agora eu vou fazer if autorization response Ok então se tiver retornado um 200 e no corpo dessa resposta então if
autorization.gateboard .get message então lembra lá eu vou abrir de novo que o navegador ele me retorna uma massa de nesse Body dizendo autorizado Então vou verificar se o status hdtp for Ok 200 e no Borel tiver um Messenger que está escrito autorizado eu vou retornar Caso contrário eu vou retornar falsa então aqui mas aqui em vez de fazer tudo isso dentro do IF eu vou fazer assim ó se o status code for OK quer dizer que deu sucesso né então vou tirar isso aqui e aqui dentro eu vou fazer a message vou pegar essa mensagem
vou fazer autorization responsável E aí eu vou fazer um aqui ele tá me reclamando porque pode ser que essa mestra de não seja do tipo string mas eu vou fazer um cast para ele parar de me reclamar eu fazer um Cash para string e aqui eu vou fazer um retorno autorizado ponto ecles message então aqui eu vou comparar string autorizado com o que vier na mensagem que eu já sei que preciso para não deixar aquele if enorme lá então se deu Ok compara a mensagem e retorna true falso se não você nem deu Ok já
retorna falso e agora aqui eu vou pegar esse retorno então vou fazer e ponto autorais trans Action passando acender e o TRANS action.ely e a que eu vou abrir Chaves Não na verdade em vez de fazer tudo aqui dentro dessa chave eu vou verificar se não tá autorizado se não está autorizado eu já vou lançar uma exceção então aqui trouxe troll New exception transação Não autorizada e aqui eu posso salvar esse retorno numa variável então aqui eu vou criar uma nova variável bule isso autorais e os pontos e aqui eu vou fazer se não tiver
autorizado lança exceção Caso esteja autorizado a gente continua a nossa lógica da transação tá agora que que a gente vai precisar fazer a gente vai precisar criar uma nova transação na nossa tabela então aqui vou criar uma variável do tipo trans Action vai ser minha transação vai ser um New trans Action E aí eu vou fazer transexion [Música] [Música] trans Action pronto e aqui em vez de get out é só Belo porque eu tenho que pegar aqui do meu ditiou e não dessa nova classe que eu criei e aquele também retornando um erro deixa eu
ver esperando cinco argumentos Ah porque lá na minha classe transexion A gente tem que colocar um no Arcos constructor então eu quero poder criar uma Instância dessa classe sem passar nada nenhum argumento no Construtor porque depois eu vou usar o ceters para setar esse valor Beleza agora por fim a gente vai atualizar o saldo dos nossos usuários e vamos salvar essa transação no banco de dados e salvar os nossos usuários Então o que eu vou fazer ponto sete balance então para atualizar o valor dele como Sender ponto getbence ponto subtract transversion então o novo belas
do meu Sander Vou atualizar vai ser o meu get balance subtraído o valor da transação e o meu receiver vai ser o contrário Então receiver Então vou adicionar o valor da transação ponto vela Beleza agora a gente pode persistir esses dados no nosso banco de dados então eu vou fazer repouster ponto save passando a minha New trans Action Então vou salvar ela no meu bloco de dados e vou fazer user service ponto save user assando meu Sander e user service ponto save user passando o meu receiver Vou salvar esses dois caras no meu banco de
dados e aqui posso fazer dois pontos né para pegar a Estância da classe beleza e a última coisa que a gente precisava fazer aqui Enviar notificação para os usuários que a transação foi concluída que a transação foi realizada Então como é que a gente vai fazer isso a gente pode criar um novo serviço que eu vou chamar de notification service que vai ser o responsável por chamar aquele de point lá de notificação então aqui eu vou criar um novo service vou chamar de notification esse meu notification também tem que colocar anotação de Service aqui dentro
Eu também vou precisar do meu rest template template para fazer requisição http então rest template e aqui dentro eu vou criar um método público que vai retornar void que vai ser sendo notification e aqui eu recebo um usuário e uma string que é a mensagem aqui o que que eu vou fazer eu vou ter que pegar o e-mail desse meu usuário então é meio igual user ponto cats e-mail então vou fazer o envio né da mensagem via e-mail para esse meu usuário fazendo a requisição naquele a gente põe lá que eles passaram para nós então
aqui eu vou fazer um rest template ponto post for and vou ter que passar o RL aqui é URL de chocolate Vamos pegar lá o nosso kit Hub vou abrir aqui uma Kleber não te faz pronto aqui é URL e depois eu vou passar o corpo dessa requisição que vai ser um notification request e aqui string ponto Class que é o retorno e aqui vai retornar do tipo string a gente precisa criar esse nosso notification request aqui então aqui dentro meus iteos eu vou criar um novo que eu vou chamar de notification que vai ser
um Record e ele vai ter basicamente uma string que é o e-mail e uma string que é a mensagem e aqui a gente pode fazer um notification funciona o nosso notification request igual a new notification o e-mail e a mensagem e a gente usa esse notification para mandar no body da nossa requisição de post e aqui eu vou chamar de notification Então a gente vai pegar essa resposta vamos verificar se deu tudo certo ok e tipo status ok aqui como eu não retorno nada eu vou fazer um se não for igual Então se isso aqui
não for igual Ok eu vou lançar uma nova exceção então exception serviço de notificação está fora do ar e aqui eu vou ter que adicionar o trose Exception na assinatura do Meu método então aqui trouxe reception beleza e vou colocar um System ponto alto aqui também para a gente visualizar caso de algum problema então vocês tem um ponto alto ponto print LN erro ao enviar notificação e aqui tem que ser antes da exceção né senão nunca vai chegar nessa etapa aqui beleza e é isso para esse notification service e a gente não pode se esquecer
de fazer a configuração do resto de template porque a gente precisa indicar para o Spring Qual é a classe que ele tem que retornar né que ele tem que injetar aqui para essas outras classes que estão usando essa classe como dependência então aqui eu vou criar um novo Packet que eu vou chamar de infra e aqui dentro eu vou criar uma classe app config essa minha classe app config recebe a notação de configuration que é uma classe de configuração e aqui eu vou colocar arroba bem Public restiny e aqui basicamente eu vou retornar um New
wrest template então tô só indicando para ele Qual é a Instância da classe que ele precisa retornar aqui né tô criando a Estância retornando aí o Bim vai ser aí o Bim vai ser capaz de fazer essa injeção lá nas classes que são dependentes Desse nosso resto tem Plate e para os nossos Services era isso eu acho agora vamos criar os controllers e testar esse fluxo né de criação de transações e criação de usuário que a gente acabou de criar então de novo eu vou criar mais um pacote aqui dentro que eu vou chamar de
controllers dentro de controles eu vou criar o meu user eu tenho que adicionar anotação de West Controller Qual anti Point que esse controle ficou ouvindo a gente põe de barra e users e aqui eu vou criar um post mapping Ou seja a gente pode para criação de usuário que vai retornar um user não vai retornar um responde e aqui vai ser create user aqui eu vou receber por parâmetro que vai ser user vou ter que criar esse user de ti ou lá no nossos jovens Classic show e aqui eu vou receber por parâmetro uma string
que é o first Name uma string que é o last uma string que é o document um big décimo que é o meu balanço vou receber uma string que é o e-mail uma string que a nossa é forte eu não me lembro se a gente chegou a criar nossa peça lá no nosso domingo deixa eu ver aqui eu vou ter uma Instância da classe user service então service e aqui eu vou fazer um user é que eu vou fazer user service passando esse meu e user de Tião só que esse nosso user service não tem
esse método da quinta a gente vai ter que adicionar a gente tinha criado um método só para procurar usuário para salvar mas aqui também a gente tem que criar um método para criação de usuário vai ser do tipo user recebe por parâmetro e aqui que que eu vou fazer eu vou criar um o meu e os arquivos e eu vou fazer um New user passando esseira e aqui depois eu vou fazer 10 pontos para persistir esse usuário no banco de dados fazer salvar ele né é que ele tá me indicando um erro porque lá na
minha classe user não tem nenhum Construtor que receba por parâmetro esse nosso e usa ele disse ou então a gente vai implementar isso então vou vir aqui na minha classe user O que é um novo Public void e user que recebe por parâmetro um e user de ti ou é do tipo daira e que eu vou fazer e esse ponto for sname é igual Beira ponto elas é igual a dele é ponto elas desconto E usei igual a ira ponto e user Type Então a gente tem que adicionar isso aqui lá nosso tio também vir
aqui eu esquecido do nosso wizer beleza voltando aqui a única coisa que a gente não recebe aqui para o parâmetro é o ID porque o ID vai ser gerado de forma automática e agora vamos ver que ele tá me indicando o erro aqui New youser recebe Public void aqui não é Public void aqui é só Public user né que é um Construtor beleza agora sim recebe aqui o user passando deira tá salva aqui pubg e aqui eu tenho que fazer um retorno né então retorno user que eu tô criando um novo usuário Aí lá nosso
controle eu chamo o meu easer service faça a criação no meu usuário Então faça um retorno passando um chip status como createst né foi criado beleza e aqui a gente pode fazer um Point também para listar todos os nossos usuários só para a gente conseguir testar se ele tá adicionando da forma correta então Public vai retornar antes que vai ser uma lista de usuários vai ser quieto users e aqui eu vou fazer um return this ponto user service lá nosso user service vamos adicionar só novo método listas né pronto que a gente está retornando uma
lista de usuários fazendo repouso sobre ponto e aqui a gente pega esse final e aqui o que que eu vou fazer vou pegar esse retorno na verdade então vou criar aqui um texto e users aqui eu tenho um portal nosso Leste também pronto do Java útil e que eu vou retornar um New responde por parâmetros meus users e aqui um chip status ponto ok deu tudo certo beleza a gente já tem o nosso para criar os nossos usuários e ele está todos eles para a gente ver se está funcionando então aqui eu vou fechar todos
esses arquivos vou vir aqui no arquivo de entrada da nossa aplicação né no picpay simplificado vou parar de executar e vou executar novamente só para garantir que não deu nenhum erro e vamos testar se esse nosso user Controller Tá funcionando então se a gente consegue cadastrar nossos novos usuários e listar todos os usuários pronto a minha aplicação já iniciou então vou abrir o meu insônia para testar essa requisição então aqui no meio some Eu Já criei uma Collection para a gente concentrar nossas requisições para nossa pi então aqui eu vou criar uma nova requisição do
tipo post que vai ser para o meu base url de porta 8080 né para o padrão que a nossa aplicação tá rodando na porta 8080 então vou abrir aqui de novo mas sombra vou disparar para a porta 80 barra e users que eu vou mandar um body Jason vou colar que eu já tinha separado meu Body e aqui eu vou passar o firstman o documento o e-mail o tipo e também um Belas a gente tem que passar um belas que vai ser por exemplo 10 vai ser o meu saldo vou disparar a requisição aí ele
me retornou um erro aqui Ah já sei o que que é que eu fiz errado no nosso user Controller aqui é o resto Controller mas isso aqui fica dentro de request map então que eu tenho que mapear para onde ele recebe esse request aqui só Quest Controller então de novo vou parar Nossa aplicação vou estar lá novamente dá um Reload iniciar pronto aplicação iniciada vou voltar lá no insumo e vou disparar de novo requisição disparei ele retornou aqui só que ele retornou tudo como nu Deixa eu entender porque vamos voltar lá para o nosso user
serve-se para entender o que que aconteceu deixa eu abrir aqui nosso Services vão abrir o user service Então deixa eu ver aqui aqui parece Tá tudo certo tá salvando o criou criando novo usuário Então deixa eu ver aqui no nosso controle Ah aqui ó no corpo da minha requisição tá quando eu recebo um body eu tenho que indicar para o Spring que ele tem que injetar esse Body como parâmetro da minha classe como é que eu indico isso através do request Body dessa anotação se não como é que o Spring vai saber qual é esse
parâmetro aqui que eu tô dizendo que esse método recebe Então a gente tem que colocar esse requestboard para indicar que esse dele aqui que tá vindo né esse payload tá vindo lá no corpo da requisição aí o Spring consegue injetar o corpo da requisição aqui para mim como parâmetro eu consigo utilizar se não vai chegar tudo como no mesmo vai chegar tudo vazio aqui de novo vou parar Nossa aplicação vai iniciar inicializar ela de novo né para não ter problema de ter ficado algum erro pronto aplicação iniciada Então vou voltar de novo lá para o
nosso para o nosso insumo e vou disparar de novo a requisição e pronto agora Ele criou o meu usuário Idi aqui o nome Beleza eu vou disparar de novo essa mesma requisição mantendo o mesmo documento e o mesmo e-mail para ver se ele vai me lançar uma exceção se ele vai fazer aquela validação então aqui eu vou mandar de novo ó e ele me lançou uma exceção internacional não pode executar essa curva aqui não pode ter né duplicado essa esses dados que eram para ser únicos então depois a gente vai adicionar um tratamento dessa exceção
para retornar de forma bonitinha para o usuário e não retornar toda a exceção do nosso código mas a validação tá funcionando e aqui se a gente cadastrar outro usuário Então vou chamar de João aqui vou trocar o documento é vou colocar um nove no final vou colocar João exemplo.com vou mandar a requisição e ele cadastra o João Sem problemas então deixa eu trocar para post user e aqui eu vou fazer um novo get que vai ser um barra e users que vai ser o meu get e users aqui vamos ver se ele vai retornar os
dois usuários aqui ele deu um erro no The fold com sructor for and to usem Então tá faltando um Construtor lá na nossa classe usuário deixa eu ver aqui que que foi então aqui no domínio e user user Ah que eu tenho que passar também o no arks constructor de novo vou parar a execução da nossa aplicação porque deu um erro né aqui vou parar vou executar ela de novo beleza aplicação iniciada Então vou vir aqui vou disparar de novo requisição agora ele me retornou uma Rei vazio porque eu arreio vazio porque é um banco
de dados em memória então toda vez que eu inicializa minha aplicação ele inicializa esse banco de dados de memória e quando a minha aplicação para de rodar eu perco todos esses dados como eu já tinha explicado para vocês então aqui a gente vai ter que postar de novo fazer um novo post cadastrar um novo usuário e agora quando eu fizer o get ele vai me retornar todos os usuários que nenhuma motivados que no caso é só um agora então o nosso a nossa cadastro de usuários né E o nosso controle de usuário está funcionando agora
vamos partir para o cadastro das transações Então vamos criar o Controller que vai chamar o nosso projections service e fazer o cadastro da nossas transações o nosso transexual Controller vai ser basicamente a mesma coisa então a gente vai vir aqui criar um novo nova clássico que vai chamar de transar Controller vou adicionar ela vou colocar como um resto Controller e o request map dela vai ser para Barra trans Actions então todas as requisições que foram disparadas para Barra de transar Esse controle aqui vai tomar conta aqui eu vou ter um trans Action service né então
vou precisar declarar essa dependência chamando de transex e aqui eu vou ter um post map que vai ser minha função Creation e essa função vai retornar no corpo vai ter uma nova transação meu Crate trans Action recebe por parâmetro o meu transexion de Tião a gente já tinha criado anteriormente chamar de transexion e aqui tem que lembrar de colocar o request Body que a gente tinha esquecido lá no nosso user Controller aqui o que que eu vou fazer basicamente eu vou chamar o meu declarar aqui uma nova transar e aqui eu vou chamar o meu
desconto trans Action service ponto Create transexion passando essa minha transação aqui ele pode lançar uma exceção Então a gente tem que adicionar isso a notação da nossa classe Então vamos vir aqui vamos colocar daqui a pouco a gente já vai tratar todas essas exceções aqui então e aqui a gente tem que retornar o nosso responde enche aqui passando por parâmetro a minha trans Action ok e aqui é um New trans Action na verdade não é minha transa e aqui ele também reclamando deixa eu ver ah porque o meu Crate trans Action não retorna uma transa
Action então a gente esqueceu de mudar isso aqui ó vai retornar uma transa e aqui no final de tudo eu vou dar um retorno ai é que a gente esqueceu de fazer a chamada do nosso notification service também então já vamos fazer esse ponto aqui eu tenho que criar notification service aqui eu vou fazer o desço ponto notification serve esse ponto sendo notification vou enviar para o meu Sander transação realizada com sucesso e para o meu [Música] com sucesso aqui por receiver beleza e aí por fim eu retorno a minha nova transação lá no meu
controle eu pego essa transação retorno ela para o usuário com status code Ok então parece Tá tudo certo beleza vamos fechar aqui vamos executar de novo a nossa aplicação tá bom parar execução vou estar de novo pronto a minha aplicação já iniciou então vou abrir aqui o nosso insumo e vou criar uma nova requisição do tipo post para base urls e aqui eu vou mandar um body nesse meu Body eu vou ter meu Sander não meu receiver que vai ser dois e eu vou ter meu Vela se eu não me engano que é o valor
da transação que aqui vai ser 10 reais Beleza eu vou disparar essa aquisição Mas acho que vai retornar erro porque a gente não tem nenhum usuário na nossa tabela como a gente startou de novo a nossa aplicação a gente perdeu aqueles usuários que a gente tinha criado mas eu vou disparar aqui só para ver o que ele vai retornar é ele retornou exceção de usuário não encontrado Beleza então Aquela nossa validação Tá funcionando então aqui eu vou criar um novo usuário vou criar o João Silva E aí de um com belas 10 e vou criar
a Fernanda Aqui Fernanda com o belas 10 também E aí eu vou transferir 10 do João para Fernanda e aí o Bela antes da Fernanda vai ser 20 o do João vai ser zero então aqui vou criar Fernanda com a de dois vou fazer a transação vou fazer essa transação do usuário um para o usuário 2 passando vela e 10 executar vamos esperar aqui galera ele deu algum erro aqui de Tai malte então Teve alguma algum serviço desses que a gente chamou que não retornou nada e eu acho que é o transexion service porque é
o notification service Porque antes eu tava te esperando umas requisições para ele ele não tava não tava funcionando também então aqui eu vou comentar aqui dentro do seno notification eu vou comentar isso aqui vou comentar esse esse post aqui que eu tô fazendo tá E aí vamos só colocar um System pontual notificação enviada para o usuário e aqui a gente pode comentar isso daqui aquele quebrou a execução na minha aplicação porque eu tinha começado a comentar E aí depois ele quebrou né porque ficou alguns comentários alguns não então agora vai dar certo eu vou voltar
aqui vou dar um Reload na nossa aplicação vou inicializar ela de novo Beleza agora a gente pode voltar lá para o insônia para a requisição para criar usuário Então vou criar Fernanda vou criar o João que vai ter o balanço dessa também beleza e agora eu vou fazer a transação da Fernanda para o João vou enviar ó agora ele retornou viu era notification service que tava dando time malte Então ele me retornou aqui uma nova transação que foi do usuário Fernanda para o usuário João tá E aqui o belas da Fernanda ficou zero e o
belas do João ficou nu beleza e aqui a gente consegue ver que a minha peça World tá ficando como no o documento também e o user Type também então deixa eu disparar aqui um Gate para a gente ver se isso tá ficando nu mesmo aí ele tá ficando como no Então tem alguma algum errinho ali no momento de cadastrar esses dados do usuário vamos lá verificar o que que aconteceu então o primeiro ponto aqui é que a gente não tá salvando o documento quando a gente faz a criação do meu youser né então aqui a
gente tá passando o user Theo tá criando força nem belas mas não Tá acertando documento então por isso que ele tá ficando como novo então aqui desse ponto do documento recebe daí ele é ponto document outra coisa é lá no insônia Então deixa eu abrir aqui de novo Nosso insônia se a gente vê aqui a gente não tá passando a password Então é só passar a peça que ela vai parar de ficar como no então aqui senha beleza e por fim é o user Type tá ficando como no porque aqui ele espera um porque aquele
esperam user Type aqui a gente tá passando só como Type Então vou trocar de user Tap para Type beleza agora sim quando eu cadastrar esse meu novo usuário deve dar certo então aqui eu vou criar como Pedro Silva e aqui Pedro arroba que sempre.com vou disparar agora assim ó Pedro tá com user Type como balance 10 e assim Vocês conseguem ver que mesmo que esses usuários que eu fiz a transação né não tinham user Type ele permitiu a transação porque porque lá no nosso trans Action service deixa eu abrir ele aqui a gente ia verificado
só se o usuário não era do tipo merchan né então aqui que a gente fez Vale trans Action se for tipo mexer não pode se for qualquer outro tipo ele deixa então por isso que mesmo quando tava no ele deixou realizar essa transação então agora a gente vai criar um novo usuário que vai ser do tipo merchan aqui mercha deixa eu ver se eu escrevi certo Vou colocar aqui merchante que vai ser a Luana Silva estão aqui Luana e a gente vai cadastrar Luana com belas de 50 então ela vai ter bastante dinheiro vamos cadastrar
Luana Beleza agora primeiro a gente vai fazer uma Transação da Fernanda acho que a Fernanda não tem dinheiro né Deixa eu ver aqui Fernanda tá com zero O João tá com 20 Então vamos fazer aqui ó do João para Luana vamos passar 10 beleza passou então agora se a gente fizer aqui um get A Luana tá com 60 e o João tá com 10 por que que a Luana tá porque a gente cadastrou com 50 Beleza agora eu vou tentar fazer o contrário vou tentar passar da Luana para o João isso não tem que dar
certo porque a Luana é lojista então ela não tá autorizada a fazer esse tipo de transação vamos enviar aqui ó beleza usuário do tipo lojista não está autorizado a realizar a transação então agora o que a gente vai fazer é fazer o tratamento dessas exceções Então a nossa aplicação tá finalizada vamos tratar essas exceções para retornar os erros certinho e finalizar a nossa aplicação então aqui o que que a gente vai fazer dentro da nossa do nosso Packet infra a gente vai criar uma nova classe que eu vou chamar de Controller é reception Exception rendler
que vai lhe dar com as exceções lançadas pelo nosso Controller aqui na nossa Classe A gente vai ter que colocar uma notação nela né para indicar por Spring o que que ela faz então é um res Controller Advice Então essa classe aqui depois que tudo acontecer tudo executar o nosso controle lançar exceção final o Spring vai chamar essa classe e vai ver se essa classe tem algum método que trata essa exceção que foi lançada Então é isso que a gente está fazendo a gente tá adicionando a última camada para tratar essas exceções por isso que
eu falei lá para vocês que naqueles momentos né lá no nosso controle por exemplo a gente só jogou exceção para cima a gente não tratou ela a gente só pegou a exceção e jogou para cima disse que nosso método disparava ela também porque agora nessa classe aqui a gente vai tratar essas exceções Então a primeira exceção que eu vou tratar é quando a gente tem dois usuários cadastrados com o mesmo documento no caso quando tenta cadastrar um usuário com documento que já existe é o que a gente vai colocar um exception rendler para exceção deita
integra-te violenta a entrega de violation já vou mostrar para vocês mas aqui vamos criar o nosso método Então vai ser um Public vai retornar um respons antes e aqui eu vou chamar de dupliquete entre recebe por parâmetro essa exceção então aqui Exception aqui eu posso retornar um responde . build mas assim eu não vou retornar nenhuma mensagem para o meu usuário só vou mandar um 400 né mas não vou mandar nada para o usuário indicando que foi duplicado que já tem usuário cadastrado então aqui a gente pode criar um DT ou também para mandar exceções
para o nosso usuário então aqui eu vou criar dentro do meus itens uma nova GVC Class chamar de exception esse meu titio é um Record aqui nos parâmetros a gente vai ter Sting metas string status aqui status Coach também E aí lá no nosso Exception render eu vou fazer um seption passando a mensagem usuário já cadastrado [Música] e o status code 400 e aqui a gente vai pegar esse Exception e vamos mandar no Body Desse nosso responde além de tratar os duplicados eu quero tratar quando eu não encontro uma índice né Então aquela aquele erro
lá de entity not found índice essas exceções aqui são do próprio JPA Eu lembro que eu falei para vocês que a gente delegou a validação para o JPA porque lá no momento de declarar a minha entidade eu coloquei que deveria ser único etc então aqui eu tô pegando as próprias exceções do JPA e tô tratando elas para retornar de uma forma como eu quero né para retornar numa forma bonitinha para o meu usuário então aqui tweet for aqui a receber um sinal e aqui eu vou retornar um not found aqui não precisa de body Então
vou tirar isso vamos retornar só um notfield e aqui ponto Yudi beleza a próxima exceção que eu quero tratar esses são geral que foi que a gente mandou lá por tudo quanto é lugar que a gente lançou essa exceção aqui então Então a gente vai tratar ela então aqui Twitch General Exception e aqui basicamente que eu vou fazer eu vou criar um Exception do seu também e na mensagem eu vou pegar aquela mensagem lá que a gente tinha mandado no momento de lançar esse assunto que eu vou pegar esse seption e o status code vai
ser 500 vou mandar como um interno server erro e aqui eu vou colocar um body vou passar o nosso Exception beleza dessa forma a gente já trata as principais exceções e retorna uma resposta mais amigável para o nosso usuário e até a gente não mostra todo a nossa steck de erro para o usuário que é uma coisa não muito segura né então assim a gente faz pelo menos um pequeno tratamento então aqui vou inicializar de novo a nossa aplicação vou parar ela vou começar de novo Beleza agora vou abrir lá nosso insônia a primeira coisa
que eu vou tentar fazer é cadastrar dois usuários com o mesmo document então vou cadastrar o primeiro deu certo vou cadastrar o segundo ó já me mostrou uma mensagem mais bonitinha não mostrou toda aquela stack Trace aqui mandou uma meça de usuário já cadastrado status code 400 agora a próxima coisa que eu vou tentar fazer é eu vou criar outro usuário que vai ser a Fernanda para mudar o documento mudar o e-mail e a Fernanda vai ser do tipo como vai ter 10 reais cadastrar aqui a Fernanda Beleza agora eu vou tentar fazer uma Transação
da Luana para Fernanda a Luana merchan e a Fernanda é como para a gente ver como é que vai vir essa exceção aqui então aqui eu vou fazer uma transação do um para o 2 antes ele tava me lançando toda essa stack Trace aqui ó tudo né feio aqui no corpo tava mandando aos artigos do erro aqui eu quero ver só ameaças e o status agora então vou lançar aqui ele mandou usuário não encontrado o usuário né com esse aí deixa eu ver aqui porque aí de um aí de três sei não criou com a
de dois então beleza Espera aí vou trocar aqui para de três e a gente já vai ver porque que exceção aqui de encontrar o usuário não funcionou Então espera aí vamos trocar aqui de três mandar usuário do tipo lojista não pode realizar essa e aqui a gente tem que trocar o tipo da nossa Exception que eu tinha copiado e colocado como Ends not founds Exception Então vamos voltar lá para o insome e fazer o teste de novo então cadastrei dois usuários a Fernanda que é do tipo como e a Luana que é do tipo merchan
eu vou tentar fazer uma requisição da Luana para Fernanda e ele tem que me retornar o erro né do formato correto o erro formatado então aqui eu vou fazer a transação do 2 para o 1 né que seria da Luana para Fernanda e ele tem que me retornar o erro da forma bonitinha e ele retornou o usuário do tipo lojista não está autorizada a realizar essa transação E se eu mandar aqui um usuário que não existe vamos ver o que que vai acontecer usuário não encontrado beleza status code 500 Então tá funcionando todas as nossas
exceções aqui já tá retornando de uma forma mais amigável para o nosso usuário mas aqui teriam mais coisas que a gente poderia fazer para evoluir a nossa aplicação Então em vez de ficar mandando essas exceções aqui generos né a gente poderia criar as próprias exceções do nosso domínio aqui então separar certinho cada uma das exceções fazer melhor esse tratamento a gente pode aqui também adicionar testes unitários esse método aqui Crate trans Action também tá bem grande tá fazendo bastante coisa então seria legal dividir ele em menores partes então tem várias coisas aqui que a gente
poderia fazer na nossa aplicação para melhorar ela né levar para outro nível Mas eu acredito que o que a gente fez aqui hoje já seria suficiente para uma vaga do nível Júnior Então lembra que a gente estava lendo lá o desafio e ele dizia que dependendo né do nível da vaga que tu tivesse te aplicando as coisas que seriam avaliadas seriam diferentes então aqui eu tentei construir o que eu acho que seria solicitado né para alguém Júnior que estivesse se candidatando para uma vaga Junior mas caso tu esteja candidatando por uma vaga de pleno ou
para uma vaga de Sênior Tem várias coisas aqui que a gente poderia melhorar Então se vocês gostaram de ver um novo vídeo da gente melhorando essa aplicação adicionando essas novas funcionalidades seguindo alguns design Peters né para deixar Nossa aplicação um pouco mais robusto um pouco mais profissional coloca aqui nos comentários que eu faço uma parte dois desse vídeo para a gente por exemplo concorrer a vaga de pleno que aqui no caso a gente fez a resolução no nível Júnior né no meu entendimento bom galera para Esse vídeo foi isso Eu espero que vocês tenham gostado
e já que nós resolvemos o desafio usando Java Spring Eu recomendo fortemente que vocês assistam esse vídeo aqui nesse vídeo a gente construiu uma aplicação do zero e eu expliquei todos os conceitos base de uma aplicação Spring então se você tá estudando Java Spring tá buscando conquistar sua primeira vaga Eu recomendo fortemente que você Assista esse vídeo bom eu espero que vocês tenham gostado se você gostou não esqueça de deixar seu like se inscrever aqui no canal para acompanhar os próximos conteúdos de programação e tecnologia e eu gostaria de aproveitar esse momento para agradecer todos
os membros aqui do canal então vocês são muito importantes para que eu continue trazendo cada vez mais conteúdos de programação de forma gratuita e um agradecimento especial a todos os membros aqui do canal então muito obrigado Vinícius canalles Rogério Oliveira Mr bye Daniel Henrique Flávio Santos Cristóvão Martins Miguel squiel Leonardo Machado Frank Santos André Brito Luiz Felipe Rafael Cordeiro Cícero e Rafael Kenzo Vocês são muito especiais bom galera para Esse vídeo foi isso e até o próximo vídeo
Related Videos
Resolvendo DESAFIO de VAGA FRONTEND com React, Next JS, Typescript  - parte 2
2:33:06
Resolvendo DESAFIO de VAGA FRONTEND com Re...
Fernanda Kipper | Dev
33,332 views
Resolvendo desafio técnico para desenvolvedor Júnior do Itaú
1:17:32
Resolvendo desafio técnico para desenvolve...
Javanauta
57,049 views
Criando BACKEND COMPLETO do ZERO com JAVA SPRING + POSTGRES + AWS
2:10:39
Criando BACKEND COMPLETO do ZERO com JAVA ...
Fernanda Kipper | Dev
73,228 views
Picpay simplificado com Java e Spring Boot!
1:09:08
Picpay simplificado com Java e Spring Boot!
Giuliana Bezerra
44,635 views
Resolvendo DESAFIO de VAGA BACKEND com Java Spring + CLEAN ARCHITECTURE
1:40:34
Resolvendo DESAFIO de VAGA BACKEND com Jav...
Tiago Dev | Flux
253 views
Spring Boot Tutorial | Full Course [2023] [NEW]
1:37:31
Spring Boot Tutorial | Full Course [2023] ...
Amigoscode
3,009,819 views
Curso de PROGRAMAÇÃO JAVA para INICIANTES | Tudo que você precisa para aprender Java
1:49:22
Curso de PROGRAMAÇÃO JAVA para INICIANTES ...
Fernanda Kipper | Dev
90,761 views
RESOLVENDO DESAFIO BACKEND PLENO com SPRING + AWS + MONGO | PARTE 1
1:30:39
RESOLVENDO DESAFIO BACKEND PLENO com SPRIN...
Fernanda Kipper | Dev
93,705 views
Java vs C# - Batalha de Back-End
16:35
Java vs C# - Batalha de Back-End
Código Fonte TV
43,740 views
CURSO DE SPRING para INICIANTES | Tutorial Completo de Java Spring
51:25
CURSO DE SPRING para INICIANTES | Tutorial...
Fernanda Kipper | Dev
74,140 views
Spring Boot 3 | Complete Course 2023
1:49:11
Spring Boot 3 | Complete Course 2023
Michelli Brito
170,353 views
C can do this too and it's faster than Python
2:09:48
C can do this too and it's faster than Python
Tsoding Daily
32,341 views
Resolvendo DESAFIO de VAGA FRONTEND com React, Next JS, Typescript e GraphQL - parte 1
2:09:03
Resolvendo DESAFIO de VAGA FRONTEND com Re...
Fernanda Kipper | Dev
222,583 views
President Trump & Elon Musk in the Oval Office: Full Remarks
30:30
President Trump & Elon Musk in the Oval Of...
Bloomberg Podcasts
374,270 views
Microservices na prática com Java Spring
1:55:28
Microservices na prática com Java Spring
Michelli Brito
55,526 views
The Most Useful Thing AI Has Done
24:52
The Most Useful Thing AI Has Done
Veritasium
2,928,267 views
7 Design Patterns EVERY Developer Should Know
23:09
7 Design Patterns EVERY Developer Should Know
ForrestKnight
350,160 views
PROJETO FULLSTACK APP DE LOGIN ANGULAR 17 + JAVA SPRING  | FRONTEND
1:11:25
PROJETO FULLSTACK APP DE LOGIN ANGULAR 17 ...
Fernanda Kipper | Dev
61,470 views
RESOLVENDO DESAFIO FRONTEND - PROJETO ANGULAR COMPLETO
3:23:50
RESOLVENDO DESAFIO FRONTEND - PROJETO ANGU...
Fernanda Kipper | Dev
301,889 views
Eu não sabia o que era Docker até agora...
25:12
Eu não sabia o que era Docker até agora...
Augusto Galego
74,890 views
Copyright © 2025. Made with ♥ in London by YTScribe.com