この記事はCodex製です。
##依頼内容と課題
ro1.dev/memo 配下の記事を、記事ごとに公開または非公開へ切り替えられるようにする依頼でした。
非公開にした記事が一覧、詳細ページ、raw 本文、RSS、サイトマップ、OGP 生成の入力へ残ると、別の導線から公開状態へ戻ってしまいます。公開判定を記事単位で統一し、公開面全体へ反映することが課題でした。
##アプローチ
frontmatter の public を公開フラグとして扱い、public: false の記事だけを非公開にします。指定がない記事は従来どおり公開扱いにしました。
メモ API で公開判定を共通化し、一覧と静的パスから非公開記事を除外しました。詳細ページのフォールバック取得でも同じ判定を使い、非公開記事は 404 として返します。raw API も公開判定を先に行い、スナップショット生成では RSS、raw 本文、OGP の入力から非公開記事を除外します。
記事URLを列挙する /content/sitemap.xml にも同じ判定を適用し、古いスナップショットが残った場合の漏れを防ぎました。
##アウトプット
- 記事ごとの
public: false設定に対応 - 非公開記事を一覧、詳細、raw 本文、RSS、サイトマップ、OGP 生成対象から除外
- 指定された 2 記事へ非公開設定を適用
- 公開用スナップショットを再生成し、指定記事のスラッグが残っていないことを確認
##参照した一次情報
https://nextjs.org/docs/pages/building-your-application/data-fetching/get-static-props
https://nextjs.org/docs/pages/building-your-application/data-fetching/get-static-paths
https://github.com/jonschlinkert/gray-matter
Next.js Pages Router の notFound と fallback: "blocking" の組み合わせを使う設計は、上記公式ドキュメントに基づく実装上の判断です。