jeffersongoncalves/laravel-saved-filter
Laravel Saved Filter lets users save reusable filter combinations for Eloquent queries and listings, so complex search criteria can be restored later. It provides database-backed storage and a simple API for persisting and applying filters.
Architecture fit. Unchanged: the package still follows the hasMigrations() publishable-stub pattern, and 1.10.0 is the first release to actually exercise the consequence of that choice — a third migration stub arriving out of band. That validates the design intent (schema under application review) and confirms the cost (a manual re-publish per schema-bearing release). The new timezone column is ordinary application-level configuration data sitting on the package's table; nothing about it strains the architecture. The builder-context change is a runtime contract change, not a structural one.
Integration feasibility. The upgrade is still two idempotent-bound commands. Critically, the 1.10.0 notes answer the largest open question from the 1.2.0 review: re-running vendor:publish --tag="saved-filter-migrations" delivers only the missing stub and skips the ones already present, so --force is not required for the upgrade path. That should still be verified on staging rather than taken on trust, but it converts the primary rollout risk from "unknown semantics" to "documented, testable behaviour."
Technical risk.
timezone column is nullable and additive, and null is defined as "use the app timezone," so existing rows are correct without a backfill. This is the safest possible shape for a schema addition and is a materially lower risk than the 1.2.0 column additions.migrate produced missing read paths. If application code begins writing timezone while the column is absent, it is an unknown-column SQL error at runtime — a louder but more disruptive failure. migrate must land in the same release, ahead of exercising the code path.saved_filter_id and report_id alongside tenant_id. Adding keys is normally backward compatible for consumers, but any strict deserialiser, exact-shape assertion, or templating that iterates context will see the change. report_id inside a signed unsubscribe route also warrants a scoping check — the signature must bind it to the recipient or tenant, not merely to the report.tzdata in the runtime image being current. Container base images pinned months ago can carry stale rules for regions that have changed their transitions.Key questions.
timezone stub, leaves the two published stubs byte-identical, and needs no --force.hasColumn-scoped, and does the second stub's pagination/grouping guard remain per-column rather than per-table?timezone validated at write time, or only at schedule execution? If only at execution, can an invalid value raise a warning, log event, or validation error rather than falling back silently?describeSchedule() render correctly for null and for an invalid zone, and is the "(America/Sao_Paulo)" suffix stable enough for anything downstream to parse?saved_filter_id and report_id additive-only in the context payload, and is the contract documented? Is saved_filter_id guaranteed tenant-scoped at the point it enters the builder?report_id in the signed unsubscribe route bound to the recipient as well as the report, and does it expire?null timezone, i.e. is there any missed or shifted send on the upgrade day itself?down() on the new stub drop the column, and is that acceptable given older application code ignores it?Stack fit. Standard artisan workflow, no new services, no configuration coupling beyond the existing publish tag. The one genuinely new infrastructure assumption is accurate timezone data in the runtime image; treat tzdata currency as a deployment prerequisite alongside the PHP version, and make the container timezone explicit now that it is the documented fallback.
Migration path.
saved-filter-migrations tag and run migrate during first deploy — now three stubs, applied in declared order.migrate. The two existing stubs are skipped; one nullable column is added.timezone. This is the cleanest way to finally bring the schema under application ownership.timezone on reports where the app timezone was only accidentally correct is worth considering, and is an application task, not a migration.timezone, so a nullable, unread column is inert. The unresolved downgrade caveat remains 1.2 → 1.1, where package-loaded migrations re-enable against a published schema.Compatibility. The schema change is backward compatible. The behaviour changes — DST occurrence computation and the expanded builder context — are the parts to test, not the DDL. Run the upgrade against a staging copy of a real 1.2-era schema rather than only against a fresh install.
Sequencing.
tzdata in the base image and pin the app timezone deliberately.php artisan migrate --pretend in staging and diff the output against the applied 1.2-era schema.migrate in the same release as the package bump, ahead of any code that writes timezone.null, and confirm the rendered schedule description.timezone.Maintenance. Schema ownership stays with the application team, and the per-release stub check is now a demonstrated obligation rather than a theoretical one — budget it explicitly for every future release that touches migrations. Two new maintenance lines enter the runbook: timezone data currency in base images, and support for per-report timezone configuration now that the feature is user-facing.
Support. The DST fix removes a class of duplicate-send complaints, which is a net reduction in ticket volume. Against that, per-report timezones introduce a new question shape — "the report sent at the wrong hour" — whose most likely cause is a typo'd zone falling back silently. Without write-time validation or a surfaced warning, that ticket is expensive to diagnose. Onboarding documentation grows by one paragraph on timezone semantics plus the unchanged publish-then-migrate step.
Scaling. No impact at request time. Timezone resolution and occurrence computation happen once per schedule evaluation, which is negligible. The tzdata dependency scales with the fleet: every environment and every tenant's runtime image needs current rules, so it belongs in the base image build, not in per-application configuration.
Failure modes.
timezone column — a hard SQL failure at deploy or first use. This is the highest-probability failure of the release.tzdata: DST transitions computed against outdated rules, producing offset-by-one-hour sends around transition dates.report_id: a signed unsubscribe link that binds only to the report could be replayed across recipients or tenants if the signature scope is too broad.timezone column, producing inconsistent behaviour that is hard to reproduce.down(): dropping a column that a partially deployed 1.10 application still writes.Each is mitigated by a pre-deploy migrate --pretend diff, a post-deploy schema assertion, and a timezone round-trip check on one non-default report.
Ramp-up. Low. Teams already on the publishable-migration pattern need only re-run a command they have run before; the concept is familiar. New material is limited to timezone semantics and the tzdata prerequisite. Recommend adopting 1.10.0 rather than deferring: staying on 1.2.0 leaves the DST double-send defect in production, and the gap to 1.10.0 widens the unreviewed changelog with every further release.
How can I help you explore Laravel packages today?