チームパスワードが必要です

nia Reminderと同じチームパスワードを入力してください。

Source Structure

nia Reminder ソースコード構成

現行本番(cloudflare-app/)のディレクトリツリーと、各ファイルの役割の解説です。GAS版(gas/)からの移行時、ロジックはできる限り1:1で対応づけてあります。詳細は仕様書も参照してください。

ディレクトリツリー

cloudflare-app/ ├── README.md # セットアップ・環境変数・カットオーバー手順 ├── package.json # devDependency: wrangler / dependency: googleapis(移行スクリプト専用) ├── wrangler.toml # Pages側設定(D1バインド) │ ├── public/ # Cloudflare Pagesの配信ルート │ ├── index.html # アプリ本体。単一ファイルSPA(9画面) │ ├── pending.html # 新規LINEグループ登録(独立ページ) │ ├── spec.html # 仕様書(このサイトの一部) │ ├── infra-map.html # 運用基盤マップ │ └── structure.html # ソースコード構成(このページ) │ ├── functions/ # Cloudflare Pages Functions │ ├── api.js # /api の全16関数。認可チェック(_assertTeamAccess)を集約 │ └── lib/ │ ├── config.js # テーブル名・enum・エラーコード・Retry設定などの定数 │ ├── db.js # D1クエリの薄いラッパー(SELECT/INSERT/UPDATE組み立て) │ ├── auth.js # チームゲート(HMAC署名トークンの発行・検証) │ ├── apiError.js # {code, message}付きのビジネスエラークラス │ ├── utils.js # ID生成(RMD_/DEST_/DLV_)・バリデーション │ ├── loggerService.js # Secret自動マスキング付きロガー │ ├── repositories.js # Reminder/Destination/DeliveryLog/WebhookEventのCRUD │ ├── settingsRepository.js NEW # Settingsテーブル(key/value)への汎用アクセサ │ ├── reminderService.js # Reminder CRUDのビジネスロジック │ ├── destinationService.js # Destination CRUD・切断/再接続カスケード │ ├── pendingGroupService.js # 未登録LINEグループの一覧・登録 │ ├── ruleParserService.js # ルールベース自然言語解析(最重要・最複雑) │ ├── aiParserService.js # AIパーサー切替の骨組み(未実装スタブ) │ ├── parserService.js # Rule→AIのオーケストレーター │ ├── recurrenceService.js # 繰り返しルールから次回送信日時を計算 │ ├── lineService.js # LINE Push送信・ヘルスチェック・グループ名取得・月間メッセージ枠取得 │ ├── chatworkService.js # Chatwork送信・ヘルスチェック │ ├── chatworkNotifier.js # 新規グループ検知時のChatwork通知(送信とは別経路) │ ├── lineSignature.js # LINE Webhookの署名検証(HMAC-SHA256) │ ├── notificationDispatcher.js # channelに応じてLine/ChatworkServiceへ振り分け │ ├── schedulerService.js # 1分毎の送信処理本体(retry込み) │ ├── healthCheckService.js # 6時間毎の定期ヘルスチェック本体 │ ├── storageService.js NEW # Cloudflare管理APIでD1のfile_sizeを取得 │ ├── usageCheckService.js NEW # D1ストレージ+LINE月間枠を毎朝チェックしSettingsへ保存 │ └── webhookHandler.js # LINE join/leaveイベント処理 │ ├── notify-worker/ # 独立Worker(D1バインドをfunctions/と共有) │ ├── index.js # scheduled()とfetch()のエントリポイント(4役を統合) │ └── wrangler.toml # cron設定(1分毎+6時間毎+毎朝6:00)・D1バインド・CF_ACCOUNT_ID等 │ ├── migrations/ │ └── 0001_init.sql # D1の全テーブルDDL(5テーブル) │ ├── scripts/ │ └── migrate-from-sheets.cjs # 旧Google Sheetsからのワンタイム移行データ生成 │ └── tests/ # Node標準テストランナー(120件、node --test tests/*.test.js) ├── parser.test.js ├── scheduler.test.js ├── signature.test.js ├── webhook.test.js ├── healthcheck.test.js ├── reminder.test.js ├── line.test.js ├── pending-groups.test.js ├── usage.test.js NEW └── mocks/ └── fake-d1.js # D1互換のインメモリフェイク(自作)

層ごとの役割

エントリポイント

functions/api.js

全リクエストの入口。{fn, args}を受けて対応するlib関数を呼び、{ok, result}形式で返す。全関数の先頭で_assertTeamAccessを通す。

notify-worker/index.js

scheduled()がcronの種類(1分毎/6時間毎)で処理を振り分け、fetch()がLINE Webhookを受信する。3つの役割を1つのWorkerに統合。

Repository層(D1アクセス)

db.js

SELECT/INSERT/UPDATE文を組み立てる汎用ヘルパー。全Repositoryの土台。

repositories.js

4つのRepositoryクラス(Reminder/Destination/DeliveryLog/WebhookEvent)。GASの汎用findWhere(predicate)を、実際に使うクエリパターンごとの専用メソッドに書き直してある。

Service層(ビジネスロジック)

reminderService.js / destinationService.js

CRUDと業務ルール(二重登録防止・接続切れカスケードなど)。UIやDBの詳細を知らない層。

schedulerService.js

1分毎の送信処理本体。GASのLockServiceはD1の行単位CASに置き換えてある。

healthCheckService.js

6時間毎、ACTIVEな送信先の生死確認。不健全ならdestinationServiceの切断処理を呼ぶ。

webhookHandler.js

LINEのjoin/leaveイベント処理。sheetsClient依存を排除し、Repositoryを直接呼ぶ形にD1移行時に書き換えた。

自然言語Parser

ruleParserService.js

日付・時刻・繰り返し・送信先をルールベースで抽出し、信頼度スコアを計算する。移植時に最も慎重を期した部分(既存テストケースで全数検証済み)。

parserService.js / aiParserService.js

信頼度が閾値未満ならAIParserへ委譲する設計だが、AIParser自体は骨組みのみで未実装。

通知送信

lineService.js / chatworkService.js

実際のPush送信・ヘルスチェックAPI呼び出し。エラーコード(AUTH_ERROR/TARGET_ERROR/RATE_LIMIT等)への変換もここで行う。lineService.jsは月間メッセージ枠取得(getMessageQuota)も担う。

notificationDispatcher.js

Destination.channelを見てLine/ChatworkServiceへ振り分けるだけの薄い層。

lineSignature.js / chatworkNotifier.js

Webhook署名検証と、新規グループ検知時の補助通知。どちらも外部npm依存無しのWeb標準APIのみで実装。

使用量モニタリングNEW

storageService.js

Cloudflare管理API(/accounts/{id}/d1/database/{id})からD1のfile_sizeを取得する。専用トークン(Account>D1>Read)をnotify-workerにのみ持たせる。

usageCheckService.js

毎朝6:00(JST)、D1ストレージとLINE月間メッセージ枠の両方をチェックし、settingsRepository経由でSettingsテーブルへ保存する。取得失敗しても本体機能は止めない。

settingsRepository.js

Settingsテーブル(key/value/updated_at)への汎用get/set。現行仕様で初めて実際に使われるようになった。

横断的な仕組み

auth.js

チームパスワードゲート。GASのGoogle Workspaceドメイン制限の代替。

config.js

全定数の一元管理。GAS版のConfig.gsと1:1対応。

loggerService.js

token/secret/passwordを自動マスキングしてログ出力する。

apiError.js / utils.js

構造化エラーとID生成(reminder_id等の採番フォーマットもGAS版と同一)。

このリポジトリに含まれないレガシーコード

GAS版一式(gas/)・GASフロントエンド(frontend/)・旧Cloud Run検討版(line-webhook/)・旧Webhook単体Worker版(cloudflare-worker/)は、このCloudflareリポジトリには含まれていません(移行元プロジェクト側に参考として保持)。現行の更新対象はcloudflare-app/のみです。

関連: 仕様書 / 運用基盤マップ / GitHub