Add email digests

This commit is contained in:
Ben Goldsworthy 2022-11-01 04:07:07 +00:00
parent 940fa5fda4
commit a569ac5cc6
6 changed files with 218 additions and 35 deletions

View file

@ -0,0 +1,57 @@
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use App\Mail\Digest;
use Illuminate\Support\Facades\Mail;
class SendDigest extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'digest:send {--D|daily} {--W|weekly} {--M|monthly}';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Send a digest of recent updates.';
/**
* Execute the console command.
*
* @return int
*/
public function handle()
{
if (!$this->option('daily') && !$this->option('weekly') && !$this->option('monthly')) {
$this->error('No schedule specified.');
return;
}
// These are seperated because I may want to send multiple types
// of digest in a single commend.
if ($this->option('daily')) {
foreach (config('app.daily_digest_recipients') as $recipient) {
Mail::to($recipient)->send(new Digest('daily', config('app.current_trip_id')));
}
}
if ($this->option('weekly')) {
foreach (config('app.weekly_digest_recipients') as $recipient) {
Mail::to($recipient)->send(new Digest('weekly', config('app.current_trip_id')));
}
}
if ($this->option('monthly')) {
foreach (config('app.monthly_digest_recipients') as $recipient) {
Mail::to($recipient)->send(new Digest('monthly', config('app.current_trip_id')));
}
}
}
}

91
app/Mail/Digest.php Normal file
View file

@ -0,0 +1,91 @@
<?php
namespace App\Mail;
use DateTime;
use App\Http\Controllers\TrackerController;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
class Digest extends Mailable
{
use Queueable, SerializesModels;
/**
* The type of digest (e.g. weekly, monthly, etc.).
* TODO: Replace with enum
*
* @var string
*/
public $digest_type;
/**
* The current trip locations as a JSON object.
*
* @var string
*/
public $locations;
/**
* The current trip checkins as a JSON object.
*
* @var string
*/
public $checkins;
/**
* Create a new message instance.
*
* @param string $digest_type
* @param string $trip_id
* @return void
*/
public function __construct(string $digest_type, string $trip_id)
{
$this->digest_type = $digest_type;
$trip = (new TrackerController)->get_trip_data($trip_id);
$cutoffDateTime = new DateTime();
switch ($this->digest_type) {
case 'daily':
$cutoffDateTime->modify('-1 day');
break;
case 'weekly':
$cutoffDateTime->modify('-1 week');
break;
case 'monthly':
$cutoffDateTime->modify('-1 month');
break;
default:
}
$this->locations = array_filter(
$trip->locations,
function($elem) use ($cutoffDateTime) {
$elemDateTime = new DateTime($elem->created_at);
return $elemDateTime > $cutoffDateTime;
}
);
$this->checkins = array_filter(
$trip->checkins,
function($elem) use ($cutoffDateTime) {
$elemDateTime = new DateTime($elem->created_at);
return $elemDateTime > $cutoffDateTime;
}
);
}
/**
* Build the message.
*
* @return $this
*/
public function build()
{
return $this->view('emails.digest')
->subject("track.bengoldsworthy.net ".ucwords($this->digest_type)." Digest");
}
}

View file

@ -1,34 +0,0 @@
<?php
namespace App\Mail;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
class WeeklyDigest extends Mailable
{
use Queueable, SerializesModels;
/**
* Create a new message instance.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Build the message.
*
* @return $this
*/
public function build()
{
return $this->view('emails.weekly-digest')
->subject('Weekly Digest');
}
}