Files
inter-hub/Web/Controller/Requirements.hs
Bernd Worsch 7f9a8dd441 feat(P3): IHF Phase 3 complete — Governance and Decision Linkage
Implements the full governance layer:
- Schema: requirements, decision_records, policy_references,
  implementation_change_references; requirement_candidates gets
  requirement_id back-reference
- RequirementsController (index/show; promotion-only create)
- DecisionRecordsController (CRUD + policy/impl ref management)
- GovernanceDashboardAction on HubsController (AutoRefresh)
- PromoteToRequirementAction + LinkToDecisionAction on candidates
- Outcome immutability enforced at controller level (fill excludes outcome)
- Full six-outcome vocabulary with Tailwind color roles
- Integration tests for all Phase 3 paths
- FrontController: registers Phase 2 missing controllers + all Phase 3
- SCOPE.md + docs/phase3-summary.md updated

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-29 10:42:56 +00:00

26 lines
935 B
Haskell

module Web.Controller.Requirements where
import Web.Types
import Web.View.Requirements.Index
import Web.View.Requirements.Show
import Generated.Types
import IHP.Prelude
import IHP.ControllerPrelude
instance Controller RequirementsController where
beforeAction = ensureIsUser
action RequirementsAction = do
requirements <- query @Requirement |> orderByDesc #createdAt |> fetch
candidates <- query @RequirementCandidate |> fetch
render IndexView { requirements, candidates }
action ShowRequirementAction { requirementId } = do
requirement <- fetch requirementId
candidate <- fetch requirement.sourceCandidateId
widget <- fetch candidate.sourceWidgetId
mDecision <- query @DecisionRecord
|> filterWhere (#requirementId, Just requirementId)
|> fetchOneOrNothing
render ShowView { requirement, candidate, widget, mDecision }