From ec69e0711b3b83811b62c85ed2bcf3e35bae3d17 Mon Sep 17 00:00:00 2001 From: Jeremy Quinton Date: Fri, 17 Aug 2018 14:32:30 +0200 Subject: [PATCH 1/2] Added better error handling On the completion of an order Attendize Generates a ticket and sends it via email. However if the ticket could not be generated we still attempt to send a file that does not exist which causes the checkout process to hang and throw an error message. Chained the Generate Ticket and SendOrderTickets events so that if a ticket cannot be generate we don't attempt to send it. --- app/Jobs/GenerateTicket.php | 14 ++++++++---- app/Jobs/ProcessGenerateAndSendTickets.php | 25 ++++++++++++++++++++++ app/Jobs/SendOrderNotification.php | 11 +++++++++- app/Jobs/SendOrderTickets.php | 2 +- app/Listeners/OrderCompletedListener.php | 12 +++++++---- app/Mailers/OrderMailer.php | 15 +++++++------ 6 files changed, 63 insertions(+), 16 deletions(-) create mode 100644 app/Jobs/ProcessGenerateAndSendTickets.php diff --git a/app/Jobs/GenerateTicket.php b/app/Jobs/GenerateTicket.php index e7f48d05..2464275f 100644 --- a/app/Jobs/GenerateTicket.php +++ b/app/Jobs/GenerateTicket.php @@ -74,11 +74,17 @@ class GenerateTicket extends Job implements ShouldQueue 'image' => base64_encode(file_get_contents(public_path($image_path))), 'images' => $images, ]; + try { + PDF::setOutputMode('F'); // force to file + PDF::html('Public.ViewEvent.Partials.PDFTicket', $data, $file_path); + Log::info("Ticket generated!"); + } catch(\Exception $e) { + Log::error("Error generating ticket. This can be due to permissions on vendor/nitmedia/wkhtml2pdf/src/Nitmedia/Wkhtml2pdf/lib. This folder requires write and execute permissions for the web user"); + Log::error("Error message. " . $e->getMessage()); + Log::error("Error stack trace" . $e->getTraceAsString()); + $this->fail($e); + } - PDF::setOutputMode('F'); // force to file - PDF::html('Public.ViewEvent.Partials.PDFTicket', $data, $file_path); - - Log::info("Ticket generated!"); } private function isAttendeeTicket() diff --git a/app/Jobs/ProcessGenerateAndSendTickets.php b/app/Jobs/ProcessGenerateAndSendTickets.php new file mode 100644 index 00000000..a702819e --- /dev/null +++ b/app/Jobs/ProcessGenerateAndSendTickets.php @@ -0,0 +1,25 @@ +sendOrderNotification($this->order); + try { + $orderMailer->sendOrderNotification($this->order); + } catch(\Exception $e) { + Log::error("Cannot send actual ticket to : " . $this->order->email . " as ticket file does not exist on disk"); + Log::error("Error message. " . $e->getMessage()); + Log::error("Error stack trace" . $e->getTraceAsString()); + $this->fail($e); + } + + } } diff --git a/app/Jobs/SendOrderTickets.php b/app/Jobs/SendOrderTickets.php index 18c5d07d..f26d8875 100644 --- a/app/Jobs/SendOrderTickets.php +++ b/app/Jobs/SendOrderTickets.php @@ -32,7 +32,7 @@ class SendOrderTickets extends Job implements ShouldQueue */ public function handle(OrderMailer $orderMailer) { - $this->dispatchNow(new GenerateTicket($this->order->order_reference)); + //$this->dispatchNow(new GenerateTicket($this->order->order_reference)); $orderMailer->sendOrderTickets($this->order); } } diff --git a/app/Listeners/OrderCompletedListener.php b/app/Listeners/OrderCompletedListener.php index 79a03bba..312c6726 100644 --- a/app/Listeners/OrderCompletedListener.php +++ b/app/Listeners/OrderCompletedListener.php @@ -6,6 +6,7 @@ use App\Events\OrderCompletedEvent; use App\Jobs\GenerateTicket; use App\Jobs\SendOrderNotification; use App\Jobs\SendOrderTickets; +use App\Jobs\ProcessGenerateAndSendTickets; use Illuminate\Foundation\Bus\DispatchesJobs; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Support\Facades\Log; @@ -26,7 +27,8 @@ class OrderCompletedListener implements ShouldQueue } /** - * Handle the event. + * Generate the ticket and send it to the attendee. If the ticket can't be generated don't attempt to send the ticket + * to the attendee as the ticket is attached as a PDF. * * @param OrderCompletedEvent $event * @return void @@ -37,9 +39,11 @@ class OrderCompletedListener implements ShouldQueue * Generate the PDF tickets and send notification emails etc. */ Log::info('Begin Processing Order: ' . $event->order->order_reference); - $this->dispatchNow(new GenerateTicket($event->order->order_reference)); - $this->dispatch(new SendOrderTickets($event->order)); - $this->dispatch(new SendOrderNotification($event->order)); + ProcessGenerateAndSendTickets::withChain([ + new GenerateTicket($event->order->order_reference), + new SendOrderTickets($event->order) + ])->dispatch(); + $this->dispatch(new SendOrderNotification($event->order)); } } diff --git a/app/Mailers/OrderMailer.php b/app/Mailers/OrderMailer.php index d4d28d81..bb6c5881 100644 --- a/app/Mailers/OrderMailer.php +++ b/app/Mailers/OrderMailer.php @@ -37,13 +37,16 @@ class OrderMailer 'orderService' => $orderService ]; - Mail::send('Mailers.TicketMailer.SendOrderTickets', $data, function ($message) use ($order) { + $file_name = $order->order_reference; + $file_path = public_path(config('attendize.event_pdf_tickets_path')) . '/' . $file_name . '.pdf'; + if (!file_exists($file_path)) { + Log::error("Cannot send actual ticket to : " . $order->email . " as ticket file does not exist on disk"); + return; + } + + Mail::send('Mailers.TicketMailer.SendOrderTickets', $data, function ($message) use ($order, $file_path) { $message->to($order->email); - $message->subject(trans("Controllers.tickets_for_event", ["event"=>$order->event->title])); - - $file_name = $order->order_reference; - $file_path = public_path(config('attendize.event_pdf_tickets_path')) . '/' . $file_name . '.pdf'; - + $message->subject(trans("Controllers.tickets_for_event", ["event" => $order->event->title])); $message->attach($file_path); }); From 68c82e0b34902e9d110652929346d0c4949b32da Mon Sep 17 00:00:00 2001 From: Jeremy Quinton Date: Fri, 17 Aug 2018 16:15:31 +0200 Subject: [PATCH 2/2] Moved forgetting session and where events are fired 1. After we have save the order to the database forget the session. 2. Firing events to create and send tickets should only be done after the we have saved the order to the database --- .../Controllers/EventCheckoutController.php | 21 +++++++------------ 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/app/Http/Controllers/EventCheckoutController.php b/app/Http/Controllers/EventCheckoutController.php index e9665f42..9c4a33f8 100644 --- a/app/Http/Controllers/EventCheckoutController.php +++ b/app/Http/Controllers/EventCheckoutController.php @@ -671,18 +671,6 @@ class EventCheckoutController extends Controller } } - /* - * Kill the session - */ - session()->forget('ticket_order_' . $event->id); - - /* - * Queue up some tasks - Emails to be sent, PDFs etc. - */ - Log::info('Firing the event'); - event(new OrderCompletedEvent($order)); - - } catch (Exception $e) { Log::error($e); @@ -694,8 +682,15 @@ class EventCheckoutController extends Controller ]); } - + //save the order to the database DB::commit(); + //forget the order in the session + session()->forget('ticket_order_' . $event->id); + + // Queue up some tasks - Emails to be sent, PDFs etc. + Log::info('Firing the event'); + event(new OrderCompletedEvent($order)); + if ($return_json) { return response()->json([