Salve, Deus, beleza? Continuando nossa saga aqui no Domain Viewing Design, agora nós vamos olhar para o nosso famoso ID aqui, o UID nosso, que tem vários propósitos. A gente pode utilizá-lo até numa URL que é seguro, porque aí ninguém sabe qual é o ID inteiro desse usuário. Seria muito complicado trabalhar dessa forma. Então, o UID serve para poder fazer essas normalizações. Mas, dessa forma que está aqui, a gente está obrigando sempre a passar esse valor. Onde que esse valor vai ser gerado? Quando estou iniciando esse customer, já pode ser gerado esse UID. Eu não quero colocar essa lógica aqui, porque a gente vai utilizar isso em outras entidades também, em outros agregados. Então, mais uma vez, vem aqui a utilidade do objeto de valor. Eu criei um objeto de valor, que é esse UUID, estende lá do value object, que vai lidar com uma string, não quero obrigar que seja passado um valor, porque se ele não passar, o que vai acontecer? Vai ser gerado um UUID com o próprio Node. Essa é uma biblioteca cripto que é nativa do próprio Node.js. E ainda eu tenho a validação dessa biblioteca UUID. Então, olha só, em alguns casos, vale a pena a gente fazer esse uso aqui da biblioteca UUID, então olha só, em alguns casos vale a pena a gente fazer esse uso aqui da biblioteca, e agora ele não vai chiar mais para mim aqui, poderia usar uma expressão regular para poder validar esse UUID, poderia também, mas isso aqui é bem conveniente, não vai custar nada, não vai ter nenhum impacto. Então nesse método validate, estou utilizando o método validate da biblioteca. Se não for válido, estoura um erro. Show de bola. Então, a gente pode tanto fazer um UID e ele vai gerar um novo valor, ou nós podemos passar ali um UID e ele vai fazer a validação. Então, de qualquer forma, a gente vai garantir que sempre nós temos um UID válido. Inclusive, isso aqui que eu uso em outros projetos, coloquei o projeto, o código, o código é o projeto. É a frase sempre que a gente tem que lembrar ali do Evans. Beleza. E o que isso tem de relação com o nosso Customer? Agora, eu não vou trabalhar mais com o ID diretamente. Nós vamos criar aqui em cima, inclusive eu vou criar mais aqui em cima. Vai ser uma classe exportável, claro que eu posso trabalhar com testes, etc. Vai ser o Customer ID, essa notação. A gente vai fazer isso para toda a entidade, para todo o agregado. Ele vai estender de um objeto de valor. essa notação, a gente vai fazer isso para toda a entidade, para todo o agregado, ele vai estender de um objeto de valor. Então, o nosso UUID. Ou seja, o nosso ID do agregado vai ser o objeto de valor. Aí aqui agora eu posso melhorar essa lógica do meu construtor. Porque eu posso tanto receber aqui um CustomerID, ou poderia receber uma String também, porque se eu receber uma String, eu gero esse CustomerID para poder guardar nessa variável. Então aqui vamos fazer uma lógica tern esse customer id para poder guardar nessa variável. Então, aqui vamos fazer uma lógica ternária que dá para poder matar. Vou aplicar um type off em props.id. Se a gente tiver, se o tipo dessa variável for uma string, então eu sei que eu tenho que fazer um new customer id, passando o valor pra poder gerar o meu newId, tá? Mas agora vem o outro caso, porque eu posso ter recebido nada ou uma instância do próprio CustomerId. Então tem um operador aqui do TypeScript que é o newColors, que eu posso passar assim. E agora alinhado fica melhor. Então se eu tiver uma string, eu gero o meu objeto de valor. Se eu tiver o id passado, vou considerar esse próprio valor para poder colocar na variável. Caso contrário, vai ser gerado um novo. Beleza. Então, aqui no nosso teste, a gente tem o deve criar um cliente aí. Poderia até colocar, vamos colocar aqui alguma seção, só para não ficar sem nada, né? O Co-Pilot vai me sugerir aqui alguma coisa. O Co-Pilot vai me sugerir aqui alguma coisa. Tá, eu quero ver se é instância de Customer, se o ID está definido, se o Name é João e se o CPF tem esse valor. Tá bom, tá ótimo. Vamos colocar aqui... É, o ID está definido, mas eu poderia colocar o que mais? Se o meu ID... se o meu id ponto melhor, meu customer.id se ele é uma instância to be instance of de customer id, onde que ele arrumou esse .id funcionando ali, eu já estou usando o próprio teste que está ali, vamos fazer um console.log em customer. Agora a gente tem um objeto um pouquinho mais complexo. Vou rodar o teste diretamente aqui. Então, olha só, eu tenho ali o meu objeto de valor, que tem lá no value o valor que foi gerado no momento então eu posso ter uma outra variação disso inclusive vou usar até com let aqui que eu posso criar novamente então eu posso fazer dessa forma, quando eu estou usando o create, eu quero que ele gere sempre o id mas se eu quiser abastecer com o valor eu uso o construtor diretamente então se eu passar dessa forma aqui o que vai acontecer? ele vai retornar um erro ele vai acabar o que ele está cpf eu fiz alguma mudança aqui porque eu não tinha salvado o valor 123 não é um uid válido isso aqui não condiz com a minha realidade, até vou colocar para vocês podem brincar aí. Não é válido. Então, tem que passar um valor válido aqui, ou poderia até passar um new customer ID que seria aceito, ou um new customer ID, desde que, obviamente, passando um new ID válido. Então, isso aqui normaliza completamente o comportamento das nossas entidades. Todo mundo já vai usar esse comportamento, vai ficar bem simples. Para o ID que a gente vai usar como referência no banco, às vezes você pode ter uma entidade que você não vai trabalhar com o UID, mas nesse caso aqui a gente vai manter esse comportamento para todo mundo, é só criar o seu ID personalizado dessa forma aqui. E aí a gente tem uma vantagem. Isso aqui pode ser, às vezes, você pode considerar um pouco burocrático, mas em determinadas situações, em alguns métodos, em vários lugares, a gente vai precisar passar o ID de uma entidade. Então, quando você usa o objeto de valor, coloca ela aqui, ah não, preciso receber aqui o Customer ID, que é Customer ID, isso faz total diferença. Primeiro no TypeScript, porque se você passar qualquer valor diferente ali, ele já vai chiar, e você tem agora mais segurança, porque você consegue fazer a versão aqui com o Stance Off, fazer um if mais seguro. A gente tem lá o equals, lembra do equals também, para poder fazer a verificação? Agora, se isso aqui fosse uma string, correria o risco de você passar qualquer tipo de valor aqui e perceber somente quando você tivesse um problema em produção. Então, o objeto de valor acaba tipando mais. Além disso, eu poderia criar até um comportamento aqui dentro da entidade, porque em determinadas situações também a gente quer... Cadê o meu entity? Eu poderia, inclusive, chegar aqui. Vamos fazer um... Eu vou ter um read-only ID, que pode ser qualquer coisa. Então, agora, aqui dentro... Eu continuo mantendo o meu id ali como uma sobrescrita, mas aí eu posso colocar aqui um método equals aqui, que é justamente o que eu quero fazer. Porque aí dentro da própria entidade, ela vai exigir que eu implemente esse equals, quero implementar aqui o método, e aqui nós vamos fazer a nossa verificação. Ele está pegando o código que eu fiz lá no valor de objeto, Ele está pegando o código que eu fiz lá no valor de objeto. Então, eu poderia ter abstraído isso aqui, mas a questão, na verdade, é que eu poderia até colocar o comportamento dentro aqui. Não precisa nem ser abstrato. porque agora aqui eu já tenho um comportamento padrão que eu recebo um objeto vou fazendo as verificações ali e para eu ver se uma entidade é igual depois que eu passei de verificar se é null, se é undefined se o ID é undefined e o nome dos construtores também, que é para a gente poder pegar o nome da classe, eu comparo os dois IDs. Então, aqui, de fato, que é o SEGUIR ali, a norma do DDD. Então, agora, se eu quiser abstrair a minha verificação... Ah, ele está falando aqui que eu posso colocar como... Se eu quiser, na minha verificação... Ah, ele está falando aqui que eu posso colocar como... Se eu quiser, na verdade, testar, eu posso fazer customer.equals e é aqui que ele recebe como parâmetro. Eu vou forçar isso aqui como n, apenas para a gente poder ver o resultado disso. Então, olha só. Ele mostrou ali como undefined, está com a linha 15. Na verdade, é porque eu esqueci aqui o equals, que sobrescreveu aquele da nossa classe pi, é por isso que ele vai retornar undefined mesmo. Então vamos dar uma olhada aqui agora. Eu tenho como falso. Então se eu passar qualquer valor aqui, null, undefined, etc, sempre não vai ser igual. Agora, olha só, eu posso gerar uma outra instância, customer 2, e Customer 2 Como se fosse aqui um João XPTO E até, deixa eu fazer Outro gerador de CPF Gerador de CPF Vou deixar isso aberto Aqui durante as aulas Mais um gerador de CPF, deixar isso aberto aqui durante as aulas. Mais um gerador de CPF aqui, tanto faz ser com ponto e tal, ele vai aceitar. Mas aqui eu vou passar inclusive assim, ID, new customer ID, para ser até um objeto diferente, mas aí vou pegar o mesmo valor id.value, que é assim que a gente pega o valor mesmo. Aqui ele está chiando, porque aqui tem que ser um new, né? Porque eu não poderia usar o create. porque eu não poderia usar o create. Então, vamos ver se ele é igual ao Customer 2, porque nesse caso é igual, porque nós temos as entidades com o mesmo ID. Então, esse aqui é o comportamento. Isso aqui vai ser muito útil. Quando você avançar com o DDD, trabalhando-se com eventos e outras situações, você vai precisar ver se o seu ID de fato é... ou melhor, se a sua entidade é igual à outra. Agora, o que ele está chiando aqui comigo? Aqui eu tenho que passar, na verdade, um new CPF. Eu estou usando o consultor diretamente, então ele vai criar de fato. Passando aqui, deu tudo certo. A gente vê que é igual a true. Então, se eu passar aqui qualquer outra entidade, até se eu passar, obviamente, uma outra entidade que tenha o mesmo ID, não vai dar certo, porque também eu tenho que ter uma proteção, aí vai a questão de verificar o nome da classe então vai ser diferente, não vai ser igual, então olha só o comportamento que a gente fez aqui, é sempre bom você ter um padrão pra poder trabalhar com o DDD então vamos seguindo a nossa saga, é isso aí e até a próxima