# 會員平台（Member Center）

此專案為多網站共用的會員登入中心與電子報訂閱管理平台。文件統一放在 `docs/`。

## 目標（MVP）
- 多個網站共用的會員登入中心（SSO）
- OAuth2 + OIDC 登入（API 與 Redirect 兩種方式）
- 電子報訂閱管理（含未註冊訂閱）
- 未註冊訂閱者可自行取消訂閱
- 未註冊訂閱者未來註冊可沿用訂閱資料

## 既定條件
- OAuth2 + OIDC
- 會員中心只負責 Email/訂閱管理，發送系統另建
- 訂閱採 double opt-in
- 各站各自設計 UI，主要走 API；少數狀況使用 redirect
- 會員資料跨站共享（邏輯隔離）
- 訂閱事件同步採 event/queue
- DB：PostgreSQL
- 開發：C# .NET Core + MVC + OpenIddict

## 範圍（第一階段）
- 多租戶（站點）概念與基本設定
- 會員與訂閱者 Email 身分識別
- OAuth2/OIDC 授權（Authorization Code + PKCE）
- 訂閱/取消訂閱流程（含未註冊）
- 基本管理後台（核心 CRUD）

## 非目標（暫不處理）
- 第三方社群登入
- MFA
- 行銷自動化或行為追蹤
- 金流/付費會員

## 文件
- `docs/DESIGN.md`：系統設計總覽、核心模組、資料模型與流程原則
- `docs/UI.md`：UI 路由規劃與 Use Cases 對應
- `docs/USE_CASES.md`：需求用例（角色、情境、驗收）
- `docs/FLOWS.md`：主要業務流程（註冊、登入、訂閱、退訂、管理）
- `docs/OPENAPI.md`：API 規格說明與補充規則
- `docs/openapi.yaml`：OpenAPI 3.1 正式規格檔
- `docs/SCHEMA.sql`：資料庫 schema（PostgreSQL）
- `docs/SEED.sql`：初始化/測試資料
- `docs/MESSMAIL.md`：租戶站台介接指引（訂閱/退訂/發信）
- `docs/TECH_STACK.md`：技術棧與選型
- `docs/INSTALL.md`：安裝、初始化與維運指令
- `docs/MEMBER_UPGRADE_PLAN.md`：會員中心下一階段升級規劃（設定畫面、SMTP、Email 驗證、忘記密碼、角色分級）
- `docs/ADMIN_AUTHORIZATION.md`：後台 Role / Permission 權限模型與管理原則
- `docs/TEST_SITE.md`：手動整合測試站說明（redirect login、service token、會員 API happy path）

## 專案結構
```text
member_center/
├── src/
│   ├── MemberCenter.Api/          # REST API（OAuth/OIDC、訂閱、管理 API）
│   ├── MemberCenter.Web/          # MVC Web UI（client-first 會員介面 + Areas/Admin 管理介面）
│   ├── MemberCenter.TestSite/     # 手動整合測試站（API / redirect login happy path）
│   ├── MemberCenter.Installer/    # 安裝與初始化 CLI（migrate/init/admin）
│   ├── MemberCenter.Application/  # 應用層介面與 DTO
│   ├── MemberCenter.Infrastructure/# EF Core、Identity、OpenIddict、服務實作
│   └── MemberCenter.Domain/       # 領域實體與常數
├── docs/                          # 專案文件
├── .vscode/                       # 本機開發啟動與工作設定
├── MemberCenter.sln               # Solution
└── README.md
```

## 待確認事項
- OAuth2 scopes 與最小 claims（email/profile）
- 事件系統選擇（Kafka/RabbitMQ/SNS+SQS）
- 取消訂閱的 UI 形式（純一鍵或提供偏好）
- GDPR/CCPA 資料匯出與刪除是否納入第一期

## 目前 UI / Auth 狀態
- `MemberCenter.Web` 採單一登入入口，client 與 admin 共用同一套帳號。
- `admin` role 使用者在 client 主介面中可看到 `Admin` 功能群組。
- `/admin/*` 已移至 `Areas/Admin`，未登入或非 admin 存取時一律回 `404`。
- 本地註冊維持 `UserName = Email`，新帳號預設為未認證但可登入。
- 已支援 Google external login / register 與同 email auto-link。
- 註冊或 external login 建立帳號後，若已存在同 email 訂閱資料，會自動補 `newsletter_subscriptions.user_id`、寫入 audit log，並發送 `subscription.linked_to_user` 事件。
