データフロー設計
1. Issue取得 → AI開発 → MR提出 → レビュー → 報酬確定フロー
メインフロー全体図
mermaid
sequenceDiagram
participant M as マネージャー
participant App as 管理画面
participant API as Backend API
participant DB as PostgreSQL
participant GL as GitLab
participant E as 業務委託エンジニア
participant Bot as Slack/Discord Bot
Note over M,Bot: Phase 1: Issue作成
M->>App: Issue作成(報酬額設定)
App->>API: POST /api/issues
API->>GL: GitLab API: Create Issue
GL-->>API: Issue作成完了
API->>DB: Issue + 報酬情報保存
API->>Bot: 新規Issue通知
Bot-->>E: 通知配信
Note over M,Bot: Phase 2: Issue取得・開発
E->>GL: Issueを確認・アサイン
GL-->>API: Webhook: issue assigned
API->>DB: アサイン情報更新
API->>Bot: アサイン通知
E->>E: AI(Claude Code)で開発
E->>GL: MR作成(報告資料含む)
GL-->>API: Webhook: MR opened
API->>DB: MRステータス更新
Note over M,Bot: Phase 3: レビュー
API->>Bot: レビュー依頼通知
M->>GL: MRレビュー(報告資料確認)
alt 修正要求
M->>GL: レビューコメント
GL-->>API: Webhook: note created
API->>Bot: FB通知
E->>GL: 修正コミット
GL-->>API: Webhook: MR updated
end
M->>GL: MR承認
GL-->>API: Webhook: MR approved
Note over M,Bot: Phase 4: 報酬確定
M->>GL: MRマージ
GL-->>API: Webhook: MR merged
API->>DB: Issue完了・報酬確定
API->>Bot: 報酬確定通知各フェーズのデータ状態遷移
mermaid
stateDiagram-v2
[*] --> Open: Issue作成
Open --> Assigned: エンジニアがアサイン
Assigned --> InProgress: 開発着手
InProgress --> InReview: MR作成
InReview --> InProgress: FB対応
InReview --> Approved: MR承認
Approved --> Done: MRマージ
Done --> Paid: 報酬確定
Paid --> [*]
Open --> Cancelled: Issue取消
Assigned --> Open: アサイン解除
Cancelled --> [*]2. GitLab Webhook処理フロー
受信・処理アーキテクチャ
mermaid
graph LR
GL["GitLab"] -->|Webhook POST| CFW["Cloudflare Workers<br/>(Webhook Receiver)"]
CFW -->|署名検証| CFW
CFW -->|イベント転送| API["FastAPI<br/>(Event Processor)"]
API -->|状態更新| DB["PostgreSQL"]
API -->|通知トリガー| Bot["Slack/Discord Bot"]処理対象Webhookイベント
| イベント | トリガー | 処理内容 |
|---|---|---|
issue (open) | Issue作成 | DB登録、通知配信 |
issue (update) | Issue更新 | DB更新、ラベル変更検知 |
issue (close) | Issue完了 | ステータス更新 |
note (issue/MR) | コメント追加 | レビューFB検知、通知 |
merge_request (open) | MR作成 | レビュー依頼通知、ステータス更新 |
merge_request (update) | MR更新 | 修正コミット検知 |
merge_request (merge) | MRマージ | 報酬確定処理、ステータス更新 |
merge_request (approved) | MR承認 | 承認ステータス更新 |
Webhook処理の詳細フロー
mermaid
flowchart TD
A[Webhook受信] --> B{署名検証}
B -->|失敗| C[403 Forbidden]
B -->|成功| D{イベント種別判定}
D -->|Issue Event| E[Issue Handler]
D -->|MR Event| F[MR Handler]
D -->|Note Event| G[Note Handler]
D -->|その他| H[無視 / ログ]
E --> I{アクション判定}
I -->|open| J[DB登録 + 通知]
I -->|update| K[DB更新 + 差分検知]
I -->|close| L[ステータス更新]
F --> M{アクション判定}
M -->|open| N[MR登録 + レビュー依頼通知]
M -->|merge| O[報酬確定処理]
M -->|approved| P[承認ステータス更新]
M -->|update| Q[修正検知]
G --> R[コメント保存 + FB通知]3. 通知フロー
通知トリガー一覧
| トリガー | 通知先 | チャネル | メッセージ内容 |
|---|---|---|---|
| 新規Issue作成 | 全エンジニア | Slack/Discord | Issue概要、報酬額、リンク |
| Issueアサイン | マネージャー、該当エンジニア | Slack/Discord | アサイン情報 |
| MR作成 | レビュアー(マネージャー) | Slack/Discord | MRリンク、レビュー依頼 |
| レビューFB | 該当エンジニア | Slack/Discord | FBコメント内容 |
| MR承認 | 該当エンジニア | Slack/Discord | 承認通知 |
| 報酬確定 | 該当エンジニア、経理 | Slack/Discord | 報酬額、Issue情報 |
| 予算超過警告 | マネージャー | Slack/Discord | プロジェクト名、超過額 |
| 進捗遅延警告 | マネージャー | Slack/Discord | プロジェクト名、遅延状況 |
通知処理アーキテクチャ
mermaid
graph TD
Event["イベント発生"] --> Dispatcher["Notification Dispatcher"]
Dispatcher --> Filter["通知ルール判定"]
Filter --> Template["メッセージテンプレート生成"]
Template --> SlackAdapter["Slack Adapter"]
Template --> DiscordAdapter["Discord Adapter"]
SlackAdapter --> SlackAPI["Slack Web API"]
DiscordAdapter --> DiscordAPI["Discord API"]通知メッセージフォーマット例
Slack/Discord 共通フォーマット:
[Issue Outsource] 新規Issue作成
━━━━━━━━━━━━━━━━━━━━
プロジェクト: {project_name}
Issue: #{issue_id} {issue_title}
報酬: ¥{reward_amount}
ラベル: {labels}
期限: {due_date}
━━━━━━━━━━━━━━━━━━━━
🔗 {issue_url}4. データモデル概要
主要エンティティ
mermaid
erDiagram
PROJECT ||--o{ ISSUE : has
ISSUE ||--o{ MERGE_REQUEST : has
ISSUE ||--o| REWARD : has
USER ||--o{ ISSUE : assigned_to
USER ||--o{ MERGE_REQUEST : created_by
PROJECT ||--o| BUDGET : has
PROJECT {
int id PK
string name
string gitlab_project_id
string description
datetime created_at
}
ISSUE {
int id PK
int project_id FK
string gitlab_issue_id
string title
string status
int assignee_id FK
datetime created_at
datetime completed_at
}
REWARD {
int id PK
int issue_id FK
decimal amount
string status
datetime confirmed_at
}
MERGE_REQUEST {
int id PK
int issue_id FK
string gitlab_mr_id
string status
int author_id FK
datetime created_at
datetime merged_at
}
USER {
int id PK
string gitlab_user_id
string name
string email
string role
}
BUDGET {
int id PK
int project_id FK
decimal total_amount
decimal consumed_amount
decimal reserved_amount
}5. API エンドポイント概要
認証
| メソッド | パス | 説明 |
|---|---|---|
| GET | /api/auth/login | GitLab OAuthログイン開始 |
| GET | /api/auth/callback | OAuth コールバック |
| POST | /api/auth/logout | ログアウト |
| GET | /api/auth/me | 現在のユーザー情報取得 |
プロジェクト
| メソッド | パス | 説明 |
|---|---|---|
| GET | /api/projects | プロジェクト一覧(予算・消化率付き) |
| GET | /api/projects/:id | プロジェクト詳細 |
| GET | /api/projects/:id/kanban | カンバンデータ取得 |
| GET | /api/projects/:id/budget | 予算詳細 |
| GET | /api/projects/:id/analytics | 進捗分析・ETA |
Issue
| メソッド | パス | 説明 |
|---|---|---|
| GET | /api/issues | Issue一覧 |
| GET | /api/issues/:id | Issue詳細 |
| POST | /api/issues | Issue作成 |
| PATCH | /api/issues/:id | Issue更新 |
| POST | /api/issues/:id/assign | アサイン |
Webhook
| メソッド | パス | 説明 |
|---|---|---|
| POST | /api/webhooks/gitlab | GitLab Webhook受信 |
報酬
| メソッド | パス | 説明 |
|---|---|---|
| GET | /api/rewards | 報酬一覧 |
| POST | /api/rewards/:id/confirm | 報酬確定 |