実装状況サマリー
現時点(2026-02-28)のコードベースの実装状況をまとめる。
MVP 完成度
受注者向けのコアフロー(ログイン → タスク一覧 → 受託 → 作業 → 完了 → 報酬確認)が全て実装済み。SSEリアルタイム通知・位置情報保存・期限切れ自動遷移も実装済み。決済・振込は未実装。
バックエンド(server/)
実装済みエンドポイント
| エンドポイント | メソッド | 認証 | 説明 |
|---|---|---|---|
/health | GET | なし | ヘルスチェック |
/auth/line/callback | POST | なし | LINE Login コールバック・トークン発行 |
/auth/refresh | POST | なし | アクセストークン更新 |
/tasks | POST | APIキー(Agent) | タスク投稿 |
/tasks | GET | JWT(Worker) | 受注可能なタスク一覧(open のみ) |
/tasks/{id} | GET | なし | タスク詳細 |
/tasks/{id} | PATCH | JWT(Worker) | タスク状態遷移 |
/tasks/events | GET | Bearer/クエリトークン | SSEリアルタイム通知ストリーム |
/workers/me | GET | JWT(Worker) | ワーカープロフィール取得 |
/workers/me | PATCH | JWT(Worker) | ワーカープロフィール更新(位置情報含む) |
/workers/me/tasks | GET | JWT(Worker) | 自分が受注したタスク一覧 |
タスク状態遷移
open ──(受諾)──→ accepted ──(作業開始)──→ in_progress ──(完了報告)──→ completed └──────────────────────────────────(キャンセル)──────────────────────→ cancelled └──────────────────────(期限切れバッチ・60秒間隔)──────────────────→ expired- 同時受諾の排他制御を CAS(
WHERE status = 'open')で実現 expires_at超過のopenタスクは 60 秒間隔のバッチで自動的にexpiredへ遷移
SSEイベント
GET /tasks/events から以下のイベントをリアルタイム配信。EventSource API 非対応のカスタムヘッダ制限を回避するため、?token= クエリパラメータでも認証を受け付ける。
| イベント名 | 発火タイミング |
|---|---|
task.created | タスク新規投稿時 |
task.accepted | タスク受諾時 |
task.cancelled | タスクキャンセル時 |
task.expired | 期限切れバッチ実行時 |
切断・再接続時は Last-Event-ID(またはクエリ ?lastEventId=)でリングバッファ(最大1000件)からイベントを再生。
DBスキーマ
| テーブル | 主要カラム |
|---|---|
agents | id, name |
api_keys | id, agent_id, key_hash |
workers | id, line_sub, name, avatar_url, phone, kyc_level, refresh_token_hash, lat, lng, location_updated_at |
tasks | id, agent_id, title, description, reward, status, location_text, lat, lng, execution_method, expires_at, contractor_id, payment_due_days |
events | id, event_type, entity_type, entity_id, payload(監査ログ) |
技術スタック
- Hono 4.x + Bun
- Drizzle ORM + PostgreSQL
- JWT (HS256)・APIキー (SHA-256ハッシュ)
- OpenAPI 3.1 自動生成(
/reference)
フロントエンド(web/)
実装済み画面
| 画面 | パス | 認証要否 | 備考 |
|---|---|---|---|
| ログイン | /login | 不要 | |
| LINE コールバック | /auth/line/callback | 不要 | |
| オンボーディング(利用規約) | /onboarding/terms | 不要 | |
| オンボーディング(プロフィール) | /onboarding/profile | 不要 | |
| オンボーディング(位置情報) | /onboarding/location | 不要 | 許可後にサーバーへ lat/lng を保存 |
| タスク一覧 | /tasks | 要 | SSEでリアルタイム更新 |
| タスク詳細 | /tasks/:id | 不要 | |
| 作業中 | /working | 要 | 画面表示時に in_progress へ自動遷移 |
| 完了報告 | /working/report | 要 | |
| 完了 | /completion | 要 | 報酬額を ¥X,XXX 形式で表示 |
| 履歴・報酬 | /history | 要 | |
| マイページ | /mypage | 要 |
useTaskEvents フック
web/src/hooks/useTaskEvents.ts で SSE 接続を管理。
task.created→ タスク一覧の先頭に追加task.accepted/task.cancelled/task.expired→ 一覧から除去connectionStatus:'connecting' | 'open' | 'closed'を返す- アンマウント時に
EventSource.close()でクリーンアップ - 再接続時は
Last-Event-IDをクエリパラメータで送信
技術スタック
- React 19 + React Router 7
- Vite 7 + Tailwind CSS 4
- PWA(vite-plugin-pwa + Workbox)
- Cloudflare Pages ホスティング
ドキュメントサイト(docs-site/)
- Astro + Starlight で構築、Cloudflare Pages にデプロイ
docs-site/scripts/sync-docs.mjsでdocs/→docs-site/src/content/docs/に同期
未実装・将来実装
| 機能 | 状況 | 優先度 |
|---|---|---|
| 決済・振込(Stripe Connect) | 未実装 | Phase 2 |
| プロフィール編集・設定 | UI は「準備中」 | Phase 2 |
| eKYC(身分証確認) | 未実装 | Phase 2+ |
| エージェント向け管理ダッシュボード | 未実装(APIキー手動発行) | Phase 2+ |
| 評価・「徳」制度 | 設計済み・未実装 | Phase 3 |
| オークション形式マッチング | 設計済み・未実装 | Phase 3 |
参考ドキュメント
- 認証・認可設計 — LINE Login・APIキー・KYCレベル
- データモデル設計決定事項 — スキーマ設計の経緯
- タスク設計 — タスクフロー・マッチング
- 通知設計 — SSEイベント仕様
- 決済フロー設計 — Phase 2 の決済方針
- セットアップチェックリスト — 環境構築手順