Files
CFDivePlatform/openspec/specs/diving-offers-api/spec.md
T
a620906209 0cd1047b10
Run Tests / test (pull_request) Successful in 30s
docs(openspec): 補齊所有 spec 缺少的 Purpose section 與規格標頭
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
2026-08-03 04:11:06 +08:00

2.4 KiB
Raw Blame History

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 200body 包含 { data: [...], meta: { total, per_page, current_page } },預設每頁 12 筆,每筆資料含 provider_id

Scenario: 依關鍵字搜尋課程

  • WHEN 客戶端發送 GET /api/diving-offers?q=墾丁
  • THEN 回傳 titlelocation 包含「墾丁」的課程列表

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 200body 包含 { data: { id, title, location, spot, rating, reviews, price, badges, description, tag, region, created_at } }

Scenario: 課程不存在

  • WHEN 客戶端發送 GET /api/diving-offers/99999(該 id 不存在)
  • THEN 回傳 HTTP 404body 包含 { message: "課程不存在" }

Requirement: CORS 允許前端 Origin

後端 SHALL 在 config/cors.php 中允許來自前端開發 originhttp://localhost:5173)的跨域請求。

Scenario: 前端跨域請求課程列表

  • WHEN 瀏覽器從 http://localhost:5173 發送 GET /api/diving-offers
  • THEN 後端回應包含正確的 CORS header,瀏覽器不阻擋請求