Olá, sejam todos muito bem-vindos a mais uma aula. E na aula de hoje, a gente vai continuar aqui o mapeamento das entidades de domínio. E na última aula a gente fez o do Customer, a gente conseguiu eliminar tudo que era complemento externo dos casos de uso. E agora a gente vai fazer para os Partners. Então, vamos lá que eu vou começar a fazer a copiar o costume é de aqui e mudar para partner porque vai ser partner vai ser a mesma coisa né aqui não tem muito segredinho não o do castro também vou copiar e vou mudar para partner e é que a gente vai ajustar aqui dentro então o que é cpf na verdade é cnpj vou mudar aqui esse cara aqui cnpj o que é a customer id na verdade é partner id aqui também partner id e aqui lugar que está com CPF? CNPJ, CNPJ. Beleza. Ah, agora o que a gente tem que mexer aqui? Nas validações. A validação de e-mail continua válida, mas a validação de CNPJ está inválida. Então, eu vou pegar aqui da internet. Pronto. Copiei aqui da internet mesmo cadê vou colocar aqui essa validação de cnpj e não precisa disso aqui e também não precisa desse barra beleza estou validando cnpj estou validando e-mail mas repare que a validação de e-mail está duplicada. Eu tenho a mesma regex aqui, a mesma regex aqui no customer, então não é muito legal, certo? O que a gente pode fazer para melhorar? Como a gente pode encapsular essa validação de uma forma que fique melhor, eu não tenho que replicar código por aí e eu continue tendo um domínio expressivo. A gente já aprendeu sobre como fazer isso, a gente fez isso para alguns cenários, como o Customer ID, por exemplo. A gente pode e deve utilizar um Value Object para isso. Então vamos lá. Vamos criar aqui um Value Object para e-mail e eu vou usar um Record Class mesmo. String Valley e aqui a gente vai ter... Na verdade, espera aí, eu estou usando Record Class, mas tem um pequeno detalhe que o construtor precisa ser privado. Deixa eu lembrar como que a gente pode fazer isso aqui na record class. Na record class não tem como fazer privado mesmo, já havia me esquecido mas a gente pode fazer o seguinte e-mail pum, e a gente vai lidar aqui então vamos fazer a mesma coisa aqui como esse construtor é público, o que a gente tem que fazer é validar aqui aqui a gente vai vai na verdade não faz sentido porque ele passar um o aí então já é válido por padrão mas aquicepção na verdade aqui precisa validar assim tá acabei de lembrar aqui já vai dar a nula habilidade então é esse velho igual a igual no nulo Invalid Valley A mesma coisa Para o Partner ID aqui If Invalid Nulo Beleza, vamos voltar agora para o e-mail Então a gente tem aqui o nosso O nosso Record Class Que na verdade é o nosso objeto de valor O próprio Record Class do Java Ele já implementa equals e hashCode e toString para a gente com os atributos. E aqui eu só estou verificando que o valor passado não é nulo ou ele é nulo se for a deluxe perception, então que ele é válido. E aí, por exemplo, a gente já pode vir aqui no partner e ao invés de fazer isso aqui a gente muda para e-mail aqui e aqui a gente new e-mail bacana e aqui também e mail no customer a mesma coisa ao invés de validar aqui e mail e mail aqui e mail aqui a gente tem três a gente pode fazer a mesma coisa para o cpf, então vamos fazer alt insert java class cpf, ele é na verdade um record, ele tem um string value, public cpf, e aí a gente vai colocar essa variação lá dentro. Só que como value e aí a gente vai utilizá-lo aqui new cpf cpf, e aqui é cpf e o name também, o name a gente está colocando aqui, então a gente pode colocar um value object para name que na verdade é um record, que tem string value, public name e ele faz essa mesma validação aqui, é velho foi na verdade nem me envolve de velho e for nem a gente mexer nos outros também acho que o inv isso, ah o email, invalid value for email beleza, cpf name, eu vou copiar o do cpf porque o do cnpj vai ser absurdamente parecido o que a gente vai mudar aqui só é a isso aqui né deixa eu colocar aqui deixa eu pegar só o regex cnpj show de bola e a gente pode vamos lá vamos substitu. O name também não faz mais sentido aqui. Então agora a gente tem o name. A gente retorna o name aqui. E ele é o name aqui. E o partner. Ele também é name. Aqui é cnpj. Então aqui é new name new cnpj aqui é cnpj e aqui é name show de bola então já substituímos criamos mais objetos de valor substituímos as validações. Deixa eu ver aqui o Customer, deixa eu ver como é que está o Partner. O Partner aqui, vala, não preciso ter essas validações mais duplicadas aqui, porque os Valid Objects já encapsularam as validações e eles já estão garantindo que eles não vão ser criados de maneira indevida. Então está tudo sendo usado aqui. Se a gente for lá nos testes, vamos ver se continua passando ou o que quebrou. Ah tá, aqui é ponto valley e aqui é ponto valley. Então a gente até pode já começar a quebrar a linha aqui, porque já está muito extenso. E aqui também é ponto Valley. Aqui a mesma coisa, então Valley, Valley, Valley e Valley aqui. e velho e aqui nos rodar os testes é velho velho velho e velho e beleza a gente vai de classe em classe beleza e quebrou beleza só vai que quebr, os outros continuam intactos. Ou seja, as validações estão feitas corretamente. Se a gente for aqui no Create Customer Test, validação feita corretamente, Customer Ready Exists. Tudo está intacto. Agora a gente pode então mexer no caso de uso de Partner. O caso de uso de Partner a gente vai mudar. Na na verdade antes de mudar a gente vai criar a interface aqui no caso vou copiar e colar é o que a gente já fez para o customer então partner repository o que é customer aqui vira partner aqui vira o partner id e o que é customer em minúsculo vai virar partner vamos ver aqui quem que tem, partner, partner, beleza e aí o partner repository ele passa a ser, cadê? aqui ó, passa a ser esse cara esse aqui val esse cara esse aqui vala, esse aqui vala vamos importar o partner repository e esse cara aqui passa a ser partner repository aqui é partner off ah, não é fnpj faltou mudar isso, não é cpf não input.cnpj, input.email e aí a gente pode passar isso aqui direto para o creator. Beleza. beleza nos corpos aqui e aqui né a gente já sabe que é aí de ponto partnerid.value opa deixa eu só ver custom.value.twisting ah tá não pera aí, custom.id o partner partnerid.value vamos lá no create partner partner ele tá retornando vamos lá no create partner partner ele está retornando o partner correto, beleza ponto value ah tá, é porque aqui ele está usando o output do create partner engraçado que ele não reclamou né, tá o value aqui é um uid mas ok, não deve ser reclamado por conta dos outros né acho que depois ele vai reclamar então vamos ver email.valley e name.valley perfeito agora ele reclamou e aí é toString porque a gente vai retornar uma string aqui. Show de bola, substituído. GetPartner aqui também. Vamos lá, vamos substituir. Vamos fazer só esses dois. PartnerRepository do application. Aqui a mesma coisa, então trazer aqui, mover para cá. A única diferença é que aqui é... Estava como P, mas vamos mudar para Partner. Beleza, está funcionando. Agora o que a gente precisa? Arrumar os testes. Vamos lá. Application. Tem esse cara. Vou copiar e colar. Vamos usar aqui um Partner in Memory. A diferença é que esse aqui é por cnp-npj e a diferença obviamente aqui não é aqui é partner não é customer e aqui também também vamos trazer esse partner repository dentro de application e aí aqui tudo que for customer minúsculo a gente vai renomear para partner of cnpj e aqui é cnpj também cnpj, cnpj show de bola já criamos ele aqui agora a gente vai lá nos, vamos lá, tudo que é mock chow, final var, customer repository igual a new in memory, ou customer repository, estou louco, partner repository in memory, partner repository in memory passa para cá beleza agora o useValidation é aquilo que a gente já sabe a gente vai instanci esse partner aqui. A gente vai trazer o partner que importa, que é o correto ali, o da application. E a gente vai passar aqui, ó. Expected name, expected CNPJ, expected email. Isso aqui tudo, vala. Isso aqui vai lá para baixo e aí a gente vai, isso aqui um pouquinho mais para baixo, para partner.create a partner, beleza, então já está persistido, agora aqui, CPF, pá pá pá, não deve cadastrar um parceiro com CNPJ duplicado porque ele vai passar o mesmo CNPJ que já vai estar persistido aqui ok agora aqui a mesma coisa não deve cadastrar um parceiro com e-mail duplicado, então isso aqui vai para a vala, partner repository, só tem um detalhe aqui, com o CNPJ duplicado, então o primeiro, eu vou passar um outro CNPJ aqui, eu vou passar, ah, e ele vai começar a validar, então tem que ter o ponto, aqui ponto, aqui mil contrário traço né então ele vai começar a validar isso aqui só que eu vou passar pra instância com o 2 e esse aqui cnpj aqui beleza agora eu vou colocar isso aqui também vou colocar aqui também e a diferença é que o e mail eu vou pré cadastrar ele com algum outro e mail qualquer então cadastrar com isso aqui vamos rodar o teste. Faltou agora ajustar aqui, string, alguns outros lugares quebraram, vamos ver. String também, useCases, ainda não existe a implementação desse repositório, então vamos colocar aqui como nulo, e aí a gente tem que ajustar aqui também e maravilha. GetPartnerById, isso aqui e aí esse aqui new partner expected name, expected beleza, instanciamos não tem mais mock a gente passa o partner repository aqui direto e o expected id na verdade não é esse aqui né na verdade é esse ponto id.value.toString e aí isso aqui a gente até pode colocar para uma variável de expected id e aí aqui ó final var show de bola ali embaixo a mesma coisa só que ali embaixo é com id inválido ou seja, é um id que nem existe então eu posso só instanciar e passar pra cá e esse aqui na verdade random.toString é isso vou mudar agora todos os testes de novo aqui dos casos de uso E em tese deveria estar passando e só quebrando Deveria estar quebrando aquele lá, invalid cnpj Cnpj inválido, por quê? Vamos ver E esse aqui também, invalid cnpj Esse aqui está cnpj inválido porque vamos ver e esse aqui também em velho e sempre essa aqui tá sendo pior em vários que de fato vamos agora passou esse tá vai então o problema não era o cnpj hein vamos ver que que tá se a ordem de parâmetros um guard de cnpj uma dupliquei ter e mail a olha aqui por o pa expectante sempre não deveria cadastrar um parceiro com e mail duplicado então a gente tem que cadastrar um aqui é peraí cnpj vai ser o mesmo não vai ser diferente do pré cadastrado aqui vamos colocar um outro o e mail que vai ser o mesmo agora sim vamos lá agora sim passou é nem tinha que rodar todos os testes da aplicação ainda, porque obviamente muitos vão quebrar. Mas, rodando aqui todos os casos de uso, só estão quebrando os integration tests. E agora, a gente novamente, vamos lá para os nossos casos de uso. Create Partner. Zero dependência de cara fora do hexágono, guest partner by ID, zero dependência de cara fora do hexágono, muito bom. Então é isso, espero que vocês tenham gostado, vejo vocês na próxima aula.