phoenix1331/filament-jev-moderation
Filament plugin for JEV moderation that adds review queues, approval and rejection actions, and status tracking to your Laravel admin panel. Designed for teams that need clear, audit-friendly content moderation workflows, it streamlines oversight and keeps moderated items organized.
Architecture fit
JevModerationPlugin::make()) that layers a review UI over phoenix1331/laravel-jev-moderation 0.2. The plugin deliberately routes all moderation writes through the core's approve() / reject(), so ReviewResolved and existing listeners/audit consumers keep working. That is the right boundary: the plugin owns presentation and workflow, the core owns decision state and events.models(), modelLabels(), authorRelation()/authorRelations(), closures throughout), which fits apps moderating several polymorphic types but adds configuration surface at boot.Integration feasibility
composer require, register the plugin, optionally scope with models([...]), set labels and author relations. No application migrations are described, implying the core owns schema — confirm before assuming zero-migration rollout.Technical risk
authorize() is fail-closed (must return exactly true; otherwise access only in local), which is a safe default but a common misconfiguration — a closure returning truthy non-true silently 403s every page and widget. Action authorization falls back to allow once page access is granted when neither authorizeActionsUsing() nor a ModerationDecision policy is registered. That is a fail-open default for approve/reject/reclassify and should be treated as a required configuration step, not an optional one.review_above / block_above / uncertain_below is a config deploy plus a per-model jev-moderation:rescan with a status target. If that rescan is run against the wrong status, moderator decisions get re-checked — a silent quality regression.Key questions
ModerationDecision policy in our app, and does Filament Shield cover approve/reject/reclassify cleanly?Stack fit
ModerationDecision policy, which lets us avoid writing a custom authorizeActionsUsing() closure.Migration path
laravel-jev-moderation 0.2 and verifying policy config is readable and versioned.ReviewResolved emissions.Compatibility
models() scoping is the compatibility lever: we can adopt without exposing every moderated type at once.Sequencing
jev-moderation:stats runs clean.models([...]) limited to one low-risk type; set modelLabels() and authorRelation() explicitly rather than relying on defaults.authorize() returning exactly true for a named pilot group; verify 403 behavior for everyone else in a non-local environment.ModerationDecision policy (or authorizeActionsUsing()) before enabling any approve/reject path — do not rely on the allow fallback.DecisionVolumeChart and ModerationOverview override rate against jev-moderation:stats until they agree.jev-moderation:rescan per model with the correct status target) and rehearse it once.includeBlocked() and remaining models; roll out calibration review as a weekly moderator ritual.Maintenance
Support
authorize() return, and over-permissioned actions from an unregistered policy. Both are configuration, not bugs, and both need to be in the onboarding doc.Scaling
ModerationOverview refreshes every minute per open panel. With many concurrent moderators this is continuous background load; confirm it is lazy/visible-only and consider lengthening the interval for large teams.Failure modes
Ramp-up
How can I help you explore Laravel packages today?