Refactoring & updating of jobs and mailers.

This commit is contained in:
Dave Earley 2016-06-15 11:14:27 +01:00
parent 3d67a8b4a3
commit 140cc130a8
16 changed files with 399 additions and 165 deletions

View File

@ -1,34 +0,0 @@
<?php
namespace App\Commands;
use App\Mailers\AttendeeMailer;
use Illuminate\Contracts\Bus\SelfHandling;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Log;
class MessageAttendeesCommand extends Command implements ShouldQueue, SelfHandling
{
use InteractsWithQueue,
SerializesModels;
public $attendeeMessage;
public function __construct(\App\Models\Message $attendeeMessage)
{
$this->attendeeMessage = $attendeeMessage;
}
public function handle(AttendeeMailer $mailer)
{
Log::info(date('d m y H:i')." - Starting Job {$this->job->getJobId()} ".__CLASS__);
$mailer->sendMessageToAttendees($this->attendeeMessage);
Log::info(date('d m y H:i')." - Finished Job {$this->job->getJobId()} ".__CLASS__);
$this->delete();
}
}

View File

@ -0,0 +1,34 @@
<?php
namespace App\Events;
use App\Events\Event;
use App\Models\Order;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
class OrderCompletedEvent extends Event
{
use SerializesModels;
public $order;
/**
* OrderCompletedEvent constructor.
* @param Order $order
*/
public function __construct(Order $order)
{
$this->order = $order;
}
/**
* Get the channels the event should be broadcast on.
*
* @return array
*/
public function broadcastOn()
{
return [];
}
}

View File

@ -2,9 +2,10 @@
namespace App\Http\Controllers;
use App\Mailers\TicketMailer;
use App\Jobs\SendAttendeeInvite;
use App\Jobs\SendAttendeeTicket;
use App\Jobs\SendMessageToAttendees;
use App\Jobs\GenerateTicket;
use App\Commands\MessageAttendeesCommand;
use App\Models\Attendee;
use App\Models\Event;
use App\Models\EventStats;
@ -191,10 +192,9 @@ class EventAttendeesController extends MyBaseController
$attendee->reference_index = 1;
$attendee->save();
$this->dispatch(new GenerateTicket($order->order_reference."-".$attendee->reference_index));
if ($email_attendee == '1') {
TicketMailer::sendAttendeeInvite($attendee);
$this->dispatch(new SendAttendeeInvite($attendee));
}
session()->flash('message', 'Attendee Successfully Invited');
@ -346,9 +346,8 @@ class EventAttendeesController extends MyBaseController
$attendee->reference_index = 1;
$attendee->save();
$this->dispatch(new GenerateTicket($attendee->getReferenceAttribute()));
if ($email_attendee == '1') {
TicketMailer::sendAttendeeInvite($attendee);
$this->dispatch(new SendAttendeeInvite($attendee));
}
}
};
@ -431,6 +430,7 @@ class EventAttendeesController extends MyBaseController
'email_logo' => $attendee->event->organiser->full_logo_path,
];
//@todo move this to the SendAttendeeMessage Job
Mail::send('Emails.messageAttendees', $data, function ($message) use ($attendee, $data) {
$message->to($attendee->email, $attendee->full_name)
->from(config('attendize.outgoing_email_noreply'), $attendee->event->organiser->name)
@ -497,13 +497,14 @@ class EventAttendeesController extends MyBaseController
$message = Message::createNew();
$message->message = $request->get('message');
$message->subject = $request->get('subject');
if ($request->get('recipients') != "all") {
$message->recipients = $request->get('recipients');
}
$message->recipients = ($request->get('recipients') == 'all') ? 'all' : $request->get('recipients');
$message->event_id = $event_id;
$message->save();
$this->dispatch(new MessageAttendeesCommand($message));
/*
* Queue the emails
*/
$this->dispatch(new SendMessageToAttendees($message));
return response()->json([
'status' => 'success',
@ -755,8 +756,7 @@ class EventAttendeesController extends MyBaseController
{
$attendee = Attendee::scope()->findOrFail($attendee_id);
$this->dispatch(new GenerateTicket($attendee->getReferenceAttribute()));
TicketMailer::sendAttendeeTicket($attendee);
$this->dispatch(new SendAttendeeTicket($attendee));
return response()->json([
'status' => 'success',

View File

@ -2,8 +2,7 @@
namespace App\Http\Controllers;
use App\Jobs\GenerateTicket;
use App\Mailers\TicketMailer;
use App\Events\OrderCompletedEvent;
use App\Models\Affiliate;
use App\Models\Attendee;
use App\Models\Event;
@ -351,7 +350,8 @@ class EventCheckoutController extends Controller
if ($response->isSuccessful()) {
session()->push('ticket_order_' . $event_id . '.transaction_id', $response->getTransactionReference());
session()->push('ticket_order_' . $event_id . '.transaction_id',
$response->getTransactionReference());
return $this->completeOrder($event_id);
@ -605,9 +605,8 @@ class EventCheckoutController extends Controller
/*
* Queue up some tasks - Emails to be sent, PDFs etc.
*/
$this->dispatch(new GenerateTicket($order->order_reference));
TicketMailer::sendOrderTickets($order);
Log::info('Firiing the event');
event(new OrderCompletedEvent($order));
} catch (Exception $e) {

View File

@ -0,0 +1,38 @@
<?php
namespace App\Jobs;
use App\Jobs\Job;
use App\Mailers\AttendeeMailer;
use App\Mailers\TicketMailer;
use App\Models\Attendee;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
class SendAttendeeInvite extends Job implements ShouldQueue
{
use InteractsWithQueue, SerializesModels;
public $attendee;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct(Attendee $attendee)
{
$this->attendee = $attendee;
}
/**
* Execute the job.
*
* @return void
*/
public function handle(AttendeeMailer $attendeeMailer)
{
$attendeeMailer->sendAttendeeInvite($this->attendee);
}
}

View File

@ -0,0 +1,38 @@
<?php
namespace App\Jobs;
use App\Jobs\Job;
use App\Mailers\AttendeeMailer;
use App\Mailers\TicketMailer;
use App\Models\Attendee;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
class SendAttendeeTicket extends Job implements ShouldQueue
{
use InteractsWithQueue, SerializesModels;
public $attendee;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct(Attendee $attendee)
{
$this->attendee = $attendee;
}
/**
* Execute the job.
*
* @return void
*/
public function handle(AttendeeMailer $attendeeMailer)
{
$attendeeMailer->sendAttendeeTicket($this->attendee);
}
}

View File

@ -0,0 +1,33 @@
<?php
namespace App\Jobs;
use App\Jobs\Job;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
class SendMessageToAttendee extends Job implements ShouldQueue
{
use InteractsWithQueue, SerializesModels;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
//
}
}

View File

@ -0,0 +1,38 @@
<?php
namespace App\Jobs;
use App\Jobs\Job;
use App\Mailers\AttendeeMailer;
use App\Models\Message;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Log;
class SendMessageToAttendees extends Job implements ShouldQueue
{
use InteractsWithQueue, SerializesModels;
public $attendeeMessage;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct(Message $attendeeMessage)
{
$this->attendeeMessage = $attendeeMessage;
}
/**
* Execute the job.
*
* @return void
*/
public function handle(AttendeeMailer $attendeeMailer)
{
$attendeeMailer->sendMessageToAttendees($this->attendeeMessage);
}
}

View File

@ -0,0 +1,37 @@
<?php
namespace App\Jobs;
use App\Jobs\Job;
use App\Mailers\OrderMailer;
use App\Models\Order;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
class SendOrderNotification extends Job implements ShouldQueue
{
use InteractsWithQueue, SerializesModels;
public $order;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct(Order $order)
{
$this->order = $order;
}
/**
* Execute the job.
*
* @return void
*/
public function handle(OrderMailer $orderMailer)
{
$orderMailer->sendOrderNotification($this->order);
}
}

View File

@ -0,0 +1,37 @@
<?php
namespace App\Jobs;
use App\Jobs\Job;
use App\Mailers\OrderMailer;
use App\Models\Order;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
class SendOrderTickets extends Job implements ShouldQueue
{
use InteractsWithQueue, SerializesModels;
public $order;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct(Order $order)
{
$this->order = $order;
}
/**
* Execute the job.
*
* @return void
*/
public function handle(OrderMailer $orderMailer)
{
$orderMailer->sendOrderTickets($this->order);
}
}

View File

@ -0,0 +1,46 @@
<?php
namespace App\Listeners;
use App\Events\OrderCompletedEvent;
use App\Jobs\GenerateTicket;
use App\Jobs\SendOrderNotification;
use App\Jobs\SendOrderTickets;
use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Support\Facades\Log;
class OrderCompletedListener implements ShouldQueue
{
use DispatchesJobs;
/**
* Create the event listener.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Handle the event.
*
* @param OrderCompletedEvent $event
* @return void
*/
public function handle(OrderCompletedEvent $event)
{
/**
* Generate the PDF tickets and send notification emails etc.
*/
Log::info('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));
}
}

View File

@ -7,23 +7,30 @@ use App\Models\Message;
use App\Models\Order;
use Carbon\Carbon;
use Mail;
use Log;
class AttendeeMailer extends Mailer
{
/**
* Send the attendee the ticket
*
* @param Attendee $attendee
* @param Order $order
* @param $ticket_path
*/
public function sendAttendeeTicket(Attendee $attendee, Order $order, $ticket_path)
public function sendAttendeeTicket($attendee)
{
$this->sendTo($attendee->email, config('attendize.outgoing_email'), $order->event->organiser->name, 'Your ticket for the event '.$order->event->title, 'Emails.AttendeeTicketResend', [
'order' => $order,
'email_logo' => $order->event->organiser->full_logo_path,
'attendee' => $attendee
], $ticket_path);
Log::info("Sending ticket to: " . $attendee->email);
$data = [
'attendee' => $attendee,
];
Mail::send('Mailers.TicketMailer.SendAttendeeTicket', $data, function ($message) use ($attendee) {
$message->to($attendee->email);
$message->subject('Your ticket for the event ' . $attendee->order->event->title);
$file_name = $attendee->getReferenceAttribute();
$file_path = public_path(config('attendize.event_pdf_tickets_path')) . '/' . $file_name . '.pdf';
$message->attach($file_path);
});
}
/**
@ -37,7 +44,8 @@ class AttendeeMailer extends Mailer
$attendees = ($message_object->recipients == 'all')
? $event->attendees // all attendees
: Attendee::where('ticket_id', '=', $message_object->recipients)->where('account_id', '=', $message_object->account_id)->get();
: Attendee::where('ticket_id', '=', $message_object->recipients)->where('account_id', '=',
$message_object->account_id)->get();
foreach ($attendees as $attendee) {
@ -61,4 +69,27 @@ class AttendeeMailer extends Mailer
$message_object->sent_at = Carbon::now();
$message_object->save();
}
public function SendAttendeeInvite($attendee)
{
Log::info("Sending invite to: " . $attendee->email);
$data = [
'attendee' => $attendee,
];
Mail::queue('Mailers.TicketMailer.SendAttendeeInvite', $data, function ($message) use ($attendee) {
$message->to($attendee->email);
$message->subject('Your ticket for the event ' . $attendee->order->event->title);
$file_name = $attendee->getReferenceAttribute();
$file_path = public_path(config('attendize.event_pdf_tickets_path')) . '/' . $file_name . '.pdf';
$message->attach($file_path);
});
}
}

View File

@ -3,34 +3,42 @@
namespace App\Mailers;
use App\Models\Order;
use Log;
use Mail;
class OrderMailer extends Mailer
class OrderMailer
{
public function sendOrderNotification(Order $order)
{
$this->sendTo($order->account->email, config('attendize.outgoing_email'), config('attendize.outgoing_email_name'), 'New order received on the event '.$order->event->title.' ['.$order->order_reference.']', 'Emails.OrderNotification', [
$data = [
'order' => $order
];
Mail::send('Emails.OrderNotification', $data, function($message) use ($order) {
$message->to($order->account->email);
$message->subject('New order received on the event '.$order->event->title.' ['.$order->order_reference.']');
});
}
public function sendOrderTickets($order) {
Log::info("Sending ticket to: ".$order->email);
$data = [
'order' => $order,
]);
];
Mail::send('Mailers.TicketMailer.SendOrderTickets', $data, function($message) use ($order) {
$message->to($order->email);
$message->subject('Your tickets for the event '.$order->event->title);
$file_name = $order->order_reference;
$file_path = public_path(config('attendize.event_pdf_tickets_path')).'/'.$file_name.'.pdf';
$message->attach($file_path);
});
}
public function sendOrderConfirmation(Order $order)
{
$ticket_pdf = public_path($order->ticket_pdf_path);
if (!file_exists($ticket_pdf)) {
$ticket_pdf = false;
}
$this->sendTo($order->email, config('attendize.outgoing_email'), $order->event->organiser->name, 'Your tickets & order confirmation for the event '.$order->event->title.' ['.$order->order_reference.']', 'Emails.OrderConfirmation', [
'order' => $order,
'email_logo' => $order->event->organiser->full_logo_path,
], $ticket_pdf);
}
public function sendTickets(Order $order)
{
// $this->sendTo($order->account->email, config('attendize.outgoing_email'), config('attendize.outgoing_email_name'), 'New order received on the event '. $order->event->title .' ['. $order->order_reference .']', 'Emails.OrderNotification', [
// 'order' => $order
// ]);
}
}

View File

@ -1,71 +0,0 @@
<?php
namespace App\Mailers;
use Mail;
use Log;
class TicketMailer
{
public static function sendOrderTickets($order) {
Log::info("Sending ticket to: ".$order->email);
$data = [
'order' => $order,
];
Mail::queue('Mailers.TicketMailer.SendOrderTickets', $data, function($message) use ($order) {
$message->to($order->email);
$message->subject('Your tickets for the event '.$order->event->title);
$file_name = $order->order_reference;
$file_path = public_path(config('attendize.event_pdf_tickets_path')).'/'.$file_name.'.pdf';
$message->attach($file_path);
});
}
public static function sendAttendeeTicket($attendee) {
Log::info("Sending ticket to: ".$attendee->email);
$data = [
'attendee' => $attendee,
];
Mail::queue('Mailers.TicketMailer.SendAttendeeTicket', $data, function($message) use ($attendee) {
$message->to($attendee->email);
$message->subject('Your ticket for the event '.$attendee->order->event->title);
$file_name = $attendee->getReferenceAttribute();
$file_path = public_path(config('attendize.event_pdf_tickets_path')).'/'.$file_name.'.pdf';
$message->attach($file_path);
});
}
public static function sendAttendeeInvite($attendee) {
Log::info("Sending invite to: ".$attendee->email);
$data = [
'attendee' => $attendee,
];
Mail::queue('Mailers.TicketMailer.SendAttendeeInvite', $data, function($message) use ($attendee) {
$message->to($attendee->email);
$message->subject('Your ticket for the event '.$attendee->order->event->title);
$file_name = $attendee->getReferenceAttribute();
$file_path = public_path(config('attendize.event_pdf_tickets_path')).'/'.$file_name.'.pdf';
$message->attach($file_path);
});
}
}

View File

@ -13,8 +13,8 @@ class EventServiceProvider extends ServiceProvider
* @var array
*/
protected $listen = [
'event.name' => [
'EventListener',
'App\Events\OrderCompletedEvent' => [
'App\Listeners\OrderCompletedListener',
],
];

View File

@ -197,7 +197,7 @@ return [
'Crypt' => Illuminate\Support\Facades\Crypt::class,
'DB' => Illuminate\Support\Facades\DB::class,
'Eloquent' => Illuminate\Database\Eloquent\Model::class,
'LaravelEvent' => Illuminate\Support\Facades\Event::class, // Changed Event to LaravelEvent
'LaravelEvent' => Illuminate\Support\Facades\Event::class,
'File' => Illuminate\Support\Facades\File::class,
'Hash' => Illuminate\Support\Facades\Hash::class,
'Input' => Illuminate\Support\Facades\Input::class,