use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
+use Illuminate\Support\Arr;
/**
'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
{
return $this->belongsTo(User::class, 'recipient', 'email');
}
+
+ /**
+ * @return string
+ */
+ public function __toString()
+ {
+ return Arr::get($this->status, 'description') ?? $this->event ?? '';
+ }
}
--- /dev/null
+<?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));
+ }
+}
--- /dev/null
+<?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';
+ }
+}
--- /dev/null
+<?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';
+ }
+}
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;
*/
public function lenses(Request $request)
{
- return [];
+ return [
+ new MailgunStatus,
+ new FailedMailgun
+ ];
}
/**
];
+
+
public const TYPE_SUBSCRIBER = 0;
public const TYPE_PROSPECT = 1;
public const TYPE_SPECIAL = 2;
return $this->hasMany(MailgunEvent::class, 'recipient', 'email');
}
-
+
/**
* @return HasOne
*/