132 lines
3.8 KiB
PHP
132 lines
3.8 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Filament\Pages\ManagedTenants;
|
|
|
|
use App\Models\Tenant;
|
|
use App\Models\User;
|
|
use App\Services\Auth\CapabilityResolver;
|
|
use App\Support\Auth\Capabilities;
|
|
use App\Support\ManagedTenants\ManagedTenantContext;
|
|
use App\Support\Rbac\UiEnforcement;
|
|
use Filament\Actions\Action;
|
|
use Filament\Notifications\Notification;
|
|
use Filament\Pages\Page;
|
|
|
|
class ArchivedStatus extends Page
|
|
{
|
|
protected static bool $isDiscovered = false;
|
|
|
|
protected static bool $shouldRegisterNavigation = false;
|
|
|
|
protected static ?string $slug = 'managed-tenants/archived';
|
|
|
|
protected static ?string $title = 'Archived managed tenant';
|
|
|
|
protected string $view = 'filament.pages.managed-tenants.archived-status';
|
|
|
|
public ?Tenant $tenant = null;
|
|
|
|
public function mount(): void
|
|
{
|
|
$user = auth()->user();
|
|
|
|
if (! $user instanceof User) {
|
|
abort(403);
|
|
}
|
|
|
|
if (! $user->tenantMemberships()->exists()) {
|
|
abort(404);
|
|
}
|
|
|
|
$this->tenant = ManagedTenantContext::archivedTenant();
|
|
|
|
if (! $this->tenant instanceof Tenant) {
|
|
abort(404);
|
|
}
|
|
|
|
/** @var CapabilityResolver $resolver */
|
|
$resolver = app(CapabilityResolver::class);
|
|
|
|
if (! $resolver->isMember($user, $this->tenant)) {
|
|
abort(404);
|
|
}
|
|
|
|
if (! $resolver->can($user, $this->tenant, Capabilities::TENANT_MANAGED_TENANTS_VIEW)) {
|
|
abort(403);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @return array<Action>
|
|
*/
|
|
protected function getHeaderActions(): array
|
|
{
|
|
return [
|
|
Action::make('back_to_managed_tenants')
|
|
->label('Back to managed tenants')
|
|
->url(Index::getUrl()),
|
|
|
|
UiEnforcement::forTableAction(
|
|
Action::make('restore')
|
|
->label('Restore')
|
|
->icon('heroicon-o-arrow-path')
|
|
->action(function (): void {
|
|
$tenant = $this->tenant;
|
|
|
|
if (! $tenant instanceof Tenant) {
|
|
abort(404);
|
|
}
|
|
|
|
$tenant->restore();
|
|
$tenant->refresh();
|
|
|
|
ManagedTenantContext::setCurrentTenant($tenant);
|
|
ManagedTenantContext::clearArchivedTenant();
|
|
|
|
Notification::make()
|
|
->title('Managed tenant restored')
|
|
->success()
|
|
->send();
|
|
|
|
$this->redirect(Current::getUrl());
|
|
}),
|
|
fn () => $this->tenant,
|
|
)
|
|
->requireCapability(Capabilities::TENANT_MANAGED_TENANTS_RESTORE)
|
|
->destructive()
|
|
->apply(),
|
|
|
|
UiEnforcement::forTableAction(
|
|
Action::make('force_delete')
|
|
->label('Force delete')
|
|
->icon('heroicon-o-trash')
|
|
->color('danger')
|
|
->action(function (): void {
|
|
$tenant = $this->tenant;
|
|
|
|
if (! $tenant instanceof Tenant) {
|
|
abort(404);
|
|
}
|
|
|
|
$tenant->forceDelete();
|
|
|
|
ManagedTenantContext::clear();
|
|
|
|
Notification::make()
|
|
->title('Managed tenant deleted')
|
|
->success()
|
|
->send();
|
|
|
|
$this->redirect(Index::getUrl());
|
|
}),
|
|
fn () => $this->tenant,
|
|
)
|
|
->requireCapability(Capabilities::TENANT_MANAGED_TENANTS_FORCE_DELETE)
|
|
->destructive()
|
|
->apply(),
|
|
];
|
|
}
|
|
}
|