Hacktoberfest 2026:维护者为十月标记出来的 issue,仍然开放、适合新手。 浏览 Hacktoberfest issue

Revive blog posts as a content-typed gitsheets sheet (revises the deferred decision)

未关闭
#45 1 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

还没有人认领这个 Issue。

评估

难度
5/5
预计耗时
一周以上
新手友好度
35/100
Issue 类型
功能
描述清晰度
基本清楚
活跃度
冷清
技术栈
markdown, typescript
领域
api, backend, data, frontend

调研方向

先阅读 issue #44 和 specs/deferred.md 中推迟的决定,然后检查现有的 gitsheet 模式和 apps/api/scripts/import-laddr.ts。跟踪 apps/api/scripts/import-laddr/translators.ts,以及所引用的 BlogPost schema 和 routing 要求。完成的标准是:在不包含已排除 workflows 的情况下,实现 content-typed blog-post sheet、API、SPA routes、恢复 importer,并完成列出的 spec 更新。

由索引模型根据 Issue 内容生成。

描述

specs/deferred.md currently says blog posts get replaced by "staff-authored markdown files in the code repo at apps/web/src/content/blog/<slug>.md, shipped via PR." That decision predates gitsheets v1.2's content-typed records.

With v1.2 we can give blog posts their own gitsheets sheet — markdown bodies + TOML frontmatter — and get a better outcome than files-in-code-repo:

Why this beats the original deferral

Concern Files-in-code-repo Content-typed sheet
PR-reviewable ✅ ✅
Publish cadence Tied to web deploys Immediate on data-repo merge
Tags / cross-links Ad-hoc frontmatter Native TagAssignment
Author attribution Hand-stamp in frontmatter Native Person reference
Snapshot inclusion Not in data snapshot In the snapshot (pseudonymized)
API serving Bespoke Vite handler Existing read API pipeline
/blog index cost Bundle every post into web build queryAll({ withBody: false })
laddr-import revival Out of scope Resurrect blog_posts table on the existing one-shot import

Sheet shape

# .gitsheets/blog-posts.toml
[gitsheet]
root = 'blog-posts'
path = '${{ slug }}'

[gitsheet.format]
type = 'markdown'
body = 'body'

[gitsheet.schema]
$ref = './schemas/BlogPost.schema.json'

BlogPost entity (in packages/shared/src/schemas/blog-post.ts):

  • id UUIDv7
  • legacyId (laddr's BlogPost.ID, for the importer's idempotence)
  • slug (kebab-case, slug-handle conventions)
  • title
  • summary (short markdown — stays in frontmatter)
  • authorId → Person
  • postedAt (iso8601)
  • editedAt nullable
  • featuredImageKey nullable (attachment via gitsheets)
  • deletedAt nullable (soft-delete)
  • body (the markdown body — the designated content field)
  • standard createdAt / updatedAt

Routing

Add to the SPA:

  • /blog — index (paginated, optional tag filter)
  • /blog/:slug — detail
  • /blog/tag/:namespace/:slug — tag-filtered (reuse TagsNamespace pattern)

API:

  • GET /api/blog-posts (list with facets, q, sort, page)
  • GET /api/blog-posts/:slug (detail)
  • POST/PATCH/DELETE — staff-only (per the original spec, blog wasn't a per-user-role CMS)

laddr-import revival

The existing one-shot importer at apps/api/scripts/import-laddr.ts currently skips blog_posts. Re-add it as another translator in apps/api/scripts/import-laddr/translators.ts:

  • Map BlogPost.Slug → slug (slugify-with-dedupe if invalid)
  • Map BlogPost.Title → title
  • Map BlogPost.Body → body
  • Map BlogPost.AuthorID → resolve via the existing idMaps.personByLegacy
  • Map BlogPost.Published (and similar) → postedAt
  • Preserve legacyId so re-runs are idempotent

Sequencing

  • Depends on #44 (content-typed gitsheets is the substrate) — or stand on its own as the first content-typed sheet in the project. Either order works since blog-posts is a brand-new sheet that doesn't conflict with the existing TOML-only ones.
  • Sequenced after cutover-prep so existing migration paths stay valid through cutover.

Spec updates needed

  • specs/deferred.md — update the "Blog (/blog) as a user-facing CMS" entry from "files in code repo" to "content-typed sheet, see this issue."
  • New spec files: specs/api/blog.md, specs/screens/blog-index.md, specs/screens/blog-detail.md.
  • specs/data-model.md — add BlogPost entity.
  • specs/behaviors/legacy-id-mapping.md — note the new BlogPost.legacyId axis.

Out of scope: comments, reactions, the multi-author "posts under a topic" workflow — keep it as simple as the original deferral imagined.

主要语言
TypeScript
星标
1
派生
1
平均合并
1 天 20 小时
30 天内合并 PR
25

贡献指南

这个仓库没有索引到贡献指南

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

CodeForPhilly/codeforphilly-ng 的其他 Issue

查看 CodeForPhilly/codeforphilly-ng 的全部 Issue

相似的 Issue

更多 TypeScript Issue

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。