diff --git a/app/AttendeeMessage.php b/app/AttendeeMessage.php index da809a9..67b26e1 100644 --- a/app/AttendeeMessage.php +++ b/app/AttendeeMessage.php @@ -7,4 +7,14 @@ use Illuminate\Database\Eloquent\Model; class AttendeeMessage extends Model { protected $guarded = []; + + public function concert() + { + return $this->belongsTo(Concert::class); + } + + public function recipients() + { + return $this->concert->orders()->pluck('email'); + } } diff --git a/app/Jobs/SendAttendeeMessage.php b/app/Jobs/SendAttendeeMessage.php index ab674ea..4b4fae9 100644 --- a/app/Jobs/SendAttendeeMessage.php +++ b/app/Jobs/SendAttendeeMessage.php @@ -3,6 +3,8 @@ namespace App\Jobs; use Illuminate\Bus\Queueable; +use App\Mail\AttendeeMessageEmail; +use Illuminate\Support\Facades\Mail; use Illuminate\Queue\SerializesModels; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Contracts\Queue\ShouldQueue; @@ -31,6 +33,8 @@ class SendAttendeeMessage implements ShouldQueue */ public function handle() { - // + $this->attendeeMessage->recipients()->each(function ($recipient) { + Mail::to($recipient)->send(new AttendeeMessageEmail($this->attendeeMessage)); + }); } } diff --git a/app/Mail/AttendeeMessageEmail.php b/app/Mail/AttendeeMessageEmail.php new file mode 100644 index 0000000..66bfa6e --- /dev/null +++ b/app/Mail/AttendeeMessageEmail.php @@ -0,0 +1,35 @@ +attendeeMessage = $attendeeMessage; + } + + /** + * Build the message. + * + * @return $this + */ + public function build() + { + return $this->view('view.name'); + } +} diff --git a/tests/Unit/Jobs/SendAttendeeMessageTest.php b/tests/Unit/Jobs/SendAttendeeMessageTest.php new file mode 100644 index 0000000..7829f05 --- /dev/null +++ b/tests/Unit/Jobs/SendAttendeeMessageTest.php @@ -0,0 +1,54 @@ + $concert->id, + 'subject' => 'My subject', + 'message' => 'My message', + ]); + $orderA = OrderFactory::createForConcert($concert, ['email' => 'alex@example.com']); + $otherOrder = OrderFactory::createForConcert($otherConcert, ['email' => 'jane@example.com']); + $orderB = OrderFactory::createForConcert($concert, ['email' => 'sam@example.com']); + $orderC = OrderFactory::createForConcert($concert, ['email' => 'taylor@example.com']); + + SendAttendeeMessage::dispatch($message); + + Mail::assertSent(AttendeeMessageEmail::class, function ($mail) use ($message) { + return $mail->hasTo('alex@example.com') + && $mail->attendeeMessage->is($message); + }); + Mail::assertSent(AttendeeMessageEmail::class, function ($mail) use ($message) { + return $mail->hasTo('sam@example.com') + && $mail->attendeeMessage->is($message); + }); + Mail::assertSent(AttendeeMessageEmail::class, function ($mail) use ($message) { + return $mail->hasTo('taylor@example.com') + && $mail->attendeeMessage->is($message); + }); + Mail::assertNotSent(AttendeeMessageEmail::class, function ($mail) { + return $mail->hasTo('jane@example.com'); + }); + } +}