Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -53,11 +53,12 @@ npm run generate # orval で API クライアント再生成(APIサーバー

Hono + `@hono/zod-openapi` でOpenAPI定義とルートハンドラを共存させている。DBはCloudflare D1(SQLite)、ORMはDrizzle。

レイヤー構成(`api/src/modules/<domain>/`:
ビジネスロジックは `api/src/modules/<domain>/` 配下の3レイヤーで構成する:
- `entity/` — DBスキーマから派生した型定義と変換関数
- `repository/` — Drizzle を使ったDB操作
- `usecase/` — ビジネスロジック(repositoryを組み合わせる)
- `routes/<domain>/` — Honoルート定義とzodスキーマ(OpenAPI仕様を兼ねる)

ルート定義は modules とは別で、`api/src/routes/<domain>/` に置く(Honoルート定義とzodスキーマ。OpenAPI仕様を兼ねる)。

新しいドメインを追加するときは `modules/` と `routes/` の両方に追加し、`api/src/index.ts` でルートをマウントする。

Expand Down
38 changes: 27 additions & 11 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
# techbook-log

技術書の読書記録を管理するWebアプリ。
**memetec.** — 技術書の読書記録を管理するWebアプリ。

---

# 1. コンセプト

- 読んだ技術書を登録して記録を残す
- 本ごとにメモ(ポストイット形式)を追加・管理
- 本ごとにメモを追加・管理
- タグで本を分類・整理
- 自分だけの読書ログとして積み上げる

Expand All @@ -26,7 +26,7 @@
# 3. 機能

- 本の登録・管理(書名検索で書誌情報を自動入力、書影表示)
- 本ごとのメモ管理(ポストイット形式、色分け
- 本ごとのメモ管理(Markdown 対応・ページ番号付き
- タグによる分類
- メモのキーワード検索
- ログイン(自分だけの記録)
Expand All @@ -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(APIWeb) |
| インフラ | Cloudflare Workers(API は Hono、Web は Next.js を OpenNext でデプロイ) |
| 認証 | better-auth |
| メール送信 | Resend(認証メール) |
| 状態管理・フォーム | TanStack Query / TanStack Form |
| APIクライアント生成 | orval(OpenAPIスペックから自動生成) |
| テスト | Vitest(API)/ Jest + Testing Library(Web) |
Expand All @@ -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/<domain>/`)
### API レイヤー構成

ビジネスロジックは `api/src/modules/<domain>/` 配下の3レイヤー、ルート定義は別のトップレベル `api/src/routes/<domain>/` に分かれている。

```
entity/ # DB スキーマから派生した型と変換関数
repository/ # Drizzle を使った DB 操作
usecase/ # ビジネスロジック
routes/ # Hono ルート定義 + Zod スキーマ(OpenAPI 兼用)
api/src/
├── modules/<domain>/
│ ├── entity/ # DB スキーマから派生した型と変換関数
│ ├── repository/ # Drizzle を使った DB 操作
│ └── usecase/ # ビジネスロジック
└── routes/<domain>/ # Hono ルート定義 + Zod スキーマ(OpenAPI 兼用)
```

API の `/doc` エンドポイントから OpenAPI スペックを取得できる。
Expand All @@ -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. 主要コマンド
Expand Down
9 changes: 9 additions & 0 deletions api/.dev.vars.example
Original file line number Diff line number Diff line change
@@ -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
2 changes: 0 additions & 2 deletions api/.env.example
Original file line number Diff line number Diff line change
@@ -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
1 change: 0 additions & 1 deletion api/wrangler.jsonc
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
"main": "src/index.ts",
"compatibility_date": "2026-04-02",
"compatibility_flags": ["nodejs_compat"],
"account_id": "b45afa0ef662c5bd6dd507ea65c81b71",
"d1_databases": [
{
"binding": "DB",
Expand Down
Loading