thread-master/docs/product/haixun-backend/fe-spec-alignment.md

335 lines
16 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 前端apps/web↔ Spechaixun-backend全量對照
> Status: **decisions locked部分** · 2026-07-10
> 目的:在 **重切 task 之前** 確認「前端已有/在用的能力」是否被後端 spec **完整擁有**(可 live 交付),並標出雙向缺口。
> 輸入:`apps/web` **現在 UI 實際呼叫****以 UI 為主**`repos.ts``spec.md` §4§5§9。
> **範圍原則2026-07-10 使用者):以現在 UI 為準;舊靈感捨棄;死 API remove。**
## 0. 總結(先讀這)
| 結論 | 說明 |
|------|------|
| **頁面級大致有對** | LoginAdminCrewStudioOutboxJobsSettingsScoutBrandsInviteUsage 在 spec §5.3 都有域 |
| **方法級不夠完整** | Spec §5.2 是域摘要§9 約 184 ID **未逐一對到** 前端每個在用 API。有一批 **UI 正在用** 的方法在 §9 **沒有獨立驗收** |
| **前端也還沒對齊已批 BYOK** | `UsageEvent` **無** `key_mode``UsageMonthSummary` **無** platformbyok 分欄 → 與 spec §4.7 衝突live 前 FE 必須改契約型別 |
| **OAuth 前端契約缺** | Crew 用 `accounts.createMock`repo **無** `oauthStart`callback 消費路徑 |
| **live 未接線** | `createRepos('live')` 仍回 mock`dataSource: 'live'` 旗標) |
| **刻意不做P2mock 專用)** | Insights 真管線、simulate 當 live 完成、公開註冊頁、真金流 |
**因此:以「全部功能完整擁有」標準,目前 spec + 既有 57 tasks 仍不足以保證前端每一條主路徑都有後端+驗收。**
應先凍結本對照表 → 補 spec 能力清單§9 → 再重切 task。
---
## 1. 畫面/導覽 → 後端域
| 前端路由/區塊 | 主要 Repos | Spec 域 | P0/P1/P2 | 對齊 |
|----------------|------------|---------|----------|------|
| `/login` | auth.login | Auth | P0 | ✅ |
| `/forgot-password` `/reset-password` | request/reset password | Auth | P0 | ✅ |
| `/verify-email` | send/verify email | Auth | P0 | ✅ |
| `/app/profile` | updateProfile | Auth | P0 | ✅ |
| `/app/users` | adminUsers.* + usage prefs | Admin + Usage | P0 | ✅ |
| `/app/crew` 帳號 | accounts.* | Threads Accounts | P0 | ⚠️ UI 仍 createMock缺 OAuth 契約 |
| `/app/crew` 人設 | personas.* | Personas | P1 | ✅ |
| `/app/studio` 方案Wizard | plays.* | Plays + Outbox | P1 | ⚠️ listByPostlistByExternalUrl 未入 §9 |
| `/app/studio` 單篇 Compose | compose.* + research + media | Compose + Research + Media | P1 | ⚠️ **mimicanalyzeViral** 未入 §9 |
| `/app/studio` 已發 | ownPosts.***無** generateFromFormula | OwnPosts | P1 | ⚠️ **analyzePost** 未入 §9formula **Remove** |
| `/app/studio` 提及 | mentions.* | Mentions | P1 | ⚠️ **generateReply** 未獨立驗收 |
| `/app/studio` 靈感 | **現 UI 版 only**session/elements/trends/chat | Inspiration | P1 | ✅ 範圍鎖定;舊 list/viral/spark **Remove** |
| `/app/outbox` | outbox.* | Outbox + Worker | P1 | ✅simulate 僅 mock |
| `/app/jobs` | jobs.* + notifications | Jobs + Notifications | P0 | ✅ |
| `/app/settings` | settings.* + 擴充 ZIP | Settings | P0 | ⚠️ platform_key_availableBYOK 顯示未全 |
| `/app/scout` `/app/brands` | scout.***無** topics UI | Scout | P1 | topics **Remove**activeBrand 可 CLIENT |
| `/app/invite` | invite.* | Invite | P1 | ✅ |
| `/app/usage` plans checkout | usage.* | Usage | P1 | ⚠️ **分計分顯未進 FE 型別** |
| `/app/today` | trends + ownPosts 摘要 | Inspiration + OwnPosts | P1 輕 | ⚠️ 聚合頁,依賴子域 |
| `/app/insights` | ownPosts + **local** accountInsights | — | **P2** | ⭕ 需求已列 P2不進 Phase C 後端必做 |
| 公開註冊/三方頁 | — | Auth API 要、頁不做 | 決策 | ✅ 故意 |
---
## 2. Repository 方法全量分類
圖例:
- **MUST** = UI 有呼叫或 live 主路徑必需 → 後端 **必須**有等價 API + 驗收
- **API-OK** = 後端要有、前端可不開 UIregister三方
- **MOCK** = 僅 mock除錯live **不得**當完成定義
- **CLIENT** = 可前端 state 或本機;後端可選
- **P2** = 本階段不做後端
- **DEPRECATED** = 註解已 deprecated可相容可不做新驗收
### 2.1 Auth8 UI + 缺口)
| 方法 | 用途 | 分類 | Spec§9 | 缺口 |
|------|------|------|----------|------|
| login / logout / me | 登入會話 | MUST | AU-0109 | — |
| updateProfile | 個人資料/改密 | MUST | AP-0407 | — |
| requestPasswordReset / resetPassword | 忘密 | MUST | AP-0103 | — |
| sendEmailVerificationCode / verifyEmail | 驗證 | MUST | AR/AP | — |
| **refreshtoken** | 換 access | MUST | AU-0708 | **FE AuthRepo 無此方法**live client 必補 |
| register / 三方 OAuth | 完整會員 API | API-OK | AR / AO | 頁可不做 ✅ |
### 2.2 AdminUsers8
| 方法 | 分類 | §9 | 缺口 |
|------|------|-----|------|
| listUsersPage / getUser / createMember / setSuspended / setEmailVerified / setRoles / resetPassword | MUST | AD-0114 | — |
| listUsersdeprecated 全量) | CLIENT/compat | — | live 可只做 page |
### 2.3 Accounts4 現有 + OAuth 缺)
| 方法 | 分類 | §9 | 缺口 |
|------|------|-----|------|
| list / refreshSession / remove(disconnect) | MUST | TH-0510 | — |
| **createMock** | MOCK | TH-09 禁止旁路過關 | live **改** oauthStart |
| **oauthStart**(及 callback 由瀏覽器導向後端) | MUST | TH-0104 | **FE repoCrew UI 皆無** |
### 2.4 Plays8
| 方法 | 分類 | §9 | 缺口 |
|------|------|-----|------|
| list / get / save / remove / submit / resolveExternalLink | MUST | PL-0105,0809 | — |
| **listByPost** | MUSTPlaysPanel | **無** | 須補 §5.2 + 驗收 PL-10 類 |
| **listByExternalUrl** | MUSTPlaysPanel | **無** | 同上 PL-11 |
### 2.5 Outbox6
| 方法 | 分類 | §9 | 缺口 |
|------|------|-----|------|
| list / get / retryStep / remove | MUST | OB-* | — |
| simulateSuccess / simulateRootFail | MOCK | OB-12 | live 隱藏或 no-op 失敗 |
### 2.6 Jobs / Notifications3+4
| 方法 | 分類 | §9 | 缺口 |
|------|------|-----|------|
| jobs.list/get/startDemo | MUST | JB-0104,0910 | startDemo = template demo |
| notifications.list/unread/markRead/markAllRead | MUST | JB-0508 | — |
### 2.7 Settings7
| 方法 | 分類 | §9 | 缺口 |
|------|------|-----|------|
| get/save Ai, get/save Placement, listModels | MUST | ST-0104,1415 | 應回 platform_key_availablemember configured |
| get/set DataSource | CLIENT | — | 前端切 mock\|live非後端 |
| 擴充 ZIP 下載 | MUST | ST-16 | T157 |
### 2.8 Personas8
| 方法 | 分類 | §9 | 缺口 |
|------|------|-----|------|
| list/get/getActiveId/setActiveId/save/remove/analyzeFromText/analyzeFromAccount | MUST | PE-0106 | — |
### 2.9 OwnPosts現 UI
| 方法 | 分類 | §9 | 缺口 |
|------|------|-----|------|
| list / lastSyncedAt / sync / generateReply / sendReply | MUST | OP-0105,07 | — |
| **analyzePost** | MUSTOwnPostsPanel 有按鈕) | **無獨立 ID** | 須補 OP-08 + AI 計費 |
| **generateFromFormula** | **REMOVE** | — | UI 未用後端不做FE repo 日後刪 |
### 2.10 Mentions4
| 方法 | 分類 | §9 | 缺口 |
|------|------|-----|------|
| list / markReplied / skip | MUST | OP-06 偏狀態 | list 應明確 |
| **generateReply** | MUSTMentionsPanel | **無** | 須補 OP-09 + 計費 |
### 2.11 Inspiration**僅現 UI 版** · 舊流 Remove
> 決策 2026-07-10舊靈感完全捨棄以 InspirePanel + Today 趨勢為準。
| 方法 | 分類 | §9 | 缺口 |
|------|------|-----|------|
| listTrends / refreshTrends | MUSTToday + Inspire | IN-0102 | — |
| listElements / saveElement / removeElement | MUST | IN-03 | — |
| getSession / saveSession / clearSession / chat(mode=chat\|generate) | MUST | IN-0405 | — |
| list / saveIdea / generate / bookmarkTrend / listViral | **REMOVE** | — | 後端不做 |
| sparkAngles / sparkAnglesForTopic / sparkFromTrend | **REMOVE** | — | 後端不做 |
| searchTrends | **REMOVE**UI 未呼叫) | — | 後端不做 |
### 2.12 Research / Media1+2
| 方法 | 分類 | §9 | 缺口 |
|------|------|-----|------|
| research.search | MUST | IN-06 + ST/USG | — |
| media.generateImage | MUST | IN-07 | — |
| media.attachLocal | MUST附圖 | IN-0809 | **真上傳** → 持久 url非法失敗非 data URL 冒充 live |
### 2.13 Compose3
| 方法 | 分類 | §9 | 缺口 |
|------|------|-----|------|
| publishSingle(+schedule) | MUST | PL-0608 | — |
| **mimic** | MUSTComposerPanel | **無** | 須補 + AI 計費ai_copy |
| **analyzeViral** | MUSTComposerPanel | **無** | 須補 + AI 計費 |
### 2.14 Scout31
| 方法群 | 分類 | §9 | 缺口 |
|--------|------|-----|------|
| brands CRUD, products CRUD, importProductFromUrl | MUST | SC-0102,14 | — |
| prepareBrief / runScanFromBrief / listPosts | MUST | SC-0308 | — |
| draftOutreach / skip / markPublished / sendOutreach | MUST | SC-0911 | — |
| removePost / removeTheme | MUST | SC-12 | — |
| homework list/save/get/remove | MUST | SC-13 | — |
| runScan / getScanContext | compat | 對齊 runScanFromBrief | 可映射 |
| getActiveBrandId / setActiveBrandId | CLIENT | — | 前端 localsession 即可 |
| **listTopics / saveTopic / removeTopic** | **REMOVE** | — | **無 UI 呼叫**;後端不做 |
### 2.15 Usage10
| 方法 | 分類 | §9 | 缺口 |
|------|------|-----|------|
| getSummary / listEvents | MUST | USG-0108 | **FE 型別缺 key_modebyok 分欄** |
| getPlanId / purchasePlan / listMyPurchases | MUST | USG-11 | listMyPurchases 應補 §9 |
| getMemberPrefs / setMemberPrefs | MUST | USG-1214 | — |
| getTenantSummary / getTenantAnalytics | MUST admin | USG-10 | analytics 序列分 platform/byok |
| setPlanId | adminself 語意混 | 與 setMemberPrefs 重疊 | 契約要寫清 |
### 2.16 Invite5
| 方法 | 分類 | §9 | 缺口 |
|------|------|-----|------|
| getMyNetwork / applyInviteCode / getTree / moveMember / listParentCandidates | MUST | IV-0113 | — |
### 2.17 非 Repo 但重要
| 能力 | 分類 | 說明 |
|------|------|------|
| Insights 頁 | P2 | localStorage 報表requirements 已列 P2 |
| Job templatespersona_analyze、threads_sync、scout_scan、outbox_publish | MUST | spec §5.4worker |
| 數字 uid | MUST | FE 現 `uid: string`live 可 number→string 顯示但 JSON number |
| BYOK 分顯 | MUST | FE Usage UI 需改T155 有提但型別未改 |
---
## 3. Spec 有、前端尚未具備的 live 契約
| Spec | 前端現況 | 動作 |
|------|----------|------|
| oauthStart / OAuth 綁帳 | createMock | **改 AccountsRepo + Crew UI**(可 mock 保留 createMock |
| Auth refresh | 無 repo 方法 | **補 AuthRepo.refresh** |
| Usage key_mode / platform vs byok summary | 無欄位 | **改 usageMeter 型別 + Usage 頁** |
| Settings platform_key_available | 僅 member configured | **擴 AiSettingsPlacement 顯示** |
| 成功 envelope 102000 | live 未接 | live HTTP client |
| 未實作不回空成功 | live 未接 | 同上 |
| register三方 API | 無頁 | 後端做即可(決策) |
---
## 4. 前端在用、Spec§9 不足(必須補進「完整擁有」)
下列建議在 **重切 task 前** 寫入 `spec.md` §5.2 與 §9新 ID
| # | 能力 | 建議驗收 ID | 優先 |
|---|------|-------------|------|
| 1 | plays.listByPost | PL-10 | P1 |
| 2 | plays.listByExternalUrl | PL-11 | P1 |
| 3 | compose.mimic | CP-01或 PL-12+ 計費 | P1 |
| 4 | compose.analyzeViral | CP-02 + 計費 | P1 |
| 5 | ownPosts.analyzePost | OP-08 + 計費 | P1 |
| 6 | mentions.list + generateReply | OP-0910 + 計費 | P1 |
| 7 | usage.listMyPurchases | USG-15 | P1 |
| 8 | usage key_modebyok 分欄 | FE 型別 + USG | P0 契約 |
| 9 | AuthRepo.refresh | 對齊 AU-07 | P0 前端 live |
| 10 | accounts.oauthStart | 對齊 TH-01取代 createMock 主路徑 | P0 前端 live |
| — | 舊靈感topicsgenerateFromFormula | — | **REMOVE · 不做** |
---
## 5. 與現有 Tasks 的關係(為何先不重切)
| 現況 | 問題 |
|------|------|
| 57 tasks 依域粗切 | 未保證上表 MUST 方法都有 API task + 測試 case |
| T171「fe live studio」 | 一行無法覆蓋 PlaysPanel + Compose mimic/viral + OwnPosts analyze + Mentions generate |
| T155 usage byok display | FE 型別尚未定義分欄 → task 輸入不足 |
| T135 accounts live | 未強制改掉 createMock → OAuth |
**建議流程:**
```text
1) ~~開放題 16~~ ✅ 已鎖
2) ~~spec / requirements 回寫關鍵決策~~ ✅
3) 重切 tasksUI MUST + 測試 + FE live + apps/backend← 下一步
4) ready-to-implement
```
---
## 6. 已鎖定決策2026-07-10
| # | 議題 | 決策 |
|---|------|------|
| 1 | 舊靈感 API | **完全捨棄**。後端/驗收只做 **現 UI**trends、elements、session、chat。listsaveIdeageneratebookmarklistViralspark*searchTrends → **Remove** |
| 2 | generateFromFormula | **Remove**UI 未用;後端不做) |
| 3 | 範圍原則 | **以現在 UI 為主**:有按鈕/主路徑呼叫 = MUST僅 mock死碼 = Remove 或 P2 |
| — | Scout topics | **Remove**(無 page 呼叫,跟 UI 原則) |
| 4 | attachLocal / 附圖 | **真上傳**(後端收檔 → 持久可取 URL禁止只靠本機 data URL 當 live 完成) |
| 5 | Insights | **維持 P2**(頁面可 local 算Phase C 後端不做真數據管線) |
| 6 | FE uid | **可以**API JSON **number**;前端顯示/比對用 toString 即可 |
### 靈感:後端 MUST 清單(凍結)
```text
listTrends / refreshTrends
listElements / saveElement / removeElement
getSession / saveSession / clearSession
chat({ message, pinnedIds, mode: chat|generate })
```
### 明確 Remove後端不實作、不進 §9
```text
inspiration: list, saveIdea, generate, bookmarkTrend, listViral,
sparkAngles, sparkAnglesForTopic, sparkFromTrend, searchTrends
ownPosts: generateFromFormula
scout: listTopics, saveTopic, removeTopic
outbox: simulate*live 完成定義)
accounts: createMocklive 主路徑mock 模式可留)
```
### 媒體上傳(凍結 · 決策 #4
```text
media.attach / upload對齊 FE attachLocal 語意)
→ 真 multipart或等價上傳
→ 回可跨裝置使用的 url及 id
→ 非法/過大失敗可讀
→ 不可 102000 + 空成功
```
儲存介面(本機 disk / S3 / 其他)實作可選,但驗收以「真上傳 + 可取 URL」為準。
### 實作清潔(不擋定義)
- FE 清掉 Remove 方法的 repo 型別(可併 live 接線 task
- Member.uid 型別live 適配 number → 顯示 string
---
## 7. 統計(粗)
| 項目 | 數 |
|------|-----|
| repos.ts 唯一方法名 | ~119 |
| UI 有呼叫(抽樣 grep的主路徑 MUST | 估計 **7590** |
| §9 現有 ID | 184含權限失敗工程非 1:1 方法) |
| 明確 MUST 但 §9 缺口 | **≥ 8**§4 表)+ BYOK FE 契約 + OAuth FE |
| MOCKP2DEPRECATED 可排除 | simulate、createMock、Insights 真管線、spark*、公開註冊頁 |
---
## 8. 批准欄
- [x] 範圍原則:以現在 UI 為主
- [x] 舊靈感捨棄generateFromFormulatopics Remove
- [x] #4 真上傳 · #5 Insights 維持 P2 · #6 uid number + toString 可以
- [x] requirements #1621、spec §5.2§6§9含 IN-0809已回寫
- [x] **tasks v3 approved**「ok同意」`ready-to-implement`;指定 T### 才寫碼
- [x] 已回寫 requirements 決策 #1618、spec §5.2§6§9 補 PL-1011、CP-0102、OP-0811
- [ ] **授權補齊其餘 §9 細項後重切 tasks**(下一步)