]> _ Git - psq.git/commitdiff
Lenses Mailgun
authorLouis Jeckel <louis.jeckel@outlook.cm>
Tue, 15 Sep 2020 14:36:12 +0000 (16:36 +0200)
committerLouis Jeckel <louis.jeckel@outlook.cm>
Tue, 15 Sep 2020 14:36:12 +0000 (16:36 +0200)
app/MailgunEvent.php
app/Nova/Filters/LastMailgunEventStatus.php [new file with mode: 0644]
app/Nova/Lenses/FailedMailgun.php [new file with mode: 0644]
app/Nova/Lenses/MailgunStatus.php [new file with mode: 0644]
app/Nova/User.php
app/User.php

index 99161fcf171494fbf049c30e8eebb9d4787dd51f..33d002efdad3c3ada4613bea3527e861c7d8eb61 100644 (file)
@@ -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 (file)
index 0000000..16bd09b
--- /dev/null
@@ -0,0 +1,44 @@
+<?php
+
+namespace App\Nova\Filters;
+
+use App\MailgunEvent;
+use Illuminate\Http\Request;
+use Illuminate\Support\Arr;
+use Laravel\Nova\Filters\Filter;
+
+class LastMailgunEventStatus extends Filter
+{
+    /**
+     * The filter's component.
+     *
+     * @var string
+     */
+    public $component = 'select-filter';
+
+    /**
+     * Apply the filter to the given query.
+     *
+     * @param  \Illuminate\Http\Request  $request
+     * @param  \Illuminate\Database\Eloquent\Builder  $query
+     * @param  mixed  $value
+     * @return \Illuminate\Database\Eloquent\Builder
+     */
+    public function apply(Request $request, $query, $value)
+    {
+        return $query->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 (file)
index 0000000..ad3522c
--- /dev/null
@@ -0,0 +1,92 @@
+<?php
+
+namespace App\Nova\Lenses;
+
+use Illuminate\Http\Request;
+use Illuminate\Support\Arr;
+use Laravel\Nova\Fields\DateTime;
+use Laravel\Nova\Fields\ID;
+use Laravel\Nova\Fields\Text;
+use Laravel\Nova\Http\Requests\LensRequest;
+use Laravel\Nova\Lenses\Lens;
+
+class FailedMailgun extends Lens
+{
+    /**
+     * Get the query builder / paginator for the lens.
+     *
+     * @param  \Laravel\Nova\Http\Requests\LensRequest  $request
+     * @param  \Illuminate\Database\Eloquent\Builder  $query
+     * @return mixed
+     */
+    public static function query(LensRequest $request, $query)
+    {
+        return $request->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 (file)
index 0000000..e3371ef
--- /dev/null
@@ -0,0 +1,96 @@
+<?php
+
+namespace App\Nova\Lenses;
+
+use App\MailgunEvent;
+use App\Nova\Filters\LastMailgunEventStatus;
+use App\User;
+use Illuminate\Http\Request;
+use Illuminate\Support\Arr;
+use Laravel\Nova\Fields\Badge;
+use Laravel\Nova\Fields\ID;
+use Laravel\Nova\Fields\Text;
+use Laravel\Nova\Http\Requests\LensRequest;
+use Laravel\Nova\Lenses\Lens;
+
+class MailgunStatus extends Lens
+{
+    /**
+     * Get the query builder / paginator for the lens.
+     *
+     * @param  \Laravel\Nova\Http\Requests\LensRequest  $request
+     * @param  \Illuminate\Database\Eloquent\Builder  $query
+     * @return mixed
+     */
+    public static function query(LensRequest $request, $query)
+    {
+        return $request->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';
+    }
+}
index b096d46afc729fa88cbe9ff76873af865ab9e06f..b7991de99ea98b5120cb217789d4c927f163ca39 100644 (file)
@@ -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
+        ];
     }
 
     /**
index 9e859575e644581eee85bc5e6e83364164be27cc..7b9c5240153a14c0337ad0aac2964e718c371923 100644 (file)
@@ -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
      */