Files
CFDivePlatform/openspec/specs/notification-email/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

81 lines
3.2 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.
# notification-email Specification
## Purpose
定義透過 SMTP 非同步寄送 Email 通知的機制,涵蓋本地 Mailpit 攔截、Queue Worker 投遞、Markdown 模板與各事件的觸發條件。
## Requirements
### Requirement: Laravel Mail 設定
系統 SHALL 支援透過 SMTP 寄送 Email 通知。本地開發環境使用 MailpitDocker 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