‫Instrutor: Neste
‫vídeo, vamos construir uma função de fábrica de
‫manipulador para excluir documentos de revisão,
‫mas também documentos de todas as outras coleções,
‫tudo com uma função simples.
‫Portanto, como mencionei no início desta seção, adicionar
‫manipuladores muito semelhantes a todos os nossos
‫controladores criará muitos códigos duplicados, certo?
‫Como todos esses manipuladores de atualização,
‫ou todos esses manipuladores
‫de exclusão, ou todos esses
‫manipuladores de criação, eles realmente parecem basicamente iguais, certo?
‫Além disso, imagine que quiséssemos
‫mudar algum código de status https ou mensagem de status.
‫Em seguida, teríamos que entrar em cada controlador e, em
‫seguida, alterar todos os manipuladores lá.
‫E então, em vez de escrever manualmente todos esses manipuladores,
‫por que não simplesmente criar uma função de fábrica
‫que retornará esses manipuladores para nós?
‫Então, uma função de fábrica é exatamente isso.
‫É uma função que retorna outra função e,
‫neste caso, nossa função de manipulador.
‫Então, para deletar, para criar, para atualizar,
‫e também para ler recursos.
‫Ok e eu sei que todo esse conceito pode ser um pouco complexo
‫para entender, e
‫é por isso que deixei
‫isso para a parte posterior deste curso.
‫Mas agora, acredito que você está
‫realmente pronto para implementar esse tipo de coisa.
‫Portanto, esse tipo de lógica é o
‫que todo desenvolvedor de JavaScript avançado deve ser capaz
‫de implementar e, novamente, acredito que neste ponto do
‫curso você está realmente pronto para começar a usar conceitos
‫avançados como este, certo.
‫Mas chega de conversa, deixe-me mostrar como ele
‫realmente funciona usando o manipulador de exclusão como um primeiro exemplo.
‫E então, na verdade, temos um no controlador de tour,
‫então vamos copiá-lo e exclua
‫o tour.
‫Ok, então copiei basicamente como um
‫modelo para seguirmos.
‫Então, vamos criar um novo arquivo, e vou fazer
‫isso nos controladores.
‫Tudo bem,
‫então manipulador ...
‫fábrica. js.
‫E estou fazendo isso na pasta de
‫controladores, bem porque as funções que vamos
‫escrever aqui basicamente retornarão controladores.
‫E então, para mim, faz muito sentido que
‫você os coloque aqui.
‫Então, vamos apenas copiar esta
‫parte aqui, apenas para mantê-la como referência.
‫Portanto, novamente, o objetivo aqui é basicamente criar uma
‫função, que retornará
‫uma função semelhante a esta aqui.
‫Mas é claro que não apenas para
‫o tour, mas para todos os modelos que temos em
‫nossa aplicação e que possamos ter no futuro.
‫Então essa função precisa ser preparada
‫para isso, e isso significa que dentro da função de
‫fábrica, vamos passar o modelo, tudo bem.
‫Então, vamos chamá-lo de deleteOne.
‫E é chamado assim, de
‫novo, porque esta função não
‫vai funcionar apenas para excluir
‫passeios, mas também para excluir comentários e usuários e
‫no futuro alguns outros documentos que
‫possamos ter.
‫Então, como eu estava dizendo
‫no início, vamos passar o modelo para essa função.
‫Então, passamos o modelo e, em seguida, criamos uma nova função, e essa
‫função imediatamente retornará nossa função
‫assíncrona, então basicamente tudo isso ou função de
‫manipulador assíncrona.
‫Ok, agora tudo o que precisamos fazer é realmente
‫mudar do modelo de ferramenta específico para o modelo mais genérico.
‫Então, aqui também vamos mudar isso do tour para o documento porque,
‫novamente, não saberemos que tipo de documento é esse.
‫Portanto, esta função não saberá realmente se é um tour, ou
‫se é uma revisão, ou um usuário.
‫E então precisamos fazer um tour por tudo isso,
‫e é realmente isso.
‫Então isso basicamente é a
‫generalização dessa função específica, que funcionava apenas para tours, e agora
‫essa nova funciona para todos os modelos.
‫O que também precisamos fazer aqui é importar este catchAsync e
‫também este AppError.
‫Então catchAsync ...
‫e acredito que esteja na pasta de utilitários.
‫E então, não AppError, mas catchAsync.
‫Em seguida, duplique
‫isso aqui, AppError, e isso aqui estará em maiúsculas.
‫Salve e agora estamos prontos para
‫realmente testar isso.
‫Então é assim que vai funcionar,
‫primeiro de tudo precisamos importar aquela fábrica de manipuladores.
‫E então vamos
‫dizer, e vou simplesmente chamá-lo de fábrica aqui.
‫Então, requer, e está na mesma pasta, então fábrica
‫de manipulador.
‫Tudo bem, então vamos comentar este aqui, ou na verdade não
‫tudo isso.
‫Sim, ou na verdade podemos comentar, e
‫assim as novas exportações. excluir tour será ...
‫fábrica. deleteOne e, em seguida, passe o modelo,
‫que é o tour.
‫E é isso, é tudo o que precisamos fazer.
‫Para recapitular muito rapidamente aqui, chamamos
‫essa função deleteOne, aí passamos o
‫modelo, e o que
‫vai acontecer é que essa função retornará
‫imediatamente a função de manipulador que
‫tínhamos antes.
‫Simplesmente o modelo específico, que antes era o tour,
‫agora será substituído por aquele que
‫passamos para a função.
‫E, a propósito, isso funciona por causa dos fechamentos
‫de JavaScript, que é apenas uma maneira
‫elegante de dizer que esta função interna aqui terá
‫acesso às variáveis da função
‫externa, mesmo depois que a externa já retornou.
‫Portanto, chamar essa função aqui retornará
‫outra função, que ficará
‫aqui parada e aguardará até que seja finalmente
‫chamada assim que atingirmos a rota correspondente.
‫E agora vamos tentar exatamente isso.
‫Portanto, exclua o passeio,
‫ok, e vamos escolher um passeio
‫de que realmente não precisamos aqui por enquanto.
‫Então vamos dizer ...
‫agora digamos aqui The Snow
‫Adventurer porque também não possui nenhuma análise.
‫Então, vamos enviar isso, ah
‫e agora não temos permissão para executar a ação,
‫e isso é porque não estamos logados como um administrador.
‫Então, vamos tentar isso,
‫e este é o administrador de que precisamos para estar logado.
‫Ok, então está feito.
‫E agora isso deve funcionar, e de fato funcionou.
‫E isso é a prova de que nossa função de fábrica
‫está realmente fazendo seu trabalho.
‫Ok, porque se você voltar aqui, nós
‫tivemos 10 resultados e agora devemos obter apenas nove, então
‫perfeito.
‫E agora o objetivo é poder usar isso
‫em cada um dos controladores.
‫Então, vamos copiar isso aqui e ir
‫para os comentários.
‫Ah, é claro
‫que precisamos disso aqui, bem no começo,
‫agora bem e agora exportar. deleteReview é igual
‫a fábrica. deleteOne com
‫o modelo de revisão.
‫E é isso, é tudo
‫o que precisamos fazer para implementar o manipulador de exclusão.
‫Agora, é claro, também precisamos especificar o manipulador de rota.
‫Agora, é claro, precisamos especificar a rota em si,
‫então vamos fazer isso aqui também.
‫Então, roteador. rota porque aqui
‫realmente precisamos do parâmetro ID.
‫E agora delete é simplesmente reviewController. deleteReview, e não estou mexendo com a
‫permissão aqui, nem com a autenticação porque por
‫enquanto eu só quero
‫fazer isso funcionar e me preocupar
‫com isso um pouco mais adiante nesta seção.
‫Ok, então vamos fechar essas coisas aqui.
‫Pegue todos os
‫comentários,
‫certo, vamos salvar este e este também.
‫Para que agora possamos começar com uma folha em
‫branco aqui e vamos começar obtendo todas as
‫revisões, para que possamos excluir uma.
‫E então vamos deletar, bem, só esse.
‫Ok, agora também precisamos, é claro,
‫disso e, em seguida, do método delete http.
‫Não precisamos de autorização neste momento,
‫então vamos apenas enviar.
‫E de fato nenhum conteúdo, então 204.
‫E se agora recebermos todas as
‫avaliações, devemos voltar a ter apenas três.
‫Sim, isso funciona, então vamos passar para o próximo.
‫Ok, então comentários, comentários.
‫Vamos pegar essa linha de código aqui e agora finalmente adicioná-la
‫ao controlador de usuário também.
‫Tudo bem, e claro, tudo isso, eu entendo que é
‫um pouco confuso mexer com todos esses arquivos
‫diferentes, mas só precisamos
‫fazer isso uma vez e então terminaremos com
‫toda aquela confusão.
‫Então aqui já tínhamos a exportação. deleteUser, agora
‫tudo o que precisamos fazer é chamar nossa função de fábrica,
‫então deleteOne e então o usuário.
‫Agora, apenas o administrador deve ser capaz
‫de excluir os usuários posteriormente, porque lembre-se de que quando
‫o usuário excluir a
‫si mesmo, eles não serão realmente excluídos, mas
‫apenas o ativo será definido como falso.
‫Mas o administrador, por outro
‫lado, realmente será capaz de excluir o usuário efetivamente do
‫banco de dados.
‫Mas, novamente, vamos nos preocupar
‫com a questão da permissão um pouco mais tarde.
‫Por enquanto, vamos verificar em userRoutes se a
‫rota está realmente implementada,
‫e sim, está aqui embaixo.
‫E como agora
‫implementamos isso, vamos testá-lo aqui novamente no Postman.
‫Então, primeiro vamos salvar este.
‫Assim...
‫exclua a revisão e
‫agora vamos simplesmente copiar isso em
‫outra rota.
‫Exclua e, em seguida, um usuário,
‫mas na verdade não vou fazer isso agora.
‫Tudo que eu quero é apenas obter uma identificação aleatória.
‫Ou, na verdade, vamos apenas criar um
‫novo usuário, então basicamente inscreva-se e exclua-o imediatamente.
‫Então, olá, assim.
‫Pegue todos os usuários, e então é esse cara aqui.
‫E então vamos deletá-lo imediatamente, então enviamos,
‫e não obtemos nenhum conteúdo.
‫E, claro, agora ele deve ter ido embora.
‫Agora, se tentarmos vê-la novamente,
‫basicamente tentando excluir um usuário que
‫não está mais lá, devemos obter um erro.
‫Então, vamos dar uma olhada e, de fato, nenhum documento foi
‫encontrado com esse ID.
‫E isso significa que em nossa função
‫de fábrica, bem aqui, tudo isso, AppError e catchAsync, tudo isso
‫ainda está intacto.
‫Então, tudo ainda funciona da mesma forma que antes.
‫Bem, isso também foi importante testar aqui.
‫Vamos salvar isso rapidamente aqui
‫também, então cada endpoint que estamos implementando, também estou
‫adicionando aqui no
‫Postman porque um pouco mais tarde poderemos
‫realmente criar alguma documentação de API
‫baseada em todos os isso que salvamos aqui no Postman.
‫Portanto, esse é outro recurso útil deste aplicativo.
‫Portanto, excluímos o usuário atual
‫e, novamente, isso é diferente de apenas excluir
‫o usuário, porque este aqui é para
‫administração e este é para o usuário conectado no
‫momento, muito diferente.
‫Ok, então esta foi nossa primeira função de fábrica
‫apenas para excluir e apenas para você entender
‫o próprio conceito.
‫Em seguida, implementaremos funções de
‫fábrica para atualizar e criar documentos.