‫Instrutor: Neste vídeo, quero, muito
‫rapidamente, refatorar os recursos da API que implementamos
‫nas últimas aulas.
‫Agora, isso não é apenas para tornar nosso código um pouco
‫mais limpo, mas também para torná-lo mais modular e mais reutilizável
‫no futuro.
‫Então, agora, temos todo esse código
‫para os recursos que construímos antes nesta função getALLTours, certo?
‫E isso parece um pouco confuso.
‫É um pouco difícil de entender, ok?
‫E imagine também que quiséssemos usar esses mesmos recursos para
‫outro recurso.
‫Por exemplo, para os usuários ou, posteriormente, para as revisões.
‫Não seria muito prático, basicamente, copiar
‫o código daqui e usar, então,
‫nos outros recursos, certo.
‫E então, o que vou
‫fazer é, agora, criar uma classe na qual vou adicionar
‫um método para cada um desses recursos ou funcionalidades da API, como
‫você pode chamá-los também.
‫Tudo bem?
‫Então, vamos prosseguir e fazer isso aqui e
‫vou fazer aqui, por agora, então, mais tarde,
‫irei exportá-lo para o seu próprio
‫arquivo, basicamente, para criar um módulo reutilizável que
‫possamos , posteriormente, importe para outros controladores.
‫Tudo bem?
‫Então, classe, e estou chamando de APIFeatures.
‫Tudo bem.
‫Então, começamos com nossa função construtora e
‫lembramos que esta é a
‫função que é chamada automaticamente assim que criamos
‫um novo objeto fora desta classe, tudo bem.
‫Agora, o que eu realmente quero nesses recursos de API?
‫Na verdade, vou analisar duas variáveis aqui, certo?
‫Portanto, a consulta mongoose e também a queryString que obtemos
‫do express.
‫Então, basicamente, vindo da rota, tudo bem.
‫Então é a isso que geralmente
‫temos acesso no req. consulta, ok.
‫Agora, novamente, estou passando a consulta aqui porque não
‫quero consultar dentro desta classe porque isso iria devolver essa
‫classe para o recurso de tour, mas, novamente,
‫quero que seja o mais reutilizável possível.
‫Tudo bem.
‫Então, o que geralmente fazemos nesta função
‫de construtor é dizer isso. consulta é igual à consulta que obtivemos como
‫argumento e depois isso. queryString
‫é igual a queryString.
‫OK?
‫Função de construtor muito simples e típica.
‫E agora, como mencionei, vou criar um
‫método para cada uma das funcionalidades, começando com o filtro.
‫Tudo bem.
‫E então, vamos agora cortar o código a partir daqui.
‫Ou, na verdade, vou copiar e
‫comentar, para não causar nenhum dano acidental.
‫Então, copie e
‫o comentário e coloque aqui.
‫Então, algumas coisas que precisamos mudar.
‫Em primeiro lugar, peça. a consulta não estará disponível
‫dentro desta classe.
‫E é por isso que realmente analisamos o queryString.
‫E então, isso aqui vai ser substituído
‫por isso. queryString.
‫OK?
‫Então, novamente, isso é apenas Javascript básico.
‫Na verdade, não tem nada a ver com o Note ou Express.
‫Então o resto aqui está certo, mas isso aqui não está certo de forma alguma.
‫Portanto, não quero consultar o tour diretamente aqui, lembre-se, mas, em
‫vez disso, quero simplesmente adicionar esta descoberta
‫à consulta que já temos.
‫Então, é isso. inquerir. encontrar
‫e assim, então será isso.
‫Tudo bem?
‫Vamos, agora, nos livrar disso.
‫E antes de adicionarmos mais métodos aqui, vamos
‫realmente prosseguir e usar essa classe para que
‫faça mais sentido para você.
‫OK?
‫Então, como isso realmente vai funcionar?
‫E vou fazer tudo aqui no final
‫aqui em Executar Consulta.
‫Tudo bem?
‫E então, o que posso fazer agora é criar
‫uma variável chamada Features, por exemplo.
‫E então, a partir daqui, criarei um novo objeto de recursos da API.
‫OK?
‫Então, basicamente, criar uma instância desses recursos da API
‫que será armazenada em Recursos.
‫E isso aqui, teremos, então, acesso a todos
‫os métodos que vamos definir na definição da classe.
‫OK?
‫Portanto, lembre-se, aqui, precisamos passar uma consulta
‫e a queryString.
‫Então, a consulta, como criamos uma?
‫Lembre-se, é o Tour. achar.
‫Portanto, há um objeto de consulta e, portanto, é
‫aquele que analisamos nesta classe e, é claro,
‫o queryString que é req. inquerir.
‫Ok, agora, neste recurso aqui, lembre-se,
‫não temos acesso ao filtro.
‫E então, vamos colocá-lo bem aqui depois.
‫Assim, . filtro.
‫Dê uma chance.
‫E então, assim, vamos executar ou
‫codificar para a funcionalidade de filtragem da API.
‫Então, aqui, a próxima linha, é claro,
‫não vai funcionar porque essa consulta
‫aqui não existe mais.
‫Em vez disso, o que temos agora são recursos. consulta, certo?
‫Então, depois de todo esse processamento agora, basicamente.
‫Ok, então, agora, após este filtro, este. a consulta terá
‫então este novo método de localização.
‫Ok, e então, novamente, isso é armazenado nele. inquerir.
‫E, mais tarde, teremos todos esses outros métodos que, todos eles,
‫vão manipular isso. consulta para
‫que, no final, esta. consulta é a
‫consulta que queremos executar.
‫Então, assim como aqui.
‫Ok, então, assim como aqui, sempre mantivemos manipulando a
‫variável de consulta.
‫Continuamos adicionando mais e mais métodos a
‫ele até que, então, o executamos no final.
‫E então, aqui, estamos fazendo exatamente o mesmo.
‫Estamos simplesmente movendo o código para todos esses métodos.
‫OK?
‫Então, no final, como falei, a consulta vai ficar armazenada dentro
‫dessa propriedade aqui e então, sim, é aí que a gente,
‫então, faz o await e
‫retorna os resultados.
‫Tudo bem?
‫De qualquer forma, vamos continuar avançando aqui e implementar a classificação.
‫Então, estou copiando e comentando.
‫Então, filtre e o próximo é chamado de Sort.
‫Tudo bem.
‫E então, aqui novamente, precisamos substituir a solicitação. consulta com
‫isso. queryString, ok.
‫E então, a consulta agora é isso. inquerir.
‫Então, vamos pegar esses quatro aqui. inquerir.
‫Ok, agora, o objetivo aqui é basicamente
‫encadear esses métodos aqui um após o outro.
‫Então, deixe-me mostrar isso para você aqui.
‫Temos o filtro e, depois disso, queremos encadear
‫o método de classificação.
‫Agora, no momento, isso não vai
‫funcionar, porque onde estamos encadeando esse tipo de coisa?
‫Então, basicamente, estamos tentando chamar isso de resultado disso, mas,
‫agora, qual é o resultado disso?
‫Bem, na verdade não é nada porque
‫este método de filtro aqui não retorna nada, certo?
‫Agora, este pedaço de código aqui, é
‫claro, retorna o objeto que acabou de ser criado e,
‫então, podemos encadear o método de filtro nele.
‫Mas o método do filtro, por sua vez, não retorna nada.
‫E então, neste ponto, não podemos realmente chamar um
‫sort no objeto, certo?
‫E então, a solução simples para
‫isso, e talvez você já tenha feito isso em algum momento em seu
‫código, é que agora temos que retornar isso.
‫Então, retorne isso e este é simplesmente o objeto inteiro, ok?
‫E o mesmo, então, aqui embaixo.
‫Então, devolva isso.
‫Para, novamente, retornar o objeto inteiro que, é claro, então
‫tem acesso a esses outros métodos para que
‫possamos, então, chamá-los lá.
‫Tudo bem?
‫Então, o próximo é o limitador.
‫E vou chamá-lo de limitFields.
‫E isso porque todos
‫esses métodos terão esses verbos como nomes.
‫Portanto, é filtrar, classificar, limitar e a paginação
‫será a próxima.
‫Então, novamente, req. consulta agora é isso. queryString e query
‫here agora são isso. inquerir.
‫Tudo bem?
‫Retorne isso e isso não está correto.
‫Ok, e finalmente, a paginação.
‫Copie, comente.
‫Então, pagine.
‫Retorne isso e, é claro, precisamos
‫substituir esses req. pergunte isso.
‫queryString.
‫E então aqui, como antes,
‫vai ser isso. inquerir.
‫E acabei de perceber que lá em
‫cima, bem no primeiro método, não fizemos isso aqui.
‫Então, nós simplesmente dissemos isso. consulta e, em
‫seguida, adicionado o achado lá.
‫Mas então, é claro, precisamos
‫realmente salvá-lo nesta propriedade de consulta.
‫Ok, então, esqueci isso.
‫E temos alguns erros aqui.
‫Tudo bem, isso realmente não
‫importa aqui neste momento.
‫Ou, na verdade, porque esta linha de código aqui está,
‫na verdade, em nosso método de paginação.
‫Então vamos lá.
‫E, na verdade, eu realmente queria falar com
‫você sobre isso aqui.
‫Porque, pensando bem, pedir a página seguinte,
‫que tem resultado zero, não é realmente um erro.
‫O fato de não haver resultados é suficiente
‫para que o usuário perceba que, basicamente, a página solicitada
‫não contém nenhum dado.
‫Portanto, não precisamos realmente de um erro nesta situação.
‫E então, vou prosseguir e deletar todo esse código.
‫OK?
‫Então, deixe-me salvá-lo agora aqui.
‫E agora, é claro, o erro desapareceu.
‫E aqui, ainda temos que continuar adicionando
‫esses outros métodos.
‫Portanto, limitFields e. paginar.
‫Salve e, novamente, lembre-se de que todo esse encadeamento aqui
‫só funciona porque depois de chamar
‫cada um desses métodos, sempre retornamos isso.
‫E este é o próprio objeto que tem acesso
‫a cada um desses métodos
‫aqui, tornando possível encadea-los exatamente como temos aqui.
‫Ok, então, apenas para recapitular:
‫estamos criando um novo objeto da classe de recursos da API.
‫Lá, estamos analisando um objeto de consulta
‫e a string de consulta que vem do express.
‫OK?
‫Então, em cada um desses quatro métodos aqui
‫que chamamos um após o outro, basicamente, manipulamos a consulta.
‫Continuamos adicionando mais métodos, assim como
‫fazemos aqui antes de fazermos qualquer refatoração, certo.
‫Então, vamos adicionando coisas na consulta aqui até o final,
‫e então, no final, simplesmente aguardamos o resultado daquela
‫consulta para que ela volte com todos os
‫documentos que foram selecionados, ok?
‫E essa consulta agora reside nas características
‫que são este objeto aqui.
‫Então, recursos. inquerir.
‫Ok, espero que faça sentido.
‫Portanto, antes de fazermos qualquer outra coisa, vamos voltar ao
‫Postman e realmente experimentar.
‫E podemos experimentá-lo aqui com esta rota dos 5
‫mais baratos porque, na verdade,
‫nos bastidores, usa todos esses recursos da API, certo.
‫Então, se eu enviar, bem, ainda funciona.
‫Então, isso é fantástico.
‫Portanto, vamos fechá-lo e salvá-lo aqui.
‫Portanto, obtenha os cinco melhores passeios baratos.
‫E sim, vou deixar isso aí no final.
‫E agora, apenas aqui, vamos fazer alguns testes.
‫Por exemplo, remova a classificação, deixe-me deixar o limite.
‫Dificuldade, duração, preço.
‫Então, vou deixar tudo isso
‫aqui só para ver se ainda funciona.
‫E parece que tudo ainda está funcionando, certo.
‫Portanto, esses são exatamente os mesmos resultados
‫que obtivemos antes de nossa refatoração.
‫Então, ótimo, perfeito.
‫Isso funcionou e, então, vamos, agora, excluir todo
‫esse código daqui, o que torna nosso gerenciador de
‫rotas muito mais limpo, não é?
‫Então, isso é muito melhor, realmente, é dia e noite.
‫OK?
‫Agora, a próxima etapa é realmente
‫ir em frente e pegar todo esse código, recortá-lo e colocá-lo
‫em um novo arquivo, basicamente um novo módulo.
‫Ok, e para isso, vou criar uma nova pasta
‫aqui que chamarei de Utils.
‫Então isso significa, basicamente, utilitários.
‫E vou adicionar algumas coisas aqui durante
‫o resto do curso.
‫OK?
‫Portanto, este
‫será chamado de APIFeatures. js e com F maiúsculo aqui.
‫Tudo bem?
‫Então, aí vai nossa aula e, no
‫final, fazemos um módulo. exportações desta classe.
‫Portanto, nada de novo neste momento.
‫Salve, feche e
‫agora, aqui, podemos solicitá-lo.
‫Const APIFeatures então requerem.
‫Em seguida, precisamos mover uma pasta
‫para cima, em seguida, em Utils e APIFeatures.
‫OK?
‫Mais um teste.
‫E está demorando um pouco, e aqui vamos nós.
‫Linda, isso é simplesmente lindo.
‫Agora, se criarmos outro recurso novamente, por exemplo, para
‫os usuários, será muito fácil
‫cair nessa mesma funcionalidade.
‫Tudo o que teremos de fazer é solicitar esse arquivo
‫e, basicamente, fazer o mesmo que aqui.
‫Ou talvez, nesse caso, não queremos ter essa
‫capacidade de classificação ou não queremos ter a capacidade de
‫filtragem e, então, tudo o que temos que fazer é
‫simplesmente retirar esta linha de código.
‫E então, como mágica, ele fará
‫apenas essas três
‫funcionalidades ou esses três recursos, ok.
‫E isso é ótimo.
‫Espero que você possa ver
‫o valor disso e, sim, estou muito feliz com este resultado.