Content production

A small but high-traffic Treehouse pillar covering everything the company published or distributed. Four controllers, no public routes — content is authored here and surfaced under Domain A (Public web) once published.

What it covers

Representative routes

Content production. All routes are Treehouse-internal.
Method Path Handler Notes
GET /admin/content/posts PostController.list Filter by status, author, tag.
POST /admin/content/posts PostController.create New draft.
GET /admin/content/posts/:id/edit PostController.edit Rich-text editor.
POST /admin/content/posts/:id/publish PostController.publish Updates status; clears CDN; queues digest.
POST /admin/content/posts/:id/ai-suggest PostController.aiSuggest Calls OpenAI; logs to LLM-trace table.
GET /admin/content/summaries SummaryController.list Board summaries; one per closed board.
POST /admin/content/summaries/:id/generate SummaryController.generate Triggers AI summarization handler in dispenserd.
GET /admin/content/assets AssetController.list Marketing copy library.
GET /admin/content/assets/:id/revisions AssetController.revisions Versioned history.

Headline flow: draft post → published

Step 1: Author clicks "New post" in /admin/content/posts.
Step 2: Writes draft in TinyMCE editor; autosave every 30s.
Step 3: Optional: POST /admin/content/posts/:id/ai-suggest →
        OpenAI completion appended to a suggestions panel.
Step 4: Author marks post "ready for review" → notification to editor.
Step 5: Editor approves → POST /admin/content/posts/:id/publish.
Step 6: PostController flips status, fires `publish_post` dispenserd job.
Step 7: dispenserd handler purges CDN, posts to social (when wired),
        queues digest email rollup.
Step 8: Post becomes visible at /blog/:slug for public consumption.