feat: minimal IHP scaffold — T01-T05, T08 of IRP-WP-0001

- flake.nix adapted from inter-hub: appName=ihp-railiance-probe, stripped to
  core packages, GHC 9.10.3 Bug 1+2 overlays carried verbatim (pname check
  updated to ihp-railiance-probe-models)
- IHP project scaffold: Main.hs, Config.hs, App.cabal, Setup.hs, Makefile
- Schema: probes table (id, name, created_at)
- Health endpoint: GET /healthz → "ok" (HealthController)
- Probes CRUD: ProbesController + 4 views (Index, New, Show, Edit)
- Hspec test suite: Test/ProbeControllerSpec covers /probes and /healthz
- Helm chart in chart/: deployment, service, ingress, secret templates
- devenv.nix, devenv.yaml, .ghci, tailwind config

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-05-03 12:57:28 +02:00
parent b818866c7f
commit e372a0c9ce
35 changed files with 645 additions and 0 deletions

36
Web/FrontController.hs Normal file
View File

@@ -0,0 +1,36 @@
module Web.FrontController where
import IHP.RouterPrelude
import IHP.ControllerPrelude
import IHP.ViewPrelude (Html, hsx, Layout)
import Generated.Types
import Web.Types
import Web.Routes ()
import Web.Controller.Health ()
import Web.Controller.Probes ()
instance FrontController WebApplication where
controllers =
[ parseRoute @HealthController
, parseRoute @ProbesController
]
instance InitControllerContext WebApplication where
initContext = do
setLayout defaultLayout
defaultLayout :: (?context :: ControllerContext, ?request :: Request) => Layout
defaultLayout inner = [hsx|
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>ihp-railiance-probe</title>
</head>
<body>
{inner}
</body>
</html>
|]