Skip to content
This repository was archived by the owner on May 29, 2026. It is now read-only.

feat(wms-wfs-layers): apply spec#401

Merged
rubenvdlinde merged 1 commit into
developmentfrom
feat/apply-wms-wfs-layers
May 11, 2026
Merged

feat(wms-wfs-layers): apply spec#401
rubenvdlinde merged 1 commit into
developmentfrom
feat/apply-wms-wfs-layers

Conversation

@rubenvdlinde

Copy link
Copy Markdown
Contributor

Summary

Manifest-first apply of openspec/changes/wms-wfs-layers:

  • New wmsLayer schema (title, type WMS/WFS, url, layerName, srs default EPSG:28992, opacity 0-1, attribution, queryable, format, version, extentCutoffKm default 50, isDefault, active) in lib/Settings/procest_register.json (REQ-WMS-1)
  • New caseType.layerIds: array<uuid wmsLayer> field for per-case-type subscription (REQ-WMS-4)
  • wmsLayer slug + wms_layer_schema config key registered in SettingsService (CONFIG_KEYS + SLUG_TO_CONFIG_KEY)
  • Manifest pages WmsLayers (type: 'index') and WmsLayerDetail (type: 'detail') in src/manifest.json plus WmsLayersMenu entry (admin-only, settings section) — no component key, no bespoke admin Vue view (REQ-WMS-2 / ADR-008)
  • lib/Service/WmsWfsService.phpgetLayersForCaseType(), validateLayer(), proxyRequest(), getLayerById(), buildGetMapUrl(), buildGetFeatureUrl(). All outbound HTTP routed through GisProxyService::proxyRequest (allowlist + rate limit enforced upstream). Tile cap 512x512, WFS BBOX mandatory, 50 km extent cutoff, non-queryable layers reject GetFeatureInfo (REQ-WMS-3, REQ-WMS-5, REQ-WMS-7, REQ-WMS-8)
  • Action-only lib/Controller/WmsWfsController.php + GET /api/wms-wfs/proxy route — CRUD on wmsLayer served by OpenRegister's auto-exposed /api/objects/<register>/<schema> endpoints (no bespoke CRUD controller)

Strict watchdog

  • No i18n changes
  • No composer check
  • php -l clean on all modified/added PHP
  • jq empty clean on procest_register.json and manifest.json

Deferred (frontend follow-up)

T04 (CaseTypeDetail "Kaartlagen" tab), T05 (CaseMap layerIds prop + Leaflet integration) and T06 (MapLayerLegend.vue) are deferred to a follow-up PR — the backend exposes the contract the Vue components will consume.

Test plan

  • POST a wmsLayer via /api/objects/procest/wmsLayer → schema validates, UUID returned, GET round-trips fields
  • Visit /settings/wms-layers → manifest renders the index page with columns title/type/url/layerName/queryable/active
  • Visit /settings/wms-layers/:id → detail page with Verbinding testen tab
  • GET /api/wms-wfs/proxy?layerId=<uuid>&request=GetCapabilities against a PDOK-hosted layer returns parsed capabilities; URL outside allowlist returns 403
  • WFS BBOX > 50 km × 50 km returns 413 with "zoom in for details" message
  • caseType.layerIds = [L1.id] persists across reload and is returned by getLayersForCaseType()

Manifest-first WMS/WFS overlay layer subscription per case type:

- Add wmsLayer schema (title, type WMS/WFS, url, layerName, srs default
  EPSG:28992, opacity 0-1, attribution, queryable, format, version,
  extentCutoffKm default 50, isDefault, active) to procest_register.json
- Add layerIds: array<uuid wmsLayer> field to caseType schema
- Register wmsLayer slug + wms_layer_schema config key in SettingsService
- Add WmsLayers (type: index, admin-only) + WmsLayerDetail (type: detail)
  manifest pages to src/manifest.json (per ADR-008 manifest-first; no
  bespoke CRUD controller) — Verbinding testen tab wired to action endpoint
- Add Kaartlagen menu entry (settings section, admin permission)
- New WmsWfsService — getLayersForCaseType, validateLayer, proxyRequest,
  getLayerById, buildGetMapUrl, buildGetFeatureUrl; all outbound HTTP
  delegated to GisProxyService::proxyRequest (allowlist + rate limit
  enforced upstream); tile cap 512x512, WFS BBOX required, 50km extent
  cutoff, non-queryable layers reject GetFeatureInfo
- New action-only WmsWfsController + GET /api/wms-wfs/proxy route
  (CRUD on wmsLayer served by OpenRegister auto-routes)

Per OPSX strict watchdog: no i18n, no composer check; php -l + jq passed.
T04/T05/T06 (frontend Leaflet wiring) deferred — backend exposes the
contract the Vue components will consume.
@rubenvdlinde rubenvdlinde merged commit cadb834 into development May 11, 2026
12 of 15 checks passed
@rubenvdlinde rubenvdlinde deleted the feat/apply-wms-wfs-layers branch May 11, 2026 16:01
@github-actions

Copy link
Copy Markdown
Contributor

Quality Report — ConductionNL/procest @ f1c5bcc

Check PHP Vue Security License Tests
lint
phpcs
phpmd
psalm
phpstan
phpmetrics
eslint
stylelint
composer ✅ 100/100
npm ✅ 419/419
PHPUnit ⏭️
Newman ⏭️
Playwright

Spec coverage: 3% (21 tests / 673 specs)


Quality workflow — 2026-05-11 16:05 UTC

Download the full PDF report from the workflow artifacts.

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant