add success page (#27)

Reviewed-on: #27
This commit is contained in:
2025-02-23 16:39:02 +00:00
parent 74ff5a23e0
commit 0000a75490
5 changed files with 170 additions and 34 deletions

View File

@ -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');
}
}

View File

@ -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,
) {
}
@ -33,31 +34,14 @@ 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
#[Route(path: '/calendar', name: 'app_calendar')]
public function calendar(Request $request): Response
{
$sessionId = $request->query->get('session_id');
$userAgent = $request->headers->get('User-Agent');
$isApple = str_contains($userAgent, 'Mac') || str_contains($userAgent, 'iPhone') || str_contains($userAgent, 'iPad');
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');
return $isApple
? $this->eventService->generateIcs()
: $this->eventService->generateGoogleRedirect();
}
}

View File

@ -0,0 +1,50 @@
<?php
declare(strict_types=1);
namespace App\Service;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Response;
class EventService
{
private const EVENT_DATA = [
'title' => 'Abiball 2025',
'description' => 'Der Abiball der Freien Waldorfschule Bremen Osterholz und Touler Straße',
'location' => 'Graubündener Str. 4, 28325 Bremen',
'start' => '20250628T173000',
'end' => '20250629T030000',
];
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'],
]));
}
}