Phase P4 of epic #323. Second content layer (after books #326).
What: SpikerSoft's own written material about each section — we are writing our own book on these subjects. Editorial angle, consistently: you're new, we're old school, you have the tools — use them, here's how. Distinct from tutorial panels (which are step instructions); this is the narrative/why layer a student reads before or alongside the exercise.
Model (backend):
Authored-text entity per section/lesson (and optionally per TutorialPanel block) — markdown body, revision-aware (author, updated-at) so chapters can be drafted incrementally alongside SpikerSoft.Data/Mongos/Lesson.cs
Decide storage: embedded on the lesson document vs separate collection keyed by lesson/section — separate is likely better since the same chapter text can span a lesson range and be edited without touching lesson definitions
Serve through the anonymous-readable catalog/detail endpoints (LessonsController)
Staff authoring path: minimal admin CRUD (a new section under the existing admin surfaces) — seeding via Mongo seed files is acceptable for the first chapters
Frontend:
Render in the shared shell's Reading surface (shared with P3's books — books = external reading, text = our chapter)
Markdown rendering consistent with existing tutorial panel body rendering
i18n: authored content is en-first with es translations flowing through the established Transloco patch/review-queue workflow — the content model must carry language variants, not just UI chrome
Acceptance: a section with SpikerSoft text shows our chapter in the shell across all five playgrounds; the voice/angle guideline above is documented for authors (e.g. a CONTRIBUTING note or admin-page hint).
Phase P4 of epic #323. Second content layer (after books #326).
**What:** SpikerSoft's own written material about each section — we are writing our own book on these subjects. Editorial angle, consistently: *you're new, we're old school, you have the tools — use them, here's how.* Distinct from tutorial panels (which are step instructions); this is the narrative/why layer a student reads before or alongside the exercise.
**Model (backend):**
- [ ] Authored-text entity per section/lesson (and optionally per `TutorialPanel` block) — markdown body, revision-aware (author, updated-at) so chapters can be drafted incrementally alongside `SpikerSoft.Data/Mongos/Lesson.cs`
- [ ] Decide storage: embedded on the lesson document vs separate collection keyed by lesson/section — separate is likely better since the same chapter text can span a lesson range and be edited without touching lesson definitions
- [ ] Serve through the anonymous-readable catalog/detail endpoints (`LessonsController`)
- [ ] Staff authoring path: minimal admin CRUD (a new section under the existing admin surfaces) — seeding via Mongo seed files is acceptable for the first chapters
**Frontend:**
- [ ] Render in the shared shell's **Reading** surface (shared with P3's books — books = external reading, text = our chapter)
- [ ] Markdown rendering consistent with existing tutorial panel body rendering
- [ ] i18n: authored content is en-first with es translations flowing through the established Transloco patch/review-queue workflow — the content model must carry language variants, not just UI chrome
**Acceptance:** a section with SpikerSoft text shows our chapter in the shell across all five playgrounds; the voice/angle guideline above is documented for authors (e.g. a CONTRIBUTING note or admin-page hint).
PRs open, stacked on the #326 pair — backend spikersoft-backend#54 (base: #53's branch) + frontend spikersoft-angular#97 (base: #96's branch). Merge order: #53 → #54, #96 → #97 (Gitea retargets stacked PRs to master automatically when the base branch merges).
Against this issue's checklist:
Authored-text entity — CurriculumText, revision-aware (Author, UpdatedAt), keyed by (language, category) with "*" intro chapters so one chapter spans a lesson range
Storage decision — separate curriculumTexts collection (as the ticket leaned): long prose stays out of the catalog list payload, chapters edit without touching lesson definitions
Serving — new anonymous GET /api/Lessons/reading with the same locale-resolution/profile-fallback as the catalog; 204 + intro-fallback semantics
Authoring path — code-authored seed (CurriculumTextSeed, upserts every boot: edit + deploy = publish). Admin CRUD deferred — seeding was the accepted starting point per the ticket; file a follow-up when chapter volume outgrows code review
First chapters — six shipped in the agreed voice (you're new, we're old school, you have the tools — here's how): intros for all five core languages + a C# Output section chapter; fully bilingual en+es (the content model carries language variants, not just UI chrome)
Rendering — chapter above the book picks in the shared Reading surface, through the same safe inline-markdown renderer as tutorial panels (no HTML path); guard tests enforce the markdown subset + bilingual completeness
Voice guideline is documented in the seed's remarks block for future authors. Will close when the stacked PRs merge.
PRs open, **stacked on the #326 pair** — backend spikersoft-backend#54 (base: #53's branch) + frontend spikersoft-angular#97 (base: #96's branch). Merge order: #53 → #54, #96 → #97 (Gitea retargets stacked PRs to master automatically when the base branch merges).
Against this issue's checklist:
- [x] **Authored-text entity** — `CurriculumText`, revision-aware (`Author`, `UpdatedAt`), keyed by (language, category) with `"*"` intro chapters so one chapter spans a lesson range
- [x] **Storage decision** — separate `curriculumTexts` collection (as the ticket leaned): long prose stays out of the catalog list payload, chapters edit without touching lesson definitions
- [x] **Serving** — new anonymous `GET /api/Lessons/reading` with the same locale-resolution/profile-fallback as the catalog; 204 + intro-fallback semantics
- [x] **Authoring path** — code-authored seed (`CurriculumTextSeed`, upserts every boot: edit + deploy = publish). Admin CRUD deferred — seeding was the accepted starting point per the ticket; file a follow-up when chapter volume outgrows code review
- [x] **First chapters** — six shipped in the agreed voice (*you're new, we're old school, you have the tools — here's how*): intros for all five core languages + a C# Output section chapter; **fully bilingual en+es** (the content model carries language variants, not just UI chrome)
- [x] **Rendering** — chapter above the book picks in the shared Reading surface, through the same safe inline-markdown renderer as tutorial panels (no HTML path); guard tests enforce the markdown subset + bilingual completeness
Voice guideline is documented in the seed's remarks block for future authors. Will close when the stacked PRs merge.
Done — merged to master. Backend our-own-book chapters (CurriculumText + anonymous reading endpoint) in PR #54, and frontend chapters in the Reading pane in PR #97. Closing P4.
Done — merged to `master`. Backend our-own-book chapters (CurriculumText + anonymous reading endpoint) in PR #54, and frontend chapters in the Reading pane in PR #97. Closing P4.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Phase P4 of epic #323. Second content layer (after books #326).
What: SpikerSoft's own written material about each section — we are writing our own book on these subjects. Editorial angle, consistently: you're new, we're old school, you have the tools — use them, here's how. Distinct from tutorial panels (which are step instructions); this is the narrative/why layer a student reads before or alongside the exercise.
Model (backend):
TutorialPanelblock) — markdown body, revision-aware (author, updated-at) so chapters can be drafted incrementally alongsideSpikerSoft.Data/Mongos/Lesson.csLessonsController)Frontend:
Acceptance: a section with SpikerSoft text shows our chapter in the shell across all five playgrounds; the voice/angle guideline above is documented for authors (e.g. a CONTRIBUTING note or admin-page hint).
PRs open, stacked on the #326 pair — backend spikersoft-backend#54 (base: #53's branch) + frontend spikersoft-angular#97 (base: #96's branch). Merge order: #53 → #54, #96 → #97 (Gitea retargets stacked PRs to master automatically when the base branch merges).
Against this issue's checklist:
CurriculumText, revision-aware (Author,UpdatedAt), keyed by (language, category) with"*"intro chapters so one chapter spans a lesson rangecurriculumTextscollection (as the ticket leaned): long prose stays out of the catalog list payload, chapters edit without touching lesson definitionsGET /api/Lessons/readingwith the same locale-resolution/profile-fallback as the catalog; 204 + intro-fallback semanticsCurriculumTextSeed, upserts every boot: edit + deploy = publish). Admin CRUD deferred — seeding was the accepted starting point per the ticket; file a follow-up when chapter volume outgrows code reviewVoice guideline is documented in the seed's remarks block for future authors. Will close when the stacked PRs merge.
Done — merged to
master. Backend our-own-book chapters (CurriculumText + anonymous reading endpoint) in PR #54, and frontend chapters in the Reading pane in PR #97. Closing P4.