Parcourir la source

TASKS.md/CLAUDE.md: P1-7 Tab 1 404 opgelost (Drupal Services-resource niet geactiveerd op productie) + herbruikbaar debug-recept gedocumenteerd

Root cause samen met Bob live gedebugd: favorieten_agenda-resource
stond wel in custom.module's hook_services_resources() maar was nooit
aangevinkt voor het flutterdrup-endpoint op productie
(admin/structure/services/list/flutterdrup/resources) — identieke
module-code op beide omgevingen, alleen de endpoint-resource-activatie
verschilde. CLAUDE.md kreeg een nieuwe notitie met het volledige
debug-recept (adb logcat op drupalRequest's debug-output, curl-
vergelijking prod/devbob, 127.0.0.1-trick om Cloudflare echt te
omzeilen, menu_router + watchdog-log-vergelijking) voor een volgende
soortgelijke 'werkt op de ene Drupal-omgeving niet op de andere'-bug.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
bob il y a 3 semaines
Parent
commit
bfaa5031be
3 fichiers modifiés avec 62 ajouts et 4 suppressions
  1. 43 0
      CLAUDE.md
  2. 15 0
      TASKS.md
  3. 4 4
      ios/Runner.xcodeproj/project.pbxproj

+ 43 - 0
CLAUDE.md

@@ -1163,6 +1163,49 @@ exacte veldnaam+type-specificatie (kost hem seconden per veld).
 
 ## Domein/architectuurcontext
 
+- **Drupal 7 Services-module: een nieuwe custom resource moet ook los
+  geactiveerd worden per endpoint — code alleen is niet genoeg.**
+  Bevestigd 2026-08-19 (Bob + Claude samen gedebugd, P1-7 Tab 1
+  "Persoonlijke agenda"): `favorieten_agenda.json` gaf op productie
+  een kale, lege 404 (geen enkele Drupal-header, niets in de
+  watchdog-log), terwijl exact dezelfde `custom.module`-code op
+  devbob prima werkte. De resource zelf stond correct gedefinieerd in
+  `hook_services_resources()` (`custom_services_resources()` in
+  `custom.module`) — dat alleen registreert 'm bij de module, maar
+  **een Services-endpoint (bv. `flutterdrup`) serveert alleen de
+  resources die daar expliciet voor zijn aangevinkt**, een aparte
+  config/database-instelling per endpoint, los van de module-code.
+  Die aanvinking was ooit op devbob gedaan (tijdens testen) maar nooit
+  meegenomen naar productie. **Check/fix altijd hier:**
+  `https://<domein>/en/admin/structure/services/list/<endpoint-naam>/resources`
+  (of via `drush @<site-alias> php-eval "print_r(services_endpoint_load('<endpoint-naam>'));"`
+  — vergelijk de `resources`-array tussen omgevingen). **Symptoom dat
+  hierop wijst:** een endpoint/pad dat op de ene Drupal-omgeving prima
+  werkt en op de andere een 404 geeft mét een compleet lege body en
+  zonder de gebruikelijke custom response-headers (bij dit project
+  bv. `x-speed-cache`/`x-device`/`x-geoip-*`, toegevoegd door de eigen
+  Aegir/Boa-caching-laag pas ná volledige Drupal-bootstrap) — dat wijst
+  op "wordt vroeg afgewezen, bereikt zelfs Drupal's eigen watchdog-log
+  niet", eerder dan een nginx/Cloudflare-routeringsprobleem. **Nuttig
+  debug-recept dat hiertoe leidde:** (1) `drupalRequest`'s eigen
+  `print()`-debug-output opvangen via `adb logcat` tijdens een live
+  test in de app, om de exacte headers/status/body te zien die de app
+  zelf verstuurt/ontvangt; (2) diezelfde request los met `curl -i`
+  natesten op beide omgevingen; (3) **om Cloudflare écht te omzeilen
+  moet je letterlijk `127.0.0.1` in de curl-URL zetten** (niet de
+  echte hostnaam, ook niet met een aangepaste `Host`-header — Cloudflare
+  zit op DNS-niveau, een `Host`-header alleen stuurt de request nog
+  steeds via Cloudflare's edge); (4) `menu_router`-tabel checken via
+  `drush php-eval` (leeg voor beide omgevingen was hier een belangrijke
+  aanwijzing dat dit geen kaal `hook_menu()`-pad was maar via
+  Services liep); (5) de Drupal watchdog-log (`admin/reports/dblog`)
+  vergelijken tussen omgevingen — als de kapotte omgeving zelfs geen
+  enkele logregel toont terwijl een ander, vergelijkbaar endpoint op
+  diezelfde omgeving wél volledig doorloopt (inclusief juiste
+  gebruikersherkenning), sluit dat sessie/cookie/nginx-routing-
+  problemen vrijwel uit en wijst het naar iets resource-specifieks
+  binnen Drupal/Services zelf.
+
 - **Taal/locale volgt het toestel, niet hardcoded Nederlands** — zonder
   opgeslagen voorkeur (`FFLocalizations`/`_kLocaleStorageKey`) valt
   `MaterialApp.locale` terug op de systeemtaal van het toestel; matcht

+ 15 - 0
TASKS.md

@@ -1123,6 +1123,21 @@ lokale/UI-kant + look&feel oppakken zolang die niet op Drupal wacht.
      **Live bevestigd:** `favorieten_agenda.json` geeft momenteel nog
      een **404** terug (Bob kijkt hier zelf naar, zie boven) — de tab
      blijft nu netjes leeg i.p.v. te crashen.
+
+*(De 404 hierboven is afgerond 2026-08-19 — Bob, Drupal-kant, samen
+met Claude gedebugd via live curl-vergelijkingen productie/devbob +
+Drupal watchdog-log + `custom.module`-broncode. **Root cause: de
+`favorieten_agenda`-resource (Services-module, gedefinieerd in
+`custom_services_resources()`) stond nog niet aangevinkt als
+ingeschakelde resource voor het `flutterdrup`-endpoint op productie**
+— identieke module-code op beide omgevingen, maar de
+resource-activatie zelf is een los, niet-code-gebonden
+config/database-item per endpoint (zie de nieuwe `CLAUDE.md`-notitie
+voor het volledige, herbruikbare debug-recept). Fix: resource
+aangevinkt op
+`https://uitgaanskrant.com/en/admin/structure/services/list/flutterdrup/resources`.
+Tab 1 "Persoonlijke agenda" haalt nu live data op. Uit deze lijst
+verwijderd.)*
 *(Anonieme API-call-bug op Tab 3 afgerond 2026-08-19 — Claude, builder
 + verse-export-verificatie: `FavorietenAgendaCall`'s Backend Query op de
 ListView had geen `sessionName`/`sessionId` gebonden, dus de call ging

+ 4 - 4
ios/Runner.xcodeproj/project.pbxproj

@@ -44,8 +44,8 @@
 		97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
 		97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
 		97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
-		6436409A27A31CD100820AF7 /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/InfoPlist.strings; sourceTree = "<group>"; };
-		6436409227A31CDE00820AF7 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+		6436409127A31CD600820AF7 /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+		6436409B27A31CDA00820AF7 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
 		97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
 /* End PBXFileReference section */
 
@@ -225,8 +225,8 @@
 		6436409C27A31CD800820AF7 /* InfoPlist.strings */ = {
 			isa = PBXVariantGroup;
 			children = (
-				6436409A27A31CD100820AF7 /* nl */,
-				6436409227A31CDE00820AF7 /* en */,
+				6436409127A31CD600820AF7 /* nl */,
+				6436409B27A31CDA00820AF7 /* en */,
 			);
 			name = InfoPlist.strings;
 			sourceTree = "<group>";