From e246e1d28e7be0c4792ab3cd0d05294bf7f8865f Mon Sep 17 00:00:00 2001 From: Natsuki Katayama Date: Mon, 15 Jun 2026 12:36:59 +0900 Subject: [PATCH 1/3] chore(api): remove hardcoded account_id from wrangler.jsonc MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit public化に備え、account_idをCLOUDFLARE_ACCOUNT_ID環境変数参照に統一。 CI・drizzle.config.tsは既にsecrets/env経由のため動作に影響なし。 Co-Authored-By: Claude Opus 4.8 --- api/wrangler.jsonc | 1 - 1 file changed, 1 deletion(-) diff --git a/api/wrangler.jsonc b/api/wrangler.jsonc index 29be06c..e9693b7 100644 --- a/api/wrangler.jsonc +++ b/api/wrangler.jsonc @@ -4,7 +4,6 @@ "main": "src/index.ts", "compatibility_date": "2026-04-02", "compatibility_flags": ["nodejs_compat"], - "account_id": "b45afa0ef662c5bd6dd507ea65c81b71", "d1_databases": [ { "binding": "DB", From 23b4f60f38cadab3d32e346367d1a36f975f3191 Mon Sep 17 00:00:00 2001 From: Natsuki Katayama Date: Mon, 15 Jun 2026 12:37:04 +0900 Subject: [PATCH 2/3] chore(api): split env templates by purpose MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit .env はdrizzle-kit用のCLOUDFLARE_*のみに整理し、Workerランタイムの シークレットは.dev.vars.exampleに分離。public化に向けて用途を明確化。 Co-Authored-By: Claude Opus 4.8 --- api/.dev.vars.example | 9 +++++++++ api/.env.example | 2 -- 2 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 api/.dev.vars.example diff --git a/api/.dev.vars.example b/api/.dev.vars.example new file mode 100644 index 0000000..0872860 --- /dev/null +++ b/api/.dev.vars.example @@ -0,0 +1,9 @@ +GOOGLE_CLIENT_ID=your_google_client_id +GOOGLE_CLIENT_SECRET=your_google_client_secret +BETTER_AUTH_SECRET=your_better_auth_secret +BETTER_AUTH_URL=your_better_auth_url +ORIGIN_URL=http://localhost:3000 +GOOGLE_BOOKS_API_KEY=your_google_books_api_key +RESEND_API_KEY=your_resend_api_key +GITHUB_CLIENT_ID=your_github_client_id +GITHUB_CLIENT_SECRET=your_github_client_secret diff --git a/api/.env.example b/api/.env.example index f8845b1..e9b2efc 100644 --- a/api/.env.example +++ b/api/.env.example @@ -1,5 +1,3 @@ CLOUDFLARE_ACCOUNT_ID=your_cloudflare_account_id CLOUDFLARE_DATABASE_ID=your_cloudflare_database_id CLOUDFLARE_D1_TOKEN=your_cloudflare_d1_token -BETTER_AUTH_SECRET=your_better_auth_secret -BETTER_AUTH_URL=http://localhost:8787 From a21127f260cff24a18e70b340c72583a30370703 Mon Sep 17 00:00:00 2001 From: Natsuki Katayama Date: Mon, 15 Jun 2026 12:37:20 +0900 Subject: [PATCH 3/3] docs: update README and CLAUDE.md to match implementation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - サイト名memetec.を明記、WebをOpenNext on Workersに修正 - メモ機能をMarkdown対応・ページ番号付きに修正 - レイヤー構成をmodules配下とroutesの分離として正確に記述 - 環境変数の置き場所(.env/.dev.vars/wrangler vars)を整理 Co-Authored-By: Claude Opus 4.8 --- CLAUDE.md | 5 +++-- README.md | 38 +++++++++++++++++++++++++++----------- 2 files changed, 30 insertions(+), 13 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index c4688b1..a1ef33b 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -53,11 +53,12 @@ npm run generate # orval で API クライアント再生成(APIサーバー Hono + `@hono/zod-openapi` でOpenAPI定義とルートハンドラを共存させている。DBはCloudflare D1(SQLite)、ORMはDrizzle。 -レイヤー構成(`api/src/modules//`): +ビジネスロジックは `api/src/modules//` 配下の3レイヤーで構成する: - `entity/` — DBスキーマから派生した型定義と変換関数 - `repository/` — Drizzle を使ったDB操作 - `usecase/` — ビジネスロジック(repositoryを組み合わせる) -- `routes//` — Honoルート定義とzodスキーマ(OpenAPI仕様を兼ねる) + +ルート定義は modules とは別で、`api/src/routes//` に置く(Honoルート定義とzodスキーマ。OpenAPI仕様を兼ねる)。 新しいドメインを追加するときは `modules/` と `routes/` の両方に追加し、`api/src/index.ts` でルートをマウントする。 diff --git a/README.md b/README.md index fd1c225..8c6a441 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,13 @@ # techbook-log -技術書の読書記録を管理するWebアプリ。 +**memetec.** — 技術書の読書記録を管理するWebアプリ。 --- # 1. コンセプト - 読んだ技術書を登録して記録を残す -- 本ごとにメモ(ポストイット形式)を追加・管理 +- 本ごとにメモを追加・管理 - タグで本を分類・整理 - 自分だけの読書ログとして積み上げる @@ -26,7 +26,7 @@ # 3. 機能 - 本の登録・管理(書名検索で書誌情報を自動入力、書影表示) -- 本ごとのメモ管理(ポストイット形式、色分け) +- 本ごとのメモ管理(Markdown 対応・ページ番号付き) - タグによる分類 - メモのキーワード検索 - ログイン(自分だけの記録) @@ -40,8 +40,9 @@ | フロントエンド | Next.js 16 / React 19 / Tailwind CSS v4 / shadcn/ui | | API | Hono + @hono/zod-openapi | | DB | Cloudflare D1(SQLite)/ Drizzle ORM | -| インフラ | Cloudflare Workers(API・Web) | +| インフラ | Cloudflare Workers(API は Hono、Web は Next.js を OpenNext でデプロイ) | | 認証 | better-auth | +| メール送信 | Resend(認証メール) | | 状態管理・フォーム | TanStack Query / TanStack Form | | APIクライアント生成 | orval(OpenAPIスペックから自動生成) | | テスト | Vitest(API)/ Jest + Testing Library(Web) | @@ -55,16 +56,20 @@ ``` techbook-log/ ├── api/ # Hono on Cloudflare Workers -└── web/ # Next.js on Cloudflare Pages +└── web/ # Next.js(OpenNext)on Cloudflare Workers ``` -### API レイヤー構成(`api/src/modules//`) +### API レイヤー構成 + +ビジネスロジックは `api/src/modules//` 配下の3レイヤー、ルート定義は別のトップレベル `api/src/routes//` に分かれている。 ``` -entity/ # DB スキーマから派生した型と変換関数 -repository/ # Drizzle を使った DB 操作 -usecase/ # ビジネスロジック -routes/ # Hono ルート定義 + Zod スキーマ(OpenAPI 兼用) +api/src/ +├── modules// +│ ├── entity/ # DB スキーマから派生した型と変換関数 +│ ├── repository/ # Drizzle を使った DB 操作 +│ └── usecase/ # ビジネスロジック +└── routes// # Hono ルート定義 + Zod スキーマ(OpenAPI 兼用) ``` API の `/doc` エンドポイントから OpenAPI スペックを取得できる。 @@ -78,15 +83,26 @@ Web 側はそのスペックから `npm run generate` で API クライアント # API cd api npm install -npm run migrate:apply # ローカル D1 にマイグレーション適用 +cp .env.example .env # drizzle-kit 用(CLOUDFLARE_ACCOUNT_ID / DATABASE_ID / D1_TOKEN) +cp .dev.vars.example .dev.vars # Worker ランタイムのシークレット(BETTER_AUTH_SECRET / RESEND_API_KEY 等) +npm run migrate:apply # ローカル D1 にマイグレーション適用 npm run dev # Web(別ターミナル) cd web npm install +cp .env.example .env # NEXT_PUBLIC_API_URL を設定 npm run dev ``` +環境変数の置き場所は用途で分かれている: + +| ファイル | 用途 | 例 | +|---|---|---| +| `api/.env` | drizzle-kit(マイグレーション)が `dotenv` で読む | `CLOUDFLARE_ACCOUNT_ID` `CLOUDFLARE_DATABASE_ID` `CLOUDFLARE_D1_TOKEN` | +| `api/.dev.vars` | Worker ランタイムのシークレット(本番は Cloudflare Secrets) | `BETTER_AUTH_SECRET` `RESEND_API_KEY` `GOOGLE_CLIENT_SECRET` 等 | +| `api/wrangler.jsonc` の `vars` | 公開してよい設定値 | `BETTER_AUTH_URL` `ORIGIN_URL` `ENV` | + --- # 7. 主要コマンド