Skip to content

Commit f16596e

Browse files
authored
feat: add can access boolean (#55)
* wip * Fix styling * wip * wip --------- Co-authored-by: Baspa <10845460+Baspa@users.noreply.github.com>
1 parent 4733e91 commit f16596e

12 files changed

Lines changed: 109 additions & 5 deletions

File tree

.github/workflows/run-tests.yml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,13 @@ jobs:
1313
fail-fast: true
1414
matrix:
1515
os: [ubuntu-latest, windows-latest]
16-
php: [8.2, 8.1]
17-
laravel: [10.*]
16+
php: [8.2]
17+
laravel: [11.*]
1818
stability: [prefer-lowest, prefer-stable]
1919
include:
20-
- laravel: 10.*
21-
testbench: 8.*
22-
carbon: 2.*
20+
- laravel: 11.*
21+
testbench: 9.*
22+
carbon: 3.*
2323

2424
name: P${{ matrix.php }} - L${{ matrix.laravel }} - ${{ matrix.stability }} - ${{ matrix.os }}
2525

README.md

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,38 @@ public function panel(Panel $panel): Panel
8585
}
8686
```
8787

88+
### Security
89+
90+
Using the `canManageMails()` method, you can define which users have access to the mail resources/pages. Here's a comprehensive example that includes additional logic for flexibility:
91+
92+
```php
93+
use Backstage\FilamentMails\FilamentMailsPlugin;
94+
use Illuminate\Support\Facades\Auth;
95+
96+
$panel
97+
->plugins([
98+
FilamentMailsPlugin::make()
99+
->canManageMails(function () {
100+
$user = Auth::user();
101+
102+
// Allow access for users with specific roles
103+
if ($user->hasRole('admin') || $user->hasRole('supervisor')) {
104+
return true;
105+
}
106+
107+
// Allow access for users with specific permissions
108+
if ($user->hasPermissionTo('manage mails')) {
109+
return true;
110+
}
111+
112+
// Restrict access for all other users
113+
return false;
114+
}),
115+
]);
116+
```
117+
118+
This example demonstrates how to combine role-based and permission-based access control, providing a more robust and flexible approach to managing access to mail resources.
119+
88120
### Tenant middleware and route protection
89121

90122
If you want to protect the mail routes with your (tenant) middleware, you can do so by adding the routes to the `tenantRoutes`:

src/FilamentMailsPlugin.php

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,18 @@
55
use Backstage\FilamentMails\Resources\EventResource;
66
use Backstage\FilamentMails\Resources\MailResource;
77
use Backstage\FilamentMails\Resources\SuppressionResource;
8+
use Closure;
89
use Filament\Contracts\Plugin;
910
use Filament\Panel;
1011
use Filament\Support\Colors\Color;
12+
use Filament\Support\Concerns\EvaluatesClosures;
1113

1214
class FilamentMailsPlugin implements Plugin
1315
{
16+
use EvaluatesClosures;
17+
18+
public bool | Closure $canManageMails = true;
19+
1420
public function getId(): string
1521
{
1622
return 'filament-mails';
@@ -46,4 +52,16 @@ public static function get(): static
4652

4753
return $plugin;
4854
}
55+
56+
public function canManageMails(bool | Closure $canManageMails = true): static
57+
{
58+
$this->canManageMails = $canManageMails;
59+
60+
return $this;
61+
}
62+
63+
public function userCanManageMails(): bool
64+
{
65+
return $this->evaluate($this->canManageMails);
66+
}
4967
}

src/Resources/EventResource.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace Backstage\FilamentMails\Resources;
44

5+
use Backstage\FilamentMails\FilamentMailsPlugin;
56
use Backstage\FilamentMails\Resources\EventResource\Pages\ListEvents;
67
use Backstage\FilamentMails\Resources\EventResource\Pages\ViewEvent;
78
use Backstage\Mails\Enums\EventType;
@@ -24,6 +25,11 @@ class EventResource extends Resource
2425

2526
protected static bool $shouldRegisterNavigation = true;
2627

28+
public static function canAccess(): bool
29+
{
30+
return FilamentMailsPlugin::get()->userCanManageMails();
31+
}
32+
2733
public static function getSlug(?Panel $panel = null): string
2834
{
2935
return config('filament-mails.resources.mail')::getSlug() . '/events';

src/Resources/EventResource/Pages/ListEvents.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace Backstage\FilamentMails\Resources\EventResource\Pages;
44

5+
use Backstage\FilamentMails\FilamentMailsPlugin;
56
use Backstage\FilamentMails\Resources\EventResource;
67
use Backstage\Mails\Enums\EventType;
78
use Backstage\Mails\Models\MailEvent;
@@ -11,6 +12,11 @@
1112

1213
class ListEvents extends ListRecords
1314
{
15+
public static function canAccess(array $parameters = []): bool
16+
{
17+
return FilamentMailsPlugin::get()->userCanManageMails();
18+
}
19+
1420
public static function getResource(): string
1521
{
1622
return config('filament-mails.resources.event', EventResource::class);

src/Resources/EventResource/Pages/ViewEvent.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,17 @@
22

33
namespace Backstage\FilamentMails\Resources\EventResource\Pages;
44

5+
use Backstage\FilamentMails\FilamentMailsPlugin;
56
use Backstage\FilamentMails\Resources\EventResource;
67
use Filament\Resources\Pages\ViewRecord;
78

89
class ViewEvent extends ViewRecord
910
{
11+
public static function canAccess(array $parameters = []): bool
12+
{
13+
return FilamentMailsPlugin::get()->userCanManageMails();
14+
}
15+
1016
public static function getResource(): string
1117
{
1218
return config('filament-mails.resources.event', EventResource::class);

src/Resources/MailResource.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace Backstage\FilamentMails\Resources;
44

5+
use Backstage\FilamentMails\FilamentMailsPlugin;
56
use Backstage\FilamentMails\Resources\MailResource\Pages\ListMails;
67
use Backstage\FilamentMails\Resources\MailResource\Pages\ViewMail;
78
use Backstage\FilamentMails\Resources\MailResource\Widgets\MailStatsWidget;
@@ -45,6 +46,11 @@ class MailResource extends Resource
4546

4647
protected static bool $shouldRegisterNavigation = true;
4748

49+
public static function canAccess(): bool
50+
{
51+
return FilamentMailsPlugin::get()->userCanManageMails();
52+
}
53+
4854
public static function getModel(): string
4955
{
5056
return config('mails.models.mail');

src/Resources/MailResource/Pages/ListMails.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace Backstage\FilamentMails\Resources\MailResource\Pages;
44

5+
use Backstage\FilamentMails\FilamentMailsPlugin;
56
use Backstage\FilamentMails\Resources\MailResource;
67
use Backstage\FilamentMails\Resources\MailResource\Widgets\MailStatsWidget;
78
use Backstage\Mails\Models\Mail;
@@ -11,6 +12,11 @@
1112

1213
class ListMails extends ListRecords
1314
{
15+
public static function canAccess(array $parameters = []): bool
16+
{
17+
return FilamentMailsPlugin::get()->userCanManageMails();
18+
}
19+
1420
public static function getResource(): string
1521
{
1622
return config('filament-mails.resources.mail', MailResource::class);

src/Resources/MailResource/Pages/ViewMail.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,17 @@
22

33
namespace Backstage\FilamentMails\Resources\MailResource\Pages;
44

5+
use Backstage\FilamentMails\FilamentMailsPlugin;
56
use Backstage\FilamentMails\Resources\MailResource;
67
use Filament\Resources\Pages\ViewRecord;
78

89
class ViewMail extends ViewRecord
910
{
11+
public static function canAccess(array $parameters = []): bool
12+
{
13+
return FilamentMailsPlugin::get()->userCanManageMails();
14+
}
15+
1016
public static function getResource(): string
1117
{
1218
return config('filament-mails.resources.mail', MailResource::class);

src/Resources/MailResource/Widgets/MailStatsWidget.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace Backstage\FilamentMails\Resources\MailResource\Widgets;
44

5+
use Backstage\FilamentMails\FilamentMailsPlugin;
56
use Filament\Facades\Filament;
67
use Filament\Widgets\StatsOverviewWidget as BaseWidget;
78
use Filament\Widgets\StatsOverviewWidget\Stat;
@@ -12,6 +13,11 @@ class MailStatsWidget extends BaseWidget
1213

1314
protected static bool $isDiscovered = false;
1415

16+
public static function canView(): bool
17+
{
18+
return FilamentMailsPlugin::get()->userCanManageMails();
19+
}
20+
1521
protected function getStats(): array
1622
{
1723
$class = config('mails.models.mail');

0 commit comments

Comments
 (0)