diff --git a/README.md b/README.md index 47065d2..6b3b086 100644 --- a/README.md +++ b/README.md @@ -109,6 +109,7 @@ return [ 'resources' => [ 'mail' => \App\Filament\Resources\MailResource::class, 'event' => \App\Filament\Resources\EventResource::class, + 'suppressions' => \App\Filament\Resources\SuppressionResource::class ], ]; ``` diff --git a/composer.json b/composer.json index ff3fc31..74c8ba7 100644 --- a/composer.json +++ b/composer.json @@ -75,4 +75,4 @@ }, "minimum-stability": "dev", "prefer-stable": true -} +} \ No newline at end of file diff --git a/config/filament-mails.php b/config/filament-mails.php index 4a97ccc..3f21b86 100644 --- a/config/filament-mails.php +++ b/config/filament-mails.php @@ -2,10 +2,12 @@ use Vormkracht10\FilamentMails\Resources\EventResource; use Vormkracht10\FilamentMails\Resources\MailResource; +use Vormkracht10\FilamentMails\Resources\SuppressionResource; return [ 'resources' => [ 'mail' => MailResource::class, 'event' => EventResource::class, + 'suppressions' => SuppressionResource::class, ], ]; diff --git a/src/FilamentMailsPlugin.php b/src/FilamentMailsPlugin.php index fb33782..caf1235 100644 --- a/src/FilamentMailsPlugin.php +++ b/src/FilamentMailsPlugin.php @@ -22,6 +22,7 @@ public function register(Panel $panel): void ->resources([ config('filament-mails.resources.mail'), config('filament-mails.resources.event'), + config('filament-mails.resources.suppressions'), ]); } diff --git a/src/Resources/SuppressionResource.php b/src/Resources/SuppressionResource.php new file mode 100644 index 0000000..0333d2c --- /dev/null +++ b/src/Resources/SuppressionResource.php @@ -0,0 +1,141 @@ +join('mails', 'mail_events.mail_id', '=', 'mails.id') + ->where(function ($query) { + $query->where('type', EventType::HARD_BOUNCED) + ->orWhere('type', EventType::COMPLAINED); + }) + ->whereNull('unsuppressed_at') + ->whereIn('mails.to', function ($query) { + $query->select('to') + ->from('mail_events') + ->where('type', EventType::HARD_BOUNCED) + ->whereNull('unsuppressed_at') + ->groupBy('to'); + }) + ->select('mail_events.*', 'mails.to') + ->addSelect([ + 'has_complained' => MailEvent::select('m.id') + ->from('mail_events AS me') + ->leftJoin('mails As m', function ($join) { + $join->on('me.mail_id', '=', 'm.id') + ->where('me.type', '=', EventType::COMPLAINED); + }) + ->take(1), + ]) + ->latest('occurred_at') + ->orderBy('occurred_at', 'desc'); + } + + public static function table(Table $table): Table + { + return $table + ->defaultSort('occurred_at', 'desc') + ->columns([ + Tables\Columns\TextColumn::make('to') + ->label(__('Email address')) + ->formatStateUsing(fn ($record) => key(json_decode($record->to ?? []))) + ->searchable(['to']), + + Tables\Columns\TextColumn::make('id') + ->label(__('Reason')) + ->badge() + ->formatStateUsing(fn ($record) => $record->type->value == EventType::COMPLAINED->value ? 'Complained' : 'Bounced') + ->color(fn ($record): string => match ($record->type->value == EventType::COMPLAINED->value) { + true => 'danger', + default => 'gray', + }), + + Tables\Columns\TextColumn::make('occurred_at') + ->label(__('Occurred At')) + ->dateTime('d-m-Y H:i') + ->since() + ->tooltip(fn (MailEvent $record) => $record->occurred_at->format('d-m-Y H:i')) + ->sortable() + ->searchable(), + ]) + ->actions([ + Tables\Actions\Action::make('unsuppress') + ->label(__('Unsuppress')) + ->action(function (MailEvent $record) { + event(new MailUnsuppressed(key($record->to), $record->mail->driver, $record->mail->stream_id ?? null)); + }), + + Tables\Actions\ViewAction::make() + ->url(null) + ->modal() + ->slideOver() + ->label(__('View')) + ->hiddenLabel() + ->tooltip(__('View')) + ->infolist(fn (Infolist $infolist) => EventResource::infolist($infolist)), + ]); + } + + public static function getPages(): array + { + return [ + 'index' => ListSuppressions::route('/'), + ]; + } +} diff --git a/src/Resources/SuppressionResource/Pages/ListSuppressions.php b/src/Resources/SuppressionResource/Pages/ListSuppressions.php new file mode 100644 index 0000000..f864885 --- /dev/null +++ b/src/Resources/SuppressionResource/Pages/ListSuppressions.php @@ -0,0 +1,16 @@ +