Salve, das Belezas! Continuamos essa saga aqui no domínio do Rewind Design. Na última aula, nós criamos o nosso primeiro mapeamento em entidade relacional e conseguimos persistir um parceiro, porém, quando foi voltar lá do banco de dados, nós perdemos o objeto de valor ali no ID. A gente tem que garantir que ele volte totalmente persistido, de forma correta. Por debaixo dos panos, a gente precisa entender o que está acontecendo ali com o nosso RM. No caso do micro RM, ele não usa o nosso construtor para poder passar as informações. Ele está passando diretamente para cada variável, ele instancia ali e vai jogando os valores, que é uma forma da gente trabalhar. Eu quero que ele use o construtor nesse caso para poder... O construtor nosso aqui tem a lógica para criar todas as variáveis de forma certinha. Então, aqui no nosso teste, tem uma opção que eu posso passar aqui. Na verdade, dá até para passar lá no mapeamento, mas ela pode ser global. Que é o Force Entity Constructor. Então, isso aqui vai informar ele que ele vai usar o nosso construtor. Beleza. Vamos, acho que a minha extensão ali bugou para algum teste que a gente tinha feito. Então, tá. Aqui a princípio não vai mudar nada, mas agora quando ele for instanciar, a gente pode até fazer aqui um console.log de props. A gente vai ver aqui. Olha que interessante. Isso aqui ele está carregando lá do banco de dados, então ele está passando as duas informações, antes era incidência direta, mas mesmo assim isso aqui não resolveu o nosso problema. Para que a gente consiga resolver esse problema, é necessário criar um novo tipo de dados. a gente consiga resolver esse problema, é necessário criar um novo tipo de dados. Então, esse type aqui que é o UUID, ele tem uma classe interna ali que ele sabe tanto enviar o valor para o banco e capturar esse valor do banco. Ele sabe fazer essa conversão. Então, nós vamos criar aqui dentro, pode ser uma pastinha types. E aí, vamos criar aqui com o mesmo nome, um parter, traço id, ponto esquema, traço type. .schema-type. Estou colocando isso aqui para ficar bem claro, para não confundir com o objeto de valor, que isso aqui é o tipo lá do nosso microRM. Eu já tenho esse tipo aqui, eu não vou digitar do zero. A gente tem que entender o que está acontecendo na prática, porque eu vou importar o meu objeto de valor. Então, esse aqui é um tipo específico do microRN. Nós vamos ter três métodos num tipo. Posso criar um tipo personalizado o quanto eu quiser. Eu tenho um método para converter para o valor que vai lá para o banco, um método para converter quando ele puxar do banco de dados e gerar ali a nossa instância e qual é o tipo da coluna que a gente vai ter lá no banco de dados. Sempre nesses métodos nós recebemos aqui qual é a plataforma porque a gente está criando esse mapeamento objeto relacional, poderia persistir isso em vários bancos de dados diferentes. Então, poderia verificar aqui se é um pós-grab, se é um MySQL. E aí, no caso aqui, por exemplo, do column type, que eu estou determinando como varchar36, se fosse um outro, se fosse pós-grab, se tem um tipo lá mais adequado, poderia fazer aqui um switch case ou algo assim, para poder fazer atribuição. Isso tem que ficar bem claro aí pra vocês. E aqui não precisa do template string, né? Só colocar um apóstrofe. Quando eu quero converter, quando tá vindo esse valor lá do meu banco de dados, eu gero a instância eu gero a instância do meu objeto de valor. Isso vai garantir que toda vez que eu usar o meu construtor, que eu passe o valor de forma correta. Para converter o valor para o banco de dados, eu poderia receber... Aqui eu tenho que tomar cuidado que... Não vou usar isso aqui somente para o ID do partner lá no event eu tenho também esse tipo aqui serve como referência para usar quando eu precisar desse partner ID então eu poderia receber um partner ID undefined ou nul então tem que considerar, porque às vezes se ele é uma chave estrangeira ela pode ser nullable. Então tem que considerar que eu recebo esses dois valores aqui. Aí eu faço uma análise. Se eu pego o objeto de valor, vai ser o value que eu vou mandar para o banco de dados. Caso contrário, vai ser o próprio value object aqui, que é nulo. Esse asString aqui é apenas porque eu tenho que colocar um tipo, que é o que eu vou devolver aqui, estou fazendo a conversão só para o TypeScript não dar o devido erro. Então está tudo alinhadinho, exportado. Inclusive até na última aula a gente está recebendo aqui o lance do ID, era até para ele poder criar aqui na verdade, o partner id, né? Será que a gente fez alguma coisa incorreta aqui? Porque se ele for igual uma string ele deveria gerar. Ah, já sei porquê é porque mesmo você forçando o construtor, isso aqui é uma pegadinha que você tem que brincar com o micro-rm. Mesmo que você coloque aqui no construtor, isso aqui é uma pegadinha que você tem que brincar com o micro-rm. Mesmo que você coloque aqui no construtor, ele está vindo aqui, para a chave primária, ele acaba acessando a variável diretamente e jogando o valor lá. Então, isso é feito depois que o objeto é instanciado. De qualquer forma, a gente deveria... Não sei se vocês estão entendendo o raciocínio. Deveria funcionar a princípio porque é passado para o construtor, mas ele acaba incidindo o valor diretamente. Então, aqui eu vou usar a instrução custom type quando eu trabalho com um tipo personalizado. E aqui eu gero a instância dele. Então, eu faço um partner de esquema type. Se eu permitir que ele... Esse nome aqui está certo. Agora veio. Eu jogo aqui dessa forma. Eu acho que com type sem o new também funciona, passando somente o tipo. Mas é bom deixar um custom type para demonstrar que é um tipo personalizado nosso. Beleza. Agora, vamos rodar o nosso teste novamente aqui. E olha só o que eu tenho. garantido que o meu objeto de valor está novamente montado corretamente e agora eu consegui fazer a minha consulta. Então, esses tipos aqui são muito simples de serem criados e também vão ser úteis porque vão ser reutilizados. Uma outra coisa que eu lembrei agora em relação ao microRM, que talvez aí da sua linguagem de programação também aconteça, se eu passar aqui o ID também como um parâmetro facultativo, ele até chega aqui, a gente vai até ver isso. Vou fazer um console.log.improps e id também aí vamos executar o teste tá vendo aqui o valor vem aqui também de qualquer forma mesmo separando é bom que a gente tenha esse tipo para evitar, porque o ORM ainda tenta fazer algumas outras questões ali na nossa entidade. Então, o tipo personalizado garante, de fato, a consistência da criação desse objeto de valor. Depois eu tenho que ver por que a minha extensão bugou. Então, a gente vai acabar criando muitos desses schema types aqui. Para cada ID, a gente vai acabar criando, mas aí se torna bem simples. Inclusive, dá até para poder fazer alguma abstração para não precisar sempre declarar todos os métodos, mas também criando cada arquivo com a sua devida lógica, não tem problema. Aquela coisa que o Uncle Bob fala que é a duplicação acidental, ela acontece no seu projeto, você fica incomodado com ela, mas a gente convive ali bem porque faz parte do jogo. O que não pode é a aplicação intencional que a gente fica fazendo, que é aquelas regras de negócio ali que deveriam ser abstratas. Então, pessoal, vamos seguindo a nossa saga. É isso aí e até a próxima.