Skip to main content
このレシピでは、公開ブログやリリースノートを構築する方法を説明します。 公開条件と言語の扱いはアプリケーション側の方針なので、自分のコンテンツモデルに合わせて調整してください。

1. スキーマを生成する

NotCMSをインストールし、プロジェクトを初期化してデータベースのスキーマを取得します。
次の例では、releases データベースに以下のプロパティがある前提です。
npx notcms pull が生成したプロパティ名と型を使ってください。データベースに slug がなければスキーマから削除し、下のURLヘルパーでは常にページIDを使います。 クライアントはサーバー側に置きます。NOTCMS_SECRET_KEY と NOTCMS_WORKSPACE_ID をブラウザへ公開しないでください。

2. 公開条件と言語の方針を定義する

この例では、released_at があり、値が有効で未来の日付ではない記事を公開済みとします。 言語が未設定の場合は日本語として扱い、新しいリリースから並べます。チェックボックスなど別の公開フィールドを使う場合は変更してください。 生成される date 型のプロパティは string | null です。現在時刻と比較する前に解析してください。JavaScriptの Date オブジェクトではありません。
APIエラーはエラーとして扱います。失敗した取得結果を空配列に変換して、成功したページとしてキャッシュしないでください。

3. 詳細URLを安定させる

データベースにslugがあり空でない場合はslugを使います。slugがない場合はNotionのページIDへフォールバックし、version_number を識別子には使いません。
localeをURLに含めます。slugはlocaleが違えば再利用できますが、同じlocaleの公開済みリリース間では一意にしてください。同じlocaleに重複slugがある場合は、このresolverが null を返して404にできるようにします。同じlocaleでslugが別の公開ページのIDと一致した場合も拒否します。slugがないデータベースでは常に一意なページIDを使います。 slugまたはIDを受け取るlocale-awareなルートでは、localeをresolverへ渡します。一覧から概要を選ぶ前に公開条件と言語を適用し、詳細を取得した後にも同じ条件を再確認します。
毎回一覧を取得したくない場合は、詳細ルートをページIDに固定し、slugは表示用のメタデータとして扱います。

4. 言語フォールバックと空状態を追加する

言語フィルタはルートまたはページ境界で明示します。
翻訳がない場合に、空状態を表示するか、別言語へフォールバックするか、リダイレクトするかを決めます。一覧、metadata、詳細ルートで同じ方針を使えるように文書化してください。

5. 詳細本文を取得する

list() は概要を返します。ページIDを解決した後、get() で本文を取得します。
version_number は未設定または製品間で重複する可能性があるため、表示用データとして扱い、ルートキーには使いません。任意のNotionプロパティも同じように扱います。

Notionから返されるリンク

Notion APIがhttps://app.notion.com/...のような絶対URLを返した場合、 NotCMS・SDK・Sync Actionは返されたURLを保持します。相対リンクに戻せるかどうかを推測して変換することはありません。公開サイトへのリンクは、Notionに完全なURL(例: https://example.com/releases/ja/v1-2-0)を入力し、同期後にNotCMS APIの応答と生成されたMarkdownでリンク先を確認してください。通常のNotionページリンクを一律に削除・置換しないでください。