男性向け体験談を軸にした収益化可能なブログメディアのNext.jsアプリケーションです。現時点では基礎スキャフォールドに加えて、Prismaスキーマ・マイグレーション・シードデータ、NextAuthによるメール/パスワード認証の下準備を完了しています。
npm install
.env.example
を .env
にコピーし、DATABASE_URL
・AUTH_SECRET
・NEXTAUTH_URL
・STRIPE_SECRET_KEY
・STRIPE_WEBHOOK_SECRET
を適切な値に変更STORAGE_DRIVER
(local
または s3
)とS3関連の環境変数を設定STORAGE_DRIVER
(local
/ s3
) と S3関連の環境変数を設定npm run db:generate
— Prisma Client の生成npm run db:push
— スキーマをローカル開発DBへ反映 ※本番環境は npm run db:migrate
npm run db:seed
— 初期データ投入(管理者アカウント、カテゴリ/タグ/記事10件)npm run dev
— 開発サーバーを起動(http://localhost:3000)npm run build
— 本番ビルドの生成npm run start
— 本番ビルドの起動確認npm run lint
— ESLintによる静的解析npm run db:migrate
— 本番/ステージングでマイグレーションを適用admin@example.com
/ Admin123!
/login
でサインインフォームを提供/admin
配下はMiddlewareでADMINロールのみ許可(その他はトップへリダイレクト)prisma/schema.prisma
— 指定スキーマ(User/Post/Category/Tag/Purchase/Setting/Comment + NextAuth標準モデル)prisma/migrations/20250101000000_init/
— 初期マイグレーションSQLprisma/seed.ts
— bcryptハッシュ済みの管理者、カテゴリ/タグ、記事10件、設定値3件を投入src/server/repositories
— Prismaに依存するデータアクセス層。公開/管理で責務を分割。src/server/services
— ドメインユースケースをカプセル化(検索、所有判定、チェックアウト、購入記録、管理投稿、設定など)。src/server/adapters/stripe.ts
— Stripe SDKの抽象化。将来他社決済への差し替えも容易。src/server/validators
— Zodスキーマを集約し、API間で再利用。src/server/utils/mdx.ts
— MDXのレンダリングと目次生成を担うユーティリティ。/
トップページは最新記事・人気記事・カテゴリグリッド・タグクラウドを表示。AdSlotによる広告プレースホルダと検索導線を用意。/posts/[slug]
記事詳細はMDXで本文をレンダリングし、目次のIntersection Observer、自動広告枠、関連記事・前後記事を掲載。課金記事は導入のみ表示し、購入ボタンからStripe Checkoutへ遷移。OGP/Twitterカード生成とArticle構造化データを出力し、コメント機能はサイト設定+記事設定が有効な場合のみ表示。/category/[slug]
/tag/[slug]
はカテゴリ/タグごとの記事一覧とページネーションを提供。/search
はキーワード・カテゴリ・タグを組み合わせたサーバーサイド検索画面。/admin
配下の画面を統一。/admin/posts
記事一覧:公開ステータスフィルタ、ページネーション、公開URL・編集リンクを提供。/admin/posts/new
/admin/posts/[id]
記事作成/編集フォーム:React Hook Form + Zod でバリデーション、MDX本文入力、カテゴリ/タグ複数選択、課金設定、予約公開、カバー画像アップロード(/api/admin/media
)に対応。/admin/settings
サイト設定フォーム:広告枠ID・SEOデフォルト・アフィリエイト共通パラメータ・コメントサイト設定をまとめて更新。/admin/comments
コメント承認ダッシュボード(ダミー実装)。GET /api/search
— クエリ・カテゴリ・タグで記事検索(ページネーション対応)。GET /api/posts/[slug]/ownership
— 認証済みユーザーの購入有無を判定。POST /api/checkout
— Stripe CheckoutセッションURLを生成(有料記事のみ)。POST /api/stripe/webhook
— Checkout完了イベントから Purchase
を登録。POST /api/comments
— コメント送信用ダミーエンドポイント(現状はモデレーション待機を返す)。GET/POST /api/admin/posts
— 投稿の一覧取得・新規作成。GET/PATCH/DELETE /api/admin/posts/[id]
— 投稿の取得・更新・削除。GET/PUT /api/admin/settings
— サイト全体設定の参照・更新。POST /api/admin/media
— 画像アップロードエンドポイント。stripe login
stripe listen --forward-to localhost:3000/api/stripe/webhook
/api/checkout
を叩き、レスポンスURLをブラウザで開くPurchase
レコードが作成されることを確認CheckoutService
内で Stripe Price を再利用するため、記事価格を変更した際も既存 price を置き換える。providerSessionId
で担保。再配信時も upsert
で安全に処理される。STRIPE_MOCK=true
を設定するとモックアダプタが動作し、E2E/ローカルで外部アクセスなく確認できる。STORAGE_DRIVER=s3
と併せてバケット名、認証情報、公開URLを環境変数で指定。S3_FORCE_PATH_STYLE=true
を設定するとローカルエミュレータと接続しやすい。.env
を設定し、PostgreSQLに接続できるnpm run db:push
が成功するnpm run db:seed
で管理者と初期データが投入されるnpm run dev
がエラーなく起動し、トップページが表示される/login
から管理者アカウントでサインインし、/admin
にアクセスできるnpm run lint
が成功する/posts/[slug]
で無料記事は全文、有料記事は導入のみ表示され、購入ボタンがStripe Checkoutに遷移する/category/[slug]
/tag/[slug]
/search
で記事一覧のフィルタリングとページネーションが機能する/admin/posts
/ /admin/posts/new
/ /admin/posts/[id]
で記事のCRUDが行える/admin/settings
で設定値を更新するとAPI経由で Setting
テーブルに反映される/api/admin/media
経由で成功し、public/uploads
または S3 に保存される/sitemap.xml
と /robots.txt
が想定どおり生成されるSTRIPE_MOCK=true
)で購入フローE2Eが成功する今後はPrismaを用いたAPI実装、NextAuthの登録フロー拡張、Stripe Checkout連携、管理画面UIの構築などを段階的に進めます。
/api/admin/media
経由で成功し、public/uploads
または S3 に保存されるnpx playwright install
でブラウザを取得してください。npm run test:e2e
で PLAYWRIGHT_BASE_URL
(未指定時は http://localhost:3000
)に対してテストを実行します。Stripe呼び出しは STRIPE_MOCK=true
をサーバーに設定することでモックされます。npm run test:lighthouse
でLighthouseスコアを取得(レポートは reports/lighthouse/
に出力)。