Files
CFDivePlatform/openspec/specs/review-voting/spec.md
T
a620906209 81a9f84b26 feat:實作評價系統 — 匿名評價、有幫助投票、手動完成預約
後端:
- 新增 reviews / review_edits / review_votes migration(含索引)
- Review / ReviewEdit / ReviewVote Model
- ReviewController:評價 CRUD、資格驗證(completed booking)、rating 即時重算
- toggleHelpful:Member 限定、GREATEST 原子防負、DB transaction 同步
- AdminReviewController:全量列表、刪除(含重算)
- AdminBookingController:全量列表、手動標記 completed
- ProviderBookingController 新增 complete 方法(教練手動完成預約)
- DevelopmentSeeder:快速重建測試資料(admin/coach/member + offers + bookings)
- EnsureAdmin middleware 正式納入 bootstrap/app.php
- Nginx server_name 加入 cfdive.local

前端:
- 課程詳情頁加入評價區塊(星等分布、排序切換、撰寫/修改/刪除、有幫助 Toggle)
- Coach Portal 新增「課程評價」頁(只讀,依課程分組)
- Coach 預約管理加入「完成」按鈕
- Admin 新增「預約管理」頁(標記完成)、「評價管理」頁(刪除)
- Admin / Coach Navbar 新增對應連結

OpenSpec:
- review-system change 歸檔至 archive/2026-05-12-review-system
- 新增 specs/review-lifecycle 與 specs/review-voting 主規格
- review-voting spec 補充 Member 限定與 GREATEST 原子更新說明

Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
2026-05-12 02:46:54 +08:00

34 lines
1.6 KiB
Markdown
Raw 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.
### Requirement: Member 對評價投「有幫助」票
已登入 **Member**role = memberSHALL 能對評價投「有幫助」票,可取消,不可重複投票。Provider 與 Admin 不可投票。
#### Scenario: 成功投票
- **WHEN** 已登入 Member 送出 `POST /api/reviews/{id}/helpful`,且尚未對此評價投票
- **THEN** 系統建立 ReviewVote`reviews.helpful_count + 1`,回傳目前 `helpful_count`
#### Scenario: 取消投票(Toggle
- **WHEN** 已登入 Member 再次送出 `POST /api/reviews/{id}/helpful`,且已投過票
- **THEN** 系統刪除 ReviewVote`reviews.helpful_count``GREATEST(helpful_count - 1, 0)` 原子更新,回傳目前 `helpful_count`
#### Scenario: 未登入不可投票
- **WHEN** 未登入使用者嘗試投票
- **THEN** 系統回傳 401
#### Scenario: 非 Member 角色不可投票
- **WHEN** Provider 或 Admin 嘗試投票
- **THEN** 系統回傳 403message:「只有會員可以投票」
#### Scenario: 不可對自己的評價投票
- **WHEN** Member 嘗試對自己撰寫的評價投票
- **THEN** 系統回傳 422,告知不可對自己的評價投票
### Requirement: 投票狀態隨評價一同回傳
已登入 Member 查看評價列表時,系統 SHALL 回傳當前用戶對每筆評價的投票狀態。
#### Scenario: 已登入查看列表
- **WHEN** 已登入 Member 送出 `GET /api/diving-offers/{id}/reviews`
- **THEN** 每筆評價包含 `has_voted: true/false`,供前端渲染「有幫助」按鈕狀態
#### Scenario: 未登入查看列表
- **WHEN** 未登入使用者送出 `GET /api/diving-offers/{id}/reviews`
- **THEN** 每筆評價的 `has_voted` 固定為 `false`