‫Instrutor: Neste
‫vídeo, vamos implementar a página minhas reservas.
‫Então, basicamente, vamos renderizar uma boa
‫página contendo todos os passeios que um usuário reservou.
‫E vamos começar adicionando uma nova rota às nossas viewRoutes.
‫Ok, então nós temos a mim e então vamos
‫depois criar os my-tours.
‫Estou duplicando este, my-tours, então também esta rota precisa
‫ser protegida para que apenas
‫usuários logados
‫possam acessar esta página, é claro.
‫E então, em nosso
‫viewsController, teremos um controlador chamado getMyTours.
‫MyTours assim, ok?
‫E é isso por agora,
‫então vamos continuar e criar este controlador agora.
‫Ok, então temos todos esses acessos aqui,
‫faça o tour, obtenha o formulário de login, obtenha a conta.
‫Então, vamos colocar este aqui também.
‫E agora, o que precisamos fazer
‫aqui é encontrar todos os passeios que o usuário reservou.
‫Então, basicamente, primeiro precisamos encontrar todas as reservas para os
‫usuários atualmente logados, o que nos
‫dará um monte de IDs de tour e,
‫em seguida, temos que encontrar os tours com esses IDs.
‫Então, basicamente, localize todas as reservas e, em seguida,
‫localize os passeios com os IDs retornados.
‫Então, basicamente, os IDs das reservas para o usuário, certo?
‫Agora, em vez disso, também
‫poderíamos fazer um preenchimento virtual nos passeios, e
‫seria ótimo se você implementasse
‫isso por conta própria exatamente como fizemos antes com os passeios
‫e as avaliações, mas aqui nesta
‫função eu realmente queria para mostrar como podemos
‫fazer isso manualmente,
‫porque acho que isso também é importante
‫e, na verdade, um populate
‫virtual deve funcionar de maneira semelhante ao que faremos aqui.
‫E então você vê que na verdade precisamos
‫de duas consultas para realmente
‫encontrar os passeios correspondentes às reservas do usuário.
‫De qualquer forma, vamos começar
‫agora, vamos criar uma variável para todas as
‫reservas, aguardar e agora acho que não temos as reservas aqui ainda, não.
‫Portanto, Reservas aqui e bookingModel.
‫E aqui, é claro, é apenas uma reserva, certo.
‫Portanto, aguarde a reserva. encontre, e agora lembre-se que
‫cada documento de reserva possui um ID de usuário, certo?
‫Portanto, aqui no esquema, lembre-se
‫de que temos o ID do tour,
‫o ID do usuário e todos esses
‫outros dados, então o
‫que vamos fazer agora é basicamente consultar pelo ID do usuário, certo?
‫E então isso vai
‫nos retornar todos os tours que pertencem ao usuário atual, ok?
‫Então, não este.
‫Portanto, o tour deve ser igual a req. do utilizador. identificação.
‫Então aqui assíncrono e, como sempre, catchAsync também.
‫Portanto, essas reservas agora contêm todos os documentos
‫de reserva do usuário atual, mas na
‫verdade isso apenas nos fornece os IDs de passeio.
‫E agora queremos encontrar os passeios com os IDs retornados.
‫A próxima etapa é
‫basicamente criar uma matriz de todos
‫os IDs e, depois dessa consulta,
‫os tours que têm um desses IDs, certo?
‫E isso fará um pouco mais de
‫sentido assim que implementarmos o que acabei de explicar.
‫TourIDs é igual a reservas e agora vamos usar um mapa
‫para criar uma nova matriz
‫baseada em uma função de retorno de chamada
‫que é esta, então
‫o el atual. Tour. identificação.
‫Então, o que isso vai fazer?
‫Bem, basicamente, isso faz um loop por toda a matriz de reservas
‫e em cada elemento pegará o el. Tour.
‫E, na verdade, nem precisamos do ID
‫aqui porque o passeio em si já é o ID do passeio, certo?
‫Então, no final, temos uma bela matriz
‫com todos os IDs de passeio aqui e isso
‫porque usamos um mapa.
‫Ok, então, tendo todos os IDs de
‫passeio, podemos realmente obter os passeios correspondentes a esses IDs.
‫Portanto, aguarde o Tour. find e realmente queremos encontrar por ID, mas
‫não podemos usar o. findbyid porque
‫aqui realmente precisaremos de um novo operador.
‫E a dita operadora,
‫que não tenho certeza se já usamos
‫antes, é chamada.
‫Então, em tourIDs.
‫Então, basicamente o que
‫isso fará em vez de selecionar
‫todos os passeios que possuem um ID que está na matriz tourIDs, certo?
‫Isso é bastante
‫direto, mas é muito bom saber
‫que podemos usar isso muito útil no operador aqui, certo?
‫E esse é realmente um dos
‫motivos pelos quais eu quis
‫fazer isso manualmente em vez de apenas preencher virtual como fizemos antes.
‫Mas, novamente, seria bom se você fosse
‫em frente e realmente implementasse
‫isso apenas para se divertir, sabe.
‫Ok, e com isso
‫temos nossos tours prontos para serem renderizados.
‫Então, res. status como
‫sempre, e então renderizá-los, certo?
‫E, na verdade, nem precisamos de um novo modelo para isso.
‫Vamos simplesmente reutilizar a visão geral, certo?
‫Então, vamos acabar com uma
‫página que se parece muito com a
‫visão geral, mas apenas com os passeios que o usuário reservou.
‫Então, aqui em cima e para ter
‫uma visão geral, nós realmente passamos em todos os tours, ok?
‫Então, basicamente, todos eles.
‫E agora, vamos ter algo muito
‫semelhante, mas é claro, apenas passando nos tours agendados.
‫Então, onde fica isso?
‫Tudo bem, então o título será My Tours,
‫e novamente passando na variável tours.
‫Ok e deve ser isso.
‫Claro que também poderíamos ter criado
‫um cartão totalmente novo para essas livrarias com
‫algumas informações mais relevantes
‫sobre cada uma das reservas,
‫mas neste caso isso não é realmente importante.
‫Agora está certo?
‫Então, estamos prontos para
‫testar isso porque já implementamos a rota aqui antes.
‫E então esse é o meu tour.
‫Oh, mas na verdade vamos definir este link aqui
‫na página da conta do usuário.
‫Portanto, este my-tours deve ter
‫seu próprio link aqui mesmo na conta.
‫Na coluna da
‫esquerda, aqui mesmo em Minhas reservas, temos
‫esta primeira aqui que
‫é para o link, lembre-se.
‫E agora, basicamente, todos eles apontam para nenhum lugar, mas agora,
‫para as reservas, temos um link.
‫E então esse é o meu tour.
‫E poderíamos ter chamado de reservas também, mas isso
‫não é realmente importante de qualquer maneira.
‫Então, agora estamos prontos para testar isso.
‫Vamos realmente fazer logoff desse usuário
‫e, em seguida, fazer logon como nosso outro usuário, Laura.
‫Tudo bem, então vamos ver o que temos aqui e
‫isso está demorando muito, então
‫vamos dar uma olhada em nosso código, editar nosso terminal aqui.
‫Ok, então não há nenhum erro aqui, mas também
‫parece que nada está realmente acontecendo aqui.
‫Então, a rota my-tours aqui nem aparece, certo.
‫Agora, para encontrar esse
‫bug, eu realmente tive que fazer alguma depuração
‫fora deste vídeo porque foi realmente difícil de encontrar, ok.
‫Primeiro, há um pequeno erro aqui.
‫Portanto, este aqui deve ser de fato um usuário e não um tour.
‫Então eu expliquei bem naquela
‫época, onde falei que precisamos filtrar por
‫usuário, então tours onde o usuário
‫é igual ao usuário vindo da requisição,
‫mas aí por algum motivo eu fiz errado aqui, ok?
‫Mas esse não é o bug principal, na verdade.
‫Portanto, não é aquele que impede a página de realmente carregar.
‫O erro que faz com que
‫isso aconteça está bem aqui no modelo de reserva.
‫E está aqui neste middleware de pré-descoberta.
‫E o problema
‫é que nunca chamamos o próximo middleware aqui, certo?
‫Então, novamente, este é um pré-middleware.
‫E todos os pré-middlewares têm acesso à
‫próxima função e então, ao final
‫desses middlewares, sempre temos que
‫chamar o próximo.
‫Caso contrário, nosso processo realmente travará, certo?
‫Então, salve isso, pode realmente fechar este aqui.
‫E agora vamos tentar de
‫novo e agora realmente temos meus
‫tours, mas está vazio porque este usuário nunca fez uma reserva.
‫Então, vamos tentar isso agora, e vamos
‫agendar o caminhante da floresta.
‫Então, isso ainda deve estar
‫funcionando, e de fato está, muito bom.
‫Temos o endereço de email pré-formatado e
‫agora, como sempre, 4242.
‫Então, na verdade, fizemos a reserva antes com esse
‫usuário, mas antes de implementarmos o modelo de
‫reserva e, portanto, nunca
‫criamos uma reserva em nosso sistema.
‫Certo, pagamento aceito
‫e agora vamos ver e vamos lá, ótimo!
‫Essa lógica que acabamos de implementar realmente funcionou e,
‫portanto, o único problema
‫era a próxima falta no middleware.
‫E assim, completamos mais uma página
‫do nosso site dinâmico.
‫E a seguir, tudo o que realmente resta a fazer neste ponto
‫é terminar a API de reservas.