filagora/filagora-notifications
Adds a ready-to-use notification layer to Filagora, with configurable channels, database and mail delivery, and clean integration into Laravel's notification system so marketplace users stay informed about activity.
PushBridge, ForumsBridge, MessagesBridge) make one preferences store authoritative for push, forum subscriptions, and private-message contactability. This is a "one user, one set of choices" product decision, and the bridge design is safe: a host's own binding always wins, and bridges only bind while the sibling's default is still in place.List-Unsubscribe / List-Unsubscribe-Post (RFC 8058), signed links, and the EmailSuppression contract (bounces, complaints, receives_email) support the mailbox-provider requirements that increasingly determine whether transactional and lifecycle mail lands at all. This is a compliance and inbox-placement decision, not a nice-to-have.notifications privacy contributor means export and erasure are handled rather than bespoke. If GDPR/CCPA response is on the roadmap, this closes a gap with zero incremental work.filagora.notifications.view) answers "why didn't this person get that email?" without an engineer. That is a measurable reduction in support-to-engineering escalations.PreferenceChanged is now an explicit host responsibility — scope it or drop the column.Adopt when:
HasNotificationPreferences trait are the fastest path to support visibility.filagora-push, filagora-forums, filagora-messages); the bridges are where most of the integration value sits, and they are opt-out per bridge.Look elsewhere, or scope extra work, when:
EmailSuppression; that is real work, not configuration.InvalidPreference where the site answered "on". Audit those call sites before rollout — the failure mode changes from silently-enabled to a thrown exception.email-preferences/unsubscribe/{user}/{category}). Enabling them is a deliberate step; verify path collisions, middleware expectations (no session/auth), and whether unsubscribe.signed_ttl is set to something you can defend.For executives: This is a buy-don't-build decision. One package gives us user-facing notification controls across email, push, in-app, and private messages; one-click unsubscribe that mailbox providers now expect; bounce and complaint suppression; and privacy export/erasure — the three things customers, auditors, and deliverability teams ask us for. It replaces an estimated multi-sprint build with a dependency, and because it is one preferences store rather than four per-surface opt-outs, it also settles the "why do forum emails ignore my email settings?" class of complaint. The trade-offs are honest: it is v0.1.0, audit logging is explicitly deferred to a future package, and there is no retention rule, so those become named roadmap items rather than hidden gaps.
For engineering: The surface is small and conventional — one table, one model, NotificationChannel and PreferenceSource enums, a Preferences service, and a category registry where first registration wins so the host can override any package's category. Defaults are "on unless the category says otherwise or a resolver answers per person," resolution is one read per person forgotten at every queue job (no stale worker reads), and a PreferenceChanged event fires on stored-value changes so you can sync legacy columns. Suppression is a contract — bind your own and your rules win. Bridges bind only after all providers boot and only while the sibling's own default is still bound, so a host binding always takes precedence; bridges.push, .forums, and .messages switch each off. Unsubscribe routes are opt-in, signature-verified, with optional TTL and a replaceable view.
Framing the risks: Pin the version and treat the API as provisional. Two behaviors will surprise a team porting from the original site: unregistered categories now throw instead of defaulting to "on," and unsubscribe endpoints live outside the web group. Both are improvements; both need a call-site audit. And be explicit that audit logging and retention are out of scope by design, so no one assumes "privacy contributor" means "audit-ready."
How can I help you explore Laravel packages today?