Salve, beleza? Continuando a nossa saga aqui no Domain Dreaming Design, na última aula nós criamos o contrato que os nossos repositórios vão usar e até a interface aqui do repositório de partner, que é um exemplo básico para a gente começar a entender como vai funcionar essa construção dessa camada aqui. Então, uma vez que eu tenha esse cara, que ele vai estender do iRepository, a gente vai fazer a implementação dele aqui na camada de infraestrutura com o microRM. Então, eu vou colocar aqui repositories, a gente vai colocando todos os nossos repositórios aqui, e aí eu vou criar o partner, ponto. O partner. Ponto. Vou colocar mais SQL, que é uma abordagem também que a gente pode utilizar, porque se eu tiver um outro repositório que trabalha com outro banco de dados, eu posso ter necessidades diferentes, ou se eu consigo concentrar, condensar isso num repositório, eu só poderia colocar aqui também o nome da lib, que seria uma outra abordagem. Mas esse repositório agora é o repositório para valer. Então, vai ser o partner MySQL. Colocar MySQL com tudo minúsculo vai ficar melhor. Então, ele vai implementar o partner repository interface. minúsculo, vai ficar melhor. Então ele vai implementar o Partner Repository Interface. Inclusive até vou fazer aqui uma outra mudança, vou colocar aqui dessa forma, vou colocar o i no nome do arquivo que eu acho que vai ficar melhor e menor também. Então eu tiro esse daqui, volto a importar novamente, e agora ele vai exigir que eu faça a implementação aqui. Show de bola. Então tem todos esses métodos que a gente possa implementar. Mas antes disso, uma vez que eu vou trabalhar com o microRM, o que eu tenho que pegar do microRM, o que eu tenho que pegar do microRM para poder trabalhar com esses métodos? No construtor, a gente vai trabalhar com uma injeção de dependência aqui do Entity Manager, que é o gerenciador das entidades, esse carinha tão famoso que está nos ajudando aqui. Então, importo ele do microRM. Inclusive, pode ser até específico do MySQL mesmo. Eu tenho a opção lá do core, beleza. Vocês vão se espantar como que é simples trabalhar, por exemplo, com o Edge. Ah, eu tenho que fazer? Não, não tem que fazer nada. Faço um Entity Manager, persiste. E até como a gente está prometendo devolver uma promessa, eu vou colocar um async aqui, mas esse processamento inclusive, ele não precisa nem de uma promessa, ele opera de forma simples, ele devolve a própria referência dele. Mas a gente deixa eSync aqui dessa forma. Então, daqui a pouco a gente vai falar sobre o Unit of Work. Aqui, ele não está batendo no banco de dados. Ele só está adicionando essa entidade, esse agregado, na listinha lá para que ele gerencie. Agora, essa entidade é gerenciada, depois a gente libera tudo de uma vez. Então, essa operação serve tanto para a inserção quanto para o update. Então, ela concentra as duas coisas e fica mais fácil até para a gente poder trabalhar. Inclusive, entidades que já foram persistidas, que a gente quer fazer o update, nem precisaria do persist. Mas, se eu tentar inserir uma entidade que já está gerenciada, ele verifica isso. Então, não tem problema a gente usar esse add para as duas operações. Para fazer o find by id, eu vou colocar aqui duas opções, porque às vezes é útil que a gente passe a string ou o próprio objeto de valor. Então, partnerId. Então, eu vou fazer aqui um businessManager, tenho o findOne. Eu não quero usar o findOneOrFail, eu quero retornar um null se der alguma zica. Inclusive, eu vou colocar aqui um ONULL, eu acho que a gente colocou isso lá no nosso contrato, colocamos, ele pode retornar a entidade ONULL. Então aqui nós vamos passar qual é, porque o EntityManager administra todas as entidades. Eu passo Partner e aqui vem o Where. Aqui eu tenho que tomar cuidado porque eu posso tanto receber String quanto o objeto de valor. Aí, eu tenho que fazer um return antes aqui para tirar aquele errinho ali que ele está demandando e agora a gente tem que resolver esse erro aqui. Ele está falando que o id não é compatível. Se a gente tiver o objeto de valor, pega, na verdade tem que fazer aqui o contrário, tiver o objeto de valor, pega, na verdade, tem que fazer aqui o contrário, o copilot pegou a ideia. Na verdade, eu tenho que verificar se o tipo do meu id for uma string, significa que eu estou passando o id de forma direta, então eu forço, porque agora como eu defini o tipo da minha variável como um tipo personalizado aqui para trabalhar com esse objeto de valor, na verdade eu tenho que verificar se é uma string para forçar a criação desse objeto. Caso contrário, eu passo o próprio id que foi passado. Beleza. Então, inclusive, eu vou fazer essa mesma... Ah, não, na verdade a gente não tem outro método para usar o ID, não. O findAll, dependendo do que o Copilot vai até já me dar pronto, a gente passa um find, que vai buscar tudo. E esse segundo parâmetro, eu acho que ele não tem como ser omitido, não. Ele tem que ser pelo menos um objeto vazio. Aí ele vai buscar todos os... os partners e na exclusão, que na verdade eu até coloquei errado, eu não quero excluir. A gente pode... mudar aqui o nosso contrato. Poderia passar o partner inteiro. mudar aqui o nosso contrato, eu poderia passar o partner inteiro que vai ser do tipo E, porque fica mais conveniente aqui, porque eu recebo, nesse caso, o entity partner, tem ali a promessa e a gente chama aqui o entity manager ponto remove, não é delete, é remove essa operação aqui, eu acho que ela não tem promessa ou tem promessa, eu acredito que também não tem ali o diesel, então não precisa mas a gente vai ter que colocar o async porque no nosso contrato todo mundo está devolvendo aqui uma promessa não tem problema a gente devolver uma promessa de uma execução aqui que ele vai executar ali diretamente mesmo maravilha, então agora vamos criar um teste aqui para brincar com exatamente mesmo. Maravilha. Então agora vamos criar um teste aqui para brincar com isso. A gente tem o caso aqui da infraestrutura, do esquemas, que eu poderia pegar, esse cara mandar para cá. Aí vamos fazer aqui o update dos importes e aqui a gente coloca partner para somar SQL, ponto repository, ponto spec. Então aqui são os testes do repositório colocar só partner repositório que eu não quero testar nada de forma separada a gente pode primeiro tem que criar o entity manager aí eu posso pegar esse partner e agora fazer a persistência aqui antes, eu vou ter que criar o repositório né, então partner repo como abreviação do nosso partner mais aquele repositório passando o ant manager então agora se eu quiser fazer aqui o add, eu não tenho nada no banco de dados. Eu só vou ter no banco de dados sempre quando eu chamar do meu Entity Manager o flush. Aí você pergunta assim, mas não deveria ser o repositório que determina ali para poder completar a operação? Na verdade, não. Quem vai ter esse controle transacional vai ser a camada de aplicação. Isso é muito importante para que a gente possa organizar o processo de negócio e fazer até o gerenciamento de eventos e outras coisas ali. Então, aqui a gente faz esse flush e logo em seguida nós podemos usar o findById, que aí dá para fazer aqui se a gente vai ter aqui o id que ele vai buscar Ele vai buscar. É igual ao ID. Inclusive aqui dá até para fazer com o ícone. Eu consigo fazer assim. Passando o partner ID que a gente faz a verificação conforme tem que ser. E esse aqui seria verdade. É esse método aqui. Vamos fazer o nosso primeiro teste. Acho que eu não esqueci nenhum await aqui. Bora lá. Show de bola. Então, passou. Inclusive, tem uns console logs que eu deixei perdidos por aí. E até para forçar esse find by ID, lembrando que ele está administrando, ele não bateu no banco de dados quando ele foi lá no find, eu vou fazer o clear para que ele limpe o cache dele. E eu consiga constar os dados novamente. De bola. Então, já tivemos aqui o sucesso. A gente pode também fazer um... Vou deixar um RM close no final. Aí, se eu tiver alguma operação que eu queira fazer no update da vida, eu não tenho o change name, eu passaria ali um partner2 para poder mudar o nome, aí eu chamaria o edge novamente. Não precisaria chamar o edge porque ele já está gerenciado ali pelo Entity Manager. Se eu só fizesse o flush, já seria suficiente. Então, eu vou passar isso aqui novamente para poder forçar. Inclusive, até algo que eu não testei aqui foi o nome. Aqui o nome, eu quero fazer essa comparação. Se eu colocar um let, eu posso usar ele ali embaixo. E aqui eu tiro esse const daqui. E agora a gente vai ver se o nome alterado é igual ao nome do que a gente buscou aqui. E a minha extensão de teste deu uma zica, mas a gente executa aqui diretamente. Então, ele deu algum erro, será que eu deixei o close aqui antes? Ele fechou a conexão pronto deu certo aqui então a gente já testou tanto o add quanto o find by id e só para consolidar essa brincadeira, vamos fazer aqui um partner. Melhor, partner repo find all. Eu tenho que colocar, obviamente, estou esquecendo o await aqui, senão ele não mostra, aqui a nossa entidade persistida, e para poder finalizar, partner repo delete, aí nesse caso aqui eu tenho que fazer o flush novamente, aí nesse caso aqui eu tenho que fazer o flush novamente vamos até usar o findAll para ver o resultado ele vai ter que mostrar vazio então, pronto excluído, então nós temos aqui o modelo de repositório podemos copiar isso para todo mundo veja o tamanzinho desse repositório então aqui a gente não fica com aquelas preocupações todas lá que a gente teria com o mapper, são abstraídas. O repositório tende a ter outras preocupações e até você tem mais liberdade para poder fazer outras coisas mais avançadas, para poder ter algumas preocupações aqui em trabalhar com níveis de cache, travamentos e etc. Não se torna aquele repositório que normalmente vai ter mais linhas de código. Então, vamos continuar nossa saga. É isso aí e até a próxima.