Ver Fonte

TASKS: taak 48/54 afgerond (Cloudflare HIT gemeten), 56 naar livegang, 47 half (events nog niet opnieuw opgeslagen), zoek-filter exact geplaatst

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
bob há 10 horas atrás
pai
commit
46f2f4f9bf
1 ficheiros alterados com 42 adições e 30 exclusões
  1. 42 30
      TASKS.md

+ 42 - 30
TASKS.md

@@ -149,8 +149,21 @@ hoe belangrijk het voor de app is.*
    *Is less than or equal to* met identifier **`datum_tot`**, beide op
    `field_date_value`. Let op: "Is between" geeft één identifier met
    `[min]`/`[max]` — dat is juist niet wat we willen (zie `CLAUDE.md`).
-2. **Eén exposed `title`-contains filter op diezelfde view** (voor P2-26),
-   identifier bv. **`zoek`**. Client-side zoeken kan hier niet: `services_1`
+2. **Eén `title`-contains filter op diezelfde view** (voor P2-26), parameter
+   **`zoek`** — **niet via de Views-UI** (zes van de zeven displays overriden
+   hun filters) maar als extra blok in `custom_views_query_alter()`, binnen het
+   bestaande `if ($view->name == 'flutterflowmobiel1') { … }`, direct **na de
+   `foreach ($grenzen …) { … }`** en vóór de sluitende accolade van die `if`:
+   ```php
+   if (!empty($_GET['zoek']) && is_string($_GET['zoek'])) {
+     $zoek = trim(drupal_substr($_GET['zoek'], 0, 100));
+     if ($zoek !== '') {
+       $query->add_where(0, 'node.title', '%' . db_like($zoek) . '%', 'LIKE');
+     }
+   }
+   ```
+   Test: `…services_3.json?townid=28695&zoek=jazz&_cb=…` → deelverzameling,
+   `zoek=qqqzzz` → `[]`, zonder `zoek` → ongewijzigd aantal. Client-side zoeken kan hier niet: `services_1`
    heeft 937 items voor Amsterdam (38 pagina's), `services_3` 497,
    `services_5` 450 — gemeten 2026-09-15.
    *Zodra 1 en 2 er staan is de app-kant van allebei klein werk: één
@@ -903,8 +916,12 @@ taak 21/33 (datumfilter, zie het blok hieronder), taak 43 + 46
 API-calls van `/en/` naar `/nl/`), taak 50 (pager 25 → 50), taak 52
 (`dblog_row_limit` stond al goed) en taak 53 (`services_2` uitgezet).*
 
-**Taak 47 · Theater Landgraaf mist zijn gemeente/plaats.** Horecagelegenheid
-nid **70155** heeft geen `field_hor_municipality_town`. Gevolg: de events daar
+**Taak 47 · Theater Landgraaf mist zijn gemeente/plaats · ⚠️ HALF (Bob
+2026-09-15: "gedaan in productie". Claude meet om 22:15: de zaak zelf heeft nu
+`plaats: Nieuwenhagen` in `establishment_info`, maar alle drie de events geven
+nog `"plaats": null` in `flutterflow_events.json` (cache-buster) — de tweede
+stap, de events opnieuw opslaan, ontbreekt nog; zie de ⚠️ hieronder).**
+Horecagelegenheid nid **70155** heeft geen `field_hor_municipality_town`. Gevolg: de events daar
 (nid 221721, 221722, 221723 — adres "Kerkberg 4") hebben een lege `plaats` en
 zijn dus **niet vindbaar via `townid`**; ze komen in geen enkele stadstab. Het
 zijn er 3 van de 1200 gemeten events (0,2%), dus het is één node, geen
@@ -912,32 +929,19 @@ structureel probleem. ⚠️ `custom_node_presave()` kopieert de plaats naar het
 event **op het moment dat het event wordt opgeslagen** — de zaak repareren is
 dus niet genoeg, die drie events moeten daarna opnieuw opgeslagen worden.
 
-**Taak 48 · FlutterFlow-commit op `main`.** Staat sinds 14 sep open (Claude's
-klik op de commit-knop in het Version Control-paneel komt niet aan) en er zijn
-op 15 sep opnieuw drie API-calls gewijzigd.
-
-**Taak 54 · Cloudflare Cache Rule voor de publieke endpoints.** De winst is
-gemeten: dezelfde URL zonder cache-buster geeft **1,23 s (MISS) → 0,10 s
-(HIT)**, maar `cf-cache-status` staat op `DYNAMIC`, dus Cloudflare cachet niets
-en elke gebruiker legt de volle weg naar de origin af. Bob doet dit puur in
-Cloudflare (geen Drupal-header). De twee instellingen die het bepalen:
-- **Expression**: `http.request.method eq "GET"` **en** `not http.cookie
-  contains "SESS"` **en** een expliciete lijst van paden.
-- **Edge TTL**: "Ignore cache-control header and use this TTL" → **300 s**.
-  De optie "Use cache-control header if present, bypass cache if not" werkt
-  hier **niet**, want de origin stuurt `no-store, no-cache`.
-⚠️ `flutterflowmobiel_establishments.json` hoort **niet** in die lijst: die
-display filtert in `custom_views_query_alter()` op de favorietenlijst van de
-ingelogde gebruiker, dus dezelfde URL geeft per gebruiker een ander antwoord.
-Idem voor `/flutterdrup/favorieten*`, `/mijn_*`, `/accountdelete`, `/user/*`.
-
-**Taak 56 · De opruim-cron zegt 30 dagen maar doet 360.** In
-`custom_cronapi()` staat *"after 30 days"*, in
-`custom_delete_expired_events_callback()` staat `$date->modify('- 360 days')`.
-Met 16.065 events in de voorraad is dat geen detail. Er zit bovendien een
-`range(0, 500)` op: max 500 verwijderingen per cronrun, wat bij de huidige
-importsnelheid mogelijk niet meer volstaat. Besluit welke van de twee klopt,
-maak description en code gelijk, en hernoem `$date_after_30`.
+**Taak 54 · Cloudflare Cache Rule · ✅ AFGEROND 2026-09-15 (Bob), nagemeten
+door Claude.** Rule "FlutterFlow publieke endpoints": `GET` én geen cookie met
+`SESS` én URI in `flutterflowmobiel1.json`, `flutterflow_events.json`,
+`flutterflowmobiel_establishment_info.json`,
+`flutterflowmobiel_establishment_events.json`, `plaatsen.json`,
+`plaatsen_bij_gemeente.json`; Edge TTL "Ignore cache-control" 5 min. Meting op
+`flutterflowmobiel1` services_3 Amsterdam: 1e call `cf-cache-status: MISS`,
+3e call **`HIT`, age 2, 0,06–0,09 s**. `flutterflowmobiel_establishments.json`
+staat er terecht **niet** in (favorieten-filter per gebruiker). **Gevolg voor
+later:** een Drupal-wijziging aan één van deze zes endpoints is voor de app pas
+na max. 5 min zichtbaar, én een cache-buster (`_cb=`) omzeilt Cloudflare óók —
+dus een `_cb`-test zegt niets over wat de app ziet; wacht 5 min of purge de
+rule in Cloudflare.
 
 ### Voor Bob — drie Drupal-taken, uitgeschreven
 
@@ -1151,6 +1155,14 @@ en staat in de map `kanweg`. Drie dingen die daaruit volgen:
 
 ### Bij livegang
 
+- **Taak 56 · Opruim-cron: description zegt 30 dagen, code doet 360 (Bob's
+  besluit 2026-09-15: na livegang).** In
+`custom_cronapi()` staat *"after 30 days"*, in
+`custom_delete_expired_events_callback()` staat `$date->modify('- 360 days')`.
+Met 16.065 events in de voorraad is dat geen detail. Er zit bovendien een
+`range(0, 500)` op: max 500 verwijderingen per cronrun, wat bij de huidige
+importsnelheid mogelijk niet meer volstaat. Besluit welke van de twee klopt,
+maak description en code gelijk, en hernoem `$date_after_30`.
 - **AdMob: `Show Test Ads` uitzetten** (App Settings → AdMob). Staat nu AAN,
   dus de banner op `pUitgaanPage` toont testadvertenties en levert niets op.
   De GDPR-consentflow staat sinds 2026-09-15 wél goed (`adMobRequestConsent()`