O que mais a gente poderia ter aqui? Uma coisa interessante para a gente... Até para a gente pensar, quando a gente tiver, de repente, outros repositórios, outras coisas. Muitas vezes, a gente quer auditar. Quem está pedindo para eu gerar isso? É A, é B. E aí a gente pode começar a pensar e aí eu vou puxar uma coisa a mais aqui que é se eu tivesse uma API em cima disso, como é que seria? Então imagina que eu tenho aqui uma API.ps vou fazer aqui um import express, from express, vamos pensar por aí. Se eu rodar npx node-mon source api, vou rodando. Se eu fizer um curl, colocar o host 3000, está aí. Isso aí quer dizer que voltou, quer dizer que deu certo. Se eu quisesse conectar agora essa API, esse use case, como é que eu faria? Teria aqui, né? Eu posso até copiar do teste. Teria isso aqui. Eu posso até copiar do teste. Eu estaria oferecendo isso a partir da API. Então, está os três aí. O const e o const. Todo mundo. E aí eu vou dizer o seguinte eu vou receber um post aqui em barra generate invoices esse post eu vou ter aqui hack has vou fazer o seguinte, olha output igual a await generate invoices execute eu vou precisar de um determinado input esse input vai ser o seguinte input.month Aí a gente pode pensar esse input aqui no fim é o body. Então vamos fazer assim. Input igual a HackBody. Aí só tem que fazer uma coisa aqui que é appUse expressJson para ele converter o body. Fechou. E aqui vamos fazer então return output, esse body está default, entra aqui e fechou, é isso como é que a gente testa isso? vamos criar um API test-test. Deve emitir, deve gerar as faturas pela API. Function. Para isso, eu poderia fazer com Axios. Então, response igual await Axios post http://localhost 300/.generateInvoice e aí ele vai passar aqui o input. year 2022 type cache beleza, vou me importar o axis vamos ver o que volta, a response dele, só para a gente ver abriu outra janela? Vamos ver o que dá. Time exceeded. Ele não foi. 3 mil. Espera aí. Deixa eu ver o que está na API. Listener 3 mil. Post no Generating Voice. GeneratingVoice GeneratingVoice input Axios deixa eu ver o que eu fiz de errado agora aqui Deixa eu ver o que eu fiz de errado agora aqui. Espera lá. Deixa eu mudar isso aqui para... Baguete. Deixa eu ver o que eu errei. chegou aqui chegou aqui em value type axios input deixa eu botar um get aqui pra ver se não é isso Axios. Pmput. Deixa eu botar um get aqui para ver se não é isso. Espera aí. Vou fazer o gesto especificamente para API. De novo. Certo. Post, então. Depois, aí o input. Aí o input. Saiu o input. Await response data. Post aqui. Use express json. Está certo. O que está batendo? Ah, talvez ele esteja travando aqui. Espera aí. Vamos lá. Controle log. Post. Input. Vamos ver se bateu. Deu. Não. É outra coisa. Então, chegou lá. 1. 2022. Cache. Deu perfeitamente certo. Perfeitamente certo. Perfeitamente certo. Então tá ok. Agora aqui ele entrou. Faltou o presenter. Vamos botar o JSON presenter aqui. Mas o presente padrão já estava lá, né? Padrão ele já tem. Esse execute aqui, input. Esse input tem o quê? Vamos ver se chegou lá agora no use case. Espera aí. Generating voices. Vamos lá. Console.log input. Lá de cá. Generating Voices, vamos lá, controle Loginput. Lá de cá. Tá, chegou certo. Deu boa. Beleza! Vamos ver se chegou até aqui embaixo. Vou dar só para o teste. Ah, eu não botei o retorno Eu tinha pego isso e esqueci É o horário Agora foi Então está aí é o horário agora foi então está aí voltou o retorno, está lindo tem jeito, tem que ir traqueando voltou o retorno aqui no return do RAP pegamos o retorno agora eu espero que o response output igual a response data eu espero que o response, vou pegar aqui output igual a response data, eu espero que o output aponta a mouth se é cache, é 6.000 ok undefined deixa eu ver quanto é que veio ah tá, porque tem que ser add0 então isso aqui já está vindo pela API date to equal date 2022 01 01 t3 0000z date 2022 01.01.13 0000Z se veio outra coisa aqui, 5 esse é cache, 05 vou tomar 1, 0, 0 ah tá esse caso não tá porque não é to equal esse aqui é to be mesmo você não tem date sendo restaurada de um JSON você vai ter string mesmo agora ele vai reclamar do formato, ele vai botar o finalzinho porque daí vai do jeito como saiu. Por que eu estou vindo até aqui? Muitas vezes A gente quer identificar Quem é que está fazendo essa chamada Então, se eu vier aqui e disser o seguinte Eu recebi uma chamada De HackHeaders Vamos Só para a gente pegar alguma coisa E aí no HackHeaders A gente tem lá Um UserAgent é o Axios Supondo que eu queira logar O host que fez a chamada E aí no Hack Header, se a gente tem lá um User Agents, é o Axios. Supondo que eu queira logar o host que fez a chamada e queira logar também o User Agents. Supondo que essas duas informações sejam relevantes para a gente, por algum motivo. Uma forma de fazer seria talvez passar isso por useCase, porque eu não tenho banco de dados aqui, eu não tenho muitos recursos nesse lugar. Então, talvez uma forma seria agregar isso no input. Olha, input, o user agent que fez é o hack headers. É o hack headers. Tá? User agents. Input, quem mais? O host é hack headers host. E aí, eu levo lá para o use case e vou mostrar o que está vindo eu levo o que está vindo e no use case eu trago o que ele montou esse user agent? deixa eu ver user headers userAgent, peraí, deixa eu ver user headers eu poderia eventualmente criar uma tabela de log, nessa tabela de log, de repente, fazer essa persistência e tá ok, então equivaleria a dizer o seguinte, olha, eu poderia vir aqui, de repente, passar aqui um logRepository. Olha como as coisas vão ficando mais difíceis agora. Aí, nesse logRepository, eu vinha, e esse pod,ia um log aqui de input ponto nem tem ali né, mas input ponto user agents vou até colocar aqui e aí eu eventualmente faria essa gestão de quem pode ou quem não pode acessar o que acontece muitas vezes é que a gente tem meios de fazer isso de um jeito mais simples que é usando um padrão que estende as funcionalidades de um determinado objeto generating voices é um objeto agregando algum tipo de coisa a mais. Nesse caso, auditoria. Eu quero logar quem é o User Agent que fez a chamada. Só que não é proando o Use Case. O Use Case nem sabe que o User Agent existe. Nem está muito certo eu passar esse dado aqui porque não é problema dele que é de negócio. O User Agent vem de um driver. Olha. O User Agent vem de um driver, de alguém que está interagindo com a aplicação. Então, nesse caso, o que a gente poderia fazer? A gente poderia usar um padrão chamado decorator. Vou pegar aqui. O que o decorator faz? Padrão de estrutura. Olha. O que o decorator faz? Padrão de estrutura. Creational Grid Composite Decorator. Decorator. Adiciona responsabilidades adicionais para um objeto dinamicamente. O decorator provê um meio flexível de estender funcionalidades. Olha que sensacional. Então, O decorator proveu um meio flexível de estender funcionalidades. Olha que sensacional. Então, permite acrescentar funcionalidades a um objeto existente. Como ele reforça o OCP, permite que você agregue pontos de extensão sem mexer no que já existe. Para isso, o que a gente vai fazer? Acompanhe comigo. Eu vou criar aqui uma classe chamada useCase.ts que vai ser a interface padrão para todos os useCases. Todos eles têm um execute. Todos recebem um input, que é qualquer coisa, e todos retornam um output Que é qualquer coisa É assim Eu posso vir aqui e fazer Eu implemento useCase E está tudo certo Sabe quem mais implementa useCase? E aí faz sentido a gente dar uma olhadinha No padrão Deixa eu só caçar aqui onde é que está a tela. Espera aí. E aqui, espera aí que eu tinha alguém legal aqui. Open in browser preview. Está aqui o browser preview. Como eu falei, permite que você crie objetos adicionais, comportamentos adicionais a objetos existentes. Olha só como é que é o desenho dele. Será que tem aqui o desenho? Aqui. Então a gente tem aqui esse notifier, eu tenho aqui o Facebook, o Google, o Slack, e aí eu posso ter um decorator, já que ambos estendem de notifier, tanto o FMS, o Facebook, o Slack, tanto o FMS, o Facebook, o Slack, e eu posso ter uma coisa a mais aqui, que repassa a chamada, está vendo? Repassa a chamada, e que estende do mesmo objeto que é o Notifier. Na prática fica mais fácil de entender. É mais simples que isso. Por isso que eu digo, às vezes a gente lê essas UMLs, às vezes não fica tão claro. Eu vou criar um logger decorator o que isso vai fazer? orderful class logger decorator implements useCase então eles são iguais, por isso que tinha duas setas apontando de primeiro lugar ambos tem a mesma cara ambos executam alguma coisa. Só que o decorator. Ele recebe. Outro use case. Beleza? Por que ele recebe outro use case? Porque no fim. Ele vai fazer return. These use case. Execute input. Ele vai repassar. Mas ele vai agregar alguma coisa. E o que é essa alguma coisa que ele agrega? Aí que está a parte boa. Console.log input user agent. Ah, mas como é que eu uso esse negócio? Porque se a gente agora vier para cá, olha que coisa maravilhosa. Estou rodando o teste. Não vai sair nada aqui na esquerda. Deixa eu só tirar o da API, não vai sair nada no use case. Não sai nada aqui. Vamos rolar de novo. Rodei aqui, não sai nada aqui. Como é que eu agrego comportamento sem que sequer o Generating Voice fique sabendo? Decorator. Como é que faz? New Logger Decorator. Olha como eu estou encapsulando. O decorator também se chama Wrapper, um outro nome para decorator. Eu estendi a funcionalidade do Generating Voice com o Logger Decorator e agora quando eu rodo então eu poderia usar isso para controlar o acesso poderia usar isso para fazer uma série de controles estendendo o comportamento do Generating Voices poderia ser uma forma boa de lidar com autenticação, autorização por meio de decorators. Você pode sempre pensar nisso. Qual é a estrutura do decorator? Ele estende a mesma classe de quem ele está decorando. Por isso que ele se passa por aquela classe. Ambos são use cases. Ambos têm execute. E o decorator repassa a chamada. Muito parecido com o proxy, só que o proxy repassa isso para fora, para outro lugar, para outro objeto remoto. Enfim, de outras formas.