Olá, seja muito bem-vindo a mais uma aula. E na última aula, a gente extraiu o primeiro caso de uso, chamado de Create Customer. Então, do jeito que estava no controle, a gente extraiu para cá. Significa que vai ficar assim? Claro que não. Por enquanto, estamos tratando a ponta dos drivers. Depois a gente vem para o caso de uso, a gente corrige o meio do hexágono. Depois a gente corrige a ponta que é os Driven Actors. Então, por enquanto, a gente está trabalhando aqui na parte dos drivers e extraindo o caso de uso, que são as regras de negócio da nossa aplicação, do Presenter, do Controller, que no caso a gente viu também que o controller é a layer de adapter do REST API, assim como os resolvers são a layer de adapter do GraphQL, extraindo toda a regra de negócio deles para os casos de uso. Então vamos lá, vamos continuar fazendo isso para os demais casos de uso. Então quem que a gente tem aqui no customer depois? A gente tem o GetById. Então, vamos aqui, criar uma nova classe chamada Get Customer By ID. Ah, e faltou o UseCase. GetCustomerByID UseCase. Antes de extrair esse cara a gente também já pode até fazer a parte do teste vamos lá, create test usando aqui a IDE pra já criar pra gente certinho lá na pasta então public vamos lá ver só no controller como é que tá lá o teste o teste deve obter um cliente por ID então public void test get como é que tá lá o teste, gente, ó, o teste deve obter um cliente por ID, ó, então, public void test get by ID, é, vamos no create, cadê, vamos ali no create, vamos pegar essa colinha aqui, ó, deve cadastrar, cbf duplicado, por que que a gente vai pegar essa colinha aqui ó deve cadastrar cbf duplicado porque a gente vai pegar essa colinha porque aqui a gente já tem opa achei que eu copiei coisa demais aqui ó vamos identar a gente já tem isso aqui ó que é o get por id afinal é o get por id né então eu quero isso aqui, isso aqui por enquanto sai, eu quero isso aqui, exatamente, essa instanciação de Customer, que é o que eu quero, Customer Service Mock, beleza, a gente vai corrigir isso agora, Então, teste getById, já tenho aqui a minha instanciação, inclusive esse cara aqui, ele pode ser, por exemplo, o id, ele pode ser o id que vai estar aqui, final var, long expected id. long expected id ok, então instanciamos, já está ok, agora aqui, mock service mock service, a gente vai no find by id expected id, then return this customer beleza, aqui é get customer by id use case, ele ainda não sabe que ele depende do customer service, né, depois a gente vai colocar lá pra ele, e a gente precisa passar um input, né, então esse cara a gente já sabe que é ponto input, new, e vai receber o expected id final var input use case execute input nesse cenário a gente não vai retornar então final var output igual a isso aqui assert equals e aí todos aqueles asserts a gente até pode copiar daqui só pra ser deve obter um cliente por id. Já temos aqui a primeira camada que é a cobertura do teste. O que a input recebe aqui então long id e tem um public record output output que é longid string name string name melhor cpf email string name e aqui tem uma sacada interessante, que é o seguinte, a gente vai receber esse input do getById e a gente vai retornar um optional de output do getById. Por quê? Porque de fato pode ser que esse cara não exista, certo? Pode ser que o ID que está sendo passado não tenha um customer, de fato. Então, ao invés de a gente retornar uma exception ou retornar nulo, a gente já retorna um optional para indicar para quem está nos consumindo que esse cara pode não retornar nada, pode não existir qual que é a regra de negócio lá? vamos lá, mesmo jeito CustomerController GetById, vamos trazer para cá colar aqui dependência do CustomerService, PrivateFinal CustomerService private final customerService refactor final objects.requiresNoneNull beleza e só que aqui tem um detalhe né aqui a gente não vai a gente não precisa fazer esse if aqui, que inclusive está usando mal o optional, a gente só vai dar um map nele e aí se tiver aqui c new output c.getid, c.getcpf, c.email e c.name. Beleza, é isso que a gente precisa fazer. E aí lá no teste, bom, como esse teste a gente sabe que tem que dar certo, eu vou pôr o get aqui. Só que esse get, só está ok usar o get aqui no cenário de teste, porque eu sei que ele precisa estar ali. Se não tiver uma resposta aqui, é porque alguma coisa atrás falhou e está tudo bem eu lançar exception aqui. No package principal, onde a gente trabalha com optional a gente não usa o get jamais. Esse get inclusive é totalmente desencorajado de ser usado tá pela pela própria dos próprios mantenedores da JDK. Porque se você chamar esse get e não tiver nenhum valor dentro, ele vai lançar uma exception. No such element. Então, por isso que você precisa usar outros métodos para obter o que está dentro, como, por exemplo, or else, or else get, or, assim por diante. Vamos lá, vamos rodar o nosso teste. Passou. Esse caso de uso foi bastante simples. A gente até pode fazer um cenário aqui. Infeliz para ele. Deve obter vazio ao tentar recuperar um cliente não existente por id e aí teste getById with invalid id e aí na verdade o que a gente vai fazer é o seguinte, mata isso aqui mata tudo isso aqui, na verdade não vai precisar customer. aqui a gente vai retornar um empty aqui a gente simplesmente vai deixar vai deixar assinalar o output para optional e aí o que eu vou fazer aqui assert true output.isempt simples assim e aí ok, então o nosso teste passou também e aí o getById já está funcionando perfeitamente, agora a gente vai lá no controller e aí aqui a gente vai basicamente new getById useCase com o customerService finalvar useCase igual useCase.execute new input id finalvar output e na verdade a gente nem precisa do output, a gente pode retornar direto aqui e aí map, então se tiver valor vai ser basicamente entry ponto not found 2.2.build, que é basicamente o que estava feito aqui embaixo. Show de bola. Vamos rodar todos os testes para ver se tudo está passando? Então, rodando todos os testes para ver se tudo está passando. Então rodando todos os testes aqui. Show de bola, tudo passa igual era antes. Tem um detalhe, vamos rodar a aplicação, vamos fazer um teste se vai... bom, se bem que todos os testes passaram, então já está ok mas se a gente quiser por exemplo checar aqui ó vamos ver aqui o cadê aqui ó vamos fazer um get by id ó tá funcionando se a gente vier por exemplo aqui no 8080 barra customers barra 2 retornou o jason está funcionando bonitamente então tudo continua funcionando como era antes. Bom, agora quem que a gente pode começar? A gente já pode começar a extrair, por exemplo, os casos de uso do parter, que vão vir aqui. Só que vou fazer uma pausa, a gente continua na próxima aula, já extraindo todos os casos de uso do Partner, e aí logo em sequência a gente faz o dos eventos também. Ah, vamos só ver um negócio que eu acho que faltou, o Customer Controller está certinho, só que o Resolver, vamos ver se a gente mudou não mudamos, ó temos que mudar aqui também a diferença é que ele retorna um customerDto, né, então aqui, ó é um customerDto 2.2.new ah tá, porque agora ele retorna um output, né, então newCustomerDTO puts, é verdade, então ele também não tem aqui, então vou fazer o seguinte, vai ser um output mesmo, então nem precisa desse mapa. E aí, .orelse nulo. o que ele está reclamando aqui? ah tá, ele apontou para o output errado então é esse output aqui show de bola então agora sim mudamos o GraphQL para usar no caso de uso e não mais a lógica grossa aqui mudamos no controller para usar no caso de uso e não mais a lógica grossa aqui. Mudamos no controller para usar o caso de uso também. Então, está ficando bem decente. A gente está conseguindo ver um valor. Eu falei que ia fazer na próxima aula, mas vamos fazer tudo junto aqui. A gente já faz rapidinho. Partner. Vamos estrear o do partner. Vamos lá. Vamos começar criando aqui o caso de uso. JavaClass. Create. vamos lá, vamos começar criando aqui o caso de uso java class create partner use case ele estende use case que recebe um input e um output public record input vai ser string cnpj é diferente string name e string email output é muito parecido com a diferença que agora tem o identificador aqui e aqui a gente pode falar que é o input do create partner e o output do create partner e aí implementar o método aqui vamos lá no controller do partner ver como é que tá ó como copiar isso aqui tá muito parecido com o do Customer, na verdade. Vamos trazer a dependência do Partner Service. Não vamos corrigir isso agora. Construção via... Injeção via construção, via construtor. Esse cara, Object Requires No Null. E aqui vamos pôr um finalzinho. Show de bola é isso aqui, input cnpj aqui tanto faz se é o parâmetro ou a invocação do método, tá gente não vai fazer diferença, a não ser que seja um método encapsulado é com alguma regra, que no caso não é, então não precisa ser. Aqui a gente já aprendeu, né? Pro, new, validation exception. Vou copiar isso aqui, vou trazer aqui para baixo. Aqui é basicamente mudar de DTO para input, save, e aí a gente vai retornar um new output. Então é... Ah, tá. save e aí a gente vai retornar um new output então é aqui faltou mudar também name cnpj e mail e aqui é partner.getid partner.get cCNPJ, e-mail e nome. Show de bola, né? Agora, beleza, a gente acabou já ruxando a implementação aqui, porque a gente já brincou bastante com o 3DD nas outras classes. Então, antes de fazer o teste, já vamos fazer o último caso de uso aqui. Então, antes de fazer o teste, já vamos fazer o último caso de uso aqui. Quer dizer, vamos... É, vamos fazer o caso de uso, depois a gente injeta aqui no controle. Ó, java.getCustomer... GetCustomer não, né? GetPartnerById... Estou tend aí de dificuldade com teclado aqui esse teclado de jogo é meu ruim de parceria de use case e tem de use case input public record input, ele recebe um long id, e aí tem um output que vai retornar id, string cmpj, string email e string name. Aí aqui a gente vai ter o construtor, que vai receber o partner service, já vamos colocar aqui tudo nele, object.requires não nulo, aí aqui é o input e o output, e aí implementar o método execute aqui, que é basicamente, eu não vou nem olhar lá porque a gente já sabe como é que é, quer dizer, vamos olhar, mas é só uma chamadinha aqui esse essa chamada e a gente vai mudar pra input.id e usar o mapa pra converter para new output e aí p.getid p.cnvj p.email e p.name. Ah, e lembrando que aqui não é o output direto, né? Aqui é o optional de output. E aí a gente faz o que a gente já sabe aqui, que é basicamente colocar aqui pra fora e esse cara aqui optional de output. Perfeito já temos dois casos de uso aqui então o que a gente faz aqui agora a mesma coisa que a gente já sabe partner useCase passando o partnerService final var useCase igual useCase .execute new input dto.cmpj, dto.email, dto.name e esse cara ele vai retornar um output que é final var output e a gente vai retornar aqui o responseEntity. que é basicamente isso aqui, deixa eu copiar isso aqui, trazer pra cá e a diferença é que é com o output, aqui é a id dessa forma. O resto é resto, é vala. Então, try, opa, try, catch, validation, exception, return, responsiation, processo do erro body ex.getmessage e aqui no get, mesma coisa final var useCase igual a new cadê? getPartnerById passando partnerService return useCase.execute new getPartnerById passando o partner service return use case ponto execute new get partner party passando esse cara aqui e aí na verdade a gente vai mapear né map response-inst 2.2.ok or else get response-inst.not found response2.build E a gente pode quebrar uma linha aqui. Por que que nesse caso, do partner, eu não fiz o teste antes? Por que que eu não fiz o TDD antes? O que que me deu confiança pra eu não fazer o TDD antes? O que que me deu confiança pra eu não fazer o TDD antes? Basicamente é os testes que já existem aqui, ó. A gente já tem aqui, já verifico que não deve cadastrar um parceiro, ele já verifica status code, já verifica que mensagem, o código já está coberto, não preciso ter medo de mexer nele, o código já está coberto não preciso ter medo de mexer nele, porque ele já está coberto, o teste, eu vi que o teste era bom, que o teste prestava, ele já me dava segurança, já me dava cobertura se o teste estivesse ruim, aí eu começaria pelo 3DD antes, se o teste fosse duvidoso, começaria pelo 3DD antes mas como o teste é confiável Então simplesmente Sair refatorando Sair mudando, agora eu vou poder executar o teste E ver se tudo está passando, se alguma coisa quebrou Que no caso, está tudo Passando bonitinho Então vamos fazer a mudança aqui também Lá para o Resolver Ah, a gente nem tem Ainda o Resolver do Partner partner então vamos criar aqui ó vamos criar partner resolver aqui onde é partner service Vamos só ajustar aqui, beleza. Aí aqui a gente tem o create partner use case. Create partner. E aqui também, partner DTO. Partner service input.getCNPJ e aí aqui embaixo é o getPartnerById getPartner, getPartner passando partnerservice e aqui é partnerOfId indentar mudar o autoimport a gente até pode ver se faltou alguma coisa com o customer aqui, mas não faltou. E aí para finalizar mesmo, vamos expor o partner via GraphQL. Vamos lá no GraphQL, copiar esses dois caras, colar aqui embaixo. Esse aqui é o partner. E esse aqui é o partner input. E aí a diferença é que a gente tem esse NPJ no lugar de CPF, vou duplicar esse cara, Partner, Partner Input, que retorna um Partner, e aqui é o Partner Off-ID, que retorna possivelmente um Partner. Show de bola. Então vamos rodar aqui a aplicação. Vamos rodar a aplicação. Vamos lá no nosso GraphQL. A aplicação rodou. Agora a gente pode chamar aqui, por exemplo, o Partner. Opa, não estou vendo. Vamos dar um refresh na página, importante. Partner of ID, nulo, não existe. Mas se a gente vier aqui, por exemplo, na verdade deixa eu continuar comentando aqui ali, vamos colocar aqui embaixo, a query aqui debaixo eu vou comentar. Create debaixo vou comentar, create partner input e aqui a diferença é que é snpj, criar o primeiro, beleza comentei, vamos buscar esse cara com id 1, ó funcionando, agora a gente não tem apenas via REST API como a gente tem via GraphQL. E aqui é Partners. Entendeu? E a lógica não está duplicada. Bacana? Temos nossos casos de uso aqui que estão bem protegidos. As nossas layers de adapters estão bem finas. Olha o partner aqui. Adapter. Partner Controller. Partner Resolver Adapter. Então, o mundo de entrada e os nossos casos de uso, a nossa regra de negócio, está bem isolada. Perfeito? Espero que vocês tenham gostado. Vejo vocês na próxima aula.