Salve, beleza? Continuando essa saga aqui no Domain Dream Design. Então vamos implementar o modo transação no Unit of Work para a gente poder contemplar aqui a nossa nova mudança no nosso serviço. A gente vai chegar primeiramente lá na interface e para deixar isso aqui, a questão é mais os nomes para não deixar isso aqui confuso eu vou colocar assim, beginTransaction, o próprio unit of work that is controlled e um um completeTransaction Para ter um nome diferente aqui do commit, inclusive eu vou precisar também do rollback. Rollback transaction. A diferença é que esse rollback aqui vai estar para o commit que a gente fez. Então, isso vai exigir que a gente implemente lá no microRM e Unit of Work. Ele vai exigir que a gente implemente os outros três métodos. A gente pode deixar aqui em cima mesmo então aqui vamos lá é EntityManagerBegin que é o primeiro só confirma se ele tem uma promessa sim, tem uma promessa a gente pode retornar aqui direto aí tem o EntityManager aqui vem o comit Aí tem o Entity Manager. Aqui vem o commit, que tem a ver com a transação. Cuidado, né, que a gente tem o flush, tem o commit. Cuidado para não fazer a confusão entre eles. A gente já explicou isso aqui durante as aulas. E temos aqui o rollback. Maravilha. Então temos esses três métodos aqui, estão habilitados bonitinhos. Agora, a gente vai chegar aqui em cima e fazer um this unitOfWorkToBeginTransaction. Inclusive, o JavaScript dá até para fazer um run envolvendo tudo isso aqui também, que seria uma outra opção. Até para fazer... Aqui, ó. Poderia... Nós poderíamos fazer aqui... run transaction. É exatamente isso aqui que ele já me deu, a gente vai passar um callback pra ele, uma função que devolve qualquer coisa que a gente queira e acaba se devolvendo esse resultado aqui, então isso aqui acaba circulando o callback ali e já faz o controle, então vamos lá a gente faz aqui um run transaction que eu acho que vai ficar mais interessante. E até o anti-manager do micro-RM já tem um transactional. Então ele já vai fazer isso aqui tudo num só. Que é mais adequado. Então vamos pegar aqui esse trecho vou fazer um runTransaction, aqui vai ser um async porque a gente vai colocar essa galera Para não... Ficar confuso depois. No final das contas, aqui a gente quer sempre devolver uma... Aqui eu não quero devolver uma ordem. A gente vai tomar uma decisão ali embaixo. Mas aqui, eu posso fazer um return já, ele vai fazer o return da order, e aqui eu tenho a ordem cancelada, adicionando ela e depois fazendo o commit, um erro, né? Eu quero lançar um erro e a gente teve um problema com pagamento porque aqui no caso se tiver um problema com a reserva a gente teria que fazer um tratamento de erro aqui. Aconteceu um erro. Ou eu poderia fazer uma separação? Eu acho que seria melhor fazer uma separação, uma separação que a gente consegue a princípio aqui ter uma clareza dos problemas que podem acontecer aqui eu não preciso fazer esse rollback mas aqui eu posso fazer um trial new error ... ... ... ... ... ... ... ... ... ... ... ... ... ... que eu poderia fazer a análise aqui do erro também que veio, mas aí eu abro um outro try aqui. E daqui para baixo, a gente vai tentar fazer o pagamento. E até mesmo na questão aqui do pagamento, poderia ter um outro try para ele também. Aqui eu faço... tento fazer o pagamento e tem a questão de criar a order. De qualquer forma, eu quero criar a order aí que volta aqui a questão, que eu tenho que criar a order independente do que está acontecendo aqui. Eu vou voltar àquela forma antiga que a gente vai ter que fazer um tratamento de erro mais apurado Para poder contemplar Aconteceu um erro Ao Reservar O seu lugar De qualquer forma, independente do pagamento reservar... o seu lugar. De qualquer forma, independente do pagamento, a gente está criando a order, mas eu poderia ver qual é o tipo de erro que está sendo lançado, até a gente poderia ter também erros personalizados. Então, beleza. Vamos rodar aqui o teste mais uma vez, para ver se a gente não quebrou nada, se está tudo funcionando. Aqui o meu teste. A gente pode ativar depois aquele outro comentário lá que ele vai tentar fazer o pagamento. Pronto. Aí o que vai acontecer aqui? A gente vai tentar fazer uma nova reserva em cima da que já foi feita. E aqui eu quero fazer um console.log do E só para ver o erro em si. E do repositório de orders, a gente pode ver quantas orders tem, que é o que eu estou interessado ali se ele criou com cancelado, pode ver quantas orders tem, que é o que eu estou interessado ali se ele criou com cancelado, e a gente consegue ver o que está acontecendo, quais são os lugares que estão sendo mais disputados, enfim, todas essas informações são muito importantes para a tomada de decisão. Então, vamos deixa eu ver aqui se meu teste tinha passado, né? Então, aqui ele vai com o TriCastatch ele não vai quebrar e a gente consegue ver aqui qual a wait, esqueci da wait aqui, senão não consigo ver as ordens que foram geradas Aí eu tenho aqui O spot Not available Ele lançou um erro exatamente No other service 47 Na verdade eu teria que fazer aqui um cenário Ele sempre está bloqueando eu teria que fazer aqui um cenário... Ele sempre está bloqueando, eu teria que mandar... Isso pelo menos de forma... Eu teria que mandar esses dois aqui, né? Poderia fazer assim, ó. Operação 1 e operação 2 aí a gente pode fazer aqui um promise all da operação 1 e operação 2 com a wait, porque aí vai ser mandado ao mesmo tempo, a gente tem que ter, claro que num teste mais apurado a gente poderia fazer controle de algumas coisas, só estou tentando ver se eu consigo avaliar ali o resultado do problema. Mas é aqui. É isso aqui que eu queria. Com o Promissal a gente consegue. Um deles, aconteceu um erro na hora de reservar o lugar, mas eu tenho a order que deu certo, que a gente não colocou ela como paga, e tem essa aqui que está pendente que o status está como zero e a outra está como falha aconteceu a falha a gente acabou registrando essa operação mesmo assim e a gente vai analisar também até bom analisar aqui a questão do Spot, né? Então vamos pegar aqui Spot Reservation Find All. A gente vai ver que tem um criadinho lá, bonitinho. está aqui o spot reservation criado para o customer que começa com é o mesmo customer que a gente está testando então eu tenho uma reserva e duas orders que falharam eu estou querendo contemplar alguma coisa que é necessária que foi o domain expert falou que eu preciso registrar a orderem, eu não posso descartar. O que eu não vou registrar a ordem quando o lugar aqui, o lugar não está mais disponível. Agora daqui para baixo, se eu tenho transações concorrentes, eu quero ver o que está acontecendo ali. Então falta aqui o pagamento para a gente poder fazer a contemplação. E tem outra coisa que falta aqui, na verdade. A gente precisa, depois do pagamento, também, eu posso ter um pagamento que aconteceu errado, posso cancelar ele aqui também, que seria uma outra possibilidade. Mas a gente analisa tudo isso e tem a parte de mudar aqui a order também para pago. Então, vamos continuar nossa saga. É isso aí. E até a próxima.