fala Dev tudo bem seja muito bem-vindo muito bem-vindo a segunda aula do nlw Connect eu sou o professor Isidro e você está no next level Week o maior evento gratuito de programação na prática da Rocket City que vai levar você pro seu próximo nível na sua carreira em programação aqui na trilha Java você vai ter uma visão Geral do potencial dessa tecnologia que é fantástico e você vai poder dar os seus primeiros passos colocando a mão na massa um projeto pro seu portfólio beleza juntos nós estamos criando uma API para inscrições em eventos então desde inscrição simples inscrição por indicação relatórios um monte de coisa legal Nesta aula em particular a gente vai falar sobre o processo de inscrição todas as validações envolvidas nisso e também a inscrição por indicação agora se você caiu de paraquedas aqui eu peço para você voltar uma casa assiste A aula anterior para não pular nenhuma etapa dessa missão Beleza Lá também tem algumas informações super importantes para você aproveitar melhor toda essa experiência Ok então vamos lá Bora pro conteúdo de hoje então galera estamos nessa nossa aula dois aqui pra gente falar né continuar né o nosso sistema de inscrição em eventos e aqui eu gostaria de fazer um pequeno review aqui por olha só que legal né A ideia é que a gente possa fazer os requisitos funcionais um e dois aqui sobre inscrição tá bom como que a gente vai fazer a minha ideia é bom na aula passada vocês lembram né a gente já fez o crud do evento fazer a recuperação incluir excluir e tudo mais né incluir listar recuperar um determinado por ID um determinado evento por ID pelo seu pred name beleza e agora a gente entra aqui ó nesse user Store 1 que que acontece aqui esse user Store tem dos requisitos funcionais rf01 e rf02 ou seja inscrição no evento Beleza beleza o endp definido por nós é post método post onde no subscription prame a gente passa o nome do evento pela URL E dentro dele vem um corpo que é o quê uma estrutura com os dados do usuário o nome dele e o e-mail E por que que é legal essa user Story porque ela tem muitos muitas regras de negócio pra gente poder trabalhar Isso vai ser bastante interessante para nós por quê Porque assim vamos lá vamos ler juntos aqui o usuário poderá fazer inscrição num evento previamente cadastrado na base informando seu nome e seu e-mail como é um sistema onde podemos ter vários eventos né obviamente a gente vai trabalhar com vários eventos pode acontecer de um usuário já estar em nossa base de dados por ter participado de eventos anteriores dessa maneira basta recuperar seus dados e tá tudo bem só que olha só o usuário não pode se inscrever duas vezes no mesmo evento Se houver uma inscrição no perspectiva evento pelo usuário uma mensagem de erro deverá ser enviada uma exceção de conflito e ao final da realização a resposta será um Jon com o número da inscrição e eventualmente seu link que eu chamei de designation aqui ó Onde eu posso eu Isidro já inscrito né eu posso indicar o evento para outra pessoa e a inscrição dela ficará atrelada à minha identificação Então como que a gente vai fazer basicamente A ideia é que a gente possa criar um sistema de inscrição mínimo mínimo mínimo onde a gente faz uma inscrição autônoma e depois uma inscrição por indicação Então vamos primeiro colocar o seguinte escopo inscrição autônoma Beleza beleza como que a gente faz para essa user Story eu coloquei vários um caso de uso bem interessante aqui onde ó a condição base é o seguinte dado um evento previamente cadastrado e um usuário que ainda não existe na base de dados a gente faz o quê insere o usuário Adiciona uma nova inscrição e retorna a resultado da inscrição contendo o id e o link pra indicação Beleza caso alternativo um o usuário existe na base porém eu não tenho ele inscrito no evento que eu quero Então o que a gente faz não adiciono ninguém eu simplesmente recupero esse cara crio uma nova inscrição e retorno o resultado da inscrição beleza é um caso base um pouquinho modificado na condição dois ó ó caso alternativo dois evento não existe então ele não encontrou o evento lá pelo prename porque sei lá digitou a URL errada então eu lanço uma exceção de event not found indicando indicando que o evento não existe e caso alternativo três ó já existe inscrição do usuário no evento Então eu lanço uma exceção indicando conflito como que a gente faz isso vamos lá vamos trabalhar isso de forma bastante gradual tudo bem tudo bem se a gente abrir o nosso projetinho aqui ó a gente tem né se vocês se lembram da aula passada a gente tratou o evento criou o repositório dele o serviço para poder manipulá-lo e o Controller para Expor essas funcionalidades via web que que eu vou fazer vamos tratar do caso mais simples bom primeiro eu não preciso ter um gerenciamento de usuários eu preciso basicamente ter o usuário mapeado na minha base de dados e ele vamos dizer assim funcionalidades para poder tanto recuperar quanto adicionar usuários por quê vamos lá se a gente olhar agora a nossa base de dados aqui ó a gente vai conseguir entender que eu tenho uma tabela de Us os onde eu tenho um user ID um name e um e-mail ok esses caras a gente vai precisar então mapear para classe Java Então vamos fazer essa primeira parte eu venho aqui na minha no meu pack de Model que são as entidades que eu quero armazenar no banco e venho aqui vou criar um uma nova classe chamada user tá aqui muito bem essa classe user como né qualquer outra classe ela vai ser basicamente uma entidade Então vou anotá-la como a entity aqui o nome da tabela né ó table name igual a tbl user certo aqui ó tbl user ex vamos fazer a importação aqui no Eclipse ó cont control shift o Ele regula ele ajusta todos os imports para mim E aí Private integer ID Private string name e Private string eil são esses atributos que correspondem aos Campos da tabela bom por padrão preconiza que a gente tenha getters e setters tá aqui coloquei muito bem e aí eu vou anotar cada um desses atributos para poder fazer esse mapeamento correspondendo às regras da da do JPA da tabela então o ID aqui ó vai ser o meu ID indicando aquele chave primária só que o valor da chave primária é aut gerado é auto incremente lá pelo banco então ó generated value cuja strategy igual a Generation Type p identity e o nome da coluna col E aí eu coloco aqui name ig a user ID user ID Beleza beleza muito bem que que eu vou ter aqui agora a coluna do name col name igual a user under name o tamanho dela eu vou colocar aqui vou anotar Vou deixar tudo bem explícito tá L 255 caracteres e não pode ser n muito muito bem e o e-mail por sua vez ó @con name igual a e-mail deixa eu ver como que tá ó user e-mail user e-mail Beleza o tamanho também ó 255 caracteres não pode ser nul não pode ter valor vazio e aqui eu vou colocar uma outra restrição e o nique igual a true Ou seja eu só posso ter e-mails únicos não pode ter duas pessoas diferentes com o mesmo e-mail na minha base de dados beleza OK isso reflete como a base está descrita no meu banco de dados beleza ok que que eu vou precisar agora basicamente de um de uma interface que vai ser o meu user para eu poder ter as operações de adicionar usuário recuperar usuário e assim por diante e aqui ó eu vou dar um extends ó Public interface tá user extends acc crud repository repository onde eu passo né eu parametrizar um objeto do tipo user e a chave do user é do tipo integer tá aqui ó lembra de importar o seu objeto a sua classe user definida nesse projeto tá aqui uau tem um detalhe tá para isso depois a gente vai melhorar essa classe nessa interface porque eu vou precisar depois recuperar usuários por e-mail por quê Porque a única informação que eu tenho do usuário no momento da inscrição dele ó olhando aqui é o nome e o e-mail então para eu saber se um usuário já existe ou não eu tenho que buscar por e-mail vamos já fazer vamos já fazer então que eu faço aqui ó Public user find by email onde eu passo aqui ó Qual é o e-mail que eu quero pronto com essa funcionalidade com o JPA gerando o código esel correspondente para nós a gente vai conseguir recuperar um usuário pelo seu respectivo e--mail beleza ótimo começa a ficar interessante aqui agora que que a gente precisa fazer bom mapeei o user a gente já tinha O Event mapeado pra tabela mapeamos o user e agora a gente vai mapear a tabela subscription e aqui eu quero uma atenção assim super delicada por quê porque existem algumas informações por exemplo ó o subscription Number é uma coluna como qualquer outra chave primária bonitinho número da inscrição tá tudo certo entretanto ó a as colunas subscribed user ID indication user id e event id não são colunas quaisquer elas são segundo a nossa teoria de banco de dados Chaves estrangeiras o que elas significam elas significam referências a objetos elementos registros que estão cadastrados aqui então por exemplo se eu coloco aqui em alguma linha dessa tabela evento um na verdade não é um Valor somente um indica que existe algum registro aqui nesta tabela que tem um um evento de id1 mesma coisa para esses usuários então aqui são referências a esses objetos destas outras tabelas tudo bem Como eu faço isso em Java aqui que tá o detalhe vamos lá voltando aqui pra classe pro pacote Model eu vou criar agora a minha classe subscription que é a minha inscrição subscription tá aqui e a classe subscription novamente ela é uma entidade ó entity ela é uma table name tbl subscription tá aqui bonitinho opa esqueci de colocar entre aspas tá tudo bem muito bem agora começa a brincadeira então até então públ Por enquanto né Opa Private né integer subscription Number tá aqui beleza aqui numa boa então esse cara é um ID ele tem um generate de value cuja strategy é um Generation Type P identity muito bem e o nome da coluna é subscription Number tudo bem Opa Number muito bem legal por enquanto tá aqui ó subscription Number muito bem colum name perdão Esqueci de colocar o atributo muito bem agora e para eu por exemplo indicar o evento Como que eu faço não é mais um inteiro apesar de estar declarado aqui como um inteiro ele é uma referência certo então eu faço o quê event e eu vou chamar de event tá aqui Private user eu vou chamar de subscriber ou seja uma referência a tabela ao objeto usuário e outra referência Ó indication quem é o usuário que indica Nossa exid que interessante como que a gente anota isso vamos gerar só os Gets e sets antes né pra gente ficar bonitinho aqui ó pronto como é que eu faço essas indicações ou esses mapeamentos essas anotações novamente não são colunas como quaisquer outras quaisquer outras o que eu tenho aqui eu tenho basicamente uma relação entre vamos pegar isolar aqui ó entre e evento tá uma inscrição está atrelada uma ocorrência de inscrição está atrelada a ocorrência de um único evento Então aquela inscrição de número 1 2 3 4 corresponde a uma inscrição daquele evento e somente aquele ok ok então de inscrição para evento eu tenho uma relação única de evento para inscrição eu tenha uma relação múltipla porque o mesmo evento pode ter Quantas inscrições nele mú tanto é que essa anotação aqui que a gente coloca parece um triangulinho a gente chama popularmente de pé de galinha indica justamente isso então a chave de event migra para tabela de inscrição E aí a gente consegue fazer o de novo como eu fazendo inscrição eu ten múltiplas inscrições para o mesmo evento Então eu tenho aqui ó múltiplas inscrições para um único evento E aí dentro da tabela inscrição Qual que é o nome da coluna que faz essa ligação entre a tabela inscrição e a tabela evento eu vou chamar de eventos id não precisaria porque coincide com o ID da tabela de eventos mas eu vou tornar isso explícito coloco como join colum E aí eu coloco name igual a event ID muito bem e para subscriber mesma coisa então ó um mesmo usuário pode ter várias inscrições pode em vários eventos né então eu faço Sei lá o NW Connect 2025 posso fazer a imersão Java imersão react e assim por diante mas um usuário faz várias inscrições Mas aquela inscrição específica está atrelada a um único usuário então eu tenho aqui ó múltiplas inscrições para um único usuário e aí de novo ah coluna disjunção col tem o nome igual a subbed user ID subscribed user ID muito bem legal bacana interessante que que a gente vai fazer agora e o indication mesma coisa só que o indication El tem um detalhezinho se vocês olharem visualmente aqui vocês podem ver que a coluna indication user ID ela tá branquinha ela tá só contornada ela não é sólida por quê porque pode ser que essa coluna tenha valor nul significa que eu fui lá fiz uma inscrição autônoma e ninguém me indicou então ela não tá atrelada ao ID de ninguém então vamos lá que a gente vai fazer manage One de novo join colum Ok cujo name é indication user id e ela pode ser nul true nullable true beleza Ou seja eu posso ter o caso que ninguém indicou indication user ID beleza bonitinho nesse ponto turma tá tudo mapeadora a gente já tem ó o subscription que é o nosso objeto de inscrição eu tenho o nosso objeto de evento já pronto que a gente já tinha feito na aula na aula um e o nosso objeto user que que eu preciso fazer agora eu vou precisar obviamente cadastrar recuperar ver se tem inscrição já feita ou não tem mas principalmente eu vou precisar de um repositório para a inscrição Então vou colocar aqui ó subscription Apple dentro do meu pack de rle tá aqui ó e esse cara obviamente extends né crude repository de subscription e integer muito bem pronto ó perceba cuidado na importação Ó tem que ter ó BR com nlw events Model subscription tá aqui show salvei Qual que é o próximo passo Agora eu preciso criar os serviços e os controllers para poder fazer essa inscrição e a inscrição o serviço de inscrição ele envolve tanto eu recuperar nome de evento recuperar o usuário ou eventualmente gravar o usuário e também efetivar a inscrição então eu vou precisar no mesmo serviço acessar os três repositórios faz sentido como que a gente vai fazer venho aqui no meu package de service tá e vou criar a minha classe subscription service tá aqui de novo só tô separando em camadas por não sei se vocês se lembram a gente tem Exatamente Essa arquitetura aqui onde eu tenho ó os models os repositórios e os serviços acessando os repositórios buscando pegando objetos recebendo objetos mods e gravando no banco ou recebendo do banco e transformando isso em objetos modos e passando isso pra frente por exemplo nos controles para poder fazer esse acesso via internet legal muito bem então o que eu vou fazer aqui esse cara todo o serviço eu tenho que é notar com o estereótipo service por quê Porque ele vai ser efetivamente injetado vou fazer a famosa injeção de dependência com eles para que ele eu não precise eu usuário eu exido não precise me preocupar em danil criar essas coisas deixa deixa aqui o Framework cuida disso e aqui eu vou criar um método chamado Public subscription Create New subscription pronto onde eu passo o quê Qual que é o event name que é uma string por que isso e qual que é o user pronto user user por que isso Isidro Vamos lá olha só vou colocar o user aqui e o subscription também fiz a importação Por que Isidro vem cá vem aqui comigo lembra que a gente colocou o endp aqui ó Então eu preciso deste nome então preciso do prename do evento que eu vou depois recuperá-lo tá e eu preciso dos dados do usuário Isso é fato legal que que a gente vai fazer vamos simplesmente pensar no caso base eu não vou fazer nenhuma validação nesse primeiro momento tudo bem nenhuma então vamos lá vem aqui que que eu faço eu basicamente faço o seguinte vou criar um subscription subs iG New subscription beleza scription Depende de um evento concorda então primeiro passo recuperar o nome o evento pelo nome como é que eu faço bom para eu poder recuperar tudo isso eu vou precisar ter acesso ao Vamos colocar como aed já ó Private event repo Opa perdão event repo eu vou chamar de evt R ou seja preciso monitorar manipular os do meu evento Vou precisar também do user ó Auto wir Private user app e eu vou chamar de user apple beleza beleza e obviamente né o repositório para gravar as as as inscrições Auto wired Private subscription app vou chamar de subh pronto beleza coloquei os três repositórios aqui tá bom que que eu faço vou recuperar o evento pelo nome então ó event evt igual a evt repo find by prame passando esse event name novamente aqui ó vou importar O Event aqui eu não tô fazendo absolutamente nenhuma verificação eu tô assumindo que o evento existe tá depois eu vou fazer os casos Ah mais mais simples e aí eu vou fazer o quê eu vou pegar esse user aqui ó e vou gravar no banco então vou fazer o seguinte o meu próprio user que eu recebo eu vou sobrescrever ó user recebe user. save o próprio user Ou seja eu gravo o meu usuário no banco e o resultado eu sobrescrevendo vou atribuir o usuário como sendo o meu assinante e simplesmente ó ó vou pegar como subscription resultado igual a subrepo p save ou seja montei o meu objeto de evento deixa eu de inscrição deixa eu pegar esse sinil vou só colocar aqui embaixo para ficar todo mundo junto is aqui ó pronto monto a minha estrutura de inscrição e mando salvar ou seja ó eu recupero o evento gravo o usuário no banco e simplesmente ó Mando gravar e o resultado disso ó return has pronto certo certo a pergunta que fica né como que a gente sabe se isso aqui vai dar certo vamos fazer um primeiro teste vamos lá ó vem cá vamos ver se a gente tem todos os eventos ó vamos dar um lembra do post Vamos fazer um um get nesse cara aqui uh verdade se se você não subir a api você não vai conseguir fazer nada antes vamos subir a api esqueci eu tinha parado para facilitar ele não ficar toda hora ã fazendo o o o famoso Dev Tools né e ficar reiniciando ó tá subindo a api vamos deixar ela subir e esperamos beleza fez a configuração com o banco e ó started fechou vamos lá vamos ver no no post Mas se a gente consegue recuperar todos os eventos temos aqui ó o evento número cinco codecraft summit e ó Este é o prett name que a gente quer Beleza então temos um evento C aqui codecraft summit beleza OK como que a gente faz Bora lá então a minha intenção é vir aqui e criar um subscription Controller lá no meu pack Controller ó subscription Controller tá aqui ó criei aqui no meu package vou colocá-lo como rest Controller precisarei ó importa Ok vou precisar do serviço então Auto wired Private subscription service eu vou chamar de service aqui OK e eu vou precisar seguir esta especificação aqui ó é Método post a URL tem este padrão então vamos lá @postmapping tá aqui subscription barra e aqui eu coloco aqui ó PRY name tá aqui vou colocar C case para manter o padrão Java tá e o que eu vou fazer vou criar aqui um Public vou usar o respon tá tá aqui de subscription depois ISO aqui vai mudar Tá mas calma aí não vou dar spoiler E aí vou criar Create subscription aqui muito bem fiz as importações corretas e que eu passar priso indicar que esta informação vem via URL então @f variable o qu string PRY name é bom eu manter sempre o mesmo nome declarado aqui no padrão e no parâmetro para que a gente não tenha conflitos tá muito bem se bem que dá para customizar Mas eu não quero ser tão verborrágico E aí ó no Body no request Ou seja no corpo da requisição vem o um Us que eu vou chamar de subscriber OK tá aqui então o que vai acontecer eu tenho esta URL Deixa eu só aumentar a tela aqui para vocês entenderem ó eu tenho na URL bar subscription prame e eu ainda passo via corpo da requisição o nome e o e-mail do meu usuário tá bom tá bom que que eu vou fazer subscription Ô perdão é subscription vou chamar de resultado igual a Service ponto ó Create New subscription onde eu passo ó o prame o subscriber já me deu essa sugestão E aí ó se o resultado for diferente de nul ou seja deu uma inscrição correta eu dou um return responsi pon Ok código http 200 passando esse resultado como corpo da resposta senão vamos dar um return aqui ó response entity pbad request Build pronto ou seja não consegi incluir Isidro será que isso aqui funciona vamos testar Qual que é a ideia de novo eu tenho que levar em consideração que existem existe um evento pré-cadastrado Então eu já vi que existe e não tem nenhum usuário no banco vamos testar vamos testar vou criar aqui um novo endp então aqui ó método post tá aqui http localhost 880 barra subscription barra Eu vou recuperar aqui o PR name para eu não errar ó code traço codecraft traço summit traço 2025 tá aqui ó beleza e no bar eu vou colocar um dado cru formatado para Jon onde eu coloco aqui ó name Vou colocar aqui ó Professor Isidro vírgula e-mail Vamos inventar um e-mail aqui ó @ Isidro pcom será que isso aqui funciona uau Ele criou uma inscrição de id2 cujo evento é esse carinha aqui que ele recuperou e o meu subscriber tem id2 uma coincidência tá que é o professor Isidro cuja indicação ó não tem ninguém Caraca Isidro que massa Vamos ver isso aqui tá certinho no banco ó vem cá select asterisco from table user Ó lá vamos ver se a gente consegue encontrar o Isidro olha aqui o Isidro aqui ó cadastrei no banco então o usuário não existia e agora e a subscription select asterisco front tbl subscription tá aqui ó inscrição número dois o id2 do usuário não tem nenhuma indicação e o evento é o evento número 5 Caraca idro que legal velho começou a ficar interessante para nós porém ainda é a apenas o caso base legal legal que que eu vou fazer então vamos pegar o caso alternativo um o usuário existe na base Porém não tem inscrição dele então tá bom o que que eu vou fazer Vem cá vamos tratar o caso um aqui ó Cadê o service subscription service tudo bem bom recuperei o evento numa boa agora que que eu faço aqui ó eu vou pegar e fazer o seguinte ó user eu vou chamar de ã user has de recuperado user recuperado faz o seguinte ó olha só que interessante essa é a parte interessante de tudo aqui depois vou mudar algumas coisas eu vou pegar o meu user ha e vou fazer um find by e-mail desse user que eu recebi e o e-mail dele user. getemail Beleza então ele já existe na base certo se o user hack for diferente de nul ou perdão se ele for igual a nul perdão que que eu faço eu faço esse save [Música] aqui tudo bem por quê Porque depois eu vou usar este evento aqui ó este sub essa essa inscrição para poder colocar o user que eu que eu fiz questão de de de colocar então o que que eu vou fazer na verdade eu vou usar agora esse objeto user hack aqui então user hack recebe user haap P save fechou só que aí Óbvio meu subscriber vai ser o user hack pronto só para poder diferenciar as variáveis tá então user é o que eu recebo na requisição e o meu user recuperado é eu tento recuperar do banco se ele não existir eu gravo porque se ele existir eu já o utilizo aqui na inscrição Vamos fazer um teste vamos fazer um teste olha só que legal eu vou vir aqui no meu banco de dados vou fazer uma inserção fixa assim ó insert uma inserção hardcode ó tbl user Vales ó eu vou colocar aqui o ID é nul e eu não preciso passar Então vou colocar aqui ó John do tá que é o meu usuário padrão E aí John @d.
com tá aqui inserir quer ver ó eu tenho agora esses dois usuários então em termos de inscrição o Isidro tá inscrito E o John do faz parte da minha base de dados mas não tá inscrito Vamos tentar fazer uma inscrição do John vamos lá tá aqui ó eu ele vai também se inscrever pro codecraft summit porém ó vamos colocar aqui ó John John E aí John @ do. com Qual é o ID dele o ID dele é TR vamos ver se isso aqui funciona send coloquei aqui vamos ver voltou aqui ó subscription 3 show event ID Qual que é o subscriber ó é o id3 que eu recuperei ó lá John do perfeito então eu não precisei incluir um próximo usuário aqui ó mas eu consegui fazer a inscrição dele Opa Deixa eu só selecionar na esta quer aqui pronto eu consegui fazer a inscrição dele aqui no meu evento Então tanto o usuário dois quanto o usuário três estão inscritos no meu evento legal putz meu tá começando a ficar massa Show Show Show Show Tá bom vamos pegar mais um caso aqui para testar e o caso alternativo dois do evento não existe Puxa vida que que pode acontecer no caso do evento não existir eu tenho que lançar uma exceção mas eu não tenho exceção Vamos criar Vamos criar então o que eu vou fazer né vou parar api só para ele poder para eu poder criar mais arquivos el não ficar toda a hora reiniciando eu vou criar mais um package aqui só de exceções tá vamos criar mais um package aqui ponto Exception tá aqui ó e aqui eu vou criar a minha not found Exception event not found Exception tá aqui e ela vai ser uma exceção não verificada ou seja uma exceção de runtime para validar a regra de negócio então ela extend runtime Exception a única obrigatoriedade que eu preciso ter nela é um Construtor Então vou criar aqui ó Public event not found Exception Opa passando uma mensagem ó string msg tá aqui e eu vou fazer o seguinte msg ou seja vou invocar o Construtor da classe p da Run só isso isso aqui para mim é suficiente legal então vamos lá no service Opa Cadê o service tá aqui lembra que eu fiz isso aqui ó event find by Então se o meu evt for igual a nul sabe o que vou fazer lançarão throw new event not found Exception e vou colocar o seguinte ó evento mais O Event [Música] name não existe Caraca IDR que legal sabe por que eu posso fazer isso agora porque lá no meu Controller eu posso tratar essa exceção e gerar por exemplo uma resposta customizada vamos fazer isso olha só que legal dentro desse package de Exception aqui vamos vou criar um outro package aqui ó vou criar um outro package que eu vou chamar de vamos chamar de dto para eu poder fazer os meus objetos aqui ó data transfer Object eu vou criar não vou criar uma classe eu vou usar um recurso bem bacana a partir do Java 14 que é o record ó é como se fosse uma classe imutável tá então vou chamar isso aqui de error message que esse cara só tem o seguinte ó uma string string message tá olha só que eu vou fazer olha só que eu vou fazer lá no meu Controller tá aqui ó tá se der ruim né vou colocar agora tudo isso dentro de um bloco de tratamento de exceção ó try né aqui ó catch nesse caso ó event not found Exception eu vou chamar de ex se por um acaso der esse erro né o que que eu faço T só ajeitei o código tá Olha só tudo aqui eu vou colocar como Bad request tá bom vem para cá última linha Bad request e eu vou fazer o seguinte ó return responsi P not found ah ponto o bar dele ó vou pegar o status ó ponto status 404 que ele me permite colocar o bar aqui ó bar e eu vou colocar aqui ó New error message onde a mensagem é a mensagem da exceção aqui ó caraca então olha só que legal importei o error message aqui tá pronto só que ele tem um problema ele tá declarado para responder o quê como sendo subscription no corpo e eu tô mandando quando dá erro um corpo do tipo error message não tem problema eu coloco eu substituo isso ó por uma interrogação e tudo passa a funcionar Pera aí só um minutinho que eu já vou colocar aqui um segundo opa pera aí que eu fiz uma besteirinha aqui pronto Qual que é a ideia turma que a gente consiga fazer esta exceção ser ao capturar a exceção do meu serviço eu at trate aqui E com isso eu Gero um código 404 tudo bem olha só que legal eu só vou colocar aqui ó o meu Ai aqui ó pronto que o eclipse demora para identificar Olha que interessante vamos subir a Api para testar por quê Porque este caso trata do erro ou onde eu tenho o quê o evento não encontrado então lá no meu Postman que que eu quero fazer eu quero basicamente mudar aqui ó Opa Cadê o Postman tá aqui ó o codecraft summit 2026 Independente de quem é o usuário tá send ó lá ó message evento cft summit 2026 não existe Ah que massa ou seja não consegui fazer e eu consegui com isso tratar o caso alternativo número dois legal agora a gente precisa tratar o caso alternativo número três como que a gente vai fazer para executar isso daí então o que que a gente precisa entender o que caracteriza uma inscrição ter aquele usuário atrelado àquele evento concordam comigo então vamos lá que que eu quero fazer então do jeito que tá aqui ainda funciona certo certo como que eu faço bom eu tenho aqui ó Create New subscription vamos lá pro serviço Cadê o serviço tá aqui já sabemos se o evento não for tudo bem Ó fiz o usuário tem esse cara aqui certo certo agora agora antes de eu fazer o save vocês concordam comigo que eu tenho ó o evento eu tenho o usuário já então o evento o usuário existe eu preciso antes verificar se tem uma inscrição com esse usuário e esse evento Como que eu faço vamos lá lá no meu repositório eu preciso fazer o seguinte ó Public subscription find by Olha só event and user E aí eu coloco aqui event evt user user eu passo objetos Caraca Isidro Pois é olha só que legal eu consigo fazer esse nível de query vocês vão perceber opa ele me deu aqui um errinho aqui OK depois a gente muda a and user não and subscriber perdão é o nome do atributo subscriber aqui subscriber aqui senão ele não vai reconhecer claro né porque ó by tem que receber nomes de atributos ó funcionou como que a gente faz isso vem aqui fiz isso certo certo lindo lindo lindo lindo que que eu vou fazer subscription Tá vou chamar de próprio subs aqui ó ou melhor vamos chamar de tmp Sub igual a subap find by event and user hack se esse cara existe tmp Sub for diferente de nul o que que eu vou ter que fazer lançar uma nova exceção uma exceção de conflito vamos lá vamos criar essa exceção New CL subscription Conflict Exception aqui e aí esse cara extend Run Exception tá bom depois a gente faz uma modificação Public subscription Conflict Exception passando uma string ó msg tá aqui e aí ó super msg só vou organizar o código ali para não ficar tão tão feio tá gente vem cá então ó testei beleza V vi que o usuário existe Beleza então esse aqui ó é o caso AL Altivo Ok perdão caus alternativo do o usuário porque eu já se o evento não existe eu nem vou ficar mexendo com o usuário beleza ó o usuário existe então tentando aqui ó caso alternativo um né se o usuário não não tá cadastrado eu faço e aqui ó caso alternativo 3 ou seja já tem uma inscrição aí então que eu faço ó throw new subscription Conflict Exception e ó já existe inscrição para o usuário e aí eu coloco aqui ó user hack. getname beleza tá aqui como é que eu faço basicamente um tratamento de exceção lá no nosso resultado no nosso service no nosso Controller perdão mais uma exceção para tratar Bora lá salva aqui ó vamos ver parou o erro Ok vamos lá no Controller Cadê o Controller deixa eu fechar um pouquinho que senão vai começar né a ficar muito ruim subscription Cadê o subscription Controller tá aqui achei então ó Ah não aqui tá no event event pera aí deixa eu achar o pronto tá aqui outra exceção ó catch catch subscription Conflict Exception ex X E aí que eu faço return ó V fazer a importação New return response entity ponto status o status de conflito http 409 PB New error message do e.
get message agora eu consigo tratar também duplicidade na ã Na inscrição vamos ver tá [Música] Mary May Mary May tá aqui e aí vai ser a Mary @mi. com no codecraft summit uh ai Compilation problem não acredito que eu fiz um pronto faltou meu ponto e vírgula Isidro os professores também esquecem ponto e vírgula pronto resolvido e eu esqueci de ver pronto ó subscription Number número 5 designation codecraft pcom bar codecraft 205/5 esse é o ID do usuário que vai fazer a indicação para outras pessoas conseguirem também se inscrever exatamente como a nossa especificação Pede tudo bem faz sentido isso e o que que a gente precisa fazer agora né basicamente agora nós temos o seguinte ponto a gente tem que colocar o nosso usuário indicador Quem indicou o evento pra gente poder colocar e inseri-lo na nossa base por quê Porque até agora ó todas as nossas inscrições estão com essa indicação vazia tá vendo aqui ó todo mundo tá no evento C tudo bem Ó os ids aqui se olhar os usuários aqui ó todos bonitinhos ó o isid o John do a Larry l a Mary May e assim vai certo Deixa eu tirar esse cara aqui para não ficar pronto legal então a gente consegue cadastrar o usuário que já existe a gente consegue cadastrar uma uma inscrição de um usuário que não existe uma inscrição de um usuário que já existe consegue verificar se existe uma inscrição já com aquele usuário dá um conflito e verifica se eu tô me inscrevendo num evento que não existe aí eu consigo ter um outro tipo de erro de event not found faz sentido muito bem próxima funcionalidade a Então vem comigo muito bem turma então vamos fazer essa essa essa visão vou fechar aqui minha api pra gente poder fazer agora inscrição indicando como que a gente consegue fazer primeiro ponto né Se vocês olharem se a gente olhar a especificação aqui da da minha resposta você concorda que esse cara pode ser um link de inscrição Puxa vida é verdade ZR mas assim ó o que que ele tem de comum com o outro link então ele vai ter aqui ó né basicamente o subscription o pretty name certo a faltou colocar o subscription aqui no meio tudo bem O prame mais o ID de Quem Indica certo certo então o que eu vou fazer né A ideia é que eu possa por exemplo criar aqui ó um post né ó http 2 bar Opa local host ou codecraft 8080 bar subscri bar codecraft summit 2025 bar o ID do meu usuário do por exemplo 3 5 8 e assim por diante faz sentido Então qual que é a ideia a ideia é que eu preciso modificar esse post maping para ele poder aceitar também um padrão de URL onde eu tenha além do Pr name o ID do usuário que indica Como que eu faço isso colocando isso ó numa listinha ponho ent entre Chaves aqui ó e coloco com a segunda possibilidade Ó subscription Barra Ten o pretty name ó pretty name beleza barra userid Nossa que legal então ele aceita esses do este tipo de post aceita esses dois padrões de URL E aí eu coloco aqui ó vejam que o meu request bu né tem o pef variable prename request Body subscriber e eu vou colocar um terceiro aqui ó pef variable e integer user ID só que esse cara aqui eu vou parametrizar como required false ou seja ele não é necessariamente obrigatório Nossa que legal por se ele não se ele não existir eu aceito esse cara aqui se ele existir eu aceito por esse padrão aqui legal né legal só que agora o o meu serviço tem que mudar por quê Porque agora eu preciso passar também ó esse user ID que é o meu indicador Beleza o meu usuário que vai indicar Óbvio que eu vou precisar mudar a descrição do meu serviço aqui ó onde eu tenho aqui ó user user integer user ID que é o indicador tudo bem muito bem que que eu vou fazer aqui a gente tem alguns casos para tratar também porque pode ser que o meu user indicador ele não né não exista Então o que eu faço E se ele não existir né Vamos lá user indicador igual a no user eu vou dar um find by ID que já vem pronto do CR repository tá eu ponho esse user ID só que ele é um optional para mim então ou ele existe eu coloco aqui or else n ou ele vai recuperar pelo id ou eu tenho esse aqui se o indicador for igual anul ou seja ele não existe eu não consigo fazer inscrição porque eu tô fazendo inscrição por um usuário que não existe então o que eu faço vamos lançar também uma exceção sim Isidro qual Vamos criar aqui ó um user indicator not found Então vamos lá aqui ó uma nova classe user indicador not found Exception tá aqui E esse cara de novo ó tends runtime Exception tá aqui e aí Public Nossa eu fiz fiz um palavrão aqui né gente Credo vem cá passando o string msg tá aqui super msg tá na mão bacana volta lá no serviço vem cá se esse cara não existir ó throw New user indicador not found Exception eu vou colocar uma mensagem aqui ó usuário indicador não existe eu coloco usuário aí eu ponho aqui ó user ID mais indicador não existe beleza pronto fim depois a gente trata a exceção lá tá bom tá bom mas se ele existir na minha inscrição eu coloco que aqui ó Sub s7 indication indicador E aí eu gravo assim simples assim simples por indicação a inscrição por indicação funciona exatamente assim vamos ver salvei vamos lá no subscription Controller CAD Conflict subs Controller tá aqui ó eu vou tratar mais uma exceção Cat qual que user indicator not found exception response entity P status 404 pon bar New error message e. get message tá aqui foi Caraca Isidro começou a ficar interessante hein por qu porque obviamente a gente encapsulou a nossa regra de negócio nesse serviço aqui ó que tem os nossos diversos casos aqui de tratamento Beleza beleza vamos testar então ó eu vou por indicação do usuário dois quem é meu usuário número dois ó é o John é o professor Isidro pronto sou eu eu vou indicar Então vou criar aqui ó o Peter Parker vamos lá vamos colocar aqui ó bar j r Jon tá aqui vamos colocar aqui ó name Peter Parker tá aqui e aí ó email Peter @p.