Olá, sejam todos muito bem-vindos a mais uma aula. E bom, dando continuidade aqui no nosso projetinho, a gente trabalhou na layer de domain, na layer de use cases, criamos os repositories, validations, já está bem formadinho aqui a nossa camada de application, de business rules, regras de negócio. Agora está na hora da gente fazer a parte da direita, que são os secondary actors, os driven actors. Bom, vamos lá. A gente precisa, antes de mais nada, ajustar algumas coisas. A gente tem esse Models aqui, a gente tem esse Repositories, a gente tem algumas coisas aqui. Então, o que eu vou fazer? Eu vou criar um Package aqui chamado Database, ou então, ou Database, ou Persistence persistence ou JPA. JPA é um bom nome até porque a gente pode ter vários tipos de persistência, eu posso utilizar JPA, JPA já é uma abstração para N tipos de bancos de dados, já é uma abstração para N tipos de bancos de dados como repositories a gente já vai usar ali, vamos deixar como JPA mesmo, e aí isso aqui esses dois caras que estão aqui eu vou levar para dentro do JPA esse que está como models, eu vou entities e os repositories está tudo bem, e aí a gente vai inserir um novo package aqui, repositories, esses services a gente já pode deletar, não tem mais services, DTO, por enquanto a gente pode manter, lembrando que ele ainda tem aquela oportunidade aqui esses DTOs eles estão sendo usados tanto para GraphQL quanto para REST então se você parar para pensar eles mudam por duas layers de transporte diferentes não é tão legal ter isso aqui compartilhado mas por enquanto ok vamos seguir assim repositories então o que a gente vai colocar aqui a gente tem que colocar quatro na verdade antes de sair modificando vamos começar com o do customer,ho vamos colocar aqui customer database tá bom database repository implements customer repository da camada de application ele vai implementar os métodos aqui esse cara ele pode ter o arroba component aqui, porque ele vai estar na camada de fora mesmo. Quem que ele é? Ele é um interface adapter. Está adaptando o que vem do nosso domínio para o próprio driven actor Actor, o Secondary Actor aqui. Então, vamos lá. Private, Final... Ah, antes de mais nada, vamos fazer o seguinte. Só para não confundir, vamos no JPA e vamos aqui nesses repositórios aqui e a gente vai alterar o nome deles também. JPA Repository. e a gente vai alterar o nome dele também, jpa repository. Beleza. O do evento também, evento, jpa repository, partner, jpa repository, e o do ticket, jpa JPA repository E o do ticket JPA repository Beleza Agora nas entities a gente também vai mudar Customer Entity Ok Ok ok ok customer ente só para não confundir com o a modelagem do nosso domen tá é sim o pt já fala que um é diferente do outro já fala com a diferença do outro Só que quando a gente importar o customer aqui ou lá no adapter para fazer uns deparas, ele vai ficar ruim o package, então por isso que eu gosto de nomear aqui com entity no final ou document se fosse por exemplo um NoSQL com document. entity no ciclo com documento em que o status na real ele morre e ottoni lembrando agora que na verdade faltou me lembrei agora no no refactor Que faltou um detalhe aqui Que passou despercebido Que é o seguinte As entidades O seu método igualitário É pelo que? É pelo Customer ID, certo? Então, é interessante Deveria ser obrigatório, na verdade A gente sobrescrever O equals e o hashcode interessante né deveria ser obrigatório na verdade a gente sobre escrever o ícone e o hash code para justamente comparar apenas o castanho aí o prefeito de todas e todas as nossas entidades equals in hashcode name, date, pa pa pa divent id isso aqui é importante, o record class não precisa porque ele já tem a própria comparação, o ticket que é um value object não também, é verdade né mas ok partner é cadê papapá insert equals and hashcode Partner, ok. Person não tem nada. E o evento, o ticket, o ticket também, né? Opa, o ticket estava importando. Eu deletei aqui o ticket status. Só que, ó, como passou despercebido. O ticket status, na verdade verdade tem que estar aqui e vamos deletar daqui de baixo beleza e agora vamos inserir o equals e o hashcode eles são enches tem que ser comparado apenas com o seu identificador correto ajustar import beleza, só import de application com o seu identificador. Correto? Ajustar import, beleza, só import de application. Beleza. Agora sim, tem um detalhe que eu até tinha mencionado agora, esse event ticket, na verdade, ele é uma entidade justamente por usar o ID do ticket aqui mas poderia ser um objeto de valor talvez, até poderia só que se fosse um objeto de valor não seria possível modificar a ordem dele mas é algo de se pensar. Mas ok, então vamos lá, dando continuidade aqui, criamos o Customer Database Repository que já traz para a gente os métodos e ele depende do Customer JPA Repository. do customer jpa repository final objects ponto requires non null então vamos lá, vamos implementar customer an id, a gente vai basicamente dis ponto, ponto find by id, ah é, tem um detalhe que na verdade a gente precisa ajustar a nossa entidade tá mapeando como string mas na verdade tá mapeando como um long só que na verdade ele é um UUID, vamos armazená-lo como UUID do tipo binário. Então aqui, UUID, UUID, tá, tá, tá. Beleza. Show de bola. E aqui, nas antigas, a gente tinha feito o equals comparando com o id corretamente. Na hora de passar para o domain que ficou lá embaixo, eu acabei esquecendo. Beleza. Agora sim, aqui é um string não, né? O id. Optional. Optional. optional nem preciso do optional na verdade é this.customer.findbyid an id.value só que aqui a gente vai passar o o id.from e aí a gente vai mapear para vamos começar o o uid.from e aí a gente vai mapear para each.toDomain ou toCustomer o customer e aí vamos lá no customerEntity e vamos criar este métodozinho Beleza Ah, detalhe, né Esse método, ele precisa estar aqui Ou ele pode Estar aqui fora É Nesse caso, como a informação Vem de uma tabela É E não de outras Tabelas também, né, tudo tá vindo aqui Da mesma informação não tem problema esse toCustomer ficar aqui dentro mas podem ter cenários onde vem de mais de um lugar diferente aí não vai ter como ficar lá dentro, e você poderia colocar aqui fora só que como nesse cenário nem pode matar todos os que eu preciso para criar o costume está aqui eu vou colocar aqui mesmo o eterno e new customer customer aí de o if dis.id.toString dis.name dis.cpf dis.email deixa só ver se é isso mesmo name, cpf e email beleza e aí aqui da pra por exemplo fazer dessa forma beleza e aí aqui dá pra por exemplo fazer dessa forma customer of cpf aqui a mesma coisa a gente só vai mudar ah e tem um detalhe que é o seguinte esse cara aqui ele recebe o objeto de valor aqui ó objetos de valor vamos fazer onde está sendo chamado esse cara cpf.value e aqui a mesma coisa e-mail.value beleza customer, customer, então aqui é cpf e aqui é e-mail e agora sim copio isso aqui, colo findbycpf, cpf.value, object.requires non-null, cpf, cpf cannot be null, só uma pequena verificação para garantir aqui a mesma coisa id cannot be null vamos copiar isso aqui por e-mail e-mail e-mail e-mail, e-mail, e-mail, e-mail, cannot be null, lá nos casos de uso, talvez a gente tenha que corrigir também, vamos aproveitar para corrigir já esses caras, use case configuration, use case configurationCaseConfiguration morre Isso aqui morre Quer dizer, na verdade Isso aqui morre Mas a gente já pode Trazer Os sinais Então, EventRepository PartnerRepository E o repository, partner repository e o ticket repository. Beleza. A gente não vai perder o fio da meada, mas como ele está quebrando, esse cara, então ó, new cpf, ticket status, beleza, beleza,ando tá ótimo agora vamos lá no partner que eu tenho certeza que lá também tem essa oportunidade Partner Repository CNPJ e-mail vou rodar os testes para ver o que já quebrou logo de cara new CNPJ new e-mail new cnpj new email aqui cnpj .vel e meio .vel e esse aqui nem precisa mais. Vamos ver se tem algum lugar quebrando. Tá tirando esses dois. Tá passando, fechou. Então vamos voltar lá pro fio da meada que era aqui, terminar de mapear esse cara, então o create, aqui a gente pode colocar um transactional do Spring, diz.customer.safe customer. customer. customer. off customer ele vai retornar um customerEntity final new customerEntity que é customer.customerId.value o id.from customer.name customer.cpf.value, customer.email.value e o name.value também. Ficou de bola. E aí depois, o customer, né? Porque a gente fez um, fez o outro. Aqui, a mesma coisa, transactional. o customer, porque a gente fez um e fez o outro. Aqui a mesma coisa, transactional. Beleza. É isso. Então implementamos o nosso primeiro repositório, que é o Customer Database Repository. A gente, inclusive, já pode fazer o do partner vamos lá fazer o do partner rapidinho ó partner partner partner partner opa pera aí que isso aqui a gente precisa só renomear uma papel repouso a parte da tua repository e aqui partner string ok assim não na verdade o uai u, uuid, uuid, partner uuid aqui, beleza, partner jpa repository, partner jpa repository, agora aqui ó, e aí onde tiver esse customer também partner e aí só o seguinte não tem cpf né cnpj, cnpj, beleza, cnpj aqui, cnpj, find by cnpj, opa, tem um bug cpf find by mail beleza agora a gente tem que criar os public partnerEntity public static off partner partner return new partnerEntity partner.partnerId.value só que aqui é o uuid.fromstring partner.name.value partner.cineperata.value partner.email.value e também e também public partner to partner new partner partner partner partner id with e aqui pode ser por exemplo id .mpj.email .mpj.email .mpj.email show de bola o que está fazendo aqui? partner id with... ah tá stream beleza já temos dois repositórios aqui implementados interface adapter agora a gente precisa do ticket e do nosso querido do nosso querido event então vamos como o do ticket é mais rápido, vamos fazer o do ticket e aí na próxima aula a gente dedica para o do event vamos fazer o mesmo esquema, copiar e colar ticket database repository, lá no ticket ele também, aqui também é um UID, não tem mais o generated value, long long long virou o id beleza como aqui tem muito parâmetro vou mudar isso aqui aí aqui já tem a primeira mudança ele não tem mais um relacionamento com customer em direto agora vai ser o ui de customer id agora estão totalmente desacoplados event id não precisamos mais deste relacionamento aqui. Customer ID, ID, ID, ID, ID, ID, ID, ID, ID, event public static ticketEntity of ticket depois eu já era o que é o que é ter de maneira automática e tic tic ponto velho e ponto o aí ponto from string vamos duplicar esse cara porque daí agora vem os outros caras status ticket.pageAt ticket.reservedAt beleza agora eu só vou copiar isso aqui colar aqui pra baixo to ticket não recebe nada new ticket ticket id with this.Id.toString eventId.with eventId.toString só vou colocar o dis aqui para manter o mesmo padrão beleza agora só vou colocar o dis aqui pra manter o mesmo padrão beleza agora dis.status dis.paid e dis.reservedAt aqui equals and hashCode aqui equals and hashCode só que eu só comparo o identificador dele next create show de bola então agora aqui a gente vai mudar tudo aqui que é partner em maiúsculo vira ticket tudo que é partner em minúsculo vira ticket, tudo que é partner em minúsculo vira ticket em minúsculo domain, ticket, ah tá, só importar do lugar certo aqui, aqui também Portado do lugar certo aqui, aqui também. Ticket.jpa.repository.findbuddy.anid.valley. Vamos ver como é que está o ticket.jpa. Ticket.jpa agora é assim. E esse cara não precisa mais, né? Show de bola. Ticket of Email, não precisa. Ticket of ID, create, update. E é isso, né? É isso. Agora, só a título de curiosidade vamos fazer o seguinte vamos vamos só criar vamos só criar na verdade fazer o seguinte vamos mudar todos os testes para ver o que que tá pegando ele provavelmente não vai conseguir injetar justamente porque não tem a implementação. Collection, Event Entity, Ticket Mapped By, Properties. Ah tá, é porque de fato o evento ainda não foi corrigido. Então tá bom. Na próxima aula a gente vai criar o repositório, o interface adapter do evento e corrigir o mapeamento JPA dele. Combinado? Te vejo na próxima aula.