Salve, das Belezas! Continuamos essa saga aqui no Domain Dreaming Design. Então, na última aula, nós criamos ali dois agregados para a gente poder lidar com a reserva. Eu quero justamente a reserva independente da order, apesar de elas estarem correlacionadas com o ID do spot. Então, nós vamos agora criar o método Create, que vai realmente realizar a reserva. A gente até poderia mudar aqui para reserva, né? Seria um nome também adequado, mas vamos lá. Então, que dados que a gente precisa aqui para poder efetuar a nossa reserva? O primeiro deles, obviamente, é o ID do evento. Preciso do id do evento. Vamos pensar que vai ser enviado o id da sessão, seria interessante também. E o id, vou até colocar session ID e spot ID a gente vai precisar dos três pra poder verificar se tá tudo ok, etc e qual é o customer então eu preciso desse cara aqui a gente pode ficar pensando assim ah, mas e a questão da autenticação? depois a gente pode conversar sobre isso. Aqui a gente precisa do Customer. Eu preciso dele para poder fazer a operação. Se ele vai vir da autenticação e etc., não diz respeito a esse Application Service. Então, a primeira coisa que a gente vai fazer aqui é fazer a consulta do evento e do Customer. A gente tem que ver se está ok. Então vai lá, com o Customer repo e Event repo. Compare o distanciadinho. Eu não estou conseguindo... Não, eu não quero o EventSpot. É por isso que ele está daneado aqui. EventRepository. Então, vamos fazer aqui a nossa primeira consulta. Primeira coisa, a gente pode verificar se o Customer existe. Eu vou começar pelo Customer. Se ele já não for direto, a consulta é bem mais simples, ela não existia, a gente já... E depois do evento. Inclusive, isso aqui poderia ser até um Pro inicial, poderia mandar as duas, tentar fazer as duas consultas ao mesmo tempo. Seria uma opção também. Então, eu vou colocar aqui. Poderia fazer um promise all. Mas aí sempre ele faria a consulta de qualquer forma. Passaria os dois repositórios aqui. E aí eu teria lá... O customer e o evento. Faria depois os ifs. Mas é que eu vou fazer de forma separada. Então verifico se o Customer está ok, agora vem o Evento, verifico se o Evento está ok também, beleza. Show de bola. Agora nós precisamos verificar se a sessão existe e se o spot também existe. Então, vamos fazer aqui uma busca. Vou pegar aqui a seção. Será que ele já consegue fazer aqui para mim? Não é exatamente isso aqui. Vamos criar. A gente tem que criar o ID da seção com o objeto de valor para a gente poder fazer a comparação. Aqui vem por que o objeto de valor é seguro, porque aí eu gero o objeto de valor para a gente poder fazer a comparação. Aqui vem o porquê que o objeto de valor é seguro, porque aí eu gero o objeto de valor, e na hora de fazer a comparação com o que ele tem lá dentro dele, eu pego o id equals, e não tenho medo de fazer a comparação com o alvo. E qualquer invariança que poderia ter aqui. Então, eu tenho a seção. Ah, session não existe. Os primeiros métodos aqui estão sendo de eu ter que fazer essas validações. Depois vem o Spot, que eu posso fazer a mesma coisa. Spot ID é igual a new event Spot ID. Passo ali o meu ID e agora eu tenho a segurança aqui de fazer a consulta com o Spot ID. Fodibola. Então agora eu validei todos os campos. Melhor, validei todas as informações básicas para a gente poder dar continuidade no processo. O que eu poderia fazer depois? Eu já tenho tudo. Poderia tentar forçar a criação da reserva, uma vez que a gente está fazendo aquela questão da chave primária no Spot Reservation. Eu já poderia fazer, mas forçar isso no banco de dados, quanto mais eu forçar, obviamente tem um custo maior. Então, se eu fazer uma consulta antes aqui, se o lugar pode ser reservado também, porque ele tem que estar publicado, ele pode não estar publicado, seria interessante que a gente fizesse essa avaliação. Então, nós vamos criar um método dentro do evento. Vamos pegar aqui o evento.ts. Ele pode ficar... Esse é o método que vai retornar um true ou false. Então, eu quero passar o ID da sessão, o ID do spot. Quero verificar se eu posso reservar o spot. Tá, ele está. O evento está publicado? Não está, então não pode. Aí vem lá a questão da sessão. Faço aqui a busca. Se a sessão não existe. Isso aqui é apenas uma segurança que a gente tem que ter. Aí eu posso pedir para o session fazer essa avaliação também. Então vamos pegar aqui do session. O session vai ter uma regra um pouco mais específica. Vamos colocar ela aqui. É o mesmo método, com o mesmo nome. Na verdade não é o mesmo método, mas é o mesmo nome. Eu passo o ID do spot. Se a sessão não está publicada, é o mesmo nome. Eu passo o id do spot se a seção não está publicada é falso também. Agora eu vou tentar achar ali o spot tá, se o spot não existe, spot not found. E aí? Se ele está reservado é falso se ele não está publicado é falso também então somente se ele passar tudo isso aqui é true então é uma regra que a gente está colocando dentro do agregado. Ele sabe se a gente pode fazer a reserva ou não. Inclusive, até com essa verificação que a gente fez aqui em relação ao session e o spot, aquilo ali já está fazendo a verificação, eu já estou fazendo a checagem se eu posso fazer a reserva ou não. Então a gente pode abstrair isso, mas antes eu vou fazer assim, se evento allow reserve spot, passando aqui as informações. Se eu não posso reservar na verdade, que é a lógica que a gente quer, então o spot não está disponível. E nesse caso aqui, a princípio, não preciso disso aqui. Vai ficar mais simples aqui também não. E o spot aqui também não. Porque isso aqui já faz a verificação para mim. E controla. Agora, depois da gente fazer essa validação seria interessante agora pegar o repositório do spot reservation, então a gente não tem isso também, vamos adicionar aqui. A gente tem a duplicação da interface Spot Reservation Cuidado para não escrever errado. Spot Reservation Pronto. Então importei aqui. Spot Reservation. Pronto. Então, importei aqui. Ele também vai ter um repositório implementado, simples também. Spot Reservation. Então, vou pegar aqui a order e mudo para spot reservation. E aqui spot reservation e aqui também a mesma coisa. Tem a diferença que a gente tem que tomar cuidado em relação ao id, né? Porque o id dele aqui não é um ID próprio dele. Na verdade, aqui a gente tem o event spot ID. Para deixar bem claro que a gente está usando o mesmo ID do outro. Por isso que quando eu fizer a comparação do spot com a reserva, eu consigo saber facilmente quando eu precisar no meio do nosso código. Então, aqui vem event spot ID. A gente tem muitos desses artifícios de você usar o ID igual. Está lá, pronto. Então, a gente tem um monte de coisa aqui. Deixa eu fechar tudo para não complicar a minha vida aqui. E aí eu tenho o spot reservation repo i spot reservation repository então, logo depois disso nós vamos pegar o Spot Reservation do repositório, fazendo um Find by ID. A gente consegue fazer essa busca, não consegue? Porque a gente tem o Spot ID. Eu vou tentar buscar pelo Spot ID. Está aqui a utilização dele. Vou tentar buscar pelo spot ID. Está aqui a utilização dele. Aí, se ele tiver, aqui é o contrário, se ele existir, então eu posso lançar um erro, que ele já foi reservado, não está avaliável. Beleza. Agora, se ele não existir, aí que a gente vai fazer aqui a nossa criação. Então, spot reservation .create. O que eu tenho que passar? O id do spot e o id do customer. Então, eu pego a instância criada aqui. Vou usar com art, que aí eu vou manter aqui o mesmo... Eu poderia manter aqui com um nome diferente? Pode ser. Então eu pego meu repositório, passando. Isso aqui tem que... Eu tenho que lembrar de fazer com o add sempre com promessa. Apesar do persist lá no não precisar, mas a gente colocou isso, então não podemos esquecer. Então, depois disso, a gente vai fazer a criação da order. Então, passo aí de do customer, aí aqui tem o evento spot ID, que é igual ao Spot ID, e vem o Amount. Aí aqui o Amount tem que ser da sessão, tem que pegar aqui a sessão, né? Então, seria interessante que eu pegasse aqui a sessão, por isso que é bom só pegá-la aqui embaixo. Na verdade, ele está dando uma sugestão aqui que eu poderia até criar esses métodos para poder buscar e tal, para não precisar ficar fazendo isso aqui. Eu posso também organizar isso. Então aqui vem o fashion.price beleza, então eu faço aqui o repositório com o add e no final das contas o o unit of work commit e ainda aqui eu devolvo a minha order, então olha só o processo de negócio que não é tão simples assim, apesar de não ser complexo a lógica, mas envolveu várias coisas. Então, a gente vê aqui como é a dinâmica na hora que a gente começa a trabalhar com esse formato de dados. Tem o pagamento que a gente vai incluir aqui ainda. Nós temos que mudar uma informação lá no evento que isso aqui está reservado, mas veja que o Unit of Work controla todo esse fluxo somente aqui no commit, que ele vai disparar tudo lá. Se caso já tiver alguém feito primeiro, vai dar um erro aqui, e aí eu teria que controlar esse erro, formatá-lo, para que o usuário... Tem um erro do banco de dados que eu tenho que tratar também. Quando ele dá um erro lá de duplicado no banco de dados em relação ao Spot Reservation, nós vamos formatar uma mensagem adequada para o usuário que a reserva já foi feita. Na próxima aula, a gente termina aqui esse processo e também faz um teste. Então, vamos continuar nossa saga. É isso aí. E até a próxima.