spec
最終更新: 2025年7月24日 00:22
v0用 日報アプリ仕様書(最終版)
■ 概要
- Markdown形式で様々な分野の投稿を行う日報型アプリ
- 公開サイトと管理画面を分離
- 公開ページ:Basic認証
- 管理画面:Cognito認証
- 投稿はカテゴリを持ち、同日に複数投稿を考慮
- フロントはVercelホスティング (ISR対応)
- バックエンドはAWS (S3, Lambda, EventBridge, Cognito)
■ 認証
- 公開ページはBasic認証
- 管理画面はCognitoによるユーザー認証
- APIはCognitoのJWTによる認可を実施
■ コンテンツ管理
- 投稿はMarkdown形式、Frontmatterでメタ情報管理
- title, description, tags, published_at, status (draft/published)
- S3に格納
- drafts: /drafts/{category}/{YYYY-MM-DD}/{slug}.md
- published: /content/{category}/{YYYY-MM-DD}/{slug}.md
- 下書きはdrafts配下に保存
- 記事の公開時にpublished配下に移動し、ISRで静的生成
■ 投稿作成・保存
- 管理画面でMarkdownエディタを提供 (@uiw/react-md-editor)
- 下書きは定期的に自動保存
- 公開操作時に初めてISRで反映
- ローカル作成mdをアップロードするbashコマンド群を用意
■ 画像管理
- S3に保存
- /assets/{category}/{YYYY-MM-DD}/{unique-filename}.png
- 命名規則で衝突対策(UUID, timestampなど)
- 記事保存時に本文内で参照されていない画像は削除
- Presigned URLでアップロード
■ カテゴリ管理
- S3のパス構造でカテゴリを表現
- CRUD APIはパスを操作する形で設計
- 削除は不可
- 管理画面でカテゴリ一覧を選択可能に
■ 投稿一覧取得
- S3をリストして投稿一覧を取得するAPI
- Frontmatterを解析しメタ情報を取得
- ソート順は降順
- ページネーション対応
■ ISRトリガー(EventBridge構成)
- S3にファイルが保存/更新された際、EventBridgeでイベント検知
- ISRトリガーLambdaがVercelのRevalidate APIを呼び出す
- /diary/{category}/{YYYY-MM-DD}/{slug}
- 投稿保存APIはS3にPUTのみを行い、ISRは疎結合で動作
■ CI/CD
- フロントエンドはVercelでビルド・デプロイ
- バックエンドはAWSでデプロイ(API, Lambda, Cognito, EventBridgeなど)
- モノレポ構成でGitHub Actionsを利用
- フロント用workflowとバックエンド用workflowを分離
- 差分ディレクトリでビルド対象を判定
- IaC(CDKなど)を含めたAWSリソースデプロイも自動化
■ ディレクトリ構成
/apps /frontend-public # 公開ページ (Vercel) /frontend-admin # 管理画面 (Vercel) /packages /api # CRUD API, 画像アップロードAPI /infra # Cognito, S3, Lambda, EventBridge などIaC /isr-trigger # EventBridge → ISRトリガーLambda /cli # ローカルアップロード用bashスクリプト群
■ 運用フロー
- 管理画面にCognitoでログイン
- Markdownエディタで投稿作成・自動保存
- 画像アップロード→記事本文に差し込み
- 公開操作でS3に配置→EventBridge→ISR再生成
- 公開ページはBasic認証で閲覧
- 投稿一覧はAPI経由で取得・表示
- ローカル作成mdはCLIコマンドでS3にアップロード