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
81 lines
3.2 KiB
Markdown
81 lines
3.2 KiB
Markdown
# notification-email Specification
|
||
|
||
## Purpose
|
||
|
||
定義透過 SMTP 非同步寄送 Email 通知的機制,涵蓋本地 Mailpit 攔截、Queue Worker 投遞、Markdown 模板與各事件的觸發條件。
|
||
|
||
## Requirements
|
||
|
||
### Requirement: Laravel Mail 設定
|
||
|
||
系統 SHALL 支援透過 SMTP 寄送 Email 通知。本地開發環境使用 Mailpit(Docker service)攔截所有寄出信件,不真實發送。`.env` 設定:`MAIL_MAILER=smtp`、`MAIL_HOST=mailpit`(Docker service name)、`MAIL_PORT=1025`。
|
||
|
||
#### Scenario: 本地環境信件攔截
|
||
|
||
- **WHEN** 系統觸發 Email 通知
|
||
- **THEN** 信件出現在 Mailpit Web UI(`http://localhost:8025`),未真實寄出
|
||
|
||
---
|
||
|
||
### Requirement: Queue Worker 處理 Email 投遞
|
||
|
||
Email 通知 SHALL 透過 Laravel Queue(`QUEUE_CONNECTION=database`)非同步投遞,不阻塞 HTTP response。Queue Worker 在 Docker Compose 中以獨立 service 啟動。
|
||
|
||
#### Scenario: Email 加入 Queue
|
||
|
||
- **WHEN** 業務邏輯觸發 notify,`via()` 包含 `'mail'`
|
||
- **THEN** Email job 進入 `jobs` 資料表,HTTP response 立即回傳
|
||
|
||
#### Scenario: Queue Worker 處理後寄出
|
||
|
||
- **WHEN** queue:work 讀取到 Email job
|
||
- **THEN** Mailable 被實際執行,信件送至 SMTP(本地為 Mailpit)
|
||
|
||
#### Scenario: 失敗重試
|
||
|
||
- **WHEN** SMTP 連線失敗
|
||
- **THEN** Job 重試最多 3 次(`$tries = 3`),超過後寫入 `failed_jobs`
|
||
|
||
---
|
||
|
||
### Requirement: Email Markdown 模板
|
||
|
||
每種通知場景 SHALL 有對應的 Laravel Markdown Mailable 模板,存放於 `resources/views/emails/notifications/`。模板須包含:平台名稱(CFDivePlatform)、通知標題、正文、行動連結按鈕(CTA)、底部免責聲明。
|
||
|
||
涵蓋場景(共 5 種,`ReviewReceivedNotification` 僅站內通知不寄 Email):
|
||
- `booking-created.blade.php`(給 Provider)
|
||
- `booking-confirmed.blade.php`(給 Member)
|
||
- `booking-rejected.blade.php`(給 Member)
|
||
- `booking-cancelled.blade.php`(給對方)
|
||
- `booking-completed.blade.php`(給 Member)
|
||
|
||
#### Scenario: Email 內容包含行動連結
|
||
|
||
- **WHEN** Member 收到「預約已確認」Email
|
||
- **THEN** 信件包含「查看預約」按鈕,點擊後導向 `{FRONTEND_URL}/my-bookings`
|
||
|
||
#### Scenario: Email 主旨語言
|
||
|
||
- **WHEN** 系統寄出任何通知 Email
|
||
- **THEN** 主旨以繁體中文撰寫(例:「你的預約已確認 — CFDivePlatform」)
|
||
|
||
---
|
||
|
||
### Requirement: Email 通知觸發條件與收件人
|
||
系統 SHALL 依下表定義的事件、收件人與主旨寄送 Email 通知:
|
||
|
||
| 事件 | 收件人 | 主旨 |
|
||
|------|--------|------|
|
||
| 預約建立(pending) | Provider | 你有新的預約申請 |
|
||
| 預約確認(confirmed) | Member | 你的預約已確認 |
|
||
| 預約拒絕(rejected) | Member | 你的預約申請未通過 |
|
||
| 預約取消(任一方) | 對方 | 預約已取消 |
|
||
| 預約完成(completed) | Member | 預約完成,歡迎留下評價 |
|
||
|
||
> **注意**:`ReviewReceivedNotification` 僅透過 `database` channel 站內通知,**不寄 Email**(告知性通知,避免打擾 Provider)。
|
||
|
||
#### Scenario: 預約建立後 Provider 收到 Email
|
||
|
||
- **WHEN** Member 成功建立預約(status 為 pending)
|
||
- **THEN** 課程所屬 Provider 在 Queue 處理後收到「你有新的預約申請」Email
|