refactor: ソースコードをsrcに移動し疎結合化・テスト追加#17
Merged
Merged
Conversation
index.tsに密結合していたtimesチャンネル判定、メッセージリンク構築、 転送テキスト構築、メッセージフィルタリングのロジックを テスト可能な純粋関数として分離した。 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
環境変数バリデーション(env.ts)、Slackアプリ設定(app.ts)、 メッセージハンドラ(handlers/message.ts)、チャンネル作成ハンドラ (handlers/channelCreated.ts)、Lambdaエントリポイント(handler.ts)に分離した。 メッセージハンドラはファクトリ関数で設定値を注入する形にし疎結合化した。 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
index.tsとjoinBotToTimesChannels.tsを削除し、 src/handler.tsとsrc/joinBotToTimesChannels.tsに置き換えた。 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- CDK entryをsrc/handler.tsに変更 - CI esbuildのエントリポイントを更新 - package.jsonのdevスクリプトを更新 - tsconfig.jsonにallowImportingTsExtensionsとnoEmitを追加 - valibotを導入し環境変数バリデーションを型安全化 - infra側でもsrc/env.tsのloadEnvを共有 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
lib関数、ハンドラ、環境変数バリデーションの単体テスト26件を追加。 CIのcheckワークフローにnpm testステップを追加した。 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
tsconfig.jsonにnoEmit: trueが設定済みのためスクリプト側のフラグは不要。 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
Pull request overview
リファクタリングで責務分離(純粋関数化・ハンドラ分離・env検証の型安全化)とテスト/CIまで一気に整備されていて、今後の変更耐性がかなり上がる良い整理だと思います。
目的(要約):
密結合していた Slack Bot の実装を src/ 配下に分離して疎結合化し、環境変数検証の型安全化と単体テスト/CIチェックを追加する。
Changes:
src/libにビジネスロジック(判定/リンク/文言生成)を純粋関数として抽出し、src/handlersにイベント処理を分離valibotによる環境変数バリデーションをsrc/env.tsに集約し、Lambda/infra で共有node:testの単体テスト追加と、CI の check ワークフローにテストステップを追加(エントリポイント参照も更新)
Reviewed changes
Copilot reviewed 25 out of 28 changed files in this pull request and generated 4 comments.
Show a summary per file
| File | Description |
|---|---|
| tsconfig.json | .ts 拡張子 import と noEmit 前提の型チェック設定を追加 |
| src/lib/timesChannel.ts | times チャンネル判定の純粋関数を追加 |
| src/lib/messageLink.ts | Slack メッセージリンク生成の純粋関数を追加 |
| src/lib/messageFilter.ts | subtype/種別ベースの転送対象フィルタを追加 |
| src/lib/forwardText.ts | 転送文面生成の純粋関数を追加 |
| src/lib/tests/timesChannel.test.ts | times 判定のユニットテスト追加 |
| src/lib/tests/messageLink.test.ts | メッセージリンク生成のユニットテスト追加 |
| src/lib/tests/messageFilter.test.ts | 転送対象フィルタのユニットテスト追加 |
| src/lib/tests/forwardText.test.ts | 転送文面生成のユニットテスト追加 |
| src/joinBotToTimesChannels.ts | times-* への join スクリプトを src 配下へ移設・共通判定利用 |
| src/handlers/message.ts | message イベントの転送処理を注入可能なハンドラに分離 |
| src/handlers/channelCreated.ts | channel_created の join 処理をハンドラとして分離 |
| src/handlers/tests/message.test.ts | message ハンドラのユニットテスト追加 |
| src/handlers/tests/channelCreated.test.ts | channel_created ハンドラのユニットテスト追加 |
| src/handler.ts | Lambda エントリポイントを分離(receiver.start のラップ) |
| src/env.ts | valibot による env 検証と型付き Env 返却を追加 |
| src/app.ts | Slack App 設定(receiver/app/イベント登録)を分離 |
| src/tests/env.test.ts | env バリデーションのユニットテスト追加 |
| package.json | dev 実行先変更・test スクリプト追加・valibot 追加 |
| package-lock.json | valibot 追加に伴うロック更新 |
| joinBotToTimesChannels.ts | 旧スクリプトを削除(src/ へ移行) |
| infra/tsconfig.json | infra 側で ../src/env.ts を型チェック対象に追加 |
| infra/package.json | infra 側にも valibot を追加(env.ts 共有のため) |
| infra/package-lock.json | infra 側ロック更新 |
| infra/lib/times-all-bot-stack.ts | Lambda entry を src/handler.ts に変更し、env 読み込みを共通化 |
| index.ts | 旧エントリポイントを削除(src/ に分割) |
| .github/workflows/_reusable_lambda_rie_test.yml | esbuild のバンドル対象を src/handler.ts に更新 |
| .github/workflows/_reusable_check.yml | CI に npm test ステップを追加 |
Files not reviewed (1)
- infra/package-lock.json: Language not supported
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
末尾スラッシュ付きURLはメッセージリンク構築時に二重スラッシュになるため スキーマで弾くようにした。テストのprocess.env復元も変更キーのみに限定した。 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1000件超のワークスペースでtimesチャンネルの一部にjoinできない問題を修正。 response_metadata.next_cursorを使って全ページを取得するようにした。 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 25 out of 28 changed files in this pull request and generated 2 comments.
Files not reviewed (1)
- infra/package-lock.json: Language not supported
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
result.okがfalseの場合やchannelsがundefinedの場合に 静かにbreakするのではなくエラーを投げるようにした。 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
awaitなしだとunhandled rejectionになりうるため修正。 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
issue
なし(リファクタリング)
変更内容
index.tsに密結合していたコードをsrc/ディレクトリに分離src/lib/: ビジネスロジックを純粋関数として抽出(timesチャンネル判定、メッセージリンク構築、メッセージフィルタリング等)src/handlers/: イベントハンドラをファクトリ関数で設定値を注入する形に分離src/env.ts: 環境変数バリデーションをvalibotで型安全化、infra側と共有src/app.ts,src/handler.ts: Slackアプリ設定とLambdaエントリポイントを分離@slack/typesのAllMessageEvents型を活用し、subtypeベースでメッセージフィルタリングを正確に実装WORKSPACE_URLの末尾スラッシュをvalibotスキーマで禁止joinBotToTimesChannelsにページネーション処理を追加確認したこと
npm test: 27件全パスnpx tsc --noEmit: Lambda側・infra側ともにエラーなしnpx biome check .: エラーなしスクリーンショット
なし
補足事項
なし
PR時のセルフチェック
by