zeeshanu/opus
Opus is a lightweight Laravel package by Zeeshan Ul Haq that adds a customizable maintenance mode to your application. Take your site offline gracefully with a polished maintenance page, and let trusted users bypass it using a secret token.
This release (v1.3.5) adds update and delete operations for integrations alongside a refreshed UI. If you were already using the package to register integrations, the first thing to do is check whether your existing create/list flows still behave — the UI update is cosmetic, but the new endpoints are the real story.
Minimal steps:
composer update <vendor>/<package> and run php artisan migrate if the changelog ships new migrations (check vendor/<vendor>/<package>/database/migrations).php artisan vendor:publish --tag=<package>-config.routes/web.php or routes/api.php) first — the new update/delete integration routes tell you the exact URI, HTTP verb, and middleware group better than any docs.src/Http/Controllers/ for the integration controller; note the method signatures (update(UpdateIntegrationRequest $request, Integration $integration) style) so you know whether route-model binding is in play.Look at the src/Actions/ or src/Services/ directory before touching controllers — if update/delete logic lives there, call it directly from your own commands, jobs, or Nova/Filament resources instead of going through HTTP.
Delegate to the package's own actions. New delete/update functionality is usually implemented as an invokable action or service method. Prefer:
app(UpdateIntegration::class)->handle($integration, $validated);
over duplicating validation and persistence in your own controller. You inherit future bug fixes for free.
Form requests as your validation contract. If the package ships an UpdateIntegrationRequest, reuse it (or extend it) so your validation rules stay in sync with the package's expectations — particularly around credentials, which are often nullable/sometimes on update but required on create.
Wrap destructive operations in your own authorization. Delete endpoints in packages frequently rely on a gate or policy that you must register. A common pattern:
Gate::define('delete-integration', fn (User $user, Integration $integration) =>
$user->isAdmin() && $user->team_id === $integration->team_id
);
Do this before exposing the delete route to non-admin users.
Pair with events/observers for side effects. Deletion often cascades to stored credentials or remote OAuth revocations. Hook IntegrationDeleted/IntegrationUpdated events (check src/Events/) into listeners rather than overriding the package's controller — it keeps upgrades painless.
Use the model directly for bulk/headless work. For CLI or queued operations, call Integration::find($id)->update([...]) only if no action class exists; otherwise favour the action so validation and event dispatch stay consistent.
Test against the new routes with assertDatabaseHas/assertSoftDeleted. If the package uses soft deletes on integrations, the delete endpoint may not actually remove the row — write the assertion that matches observed behaviour, not expectation.
softDeletes() and the model for SoftDeletes. If soft, restore() may or may not be exposed; if hard, foreign keys on related tables (logs, sync jobs) need onDelete('cascade') or your own cleanup listener.resources/views/vendor/<package>), re-publish and diff — stale overrides silently break the new buttons.php artisan route:clear && php artisan config:clear. New routes won't appear behind a cached route table, and this masquerades as a broken install.can:update,integration) yourself and consider reporting upstream.$fillable includes the fields you're passing — the package may guard credentials or similar, causing silently ignored updates.How can I help you explore Laravel packages today?