Skip to content

refactor(utils): hashTokenをapiToken.tsから独立したtokenHash.tsに分離#73

Open
hashrock wants to merge 1 commit into
mainfrom
claude/blissful-brown-rsf4tl
Open

refactor(utils): hashTokenをapiToken.tsから独立したtokenHash.tsに分離#73
hashrock wants to merge 1 commit into
mainfrom
claude/blissful-brown-rsf4tl

Conversation

@hashrock

Copy link
Copy Markdown
Owner

観測した問題

app/utils/apiToken.ts は、外部依存のない純粋関数 hashToken(SHA-256ハッシュ)と、DB(drizzle-orm/d1, db/schema)に依存する getUserByToken を同一ファイルに同居させていました。

app/utils/crypto.ts が示す通り、本来は上位レイヤーに依存しない基盤層です。しかし apiToken.ts を経由すると、hashToken だけを使いたい場面でも drizzle-orm/d1db/schema が芋づる式に読み込まれ、DBやHonoのContextなしでは独立してテストできない状態になっていました。

これは直前の #71resolveDevGuestPreference を dev-bypass ロジックから分離し、DBやリクエストなしでテスト可能にした変更)と同じ「境界分離」パターンの見落としです。

変更内容

  • hashToken を新しい app/utils/tokenHash.ts に抽出(ロジックは無変更)
  • apiToken.tsgetUserByToken(DB依存のトークン検証)に専念し、tokenHash.ts から hashToken を import
  • server.ts の import元を更新
  • tokenHash.test.ts を新規追加し、DBなしで hashToken を独立してテスト可能なことを実証

守りたい設計意図

  • app/utils/ はDB・フレームワークに依存しない基盤ユーティリティ層である、という境界
  • 純粋関数とDBアクセスを同一ファイルに混在させない(resolveDevGuestPreference 分離と同じ方針)

確認方法

  • npx tsc --noEmit -p tsconfig.json — エラーなし
  • pnpm test — 450件成功(新規 tokenHash.test.ts 3件含む)。editorKeymap.test.ts の既存2件の失敗は本変更前から存在し、無関係であることを git stash で切り分けて確認済み

レビュー観点

  • hashToken のロジック・戻り値は一切変更していないこと(diffで確認可能)
  • apiToken.tsserver.ts の import 更新に抜け漏れがないこと

🤖 Generated with Claude Code


Generated by Claude Code

観測: utils/apiToken.ts は純粋なSHA-256ハッシュ関数 hashToken と、
DB(drizzle-orm/d1, db/schema)に依存する getUserByToken を同一ファイルに
同居させていた。utils/ は crypto.ts が示す通り依存を持たない基盤層である
べきだが、apiToken.ts を経由すると hashToken だけを使いたい場面でも
drizzle-orm/d1 と db/schema が芋づる式に読み込まれ、DBなしでは
テストできない状態になっていた(直前のresolveDevGuestPreference分離と
同じ境界分離パターン)。

変更: hashToken を app/utils/tokenHash.ts に抽出し、apiToken.ts と
server.ts はそこから import する形に変更。ロジックは無変更。

確認: pnpm test(新規 tokenHash.test.ts 3件含め450件成功、既存の
editorKeymap.test.ts 2件の失敗はこの変更前から存在し無関係と確認済み)、
tsc --noEmit エラーなし。

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016FXQM7dDrPE7h5uZmroBuV
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants