shell配布物の組み立て¶
shell方式は画面をリリース時に一度ビルドし、レポート出力時には共通assetsと公開用JSONから配布物を作ります。従来のstatic-site-builderの/buildは変更していません。この方式は明示的に選んで使うもので、FastAPIのダウンロード経路への接続は#885の後続作業です。
画面の事前ビルド(開発・リリース時)¶
apps/public-viewer/outを未加工の共通assetsとして保存します。配下パスで配信する場合はビルド時にNEXT_PUBLIC_STATIC_EXPORT_BASE_PATHを設定します。レポートの追加・変更でこのビルドを繰り返す必要はありません。
Pythonで組み立てる(レポート出力時)¶
入力ディレクトリは次の構成です。各JSONの形は公開APIの/meta/metadata.json、/reports、/reports/{slug}と同じです。
限定公開レポートを含める場合は、選択したレポートの記述をreports.jsonに加え、本文にもvisibility: "unlisted"を含めます。公開APIの通常の一覧には限定公開レポートが含まれない点に注意してください。組立処理はAPIに接続せず、入力済みのJSONを使います。
python3 apps/api/src/services/shell_export.py \
--assets apps/public-viewer/out \
--data export-data \
--output packaged-site
Python標準ライブラリだけで動作し、組立時のNodeやAPIキーは不要です。package_shell関数をFastAPIなどから呼ぶこともできます。出力先はassetsの外側にある新しいディレクトリを指定します。古いレポートが残らないよう、既存の配布物への上書きは受け付けません。
- 各レポートHTMLに「質問 - レポーター」のタイトルをHTMLエスケープして挿入します。
- 限定公開には
noindex, nofollowを最初から含めます。公開にはindex, followを設定します。 - 限定公開は配布物内の一覧にも載せません。privateや公開状態の不整合はエラーにします。
- ブラウザで一覧・詳細を移動した場合も同じタイトルとrobotsを設定します。検索除外はJavaScriptの実行だけには依存しません。
閲覧・公開¶
ローカル閲覧はこのHTTPサーバーで行います。Web公開する場合は配布物全体を配置してください。noindexは検索エンジン向けの指示で、閲覧制限・認証の代わりにはなりません。OGP画像の生成はこの処理の対象外です。