ZDDC/zddc/internal/apps
ZDDC f7958d7b22 feat(dispatch): trailing slash → browse, no slash → canonical default tool
URL convention for directories under a project:

- <dir>/  (with trailing slash)  → browse (the directory view; same
                                     behaviour as today)
- <dir>   (without trailing slash) → the canonical default tool for
                                     that directory's context, served
                                     inline (no 301 hop)

Tool mapping via the new apps.DefaultAppAt(root, dir):

  - working/...               → mdedit
  - staging/...               → transmittal
  - archive/                  → archive
  - archive/<party>/          → archive
  - archive/<party>/incoming|received|issued/...  → archive
  - archive/<party>/mdl/...   → tables (the per-party MDL grid editor)

Directories outside the canonical layout (project root, scratch
folders) keep the legacy 301-to-trailing-slash redirect since no
default tool fits.

This generalises and replaces the bespoke
"GET archive/<party>/mdl/ → 302 mdl.table.html" redirect added in PR4.
The new dispatcher rule serves the table app inline at the bare-mdl
URL by routing through RecognizeTableRequest with the canonical
.table.html suffix appended; relative fetches resolve identically
because both URLs share the same parent directory.

Tests: TestDefaultAppAt covers all canonical positions plus
case-fold and out-of-tree edges. TestDispatchSlashRouting (replacing
the now-obsolete TestDispatchMdlRedirect) verifies the slash-vs-no-
slash distinction at every canonical folder + non-canonical
fallback.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-07 11:26:32 -05:00
..
embedded chore(embedded): cut v0.0.17-beta 2026-05-07 06:28:22 -05:00
apps.go feat(zddc-server): apps fetch+cache subsystem with cascade overrides 2026-05-01 15:25:25 -05:00
apps_test.go feat(zddc-server): apps fetch+cache subsystem with cascade overrides 2026-05-01 15:25:25 -05:00
availability.go feat(dispatch): trailing slash → browse, no slash → canonical default tool 2026-05-07 11:26:32 -05:00
availability_test.go feat(dispatch): trailing slash → browse, no slash → canonical default tool 2026-05-07 11:26:32 -05:00
cache.go fix(apps): cache key now includes scheme + full host:port (no collisions) 2026-05-04 17:57:28 -05:00
cache_test.go fix(apps): cache key now includes scheme + full host:port (no collisions) 2026-05-04 17:57:28 -05:00
embed.go perf(server): ETag + max-age=0 on embedded HTML responses 2026-05-04 07:49:17 -05:00
fetch.go feat(apps): code-signed URL fetches; dev chart overlays prod data RO 2026-05-04 21:59:07 -05:00
handler.go perf(server): ETag + max-age=0 on embedded HTML responses 2026-05-04 07:49:17 -05:00
handler_test.go feat(apps): code-signed URL fetches; dev chart overlays prod data RO 2026-05-04 21:59:07 -05:00
singleflight.go feat(zddc-server): apps fetch+cache subsystem with cascade overrides 2026-05-01 15:25:25 -05:00
singleflight_test.go feat(zddc-server): apps fetch+cache subsystem with cascade overrides 2026-05-01 15:25:25 -05:00
verify.go feat(apps): code-signed URL fetches; dev chart overlays prod data RO 2026-05-04 21:59:07 -05:00
verify_test.go feat(apps): code-signed URL fetches; dev chart overlays prod data RO 2026-05-04 21:59:07 -05:00
versions.go feat(zddc-server): CLI flags, --version, CWD-default ZDDC_ROOT 2026-05-01 15:43:31 -05:00