From 7e843260243728ce33f8a5adfa718c8f7b1b4f0b Mon Sep 17 00:00:00 2001 From: Louis Jeckel Date: Tue, 15 Sep 2020 16:36:12 +0200 Subject: [PATCH] Lenses Mailgun --- app/MailgunEvent.php | 36 ++++++++ app/Nova/Filters/LastMailgunEventStatus.php | 44 ++++++++++ app/Nova/Lenses/FailedMailgun.php | 92 ++++++++++++++++++++ app/Nova/Lenses/MailgunStatus.php | 96 +++++++++++++++++++++ app/Nova/User.php | 8 +- app/User.php | 4 +- 6 files changed, 278 insertions(+), 2 deletions(-) create mode 100644 app/Nova/Filters/LastMailgunEventStatus.php create mode 100644 app/Nova/Lenses/FailedMailgun.php create mode 100644 app/Nova/Lenses/MailgunStatus.php diff --git a/app/MailgunEvent.php b/app/MailgunEvent.php index 99161fc..33d002e 100644 --- a/app/MailgunEvent.php +++ b/app/MailgunEvent.php @@ -4,6 +4,7 @@ namespace App; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; +use Illuminate\Support\Arr; /** @@ -22,6 +23,33 @@ class MailgunEvent extends Model 'status' => 'array' ]; + public const STATUSES = [ + 'delivered' => [ + 'badge' => 'info', + 'label' => 'Reçu' + ], + 'opened' => [ + 'badge' => 'success', + 'label' => 'Ouvert' + ], + 'clicked' => [ + 'badge' => 'success', + 'label' => 'Cliqué' + ], + 'failed' => [ + 'badge' => 'warning', + 'label' => 'Erreur' + ], + 'unsubscribed' => [ + 'badge' => 'danger', + 'label' => 'Désabonné' + ], + 'unknown' => [ + 'badge' => 'info', + 'label' => 'Inconnu' + ] + ]; + /** * @return BelongsTo @@ -38,4 +66,12 @@ class MailgunEvent extends Model { return $this->belongsTo(User::class, 'recipient', 'email'); } + + /** + * @return string + */ + public function __toString() + { + return Arr::get($this->status, 'description') ?? $this->event ?? ''; + } } diff --git a/app/Nova/Filters/LastMailgunEventStatus.php b/app/Nova/Filters/LastMailgunEventStatus.php new file mode 100644 index 0000000..16bd09b --- /dev/null +++ b/app/Nova/Filters/LastMailgunEventStatus.php @@ -0,0 +1,44 @@ +whereHas('lastMailgunEvent', function($builder) use($value) { + $builder->where('event', $value); + }); + } + + /** + * Get the filter's available options. + * + * @param \Illuminate\Http\Request $request + * @return array + */ + public function options(Request $request) + { + return array_flip(array_map(static fn($a) => $a['label'], MailgunEvent::STATUSES)); + } +} diff --git a/app/Nova/Lenses/FailedMailgun.php b/app/Nova/Lenses/FailedMailgun.php new file mode 100644 index 0000000..ad3522c --- /dev/null +++ b/app/Nova/Lenses/FailedMailgun.php @@ -0,0 +1,92 @@ +withOrdering($request->withFilters( + $query->whereHas('lastMailgunEvent', function($builder) { + $builder->where('event', 'failed'); + }) + )); + } + + /** + * Get the fields available to the lens. + * + * @param \Illuminate\Http\Request $request + * @return array + */ + public function fields(Request $request) + { + return [ + Text::make('Prénom', 'first_name'), + Text::make('Nom', 'last_name'), + Text::make('Email'), + Text::make('Erreur', function() { + return Arr::get($this, 'lastMailgunEvent.status.description'); + }), + DateTime::make('Last seen', 'updated_at'), + ]; + } + + /** + * Get the cards available on the lens. + * + * @param \Illuminate\Http\Request $request + * @return array + */ + public function cards(Request $request) + { + return []; + } + + /** + * Get the filters available for the lens. + * + * @param \Illuminate\Http\Request $request + * @return array + */ + public function filters(Request $request) + { + return []; + } + + /** + * Get the actions available on the lens. + * + * @param \Illuminate\Http\Request $request + * @return array + */ + public function actions(Request $request) + { + return parent::actions($request); + } + + /** + * Get the URI key for the lens. + * + * @return string + */ + public function uriKey() + { + return 'failed-mailgun'; + } +} diff --git a/app/Nova/Lenses/MailgunStatus.php b/app/Nova/Lenses/MailgunStatus.php new file mode 100644 index 0000000..e3371ef --- /dev/null +++ b/app/Nova/Lenses/MailgunStatus.php @@ -0,0 +1,96 @@ +withOrdering($request->withFilters( + $query->with('lastMailgunEvent') + )); + } + + /** + * Get the fields available to the lens. + * + * @param \Illuminate\Http\Request $request + * @return array + */ + public function fields(Request $request) + { + return [ + Text::make('Prénom', 'first_name'), + Text::make('Nom', 'last_name'), + Text::make('Email'), + Badge::make('Abonnement', fn() => User::STATUSES[$this->status]['label']) + ->map(Arr::pluck(User::STATUSES, 'badge', 'label')), + Badge::make('Etat mail', fn() => MailgunEvent::STATUSES[$this->lastMailgunEvent->event ?? 'unknown']['label']) + ->map(Arr::pluck(MailgunEvent::STATUSES, 'badge', 'label')), + + ]; + } + + /** + * Get the cards available on the lens. + * + * @param \Illuminate\Http\Request $request + * @return array + */ + public function cards(Request $request) + { + return []; + } + + /** + * Get the filters available for the lens. + * + * @param \Illuminate\Http\Request $request + * @return array + */ + public function filters(Request $request) + { + return [ + new LastMailgunEventStatus + ]; + } + + /** + * Get the actions available on the lens. + * + * @param \Illuminate\Http\Request $request + * @return array + */ + public function actions(Request $request) + { + return parent::actions($request); + } + + /** + * Get the URI key for the lens. + * + * @return string + */ + public function uriKey() + { + return 'mailgun-status'; + } +} diff --git a/app/Nova/User.php b/app/Nova/User.php index b096d46..b7991de 100644 --- a/app/Nova/User.php +++ b/app/Nova/User.php @@ -6,12 +6,15 @@ use App\Nova\Actions\ImportUsers; use App\Nova\Actions\SendNotification; use App\Nova\Actions\StartTrial; use App\Nova\Actions\VerifyEmail; +use App\Nova\Lenses\FailedMailgun; +use App\Nova\Lenses\MailgunStatus; use App\Nova\Metrics\RegistrationCompletePartition; use App\Nova\Metrics\SubscribedUsers; use App\Nova\Metrics\TotalUsers; use App\Nova\Metrics\TrialUsers; use App\Nova\Metrics\UsersPartition; use App\User as AppUser; +use Illuminate\Auth\Events\Failed; use Illuminate\Http\Request; use Illuminate\Support\Arr; use Laravel\Nova\Fields\Badge; @@ -149,7 +152,10 @@ class User extends Resource */ public function lenses(Request $request) { - return []; + return [ + new MailgunStatus, + new FailedMailgun + ]; } /** diff --git a/app/User.php b/app/User.php index 9e85957..7b9c524 100644 --- a/app/User.php +++ b/app/User.php @@ -145,6 +145,8 @@ class User extends Authenticatable implements MustVerifyEmail ]; + + public const TYPE_SUBSCRIBER = 0; public const TYPE_PROSPECT = 1; public const TYPE_SPECIAL = 2; @@ -198,7 +200,7 @@ class User extends Authenticatable implements MustVerifyEmail return $this->hasMany(MailgunEvent::class, 'recipient', 'email'); } - + /** * @return HasOne */ -- 2.39.5