From b50b2e0a622732cedb546451143376dd986b5151 Mon Sep 17 00:00:00 2001 From: Constantin Simonis Date: Sat, 22 Feb 2025 17:55:37 +0100 Subject: [PATCH 1/4] add success page --- .ddev/commands/host/cf | 3 ++ src/Controller/TicketController.php | 14 ++++++- src/Service/EventService.php | 50 +++++++++++++++++++++++ templates/ticket/success.html.twig | 62 ++++++++++++++++++++++++++--- 4 files changed, 122 insertions(+), 7 deletions(-) create mode 100755 .ddev/commands/host/cf create mode 100644 src/Service/EventService.php diff --git a/.ddev/commands/host/cf b/.ddev/commands/host/cf new file mode 100755 index 0000000..322ee28 --- /dev/null +++ b/.ddev/commands/host/cf @@ -0,0 +1,3 @@ +#!/bin/bash + +cloudflared tunnel --url "https://127.0.0.1/$DDEV_HOST_HTTPS_PORT" --http-host-header "$DDEV_SITENAME.$DDEV_TLD" diff --git a/src/Controller/TicketController.php b/src/Controller/TicketController.php index 50bf39e..2d5cca8 100644 --- a/src/Controller/TicketController.php +++ b/src/Controller/TicketController.php @@ -3,8 +3,8 @@ namespace App\Controller; use App\DataObjects\TicketFormData; +use App\Service\EventService; use App\Service\TicketService; -use Stripe\Stripe; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; @@ -16,6 +16,7 @@ final class TicketController extends AbstractController public function __construct( private TicketService $service, private SerializerInterface $serializer, + private EventService $eventService, ) { } @@ -60,4 +61,15 @@ final class TicketController extends AbstractController return $this->redirectToRoute('app_ticket'); } + + #[Route('/calendar', name: 'app_calendar')] + public function calendar(Request $request): Response + { + $userAgent = $request->headers->get('User-Agent'); + $isApple = str_contains($userAgent, 'Mac') || str_contains($userAgent, 'iPhone') || str_contains($userAgent, 'iPad'); + + return $isApple + ? $this->eventService->generateIcs() + : $this->eventService->generateGoogleRedirect(); + } } diff --git a/src/Service/EventService.php b/src/Service/EventService.php new file mode 100644 index 0000000..1ac0708 --- /dev/null +++ b/src/Service/EventService.php @@ -0,0 +1,50 @@ + 'FWS Abiball', + 'description' => 'Der Abiball der Freien Waldorfschule Bremen Osterholz und Touler Straße', + 'location' => 'Graubünder Straße 2, 28209 Bremen', + 'start' => '20240615T180000', + 'end' => '20240615T220000', + ]; + + public function generateIcs(): Response + { + $data = [ + 'BEGIN:VCALENDAR', + 'VERSION:2.0', + 'BEGIN:VEVENT', + 'DTSTART:' . self::EVENT_DATA['start'], + 'DTEND:' . self::EVENT_DATA['end'], + 'SUMMARY:' . self::EVENT_DATA['title'], + 'DESCRIPTION:' . self::EVENT_DATA['description'], + 'LOCATION:' . self::EVENT_DATA['location'], + 'END:VEVENT', + 'END:VCALENDAR' + ]; + + return new Response(implode("\r\n", $data), headers: [ + 'Content-Type' => 'text/calendar; charset=utf-8', + 'Content-Disposition' => 'attachment; filename="event.ics"' + ]); + } + + public function generateGoogleRedirect(): Response + { + return new RedirectResponse('https://calendar.google.com/calendar/render?' . http_build_query([ + 'action' => 'TEMPLATE', + 'text' => self::EVENT_DATA['title'], + 'dates' => self::EVENT_DATA['start'] . '/' . self::EVENT_DATA['end'], + 'details' => self::EVENT_DATA['description'], + 'location' => self::EVENT_DATA['location'], + ])); + } +} \ No newline at end of file diff --git a/templates/ticket/success.html.twig b/templates/ticket/success.html.twig index eb38a9a..8f657cc 100644 --- a/templates/ticket/success.html.twig +++ b/templates/ticket/success.html.twig @@ -1,16 +1,66 @@ {% extends 'base.html.twig' %} {% block title %} -Success +Danke {% endblock %} {% block body %} -
-
-
-

Success

-

Your ticket has been successfully created.

+
+
+ +
+ +
+
+
+
+ +
+

Vielen Dank für deine Bestellung!

+

Wir freuen uns, dich bei der Veranstaltung begrüßen zu dürfen.

+
+ +
+

Veranstaltungsdetails

+
+
+ +

[Datum]

+
+
+ +

[Uhrzeit]

+
+
+ +

[Adresse]

+
+
+ + +
+ + +
+
{% endblock %} -- 2.47.2 From b4073c73f148d6f2c9fa3e4b7073986dd54d668c Mon Sep 17 00:00:00 2001 From: Constantin Simonis Date: Sun, 23 Feb 2025 17:13:40 +0100 Subject: [PATCH 2/4] restyle success page --- templates/ticket/success.html.twig | 76 ++++++++++++++++++++---------- 1 file changed, 52 insertions(+), 24 deletions(-) diff --git a/templates/ticket/success.html.twig b/templates/ticket/success.html.twig index 8f657cc..fb2ecbf 100644 --- a/templates/ticket/success.html.twig +++ b/templates/ticket/success.html.twig @@ -19,48 +19,76 @@ Danke
-
+

Vielen Dank für deine Bestellung!

-

Wir freuen uns, dich bei der Veranstaltung begrüßen zu dürfen.

+

Wir freuen uns, dich beim Abiball zu sehen.

-
-

Veranstaltungsdetails

-
-
- -

[Datum]

-
-
- -

[Uhrzeit]

-
-
- -

[Adresse]

+
+
+

Veranstaltungsdetails

+
+
+
+ +

Sa. 28.06.2025

+
+
+ +

17:30 - Open End

+
+
+ +

Graubündener Str. 4, 28325 Bremen

+
+
+ +

Abendkleidung

+
+
-
+
+

Ablauf

+
+
+
+ + 17:30-19:30 + Einlass & Platznehmen +
+
+ + 19:30-22:00 + Dinner & Beisammensein +
+
+ + ab 22:00 + Feier & Tanz im Saal +
+
+
+
+
+ + -
+
- - -
-
{% endblock %} -- 2.47.2 From a7b7fb4b3219d43c36963503c46d544c1e9e1090 Mon Sep 17 00:00:00 2001 From: Constantin Simonis Date: Sun, 23 Feb 2025 17:19:17 +0100 Subject: [PATCH 3/4] refactor --- src/Controller/SuccessController.php | 27 ++++++++++++++++++++++--- src/Controller/TicketController.php | 30 +--------------------------- 2 files changed, 25 insertions(+), 32 deletions(-) diff --git a/src/Controller/SuccessController.php b/src/Controller/SuccessController.php index ebb7804..dc4d8b6 100644 --- a/src/Controller/SuccessController.php +++ b/src/Controller/SuccessController.php @@ -10,11 +10,32 @@ use Symfony\Component\Routing\Attribute\Route; class SuccessController extends AbstractController { - #[Route(path: '/success', name: 'app_success_page', methods: Request::METHOD_GET)] - public function __invoke(TicketService $service, Request $request): Response + #[Route(path: '/success', name: 'app_order_success', methods: Request::METHOD_GET)] + public function success(Request $request, TicketService $service): Response { - $service->completePayment((string)$request->query->get('session_id')); + $sessionId = $request->query->get('session_id'); + + if (!$sessionId) { + noty()->error('Etwas ist schiefgelaufen'); + + return $this->redirectToRoute('app_ticket'); + } + + if (!$service->completePayment($sessionId)) { + noty()->error('Etwas ist schiefgelaufen'); + + return $this->redirectToRoute('app_ticket'); + } return $this->render('ticket/success.html.twig'); } + + #[Route(path: '/cancelled', name: 'app_cancelled', methods: Request::METHOD_GET)] + public function cancel(): Response + { + noty()->error('Bezahlung abgebrochen'); + + return $this->redirectToRoute('app_ticket'); + } + } \ No newline at end of file diff --git a/src/Controller/TicketController.php b/src/Controller/TicketController.php index 2d5cca8..e531cd5 100644 --- a/src/Controller/TicketController.php +++ b/src/Controller/TicketController.php @@ -34,35 +34,7 @@ final class TicketController extends AbstractController return $this->json(['id' => $this->service->handleTicketData($ticketData)->id]); } - #[Route(path: '/success', name: 'app_order_success', methods: Request::METHOD_GET)] - public function success(Request $request): Response - { - $sessionId = $request->query->get('session_id'); - - if (!$sessionId) { - noty()->error('Etwas ist schiefgelaufen'); - - return $this->redirectToRoute('app_ticket'); - } - - if (!$this->service->completePayment($sessionId)) { - noty()->error('Etwas ist schiefgelaufen'); - - return $this->redirectToRoute('app_ticket'); - } - - return $this->redirectToRoute('app_success_page'); - } - - #[Route(path: '/cancelled', name: 'app_cancelled', methods: Request::METHOD_GET)] - public function cancel(): Response - { - noty()->error('Bezahlung abgebrochen'); - - return $this->redirectToRoute('app_ticket'); - } - - #[Route('/calendar', name: 'app_calendar')] + #[Route(path: '/calendar', name: 'app_calendar')] public function calendar(Request $request): Response { $userAgent = $request->headers->get('User-Agent'); -- 2.47.2 From 5e7a7e8f507cf6c45870db86e777fbff3a908ee3 Mon Sep 17 00:00:00 2001 From: Constantin Simonis Date: Sun, 23 Feb 2025 17:33:03 +0100 Subject: [PATCH 4/4] adjust event details --- src/Service/EventService.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Service/EventService.php b/src/Service/EventService.php index 1ac0708..9ecf3ce 100644 --- a/src/Service/EventService.php +++ b/src/Service/EventService.php @@ -9,11 +9,11 @@ use Symfony\Component\HttpFoundation\Response; class EventService { private const EVENT_DATA = [ - 'title' => 'FWS Abiball', + 'title' => 'Abiball 2025', 'description' => 'Der Abiball der Freien Waldorfschule Bremen Osterholz und Touler Straße', - 'location' => 'Graubünder Straße 2, 28209 Bremen', - 'start' => '20240615T180000', - 'end' => '20240615T220000', + 'location' => 'Graubündener Str. 4, 28325 Bremen', + 'start' => '20250628T173000', + 'end' => '20250629T030000', ]; public function generateIcs(): Response -- 2.47.2