Skip to content

Commit b4e6919

Browse files
committed
feat: (LAR-86) add bannished sysem
bannish user unbannish user bannish user can not login send mail when ban or unban user
1 parent 7768503 commit b4e6919

22 files changed

+488
-46
lines changed

app/Events/UserBannedEvent.php

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace App\Events;
6+
7+
use App\Models\User;
8+
use Illuminate\Broadcasting\Channel;
9+
use Illuminate\Broadcasting\InteractsWithSockets;
10+
use Illuminate\Broadcasting\PresenceChannel;
11+
use Illuminate\Broadcasting\PrivateChannel;
12+
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
13+
use Illuminate\Foundation\Events\Dispatchable;
14+
use Illuminate\Queue\SerializesModels;
15+
16+
final class UserBannedEvent
17+
{
18+
use Dispatchable, InteractsWithSockets, SerializesModels;
19+
20+
public function __construct(public User $user){}
21+
22+
/**
23+
* Get the channels the event should broadcast on.
24+
*
25+
* @return array<int, \Illuminate\Broadcasting\Channel>
26+
*/
27+
public function broadcastOn(): array
28+
{
29+
return [
30+
new PrivateChannel('user-banned'),
31+
];
32+
}
33+
}

app/Events/UserUnbannedEvent.php

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace App\Events;
6+
7+
use App\Models\User;
8+
use Illuminate\Broadcasting\Channel;
9+
use Illuminate\Queue\SerializesModels;
10+
use Illuminate\Broadcasting\PrivateChannel;
11+
use Illuminate\Broadcasting\PresenceChannel;
12+
use Illuminate\Foundation\Events\Dispatchable;
13+
use Illuminate\Broadcasting\InteractsWithSockets;
14+
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
15+
16+
final class UserUnbannedEvent
17+
{
18+
use Dispatchable, InteractsWithSockets, SerializesModels;
19+
20+
public function __construct(public User $user){}
21+
22+
/**
23+
* Get the channels the event should broadcast on.
24+
*
25+
* @return array<int, \Illuminate\Broadcasting\Channel>
26+
*/
27+
public function broadcastOn(): array
28+
{
29+
return [
30+
new PrivateChannel('unban-user'),
31+
];
32+
}
33+
}

app/Filament/Resources/UserResource.php

Lines changed: 38 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,17 @@
44

55
namespace App\Filament\Resources;
66

7-
use App\Filament\Resources\UserResource\Pages;
87
use App\Models\User;
9-
use Awcodes\FilamentBadgeableColumn\Components\Badge;
10-
use Awcodes\FilamentBadgeableColumn\Components\BadgeableColumn;
11-
use Filament\Resources\Resource;
128
use Filament\Tables;
139
use Filament\Tables\Table;
10+
use Filament\Resources\Resource;
11+
use Filament\Tables\Actions\Action;
12+
use Filament\Forms\Components\TextInput;
13+
use Filament\Tables\Actions\ActionGroup;
1414
use Illuminate\Database\Eloquent\Builder;
15+
use App\Filament\Resources\UserResource\Pages;
16+
use Awcodes\FilamentBadgeableColumn\Components\Badge;
17+
use Awcodes\FilamentBadgeableColumn\Components\BadgeableColumn;
1518

1619
final class UserResource extends Resource
1720
{
@@ -64,8 +67,36 @@ public static function table(Table $table): Table
6467
->nullable(),
6568
])
6669
->actions([
67-
Tables\Actions\DeleteAction::make()
68-
->iconButton(),
70+
ActionGroup::make([
71+
Action::make('ban')
72+
->label(__('actions.ban'))
73+
->icon('untitledui-archive')
74+
->color('warning')
75+
->visible(fn ($record) => $record->banned_at == null)
76+
->modalHeading(__('Bannir l\'utilisateur'))
77+
->modalDescription(__('Veuillez entrer la raison du bannissement.'))
78+
->form([
79+
TextInput::make('banned_reason')
80+
->label(__('Raison du bannissement'))
81+
->required(),
82+
])
83+
->action(function ($record, array $data) {
84+
$record->ban($data['banned_reason']);
85+
})
86+
->requiresConfirmation(),
87+
88+
Action::make('unban')
89+
->label(__('actions.unban'))
90+
->icon('heroicon-o-check-circle')
91+
->color('success')
92+
->visible(fn ($record) => $record->banned_at !== null)
93+
->action(function ($record) {
94+
$record->unban();
95+
})
96+
->requiresConfirmation(),
97+
98+
Tables\Actions\DeleteAction::make(),
99+
])->icon('heroicon-m-ellipsis-horizontal'),
69100
])
70101
->bulkActions([
71102
Tables\Actions\DeleteBulkAction::make(),
@@ -78,4 +109,4 @@ public static function getPages(): array
78109
'index' => Pages\ListUsers::route('/'),
79110
];
80111
}
81-
}
112+
}

app/Http/Middleware/CheckIfBanned.php

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace App\Http\Middleware;
6+
7+
use Closure;
8+
use Illuminate\Http\Request;
9+
use Illuminate\Support\Facades\Auth;
10+
use Symfony\Component\HttpFoundation\Response;
11+
12+
final class CheckIfBanned
13+
{
14+
public function handle(Request $request, Closure $next): Response
15+
{
16+
if (Auth::check() && Auth::user()->banned_at) {
17+
Auth::logout();
18+
19+
return redirect()->route('login')->withErrors([
20+
'email' => __('Votre compte a été banni. Contactez l\'administrateur pour plus d\'informations.'),
21+
]);
22+
}
23+
24+
return $next($request);
25+
}
26+
}

app/Jobs/SendBanEmailJob.php

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace App\Jobs;
6+
7+
use App\Models\User;
8+
use App\Mail\UserBannedEMail;
9+
use Illuminate\Bus\Queueable;
10+
use Illuminate\Support\Facades\Mail;
11+
use Illuminate\Queue\SerializesModels;
12+
use Illuminate\Queue\InteractsWithQueue;
13+
use Illuminate\Contracts\Queue\ShouldQueue;
14+
use Illuminate\Foundation\Bus\Dispatchable;
15+
use Illuminate\Contracts\Queue\ShouldBeUnique;
16+
17+
final class SendBanEmailJob implements ShouldQueue
18+
{
19+
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
20+
21+
public function __construct(public User $user){}
22+
23+
public function handle(): void
24+
{
25+
Mail::to($this->user->email)->send(new UserBannedEMail($this->user));
26+
}
27+
}

app/Jobs/SendUnbanEmailJob.php

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace App\Jobs;
6+
7+
use App\Models\User;
8+
use Illuminate\Bus\Queueable;
9+
use App\Mail\UserUnBannedEMail;
10+
use Illuminate\Support\Facades\Mail;
11+
use Illuminate\Queue\SerializesModels;
12+
use Illuminate\Queue\InteractsWithQueue;
13+
use Illuminate\Contracts\Queue\ShouldQueue;
14+
use Illuminate\Foundation\Bus\Dispatchable;
15+
use Illuminate\Contracts\Queue\ShouldBeUnique;
16+
17+
final class SendUnbanEmailJob implements ShouldQueue
18+
{
19+
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
20+
21+
public function __construct(public User $user){}
22+
23+
public function handle(): void
24+
{
25+
Mail::to($this->user->email)->send(new UserUnBannedEMail($this->user));
26+
}
27+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<?php
2+
3+
namespace App\Listeners;
4+
5+
use App\Jobs\SendBanEmailJob;
6+
use App\Events\UserBannedEvent;
7+
use Illuminate\Queue\InteractsWithQueue;
8+
use Illuminate\Contracts\Queue\ShouldQueue;
9+
10+
class SendBanNotificationListener
11+
{
12+
/**
13+
* Create the event listener.
14+
*/
15+
public function __construct()
16+
{
17+
//
18+
}
19+
20+
/**
21+
* Handle the event.
22+
*/
23+
public function handle(UserBannedEvent $event): void
24+
{
25+
SendBanEmailJob::dispatch($event->user);
26+
}
27+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<?php
2+
3+
namespace App\Listeners;
4+
5+
use App\Jobs\SendUnbanEmailJob;
6+
use App\Events\UserUnbannedEvent;
7+
use Illuminate\Queue\InteractsWithQueue;
8+
use Illuminate\Contracts\Queue\ShouldQueue;
9+
10+
class SendUnbanNotificationListener
11+
{
12+
/**
13+
* Create the event listener.
14+
*/
15+
public function __construct()
16+
{
17+
//
18+
}
19+
20+
/**
21+
* Handle the event.
22+
*/
23+
public function handle(UserUnbannedEvent $event): void
24+
{
25+
SendUnbanEmailJob::dispatch($event->user);
26+
}
27+
}

app/Mail/UserBannedEMail.php

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace App\Mail;
6+
7+
use App\Models\User;
8+
use Illuminate\Bus\Queueable;
9+
use Illuminate\Contracts\Queue\ShouldQueue;
10+
use Illuminate\Mail\Mailable;
11+
use Illuminate\Mail\Mailables\Content;
12+
use Illuminate\Mail\Mailables\Envelope;
13+
use Illuminate\Queue\SerializesModels;
14+
15+
final class UserBannedEMail extends Mailable
16+
{
17+
use Queueable, SerializesModels;
18+
19+
public function __construct(public User $user){}
20+
21+
public function envelope(): Envelope
22+
{
23+
return new Envelope(
24+
subject: __('Notification de bannissement Laravelcm'),
25+
);
26+
}
27+
28+
public function content(): Content
29+
{
30+
return new Content(
31+
markdown: 'emails.send-user-banned-message',
32+
);
33+
}
34+
}

app/Mail/UserUnBannedEMail.php

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace App\Mail;
6+
7+
use App\Models\User;
8+
use Illuminate\Bus\Queueable;
9+
use Illuminate\Contracts\Queue\ShouldQueue;
10+
use Illuminate\Mail\Mailable;
11+
use Illuminate\Mail\Mailables\Content;
12+
use Illuminate\Mail\Mailables\Envelope;
13+
use Illuminate\Queue\SerializesModels;
14+
15+
final class UserUnBannedEMail extends Mailable
16+
{
17+
use Queueable, SerializesModels;
18+
19+
public function __construct(public User $user){}
20+
21+
public function envelope(): Envelope
22+
{
23+
return new Envelope(
24+
subject: __('Notification de dé-baannissement Laravelcm'),
25+
);
26+
}
27+
28+
public function content(): Content
29+
{
30+
return new Content(
31+
markdown: 'emails.send-user-unbanned-message',
32+
);
33+
}
34+
}

0 commit comments

Comments
 (0)