Commit 9f69f60
refactor: AbstractEntityMiddleware base class + complete middleware consolidation (phase 2) (#8169)
## Summary
Follows up on #8166, extending the middleware consolidation pattern
across all remaining routes.
- **`AbstractEntityMiddleware`** — new abstract base class encapsulating
the entity-loading pattern (get route param → 412, ORM query → 404,
`withAttribute`) used by all entity middleware. Each subclass only
implements `getRouteParamName()`, `getAttributeName()`, and
`loadEntity()`
- **`GroupMiddleware`, `DepositMiddleware`, `CalendarMiddleware`,
`KioskDeviceMiddleware`** — all refactored to extend
`AbstractEntityMiddleware`; also fixes a bug in `GroupMiddleware` that
was returning 412 instead of 404 for not-found entities
- **Route files** — entity-loading middleware wired to 17 routes across
5 files, removing all inline ORM loads and null guards from handlers
- **`InputSanitizationMiddleware`** — wired to every write route that
accepts text input; found and fixed a gap: `POST /{groupID}/roles`
(`roleName`) was missing sanitization
- **Bug fix** — `getEventSecondaryContact` had an inverted condition
(`!empty`) that threw 404 when the contact *was* found; fixed to `empty`
## Files changed
| Action | File |
|--------|------|
| **New** |
`src/ChurchCRM/Slim/Middleware/Api/AbstractEntityMiddleware.php` |
| **New** | `src/ChurchCRM/Slim/Middleware/Api/CalendarMiddleware.php` |
| **New** | `src/ChurchCRM/Slim/Middleware/Api/DepositMiddleware.php` |
| **New** |
`src/ChurchCRM/Slim/Middleware/Api/KioskDeviceMiddleware.php` |
| **Modified** | `src/ChurchCRM/Slim/Middleware/Api/GroupMiddleware.php`
|
| **Modified** | `src/api/routes/calendar/calendar.php` |
| **Modified** | `src/api/routes/calendar/events.php` |
| **Modified** | `src/api/routes/finance/finance-deposits.php` |
| **Modified** | `src/api/routes/people/people-groups.php` |
| **Modified** | `src/kiosk/routes/api/kiosks.php` |
## Middleware ordering
Slim 4 is LIFO:
`->add(InputSanitizationMiddleware)->add(EntityMiddleware)` runs
entity-loading first (outermost), then sanitizes the body, then calls
the handler. This is the correct order — no wasteful sanitization on
requests that will 404.
## Test plan
- [ ] Existing Cypress suite passes (behavior is unchanged — same auth,
same 404/412 responses, same handler logic)
- [ ] `GET /groups/999999` → 404 (GroupMiddleware now returns 404, was
412)
- [ ] `GET /deposits/999999` → 404
- [ ] `GET /api/calendars/999999` → 404
- [ ] `POST /kiosk/api/devices/999999/reload` → 404
- [ ] `POST /groups/{id}/roles` with XSS in `roleName` → name sanitized
in DB
🤖 Generated with [Claude Code](https://claude.com/claude-code)
---------
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>1 parent 29823de commit 9f69f60
File tree
13 files changed
+238
-214
lines changed- cypress/e2e/api/private/standard
- src
- ChurchCRM/Slim/Middleware/Api
- api/routes
- calendar
- finance
- people
- kiosk/routes/api
- members
13 files changed
+238
-214
lines changedLines changed: 6 additions & 6 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
203 | 203 | | |
204 | 204 | | |
205 | 205 | | |
206 | | - | |
| 206 | + | |
207 | 207 | | |
208 | 208 | | |
209 | 209 | | |
210 | 210 | | |
211 | | - | |
| 211 | + | |
212 | 212 | | |
213 | 213 | | |
214 | 214 | | |
215 | | - | |
| 215 | + | |
216 | 216 | | |
217 | 217 | | |
218 | 218 | | |
219 | 219 | | |
220 | | - | |
| 220 | + | |
221 | 221 | | |
222 | 222 | | |
223 | 223 | | |
224 | | - | |
| 224 | + | |
225 | 225 | | |
226 | 226 | | |
227 | 227 | | |
228 | 228 | | |
229 | | - | |
| 229 | + | |
230 | 230 | | |
231 | 231 | | |
232 | 232 | | |
| |||
Lines changed: 44 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
| 3 | + | |
| 4 | + | |
3 | 5 | | |
4 | 6 | | |
5 | 7 | | |
6 | | - | |
7 | | - | |
8 | | - | |
9 | | - | |
10 | | - | |
11 | | - | |
12 | | - | |
13 | 8 | | |
14 | | - | |
| 9 | + | |
15 | 10 | | |
16 | | - | |
| 11 | + | |
17 | 12 | | |
18 | | - | |
19 | | - | |
20 | | - | |
21 | | - | |
22 | | - | |
| 13 | + | |
| 14 | + | |
23 | 15 | | |
24 | | - | |
25 | | - | |
26 | | - | |
27 | | - | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
28 | 20 | | |
29 | | - | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
30 | 25 | | |
31 | | - | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
32 | 29 | | |
33 | 30 | | |
Lines changed: 30 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
6 | 6 | | |
7 | 7 | | |
8 | 8 | | |
| 9 | + | |
| 10 | + | |
9 | 11 | | |
10 | 12 | | |
11 | | - | |
12 | 13 | | |
13 | 14 | | |
14 | 15 | | |
15 | | - | |
16 | 16 | | |
17 | 17 | | |
18 | 18 | | |
| |||
22 | 22 | | |
23 | 23 | | |
24 | 24 | | |
25 | | - | |
| 25 | + | |
26 | 26 | | |
27 | | - | |
| 27 | + | |
28 | 28 | | |
29 | | - | |
30 | | - | |
31 | | - | |
32 | | - | |
33 | | - | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
34 | 34 | | |
35 | 35 | | |
36 | 36 | | |
| |||
211 | 211 | | |
212 | 212 | | |
213 | 213 | | |
214 | | - | |
215 | | - | |
216 | | - | |
217 | | - | |
218 | | - | |
219 | | - | |
| 214 | + | |
220 | 215 | | |
221 | 216 | | |
222 | 217 | | |
| |||
248 | 243 | | |
249 | 244 | | |
250 | 245 | | |
251 | | - | |
252 | | - | |
253 | | - | |
254 | | - | |
255 | | - | |
256 | | - | |
| 246 | + | |
257 | 247 | | |
258 | 248 | | |
259 | 249 | | |
| |||
289 | 279 | | |
290 | 280 | | |
291 | 281 | | |
292 | | - | |
293 | | - | |
294 | | - | |
295 | | - | |
296 | | - | |
297 | | - | |
298 | | - | |
299 | | - | |
| 282 | + | |
300 | 283 | | |
301 | 284 | | |
302 | 285 | | |
| |||
319 | 302 | | |
320 | 303 | | |
321 | 304 | | |
322 | | - | |
323 | | - | |
324 | | - | |
325 | | - | |
326 | | - | |
327 | | - | |
328 | | - | |
329 | | - | |
| 305 | + | |
330 | 306 | | |
331 | 307 | | |
332 | 308 | | |
| |||
355 | 331 | | |
356 | 332 | | |
357 | 333 | | |
358 | | - | |
| 334 | + | |
359 | 335 | | |
360 | 336 | | |
361 | 337 | | |
| |||
380 | 356 | | |
381 | 357 | | |
382 | 358 | | |
383 | | - | |
384 | | - | |
385 | | - | |
386 | | - | |
387 | | - | |
388 | | - | |
389 | | - | |
390 | | - | |
391 | | - | |
| 359 | + | |
392 | 360 | | |
393 | 361 | | |
394 | 362 | | |
| |||
0 commit comments