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スクリプト群

■ 運用フロー

  1. 管理画面にCognitoでログイン
  2. Markdownエディタで投稿作成・自動保存
  3. 画像アップロード→記事本文に差し込み
  4. 公開操作でS3に配置→EventBridge→ISR再生成
  5. 公開ページはBasic認証で閲覧
  6. 投稿一覧はAPI経由で取得・表示
  7. ローカル作成mdはCLIコマンドでS3にアップロード