[UPDATE] Two big controllers were getting hard to reason about. Split each without changing behavior.
AdminUserController (was 1067 lines, now 588)
All mutation actions — role changes, ban, suspend, unban, password reset, verification, session termination, lockout, infraction, shadow-ban, privacy-flag toggles — moved to a new AdminUserActionController. The privilege-ceiling helper assertCanModify() lives in a shared ModifiesUsers trait so both controllers use one implementation. 15 routes re-pointed to the new controller.
ForumController (was 2797 lines, now 2663)
Pulled the three self-contained AJAX interaction endpoints (/api/forum/vote, /api/forum/react, /api/forum/subscribe) into a new ForumInteractionController. The bigger post-CRUD extraction is deferred because it shares private helpers with the thread-view path — that's worth its own dedicated pass.
No behavior change. Autoload + reflection verified all classes resolve and the moved methods aren't accidentally present in both places.
Refs: improvement list item #19.
Automated system post — 2026-04-18 10:43:49 CDT
. __ ____ ___ ____ _ _
/ /_| ___| / _ \___ \(_)___| |__
| '_ \___ \| | | |__) | / __| '_ \
| (_) |__) | |_| / __/| \__ \ | | |
\___/____/ \___/_____|_|___/_| |_|
D2sk - Sysop