‫-: Tudo bem.
‫Portanto, vamos agora criar um novo documento de reserva em nosso banco de
‫dados sempre que um usuário adquire um passeio com sucesso.
‫Então, estamos de volta aqui no controlador
‫de reservas e na
‫proposta bruta, que cria as sessões de checkout, certo?
‫E lembre-se de que aqui temos esse url de
‫sucesso e esse url é a base da
‫funcionalidade que vamos implementar nesta aula.
‫Assim, sempre que um check-out
‫for bem-sucedido, o navegador irá automaticamente para este
‫url, que agora é basicamente a nossa página inicial, certo?
‫É também neste momento, então,
‫quando um checkout é bem-sucedido, queremos criar uma
‫nova reserva, certo?
‫Basicamente, queremos criar uma nova
‫reserva sempre que este url for acessado.
‫Agora poderíamos criar uma nova rota para esse sucesso, mas
‫então teríamos que criar uma página totalmente nova e
‫isso não vale a pena neste caso.
‫E isso porque o que vamos fazer nesta
‫palestra é apenas uma solução
‫temporária, porque não é realmente seguro, ok?
‫Portanto, lembre-se de como dissemos algumas palestras
‫atrás e aquele belo diagrama que mais tarde,
‫quando um site for realmente implantado em um servidor, teremos
‫acesso ao objeto de sessão assim que a compra
‫for concluída usando Stripe Webhooks.
‫Assim, esses webhooks serão perfeitos para
‫criarmos uma nova reserva.
‫OK?
‫Mas, por enquanto, como ainda não podemos
‫fazer isso, vamos usar uma
‫solução alternativa, que é simplesmente colocar os dados de que
‫precisamos para criar uma nova reserva diretamente neste url como uma string de consulta.
‫OK?
‫E precisamos criar uma string de consulta porque Stripe
‫fará apenas uma solicitação get para este url aqui e, portanto,
‫não podemos realmente enviar um corpo ou qualquer dado com ele,
‫exceto para a string de consulta.
‫Tudo bem?
‫Então, vamos fazer isso e o que precisamos aqui são basicamente
‫os três campos obrigatórios em nosso modelo de reserva.
‫Então, tour,
‫usuário e preço.
‫Portanto, o
‫tour
‫é igual a req.
‫params.
‫tourid certo?
‫Então o que eu fiz aqui?
‫Então está correto.
‫Em seguida, precisamos do usuário.
‫Então, usuário, que está a
‫pedido. do utilizador. identificação.
‫E finalmente precisamos do preço,
‫que
‫está em turnê. preço.
‫Tudo bem.
‫Agora, como eu disse antes,
‫isso obviamente não é
‫seguro, porque agora qualquer
‫um que conheça essa estrutura de url aqui
‫poderia simplesmente chamá-la sem passar pelo processo de checkout, certo?
‫E então qualquer pessoa poderia
‫simplesmente reservar um passeio sem ter que pagar.
‫Tudo o que eles teriam que fazer seria abrir
‫esse url com o tour, o
‫usuário e o preço e então criariam automaticamente uma
‫nova reserva sem pagar, certo?
‫Então, novamente, não é realmente seguro, mas por
‫enquanto, como uma solução alternativa, funciona
‫muito bem, porque muitas pessoas, é claro, saberão que
‫este é o nosso url de sucesso.
‫OK?
‫Porque, na verdade, vamos esconder esse fato
‫um pouco em um segundo, ok?
‫Portanto, vamos agora criar a função que realmente criará a nova reserva no
‫banco de dados.
‫Isso vai exportar dot create booking
‫checkout e é chamado
‫de create booking checkout porque mais tarde teremos
‫também o create booking,
‫que estará acessível em
‫nossa API
‫de
‫reservas.
‫Tudo bem.
‫De qualquer forma.
‫Aqui como sempre.
‫E vamos começar obtendo nossos dados da string de consulta.
‫E então para isso vou usar a estruturação.
‫Portanto,
‫o tour, o
‫usuário e o preço estão disponíveis mediante solicitação. inquerir.
‫Portanto, lembre-se de que essa é a string de consulta.
‫Então, na verdade, só queremos criar
‫uma nova reserva se tudo isso aqui for especificado.
‫E então basicamente dizemos que, se eles não existirem, vamos
‫ao próximo middleware.
‫Então esse é o nosso procedimento padrão, certo?
‫Portanto, dizemos que se
‫não houver
‫tour e nenhum usuário
‫e nenhum preço.
‫Então, basicamente, exigimos que todos eles existam.
‫E então, nesse caso, vamos para o
‫próximo middleware.
‫Agora, o que exatamente é o próximo middleware?
‫Lembre-se de que
‫queremos criar uma nova reserva neste url de casa.
‫Então, este aqui.
‫Porque, novamente, esse é o url
‫que é chamado sempre que uma compra é bem-sucedida com o Stripe.
‫E então o que precisamos fazer é adicionar esta função de middleware que
‫estamos criando agora na pilha de middleware
‫deste manipulador de rota.
‫Então, que manipulador de rota é esse?
‫Bem, está em vista de rotas
‫e é esta aqui, certo?
‫Isso provavelmente parece um pouco confuso.
‫Mas, novamente, este é o caminho
‫que será atingido quando um cartão de crédito for cobrado com sucesso.
‫E então este é também o momento em que queremos criar uma
‫nova reserva.
‫E aqui é onde precisamos adicionar
‫essa função de middleware, então vamos realmente fazer isso
‫e exigir nosso controlador e
‫agora vamos apenas duplicar isso aqui.
‫Então, o controlador de
‫reserva e agora irei editar aqui logo no início, porque realmente não importa
‫se estamos logados ou não para isso.
‫Portanto, controlador de reservas. get, ou realmente
‫dot create
‫bookingcheckout.
‫Salve e tudo
‫bem.
‫E, novamente, isso é apenas temporário
‫até que tenhamos nossos sites implantados
‫em um servidor
‫onde seremos capazes de criar uma solução melhor para isso.
‫OK?
‫Então, aqui no controlador de reservas,
‫agora é hora de realmente criar essa nova reserva.
‫E agora precisamos importar esse modelo.
‫Então vamos fazer isso aqui.
‫Reserva e
‫modelo de reserva aqui também.
‫E por alguma razão aqui eu tenho esse caminho estranho.
‫Então, isso não faz nenhum sentido.
‫Não sei por que os escrevi assim naquela época.
‫Então, o que temos lá é exatamente igual a isso.
‫Mas é claro que isso é mais legível.
‫De qualquer forma.
‫Vamos agora criar essa reserva.
‫E para isso teremos
‫que aguardar reserva. crie com um
‫objeto
‫de passeio, usuário e preço.
‫E é isso.
‫Agora também precisamos marcar este
‫aqui como assíncrono e como
‫sempre catchasync.
‫OK?
‫E não estamos salvando isso
‫em nenhuma variável porque realmente não precisamos disso.
‫Não vamos enviar isso de volta como uma resposta da API.
‫Neste ponto, tudo o que queremos fazer aqui é
‫criar esse novo documento, ok?
‫Em
‫seguida, poderíamos dizer próximo, assim.
‫E então isso iria para
‫o próximo middleware, mas isso não é realmente ideal.
‫Portanto, lembre-se novamente de que o próximo middleware na
‫pilha é, obviamente, este e a
‫visão geral do get.
‫Então, basicamente, a
‫função que irá renderizar nossa página.
‫Mas lembre-se de que esse url é tudo isso.
‫Então, tudo isso com todos esses dados aqui.
‫E, novamente, isso não é seguro de forma alguma.
‫E pelo menos vamos
‫torná-lo um pouco mais seguro, certo?
‫E então
‫o que podemos fazer aqui é basicamente redirecionar o
‫aplicativo agora para apenas este url.
‫Basicamente, você está removendo
‫a string de consulta do url original.
‫E agora
‫vamos usar algo que nunca usamos antes.
‫Então isso é ótimo, certo?
‫Então, vamos usar o redirecionamento.
‫Tudo bem?
‫Portanto, agora o que
‫queremos é a url inteira, mas sem a string de consulta.
‫Então, o que podemos
‫fazer é
‫apenas trapacear e copiar isso aqui.
‫Mas vamos torná-lo um pouco mais elegante.
‫Então, o que estamos fazendo é um pedido. teoriginalurl, que já usamos
‫antes.
‫E esse é o url
‫inteiro de onde veio a solicitação.
‫E agora o
‫que precisamos fazer é dividi-lo pelo ponto de interrogação.
‫Direito?
‫Porque esse é o divisor entre a parte que realmente
‫queremos e a string de consulta.
‫Então, se dividirmos isso pelo ponto de interrogação,
‫teremos um array onde o primeiro
‫elemento é esse e o segundo elemento é todo o resto.
‫Portanto, a própria string de consulta.
‫E aqui
‫pegamos o primeiro elemento e essa é a nossa página inicial.
‫Então, nosso url de rota.
‫E o que o redirecionamento aqui faz é basicamente criar uma nova
‫solicitação, mas para este novo url que passamos lá.
‫Tudo bem?
‫Portanto, isso irá criar mais
‫uma solicitação para o nosso url de rota.
‫Então, vamos novamente pegar essa rota.
‫E então, mais uma vez, vamos acertar esse middleware aqui.
‫Então, aquele que estamos apenas criando.
‫Então, pela segunda vez, vamos chegar lá, mas agora o tour, o usuário e o preço não
‫estão mais definidos.
‫E então passaremos para o próximo middleware, que finalmente
‫é a função
‫de manipulador get overview, que então apenas renderizaremos a página inicial, ok?
‫Fez sentido?
‫Então isso é meio circular.
‫Então, basicamente, no
‫começo, vamos pegar essa rota aqui.
‫Em seguida, uma nova reserva
‫aqui é criada e redirecionamos o aplicativo novamente
‫para esta rota, desta vez sem a string de consulta.
‫E assim,
‫sem a string de consulta e este
‫middleware, passamos direto para o próximo.
‫E só então podemos
‫fazer o login e obter uma visão geral.
‫Tudo bem?
‫E então é isso mesmo, certo?
‫Bem, isso é exatamente aqui
‫que isso é apenas temporário
‫porque não é seguro.
‫Todos podem fazer reservas sem
‫pagar.
‫Então, novamente, isso seria terrível para o negócio.
‫Ok, agora é hora de testar isso.
‫Na verdade, quero fazer isso com aquele outro usuário que criamos, que é
‫jonas @ mailsac.
‫E isso
‫porque quero ver se realmente recebemos o recibo por e-mail do Stripe.
‫Então, vamos
‫fazer login com esse usuário em nosso site.
‫Portanto, saia.
‫Bem, isso não está funcionando.
‫Isso é estranho.
‫Vamos recarregar.
‫E isso deve estar funcionando, então vamos ver se temos algum erro
‫em nosso javascript.
‫Porque isso é realmente voltado para o cliente e temos
‫Stripe não está definido.
‫Vamos ver se temos o mesmo erro aqui nesta
‫página, o que não deveríamos, certo?
‫E na
‫verdade não está lá, mas em todas as turnês.
‫Sim, está lá.
‫Portanto, a solução para isso é
‫movê-lo do tour basicamente para todas as páginas.
‫Tudo bem?
‫Portanto, por algum motivo, o empacotador de
‫pacotes faz isso de modo que precisa estar aqui no escopo
‫principal para todos eles.
‫Então, para todas as páginas, ok?
‫Então, vamos colocar isso no final, bem aqui, antes
‫do nosso pacote.
‫Tudo bem?
‫Tente novamente e agora estamos prontos.
‫Então
‫saia e funcionou.
‫Agora faça login.
‫Claro que agora nossa cópia se foi.
‫Um dois três quatro.
‫Não, isso não é correto.
‫Teste um dois três quatro.
‫Acho que mudei a senha em algum momento, então vamos tentar
‫uma nova senha,
‫que também não está funcionando.
‫Vamos tentar passar um dois três quatro
‫e funcionou.
‫Portanto, não é um teste um dois
‫três quatro, mas passe um dois três quatro.
‫Pelo menos aqui no meu caso.
‫Então, vamos tentar reservar o, digamos, o
‫amante dos esportes.
‫Tudo bem.
‫Aqui embaixo.
‫Reserve um tour e isso
‫ainda funciona e esse é o
‫mais caro.
‫(risos) Então, quatro dois quatro dois e
‫depois quatro dois até
‫o fim.
‫Então aqui está algum mês e aqui está algum número.
‫Digamos meu nome completo
‫aqui e agora vamos clicar em pagar.
‫E vou dar uma olhada na barra de url.
‫E, de fato, obtemos nossa
‫página inicial, portanto, nosso URL de rota sem qualquer uma das strings de consulta que especificamos antes.
‫Isso significa que algo está funcionando.
‫Então, vamos dar uma olhada na bússola e clicar aqui para
‫recarregar e obter nossa coleção de reservas.
‫E isso é um bom sinal.
‫E, de fato, aqui vamos nós.
‫Nosso primeiro documento é criado.
‫Portanto, lembre-se de que esse foi o preço.
‫Vamos também dar uma olhada no
‫id do usuário, que termina em oito E três B.
‫Então, oito E três B, correto.
‫E estou assumindo que a turnê também será correta.
‫Tão perfeito.
‫Isso também funcionou e agora realmente temos uma maneira
‫de criar reservas sempre que
‫uma reserva acontecer com o Stripe.
‫Vamos também verificar rapidamente nossos painéis aqui novamente.
‫Isso é muito divertido.
‫E acho que só preciso recarregar aqui.
‫Então vamos ver.
‫Aqui está Jonas em qualquer coisa que tenhamos chamado.
‫Temos o amante
‫de
‫esportes e perfeito.
‫Isso está funcionando agora.
‫E a tarefa final.
‫Vamos agora verificar o mailsac.
‫Saco de correio.
‫com e veja se recebi
‫meu e-mail lá.
‫E bem, na verdade eu não fiz, mas
‫isso não é grande coisa.
‫Não tenho certeza de que talvez não funcione com dados de teste.
‫E então, por enquanto, isso é tudo que
‫tenho para mostrar a você sobre a integração do Stripe.
‫Agora, novamente,
‫quando um site for implantado, usaremos o Stripe
‫Webhooks para criar
‫reservas de uma maneira mais segura e muito melhor.
‫Tudo bem?
‫Então, vamos tomar um minuto para recapitular o que fizemos aqui.
‫Então, basicamente, adicionamos todas
‫as variáveis de que precisamos para criar
‫uma nova reserva ao url de sucesso.
‫Em seguida, adicionamos uma nova função
‫de middleware aqui à pilha dessa rota exata.
‫Então, este aqui.
‫E assim,
‫sempre que este url aqui for atingido, tentaremos criar uma nova reserva.
‫Tudo bem?
‫Mas essa nova reserva, é claro, só é criada quando o tour, o usuário e
‫o preço são especificados na consulta.
‫E assim, nesta função de middleware, se eles forem bem
‫especificados na consulta, criamos uma
‫nova reserva aqui.
‫Em seguida, removemos a string de consulta da url para
‫tornar todo o processo um pouco menos transparente para
‫o usuário.
‫Basicamente, para que toda a string
‫de consulta não apareça na barra de url do nosso navegador.
‫E então aqui embaixo nós
‫redirecionamos nosso aplicativo para este novo url de rota aqui, ok?
‫E desta forma, este middleware aqui
‫será ignorado e nossa página inicial normal será simplesmente renderizada.
‫Tudo bem?
‫Vamos apenas nos livrar desse erro de
‫aplicativo aqui e da fábrica de que realmente precisaremos na próxima aula.
‫Então, na próxima aula, cuidaremos da
‫implementação de uma última parte do nosso site,
‫que basicamente é esta página para minhas reservas.
‫E o que esta página fará é basicamente exibir um cartão
‫de passeio para cada um dos passeios que reservamos.
‫Parece muito
‫semelhante a esta página inicial, mas apenas com
‫os passeios que o usuário conectado no momento reservou, certo?
‫Esse é um bom recurso para um site, certo?
‫E então vamos cuidar disso no próximo.