Files
gridpilot.gg/docs/architecture/website/PRESENTERS.md
2026-01-11 14:04:48 +01:00

1.6 KiB

Presenters (Strict)

This document defines the Presenter boundary for apps/website.

Presenters exist to prevent responsibility drift into:

  • server routes
  • Page Queries
  • Templates

1) Definition

A Presenter is a deterministic, side-effect free transformation between website presentation models.

Allowed transformations:

  • Page DTO → ViewData
  • Page DTO → ViewModel
  • ViewModel → ViewData

2) Non-negotiable rules

  1. Presenters MUST be deterministic.
  2. Presenters MUST be side-effect free.
  3. Presenters MUST NOT perform HTTP.
  4. Presenters MUST NOT call API clients.
  5. Presenters MUST NOT access cookies/headers.
  6. Presenters MAY use Display Objects.
  7. Presenters MUST NOT import Templates.

3) Where Presenters run

Presenters run in client code only.

Presenters MUST be defined in 'use client' modules.

If a computation affects routing decisions (redirect, notFound), it belongs in a Page Query or server route composition, not in a Presenter.

4) Relationship to Display Objects

Display Objects implement reusable formatting/mapping.

Rules:

  • Presenters may orchestrate Display Objects.
  • Display Object instances MUST NOT appear in ViewData.

See DISPLAY_OBJECTS.md and VIEW_DATA.md.

5) Canonical placement in this repo (strict)

Presenters MUST live colocated with ViewModels under:

  • apps/website/lib/view-models/**

Reason: this repo already treats apps/website/lib/view-models/** as the client-only presentation module boundary.