モダンなBaaSを使って Next.js + PayPayアプリコール(App Invoke) でなんかやる

next.js プロジェクトの作成から
$ npx create-next-app@latest
What is your project named? app-name
Would you like to use TypeScript? Yes
Would you like to use ESLint? Yes
Would you like to use Tailwind CSS? Yes
Would you like your code inside a `src/` directory? Yes
Would you like to use App Router? (recommended) Yes
Would you like to use Turbopack for `next dev`? Yes
Would you like to customize the import alias (`@/*` by default)? No

ディレクトリ構成を考える
/
├─ prisma/
│ ├─ migrations/
│ ├─ scheme.prisma
│ └─ seed.ts
├─ public/
├─ src/
│ └─ app/
│ ├─ api/
│ │ └─ (api...)
│ ├─ (page...)
│ ├─ layout.tsx
│ ├─ page.tsx
│ ├─ components/
│ │ ├─ ui/
│ │ │ └─ (shadcn/uiコンポーネント)
│ │ └─ (自作コンポーネント)
│ ├─ hooks/
│ │ └─ (カスタムフック)
│ ├─ libs/
│ │ └─ (共通ライブラリ)
│ ├─ context/
│ │ └─ (コンテキスト)
│ ├─ types/
│ │ └─ (型定義)
│ └─ middleware.ts
├─ .gitignore
└─ ...その他

今回、管理画面の構築をヘッドレスCMSで試す。
デザインもシンプルで使い勝手が良さそうな Strapi を採用。
複数のリポジトリで管理するのが大変面倒くさいので、モノレポで進めていく。
/
├─ backend/(Strapi)
└─ frontend/(Next.js)

最初に今後の順序・タスクを明確にしていく。
- 基本設計(DB, APIなど)
- Supabase, Prismaのセットアップ・検証
- Strapiのセットアップ・検証
- フロントの実装(shadcn.ui)
- Next.jsのAPI実装(PayPay含む)
- フロント - Strapiの統合
- フロント - APIの統合(PayPay含む)
- デプロイ
本来は開発環境を作るためにDockerを採用したいところだが、今回は時間がないので割愛。
Dockerで開発環境も作っていくぜ(スクラップ書いてたら急にモチベ上がった。)
デプロイ環境は学習の意も込めてCMSはAWSにデプロイしてみたい。
Next.jsはいつも通りVercelへ。
フロントは凝らないので、LLMにディレクトリ構成だけぶち込んで作ってもらう。
私がやるのはAPIの実装と統合作業。
TailwindCSSを採用しているので独自スタイルは絶対に書かない方針でいく。

基本設計
作りたいもの
ECサイトが手っ取り早いので、アパレルのECサイトを作ってみよう。
システム構成
Next.js:フロントエンド
Supabase:注文データ管理
Strapi CMS:コンテンツ管理(商品・営業時間など)
Supabase Auth:認証
PayPay App Invoke:決済
(余裕があればStripeの決済も導入)
DB設計
mermaid大好き。
ユニクロのECを参考にして、色・サイズ・値段・数量・在庫を考慮してみる。
コメントやいいね機能は今回は非要件にする。
API設計
Next.js側:
/api/v1/users/[id]
→ ユーザー情報を取得するAPI(プロフィール画面などで使用)
/api/v1/orders
→ 注文一覧を取得するAPI(フィルターで現在ログインしているユーザーに絞り込む)
/api/v1/orders/[id]
→ 注文詳細を取得するAPI(注文履歴画面で使用)
/api/v1/checkout
→ 決済のためのAPI(PayPay API コール)
Strapi側:
/api/v1/item-categories
→ カテゴリ一覧を呼び出す
/api/v1/items
→ 商品一覧を呼び出す
/api/v1/items?category=[]
→ 特定のカテゴリに属する商品一覧を呼び出す。
抜け漏れは後ほど修正。

2.Supabase, Prismaのセットアップ
Prismaのインストール (参考↓
$ npm i prisma --save-dev
$ npm i @prisma/client
$ npx prisma init
ルートにprisma/
ディレクトリが作成される。
Supabaseのセットアップ
- プロジェクト作成
- ヘッダーの"Connect"から、"ORMs"を選択して "Prisma"
- .env.local をコピペ → パスワードの部分をDBパスワードに修正
- scheme.prismaをコピペ
※DBパスワードに使用できない文字列があるとエラーになるらしい。
Supabase と Prismaの接続確認
model User {
id Int @id @default(autoincrement())
email String @unique
}
一旦適当にユーザーモデルを作ってみる。
$ npx prisma migrate dev --name init //migration
migrateはマイグレーション。
これが成功するとPrismaで作成したモデルがSupabaseにも反映されるはず。
$ npx prisma generate //model generate
generateはPrisma Clientや型定義ファイルを自動生成するもの。
(まだよくわかってない。)