‫-: Gut.
‫Lassen Sie uns nun ein neues Buchungsdokument in unserer Datenbank
‫erstellen, wenn ein Benutzer erfolgreich eine Tour kauft.
‫Wir sind also wieder hier
‫im Buchungscontroller und
‫in der Rohausschreibung, die die Checkout-Sitzungen erstellt, oder?
‫Und denken Sie daran, dass wir hier diese Erfolgs-URL haben
‫und diese URL die Grundlage der Funktionalität ist, die
‫wir in dieser Vorlesung implementieren werden.
‫Wenn ein Check-out also erfolgreich
‫ist, wird der Browser automatisch auf diese URL gehen,
‫die im Moment im Grunde einfach unsere Homepage ist, oder?
‫Es ist auch zu diesem Zeitpunkt,
‫also wenn ein Checkout erfolgreich ist, möchten wir eine
‫neue Buchung erstellen, oder?
‫Im Grunde wollen wir also immer dann eine
‫neue Buchung erstellen, wenn auf diese URL hier zugegriffen wird.
‫Nun könnten wir für diesen Erfolg nun eine neue Route erstellen,
‫aber dann müssten wir eine ganz neue Seite erstellen und
‫das lohnt sich in diesem Fall nicht wirklich.
‫Und das liegt daran, dass das, was wir in diesem
‫Vortrag machen werden, sowieso nur eine
‫Übergangslösung ist, weil es nicht wirklich sicher ist, okay?
‫Denken Sie also daran, wie wir vor
‫einigen Vorträgen gesagt haben, und dieses schöne Diagramm, dass
‫wir später, wenn eine Website tatsächlich auf einem Server bereitgestellt
‫wird, Zugriff auf das Sitzungsobjekt erhalten, sobald der Kauf
‫mit Stripe Webhooks abgeschlossen ist.
‫Und so sind diese Webhooks dann perfekt für uns,
‫um eine neue Buchung zu erstellen.
‫Okay?
‫Da dies jedoch noch nicht möglich
‫ist, verwenden wir vorerst
‫einen Workaround, der darin besteht, die Daten, die wir zum
‫Erstellen einer neuen Buchung benötigen, direkt als Abfragezeichenfolge in diese URL einzufügen.
‫Okay?
‫Und wir müssen eine Abfragezeichenfolge erstellen, da
‫Stripe hier nur eine Get-Anforderung an diese URL sendet
‫und wir daher außer der Abfragezeichenfolge keinen Text oder
‫andere Daten damit senden können.
‫Gut?
‫Also machen wir das und was wir hier brauchen sind
‫im Grunde die drei Pflichtfelder in unserem Buchungsmodell.
‫Also Tour,
‫Benutzer und Preis.
‫Tour ist
‫also gleich req.
‫Parameter.
‫touristisch richtig?
‫Was habe ich also hier gemacht?
‫Das ist also richtig.
‫Als nächstes brauchen wir den Benutzer.
‫Also User, das ist auf
‫Anfrage. Nutzer. Ich würde.
‫Und zum Schluss brauchen wir noch
‫den Preis,
‫der bei Tour steht. Preis.
‫Gut.
‫Nun, wie ich schon
‫sagte, das ist natürlich
‫überhaupt nicht sicher, denn
‫im Moment könnte jeder, der diese URL-Struktur hier
‫kennt, einfach aufrufen, ohne den Checkout-Prozess zu durchlaufen, oder?
‫Und so konnte wirklich jeder
‫einfach eine Tour buchen, ohne bezahlen zu müssen.
‫Sie müssten nur diese URL mit Tour, Benutzer
‫und Preis öffnen und dann
‫würden sie automatisch eine neue Buchung erstellen, ohne
‫zu bezahlen, okay?
‫Also wieder nicht wirklich sicher, aber
‫im Moment funktioniert
‫es gut, weil nicht viele Leute wissen,
‫dass dies unsere Erfolgs-URL ist.
‫Okay?
‫Denn eigentlich werden wir diese Tatsache
‫gleich ein bisschen verbergen, okay?
‫Lassen Sie uns nun die Funktion erstellen, die die neue Buchung tatsächlich in
‫der Datenbank erstellt.
‫Das wird also zum Exportieren von Dot
‫Create Booking Checkout und
‫es wird Create Booking Checkout genannt, da wir später
‫auch eine Buchung erstellen
‫haben, auf die dann über
‫unsere Buchungs-API zugegriffen
‫werden
‫kann.
‫Gut.
‫Trotzdem.
‫Hier wie immer.
‫Beginnen wir damit, unsere Daten aus der Abfragezeichenfolge abzurufen.
‫Und dafür werde ich die Strukturierung verwenden.
‫Tour,
‫Benutzer und
‫Preis sind daher auf Anfrage erhältlich. Anfrage.
‫Denken Sie also daran, dass dies die Abfragezeichenfolge ist.
‫Dann wollen wir eigentlich nur dann eine
‫neue Buchung anlegen, wenn all diese hier angegeben sind.
‫Im Grunde sagen wir also, dass wir uns umdrehen und zur nächsten Middleware
‫übergehen, wenn sie nicht existieren.
‫Das ist also unser ganz normales Verfahren, oder?
‫Also sagen wir das,
‫wenn es
‫keine Tour und keinen Benutzer
‫und keinen Preis gibt.
‫Im Grunde verlangen wir also, dass alle auf ihnen existieren.
‫In diesem Fall gehen wir also zur
‫nächsten Middleware.
‫Was genau ist nun eigentlich die nächste Middleware?
‫Denken Sie daran,
‫dass wir eine neue Buchung für diese Home-URL erstellen möchten.
‫Also dieser hier.
‫Denn auch das ist die URL,
‫die aufgerufen wird, wenn ein Kauf bei Stripe erfolgreich ist.
‫Was wir also tun müssen, ist diese Middleware-Funktion, die wir
‫gerade erstellen, zum Middleware-Stack dieses
‫Route-Handlers hinzuzufügen.
‫Was ist das denn für ein Routenhandler?
‫Nun, es ist in Sichtrouten und
‫es ist diese, oder?
‫Das klingt also wahrscheinlich etwas verwirrend.
‫Aber auch hier wird
‫der Weg eingeschlagen, wenn eine Kreditkarte erfolgreich belastet wird.
‫Dies ist also auch der Zeitpunkt, an dem wir eine neue Buchung
‫erstellen möchten.
‫Und hier müssen wir diese Middleware-Funktion
‫hinzufügen, also lassen Sie uns das tatsächlich tun und
‫unseren Controller benötigen, und jetzt
‫werden wir dies hier einfach duplizieren.
‫Also Buchungscontroller und jetzt
‫werde ich hier gleich zu Beginn editieren, da es eigentlich egal ist,
‫ob wir dafür eingeloggt sind oder nicht.
‫Also Buchungscontroller. Holen Sie sich, oder
‫erstellen Sie die
‫Buchungskasse.
‫Speichern Sie es
‫und okay.
‫Und auch hier ist dies nur vorübergehend,
‫bis wir unsere Websites tatsächlich auf einem
‫Server bereitgestellt haben,
‫auf dem wir dann eine bessere Lösung dafür erstellen können.
‫Okay?
‫Hier im Buchungscontroller ist es nun
‫an der Zeit, diese neue Buchung tatsächlich zu erstellen.
‫Und so müssen wir dieses Modell jetzt eigentlich importieren.
‫Also machen wir das hier.
‫Buchung
‫und Buchungsmodell auch hier.
‫Und aus irgendeinem Grund habe ich hier diesen seltsamen Weg.
‫Diese machen also überhaupt keinen Sinn.
‫Ich bin mir nicht sicher, warum ich sie damals so geschrieben habe.
‫Also, was wir dort haben, ist genau das gleiche.
‫Aber das ist natürlich besser lesbar.
‫Trotzdem.
‫Lassen Sie uns nun diese Buchung erstellen.
‫Dafür müssen wir also auf
‫die Buchung warten. mit einem
‫Tour-,
‫Benutzer- und Preisobjekt erstellen.
‫Und das ist es.
‫Jetzt müssen wir auch diesen
‫hier als async und als immer
‫catchasync markieren.
‫Okay?
‫Und wir speichern das nicht
‫in irgendeiner Variablen, weil wir es nicht wirklich brauchen.
‫Wir werden dies nicht als API-Antwort zurücksenden.
‫An dieser Stelle wollen wir hier nur das
‫neue Dokument erstellen, okay?
‫Als nächstes
‫könnten wir dann so weiter sagen.
‫Und damit würde dann die
‫nächste Middleware gehen aber das ist nicht wirklich optimal.
‫Denken Sie also wieder daran, dass die nächste
‫Middleware im Stack natürlich diese ist
‫und die Übersicht erhalten.
‫Also im Grunde die
‫Funktion, die unsere Seite rendern wird.
‫Aber denken Sie daran, dass diese URL all das ist.
‫Das alles mit all diesen Daten hier.
‫Das ist also wieder überhaupt nicht sicher.
‫Also machen wir es
‫wenigstens ein bisschen sicherer, in Ordnung?
‫Was wir
‫hier also tun können, ist, die Anwendung jetzt im
‫Grunde nur auf diese URL umzuleiten.
‫Im Grunde entfernen Sie
‫also die Abfragezeichenfolge aus der ursprünglichen URL.
‫Und so werden wir
‫jetzt tatsächlich etwas verwenden, das wir noch nie zuvor verwendet haben.
‫Das ist also großartig, oder?
‫Also werden wir die Weiterleitung verwenden.
‫Gut?
‫Jetzt wollen wir
‫also die gesamte URL, aber ohne die Abfragezeichenfolge.
‫Was wir also tun
‫könnten, ist, einfach
‫zu betrügen und dies hier zu kopieren.
‫Aber machen wir es etwas eleganter.
‫Was wir also tun, ist eine Anfrage. theoriginalurl, die wir bereits zuvor
‫verwendet haben.
‫Und das ist im Grunde die
‫gesamte URL, von der die Anfrage kam.
‫Und jetzt
‫müssen wir es durch das Fragezeichen aufteilen.
‫Richtig?
‫Denn das ist die Trennlinie zwischen dem Teil, den
‫wir tatsächlich wollen, und der Abfragezeichenfolge.
‫Wenn wir dies also durch das Fragezeichen aufteilen,
‫haben wir ein Array, in dem das
‫erste Element dies ist und das zweite Element der Rest ist.
‫Also die Abfragezeichenfolge selbst.
‫Und so
‫nehmen wir hier das erste Element und das ist dann unsere Homepage.
‫Also unsere Routen-URL.
‫Und was die Weiterleitung hier macht, ist im Grunde eine neue Anfrage zu
‫erstellen, aber zu dieser neuen URL, die wir dort eingegeben haben.
‫Gut?
‫Dadurch wird nun eine
‫weitere Anfrage an unsere Routen-URL erstellt.
‫Also werden wir diesen Weg wieder einschlagen.
‫Und so werden wir hier noch einmal auf diese Middleware treffen.
‫Also die, die wir gerade erstellen.
‫Wir werden also zum zweiten Mal darauf eingehen, aber jetzt sind Tour, Benutzer und Preis
‫nicht mehr definiert.
‫Und dann gehen wir zur nächsten Middleware, das
‫ist schließlich die
‫Get Overview Handler-Funktion, die dann nur die Homepage rendern, okay?
‫Machte Sinn?
‫Das ist also eine Art Rundschreiben.
‫Also im Grunde werden
‫wir am Anfang diesen Weg hier einschlagen.
‫Dann wird hier eine
‫neue Buchung angelegt und wir leiten die Anwendung
‫wieder auf diese Route um, diesmal ohne den Abfragestring.
‫Und so
‫gingen wir ohne den Abfragestring und diese
‫Middleware direkt zum nächsten über.
‫Und so kommen wir
‫erst dann an, eingeloggt zu sein und Übersicht zu bekommen.
‫Gut?
‫Und das war's dann eigentlich, in Ordnung?
‫Nun, das ist hier genau richtig,
‫dass dies nur vorübergehend ist,
‫weil es unsicher ist.
‫Jeder kann buchen, ohne zu
‫bezahlen.
‫Das wäre also wiederum schrecklich für das Geschäft.
‫Okay, jetzt ist es Zeit, das auszuprobieren.
‫Und eigentlich möchte ich es mit dem anderen Benutzer machen, den wir erstellt
‫haben, nämlich jonas@mailsac.
‫Und das liegt
‫daran, dass ich sehen möchte, ob wir diese E-Mail-Bestätigung tatsächlich von Stripe erhalten.
‫Loggen wir
‫uns also mit diesem Benutzer auf unserer Website ein.
‫Loggen
‫Sie sich also aus.
‫Nun, das funktioniert nicht.
‫Das ist seltsam.
‫Lass uns neu laden.
‫Und das sollte funktionieren, also schauen wir mal, ob wir einen Fehler in
‫unserem Javascript haben.
‫Denn das ist tatsächlich kundenorientiert und wir bekommen
‫Stripe nicht definiert.
‫Mal sehen, ob wir hier auf dieser Seite den gleichen
‫Fehler haben, was wir nicht sollten, oder?
‫Und eigentlich
‫ist es nicht da, sondern auf allen Touren wieder da.
‫Ja, es ist da.
‫Die Lösung dafür besteht also darin, es
‫von der Tour im Grunde auf alle Seiten zu verschieben.
‫Gut?
‫Aus irgendeinem Grund macht es der
‫Paketbündeler so, dass er für alle hier im Hauptumfang
‫enthalten sein muss.
‫Also für alle Seiten, okay?
‫Also lasst uns das hier vor unserem Bundle
‫ganz unten setzen.
‫Gut?
‫Versuchen Sie es noch einmal und jetzt können wir loslegen.
‫Also
‫abmelden und das hat geklappt.
‫Melden Sie sich jetzt an.
‫Jetzt ist unser Exemplar natürlich weg.
‫Eins zwei drei vier.
‫Nein, das ist nicht richtig.
‫Testen Sie eins zwei drei vier.
‫Also habe ich das Passwort wohl irgendwann geändert, also versuchen wir es
‫mit einem neuen
‫Passwort, das auch nicht funktioniert.
‫Lassen Sie uns versuchen, eins zwei drei vier zu bestehen
‫und das hat funktioniert.
‫Also nicht eins zwei drei vier
‫testen, sondern eins zwei drei vier bestehen.
‫Zumindest hier in meinem Fall.
‫Versuchen wir also, den Sportliebhaber
‫zu buchen.
‫Gut.
‫Hier unten.
‫Tour buchen und das funktioniert
‫immer noch und das ist
‫das teuere.
‫(lacht) Also vier zwei vier zwei und
‫dann vier zwei bis
‫zum Ende.
‫Dann ist hier ein Monat und hier ist eine Zahl.
‫Sagen wir meinen ganzen
‫Namen hier und jetzt lass uns bezahlen.
‫Und ich schaue mir die URL-Leiste an.
‫Und tatsächlich erhalten
‫wir unsere Homepage, also unsere Routen-URL, ohne den zuvor angegebenen Abfragestring.
‫Das bedeutet also, dass etwas funktioniert.
‫Werfen wir also einen Blick auf den Kompass und klicken Sie hier, um
‫neu zu laden, und wir erhalten unsere Buchungssammlung.
‫Und das ist ein gutes Zeichen.
‫Und tatsächlich geht es los.
‫Unser allererstes Dokument wird erstellt.
‫Denken Sie also daran, dass das dieser Preis war.
‫Werfen wir auch einen Blick auf
‫die Benutzer-ID, die auf acht E drei B endet.
‫Also acht E drei B, das ist richtig.
‫Und ich gehe davon aus, dass die Tour auch richtig sein wird.
‫So perfekt.
‫Das hat auch funktioniert und so haben wir jetzt
‫wirklich eine Möglichkeit, Buchungen zu
‫erstellen, wenn eine Buchung mit Stripe stattfindet.
‫Schauen wir uns auch hier noch einmal schnell unsere Dashboards an.
‫Das macht richtig Spaß.
‫Und ich glaube, ich muss hier einfach neu laden.
‫Also mal sehen.
‫Hier ist Jonas bei wie auch immer wir das heißen.
‫Wir haben
‫den
‫Sportliebhaber und perfekt.
‫Das funktioniert jetzt.
‫Und die letzte Aufgabe.
‫Schauen wir uns nun mailsac an.
‫Postsack.
‫com und sehen Sie, ob ich
‫dort meine E-Mail habe.
‫Und nun, eigentlich habe ich das nicht getan,
‫aber das ist keine große Sache.
‫Ich bin mir nicht sicher, vielleicht funktioniert es einfach nicht mit Testdaten.
‫Das ist alles, was ich
‫Ihnen über die Stripe-Integration zu zeigen habe.
‫Auch
‫hier werden wir nach der Bereitstellung einer Website
‫tatsächlich Stripe Webhooks
‫verwenden, um Buchungen sicherer und viel besser zu erstellen.
‫Gut?
‫Nehmen wir uns also noch einmal eine Minute Zeit, um zusammenzufassen, was wir hier gemacht haben.
‫Im Grunde haben wir
‫also alle Variablen, die wir zum Erstellen
‫einer neuen Buchung benötigen, zur Erfolgs-URL hinzugefügt.
‫Dann haben wir hier dem Stack
‫genau dieser Route eine neue Middleware-Funktion hinzugefügt.
‫Also dieser hier.
‫Auf diese Weise
‫versuchen wir immer, wenn diese URL hier erreicht wird, eine neue Buchung zu erstellen.
‫Gut?
‫Aber diese neue Buchung wird natürlich erst angelegt, wenn Tour, Benutzer und Preis
‫in der Abfrage angegeben sind.
‫Wenn sie also in dieser Middleware-Funktion gut in der Abfrage
‫angegeben sind, erstellen wir hier
‫eine neue Buchung.
‫Danach entfernen wir die Abfragezeichenfolge aus der URL, um den
‫gesamten Prozess für den Benutzer etwas weniger transparent
‫zu machen.
‫Grundsätzlich, damit die gesamte Abfragezeichenfolge
‫nicht in der URL-Leiste unseres Browsers angezeigt wird.
‫Und dann hier unten
‫leiten wir unsere Bewerbung an diese neue Routen-URL weiter, okay?
‫Auf diese Weise wird also diese Middleware
‫hier übersprungen und dann wird unsere normale Homepage einfach gerendert.
‫Gut?
‫Lassen Sie uns diesen App-Fehler hier einfach loswerden
‫und die Fabrik, die wir in der nächsten Vorlesung tatsächlich brauchen werden.
‫In diesem nächsten Vortrag werden wir uns
‫also tatsächlich um die Umsetzung eines letzten Teils unserer Website kümmern,
‫der im Grunde diese Seite hier für meine Buchungen ist.
‫Und diese Seite zeigt im Grunde eine Tourkarte für
‫jede der von uns gebuchten Touren an.
‫Sieht dieser
‫Homepage also ziemlich ähnlich, aber nur mit den
‫Touren, die der aktuell eingeloggte Benutzer gebucht hat, in Ordnung?
‫Das ist also ein nettes Feature für eine Website, oder?
‫Und darum kümmern wir uns im nächsten.