0cd1047b10
Run Tests / test (pull_request) Successful in 30s
repo 內 35/38 份既有 spec 都是舊版歸檔流程留下的原始 delta 內容(`## ADDED Requirements`,缺標題與 Purpose),openspec CLI 現版本嚴格驗證 (--strict)會報錯或警告。逐一補上: - 缺標題/Purpose 的 30 份:加上 `# <name> Specification` 標題 + 依內容 撰寫的 Purpose 段落,`## ADDED Requirements` 改回 `## Requirements` - compose-cloud-baseline、scheduler-container:已有標題與 Requirements,只補 Purpose 包裝 - provider-verification:已有標題與 Purpose,只需把 `## ADDED Requirements` 改回 `## Requirements` - admin-user-management、notification-email:各有一條 requirement 缺 SHALL/MUST 關鍵字(純敘述句或表格),補上規範用語,內容不變 `openspec validate --specs --strict`:38/38 全過(原本 4/38)。純文件 補齊,未變更任何 requirement 的實質內容或行為描述。 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011LpcY9b7y9x4fusHBTXciQ
53 lines
2.4 KiB
Markdown
53 lines
2.4 KiB
Markdown
# diving-offers-api Specification
|
||
|
||
## Purpose
|
||
|
||
定義公開的課程列表與課程詳情 API,支援關鍵字搜尋、地區與標籤篩選、分頁,以及前端開發 origin 的 CORS 設定。
|
||
|
||
## Requirements
|
||
|
||
### Requirement: 課程列表 API
|
||
後端 SHALL 提供公開的 `GET /api/diving-offers` endpoint,回傳分頁的潛水課程列表,支援關鍵字搜尋與篩選,無需認證即可存取。response 中每筆課程包含 `provider_id` 欄位(可為 null)。
|
||
|
||
#### Scenario: 取得全部課程列表
|
||
- **WHEN** 客戶端發送 `GET /api/diving-offers` 且不帶任何參數
|
||
- **THEN** 回傳 HTTP 200,body 包含 `{ data: [...], meta: { total, per_page, current_page } }`,預設每頁 12 筆,每筆資料含 `provider_id`
|
||
|
||
#### Scenario: 依關鍵字搜尋課程
|
||
- **WHEN** 客戶端發送 `GET /api/diving-offers?q=墾丁`
|
||
- **THEN** 回傳 `title` 或 `location` 包含「墾丁」的課程列表
|
||
|
||
#### Scenario: 依地區篩選課程
|
||
- **WHEN** 客戶端發送 `GET /api/diving-offers?region=南部`
|
||
- **THEN** 只回傳 `region` 欄位等於「南部」的課程
|
||
|
||
#### Scenario: 依標籤篩選課程
|
||
- **WHEN** 客戶端發送 `GET /api/diving-offers?tag=初學者`
|
||
- **THEN** 只回傳 `tag` 欄位包含「初學者」的課程
|
||
|
||
#### Scenario: 分頁參數
|
||
- **WHEN** 客戶端發送 `GET /api/diving-offers?page=2&per_page=6`
|
||
- **THEN** 回傳第 2 頁資料,每頁 6 筆,`meta` 包含正確的分頁資訊
|
||
|
||
---
|
||
|
||
### Requirement: 課程詳情 API
|
||
後端 SHALL 提供公開的 `GET /api/diving-offers/{id}` endpoint,回傳單一課程完整資訊,無需認證即可存取。
|
||
|
||
#### Scenario: 取得存在的課程詳情
|
||
- **WHEN** 客戶端發送 `GET /api/diving-offers/1`(該 id 存在)
|
||
- **THEN** 回傳 HTTP 200,body 包含 `{ data: { id, title, location, spot, rating, reviews, price, badges, description, tag, region, created_at } }`
|
||
|
||
#### Scenario: 課程不存在
|
||
- **WHEN** 客戶端發送 `GET /api/diving-offers/99999`(該 id 不存在)
|
||
- **THEN** 回傳 HTTP 404,body 包含 `{ message: "課程不存在" }`
|
||
|
||
---
|
||
|
||
### Requirement: CORS 允許前端 Origin
|
||
後端 SHALL 在 `config/cors.php` 中允許來自前端開發 origin(`http://localhost:5173`)的跨域請求。
|
||
|
||
#### Scenario: 前端跨域請求課程列表
|
||
- **WHEN** 瀏覽器從 `http://localhost:5173` 發送 `GET /api/diving-offers`
|
||
- **THEN** 後端回應包含正確的 CORS header,瀏覽器不阻擋請求
|