diff --git a/src/Commands/Down.php b/src/Commands/Down.php index 3c82206b..be5ea707 100644 --- a/src/Commands/Down.php +++ b/src/Commands/Down.php @@ -5,9 +5,11 @@ declare(strict_types=1); namespace Stancl\Tenancy\Commands; use Illuminate\Console\Command; +use Illuminate\Foundation\Console\DownCommand; use Stancl\Tenancy\Concerns\HasATenantsOption; +use Symfony\Component\Console\Input\InputOption; -class Down extends Command +class Down extends DownCommand { use HasATenantsOption; @@ -37,17 +39,34 @@ class Down extends Command */ public function handle() { - tenancy()->runForMultiple($this->option('tenants'), function ($tenant) { + // The base down command is heavily used. Instead of saving the data inside a file, + // the data is stored the tenant database, which means some Laravel features + // are not available with tenants. + + $payload = $this->getDownDatabasePayload(); + tenancy()->runForMultiple($this->option('tenants'), function ($tenant) use ($payload){ $this->line("Tenant: {$tenant['id']}"); - $tenant->putDownForMaintenance([ - 'redirect' => $this->option('redirect'), - 'retry' => $this->option('retry'), - 'refresh' => $this->option('refresh'), - 'secret' => $this->option('secret'), - 'status' => $this->option('status'), - ]); + $tenant->putDownForMaintenance($payload); }); $this->comment('Tenants are now in maintenance mode.'); } + + + /** + * Get the payload to be placed in the "down" file. + * + * @return array + */ + protected function getDownDatabasePayload() + { + return [ + 'except' => $this->excludedPaths(), + 'redirect' => $this->redirectPath(), + 'retry' => $this->getRetryTime(), + 'refresh' => $this->option('refresh'), + 'secret' => $this->option('secret'), + 'status' => (int) $this->option('status', 503), + ]; + } } diff --git a/src/Database/Concerns/MaintenanceMode.php b/src/Database/Concerns/MaintenanceMode.php index 3f0df4fb..a4e5c465 100644 --- a/src/Database/Concerns/MaintenanceMode.php +++ b/src/Database/Concerns/MaintenanceMode.php @@ -10,6 +10,7 @@ trait MaintenanceMode { $this->update([ 'maintenance_mode' => [ + 'except' => $data['except'] ?? null, 'redirect' => $data['redirect'] ?? null, 'retry' => $data['retry'] ?? null, 'refresh' => $data['refresh'] ?? null, diff --git a/src/Middleware/CheckTenantForMaintenanceMode.php b/src/Middleware/CheckTenantForMaintenanceMode.php index a27f5c74..bbc29373 100644 --- a/src/Middleware/CheckTenantForMaintenanceMode.php +++ b/src/Middleware/CheckTenantForMaintenanceMode.php @@ -42,13 +42,13 @@ class CheckTenantForMaintenanceMode extends CheckForMaintenanceMode if (isset($data['template'])) { return response( $data['template'], - (int) $data['status'] ?? 503, + (int) ($data['status'] ?? 503), $this->getHeaders($data) ); } throw new HttpException( - (int) $data['status'] ?? 503, + (int) ($data['status'] ?? 503), 'Service Unavailable', null, $this->getHeaders($data) diff --git a/tests/MaintenanceModeTest.php b/tests/MaintenanceModeTest.php index 897dd8a4..4df495e9 100644 --- a/tests/MaintenanceModeTest.php +++ b/tests/MaintenanceModeTest.php @@ -27,9 +27,7 @@ test('tenant can be in maintenance mode', function () { $tenant->putDownForMaintenance(); - pest()->expectException(HttpException::class); - pest()->withoutExceptionHandling() - ->get('http://acme.localhost/foo'); + pest()->get('http://acme.localhost/foo')->assertStatus(503); tenancy()->end(); @@ -59,9 +57,7 @@ test('tenant can be in maintenance mode from command', function() { Artisan::call('tenancy:down'); - pest()->expectException(HttpException::class); - pest()->withoutExceptionHandling() - ->get('http://acme.localhost/foo'); + pest()->get('http://acme.localhost/foo')->assertStatus(503); tenancy()->end();