Major Features: - ✅ Multi-tenant architecture (tenant isolation) - ✅ Employee CRUD with lifecycle management (onboarding/offboarding) - ✅ Department tree structure with email domain management - ✅ Company info management (single-record editing) - ✅ System functions CRUD (permission management) - ✅ Email account management (multi-account per employee) - ✅ Keycloak SSO integration (auth.lab.taipei) - ✅ Redis session storage (10.1.0.254:6379) - Solves Cookie 4KB limitation - Cross-system session sharing - Sliding expiration (8 hours) - Automatic token refresh Technical Stack: Backend: - FastAPI + SQLAlchemy - PostgreSQL 16 (10.1.0.20:5433) - Keycloak Admin API integration - Docker Mailserver integration (SSH) - Alembic migrations Frontend: - Next.js 14 (App Router) - NextAuth 4 with Keycloak Provider - Redis session storage (ioredis) - Tailwind CSS Infrastructure: - Redis 7 (10.1.0.254:6379) - Session + Cache - Keycloak 26.1.0 (auth.lab.taipei) - Docker Mailserver (10.1.0.254) Architecture Highlights: - Session管理由 Keycloak + Redis 統一控制 - 支援多系統 (HR/WebMail/Calendar/Drive/Office) 共享 session - Token 自動刷新,異質服務整合 - 未來可無縫遷移到雲端 Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
408 lines
12 KiB
Markdown
408 lines
12 KiB
Markdown
# HR Portal Phase 1.2 完成報告
|
|
|
|
**階段**: Phase 1.2 - 後端專案架構 (FastAPI 專案初始化)
|
|
**完成日期**: 2026-02-15
|
|
**狀態**: ✅ 完成
|
|
|
|
---
|
|
|
|
## 📋 執行摘要
|
|
|
|
成功完成 HR Portal 後端架構的建置,新增了郵件帳號管理和系統權限管理兩大核心功能模組。所有 API 端點都遵循 RESTful 設計原則,支援多租戶架構,並整合了審計日誌功能。
|
|
|
|
---
|
|
|
|
## ✅ 完成項目
|
|
|
|
### 1. Pydantic Schemas 建立 (資料驗證層)
|
|
|
|
#### 郵件帳號 Schemas
|
|
**檔案**: [`app/schemas/email_account.py`](backend/app/schemas/email_account.py)
|
|
|
|
| Schema 類別 | 用途 | 關鍵欄位 |
|
|
|------------|------|---------|
|
|
| `EmailAccountBase` | 基礎資料 | email_address, quota_mb, forward_to, auto_reply, is_active |
|
|
| `EmailAccountCreate` | 創建請求 | 繼承 Base + employee_id |
|
|
| `EmailAccountUpdate` | 更新請求 | 所有欄位可選,支援清空轉寄/自動回覆 |
|
|
| `EmailAccountInDB` | 資料庫模型 | 繼承 Base + id, tenant_id, employee_id, timestamps |
|
|
| `EmailAccountResponse` | API 回應 | 繼承 InDB + employee_name, employee_number |
|
|
| `EmailAccountListItem` | 列表項目 | 簡化版,用於列表顯示 |
|
|
| `EmailAccountQuotaUpdate` | 配額更新 | 單一 quota_mb 欄位 |
|
|
|
|
**特色功能**:
|
|
- Email 格式驗證 (EmailStr)
|
|
- 配額範圍驗證 (1024-102400 MB / 1GB-100GB)
|
|
- 支援清空轉寄地址和自動回覆 (空字串轉 None)
|
|
|
|
#### 系統權限 Schemas
|
|
**檔案**: [`app/schemas/permission.py`](backend/app/schemas/permission.py)
|
|
|
|
| Schema 類別 | 用途 | 關鍵欄位 |
|
|
|------------|------|---------|
|
|
| `PermissionBase` | 基礎資料 | system_name, access_level |
|
|
| `PermissionCreate` | 創建請求 | 繼承 Base + employee_id, granted_by |
|
|
| `PermissionUpdate` | 更新請求 | access_level, granted_by |
|
|
| `PermissionInDB` | 資料庫模型 | 繼承 Base + id, tenant_id, employee_id, granted_at |
|
|
| `PermissionResponse` | API 回應 | 繼承 InDB + employee_name, employee_number, granted_by_name |
|
|
| `PermissionListItem` | 列表項目 | 簡化版,用於列表顯示 |
|
|
| `PermissionBatchCreate` | 批量創建 | employee_id + permissions 陣列 |
|
|
| `PermissionFilter` | 篩選條件 | employee_id, system_name, access_level |
|
|
|
|
**常數定義**:
|
|
```python
|
|
VALID_SYSTEMS = ["gitea", "portainer", "traefik", "keycloak"]
|
|
VALID_ACCESS_LEVELS = ["admin", "user", "readonly"]
|
|
```
|
|
|
|
**驗證功能**:
|
|
- 系統名稱驗證 (必須在 VALID_SYSTEMS 中)
|
|
- 存取層級驗證 (必須在 VALID_ACCESS_LEVELS 中)
|
|
- 自動轉小寫
|
|
|
|
### 2. RESTful API Endpoints 實作
|
|
|
|
#### 郵件帳號管理 API
|
|
**檔案**: [`app/api/v1/email_accounts.py`](backend/app/api/v1/email_accounts.py)
|
|
**前綴**: `/api/v1/email-accounts`
|
|
|
|
| 端點 | 方法 | 功能 | 查詢參數 |
|
|
|-----|------|------|---------|
|
|
| `/` | GET | 獲取郵件帳號列表 | employee_id, is_active, search, page, page_size |
|
|
| `/{id}` | GET | 獲取郵件帳號詳情 | - |
|
|
| `/` | POST | 創建郵件帳號 | - |
|
|
| `/{id}` | PUT | 更新郵件帳號 | - |
|
|
| `/{id}/quota` | PATCH | 更新郵件配額 | - |
|
|
| `/{id}` | DELETE | 停用郵件帳號 | - |
|
|
| `/employees/{employee_id}/email-accounts` | GET | 獲取員工的所有郵件帳號 | - |
|
|
|
|
**業務邏輯**:
|
|
- 創建時檢查郵件地址唯一性
|
|
- 創建時檢查員工是否存在
|
|
- 刪除採用軟刪除 (設為 is_active=False)
|
|
- 支援郵件地址搜尋 (ILIKE)
|
|
- 自動記錄審計日誌
|
|
|
|
#### 系統權限管理 API
|
|
**檔案**: [`app/api/v1/permissions.py`](backend/app/api/v1/permissions.py)
|
|
**前綴**: `/api/v1/permissions`
|
|
|
|
| 端點 | 方法 | 功能 | 查詢參數 |
|
|
|-----|------|------|---------|
|
|
| `/` | GET | 獲取權限列表 | employee_id, system_name, access_level, page, page_size |
|
|
| `/{id}` | GET | 獲取權限詳情 | - |
|
|
| `/` | POST | 創建權限 | - |
|
|
| `/{id}` | PUT | 更新權限 | - |
|
|
| `/{id}` | DELETE | 刪除權限 | - |
|
|
| `/employees/{employee_id}/permissions` | GET | 獲取員工的所有系統權限 | - |
|
|
| `/batch` | POST | 批量創建權限 | - |
|
|
| `/systems` | GET | 獲取可授權的系統列表 | - |
|
|
|
|
**業務邏輯**:
|
|
- 創建時檢查員工和授予人是否存在
|
|
- 創建時檢查 (employee_id, system_name) 唯一性
|
|
- 批量創建時跳過已存在的權限
|
|
- 刪除採用硬刪除
|
|
- 自動記錄審計日誌
|
|
- 提供系統列表和權限層級說明
|
|
|
|
### 3. 路由註冊
|
|
|
|
**檔案**: [`app/api/v1/router.py`](backend/app/api/v1/router.py)
|
|
|
|
```python
|
|
# 郵件帳號管理
|
|
api_router.include_router(
|
|
email_accounts.router,
|
|
prefix="/email-accounts",
|
|
tags=["Email Accounts"]
|
|
)
|
|
|
|
# 系統權限管理
|
|
api_router.include_router(
|
|
permissions.router,
|
|
prefix="/permissions",
|
|
tags=["Permissions"]
|
|
)
|
|
```
|
|
|
|
### 4. Schema 模組更新
|
|
|
|
**檔案**: [`app/schemas/__init__.py`](backend/app/schemas/__init__.py)
|
|
|
|
新增以下匯出:
|
|
- EmailAccount 相關 Schemas (7 個類別)
|
|
- Permission 相關 Schemas (8 個類別 + 2 個常數)
|
|
|
|
---
|
|
|
|
## 🏗️ 架構特色
|
|
|
|
### 多租戶支援
|
|
- 所有 API 都透過 `get_current_tenant_id()` 進行租戶隔離
|
|
- 目前暫時返回固定值 (tenant_id=1)
|
|
- 未來將從 JWT token 中提取租戶 ID
|
|
|
|
### 審計日誌整合
|
|
所有 CUD 操作都自動記錄審計日誌:
|
|
```python
|
|
audit_service.log_action(
|
|
request=request,
|
|
db=db,
|
|
action="create_email_account",
|
|
resource_type="email_account",
|
|
resource_id=account.id,
|
|
details={...}
|
|
)
|
|
```
|
|
|
|
### 資料驗證
|
|
- Pydantic 自動驗證請求資料
|
|
- 自訂驗證器 (field_validator)
|
|
- 資料庫約束檢查 (唯一性、外鍵)
|
|
|
|
### 關聯資料載入
|
|
- 使用 SQLAlchemy `joinedload` 優化查詢
|
|
- 避免 N+1 查詢問題
|
|
- 回應中包含關聯員工資訊
|
|
|
|
### 錯誤處理
|
|
- 404: 資源不存在
|
|
- 400: 驗證失敗或違反約束
|
|
- 詳細的錯誤訊息 (英文)
|
|
|
|
---
|
|
|
|
## 📊 統計數據
|
|
|
|
### 新增程式碼
|
|
- **新增檔案**: 3 個
|
|
- `app/schemas/email_account.py` (~130 行)
|
|
- `app/schemas/permission.py` (~160 行)
|
|
- `app/api/v1/permissions.py` (~490 行)
|
|
- **重寫檔案**: 1 個
|
|
- `app/api/v1/email_accounts.py` (~426 行)
|
|
- **更新檔案**: 2 個
|
|
- `app/schemas/__init__.py` (+24 行)
|
|
- `app/api/v1/router.py` (+8 行)
|
|
|
|
### API 端點統計
|
|
- **郵件帳號管理**: 7 個端點
|
|
- **系統權限管理**: 8 個端點
|
|
- **總計新增**: 15 個端點
|
|
|
|
### 資料模型
|
|
- **Pydantic Schemas**: 15 個類別
|
|
- **常數定義**: 2 個
|
|
- **支援的系統**: 4 個 (Gitea, Portainer, Traefik, Keycloak)
|
|
- **權限層級**: 3 個 (admin, user, readonly)
|
|
|
|
---
|
|
|
|
## 🔧 技術棧
|
|
|
|
### 核心框架
|
|
- **FastAPI** 0.109.0 - Web 框架
|
|
- **Pydantic** 2.5.3 - 資料驗證
|
|
- **SQLAlchemy** 2.0.25 - ORM
|
|
|
|
### 資料驗證
|
|
- **email-validator** 2.1.0 - Email 格式驗證
|
|
- **dnspython** - Email 驗證依賴
|
|
|
|
### 資料庫
|
|
- **PostgreSQL** 16
|
|
- **psycopg2-binary** 2.9.9 - PostgreSQL 驅動
|
|
|
|
---
|
|
|
|
## 📝 文件產出
|
|
|
|
### 1. API 端點清單
|
|
**檔案**: [`API_ENDPOINTS.md`](backend/API_ENDPOINTS.md)
|
|
|
|
完整的 API 端點參考文件,包含:
|
|
- 所有端點的 URL 和 HTTP 方法
|
|
- 查詢參數說明
|
|
- 回應格式範例
|
|
- HTTP 狀態碼說明
|
|
|
|
### 2. 測試腳本
|
|
**檔案**: [`test_api_imports.py`](backend/test_api_imports.py)
|
|
|
|
用於驗證模組導入的測試腳本:
|
|
- 測試 Schemas 導入
|
|
- 測試 Models 導入
|
|
- 測試 API Routers 導入
|
|
- 測試主應用導入
|
|
|
|
---
|
|
|
|
## ✨ 關鍵功能亮點
|
|
|
|
### 1. 郵件配額管理
|
|
```python
|
|
class EmailAccountQuotaUpdate(BaseSchema):
|
|
quota_mb: int = Field(..., ge=1024, le=102400)
|
|
```
|
|
- 配額範圍: 1GB - 100GB
|
|
- 獨立的配額更新端點 (PATCH)
|
|
- 自動記錄配額變更歷史
|
|
|
|
### 2. 批量權限授予
|
|
```python
|
|
@router.post("/batch")
|
|
def create_permissions_batch(
|
|
batch_data: PermissionBatchCreate, ...
|
|
):
|
|
```
|
|
- 一次為員工授予多個系統權限
|
|
- 自動跳過已存在的權限
|
|
- 減少 API 呼叫次數
|
|
|
|
### 3. 軟刪除機制
|
|
郵件帳號採用軟刪除 (is_active=False),避免資料遺失:
|
|
```python
|
|
account.is_active = False
|
|
db.commit()
|
|
```
|
|
|
|
### 4. 驗證器鏈
|
|
```python
|
|
@field_validator('system_name')
|
|
@classmethod
|
|
def validate_system_name(cls, v):
|
|
if v.lower() not in VALID_SYSTEMS:
|
|
raise ValueError(...)
|
|
return v.lower()
|
|
```
|
|
|
|
---
|
|
|
|
## 🧪 測試建議
|
|
|
|
### 單元測試
|
|
- [ ] Pydantic Schema 驗證測試
|
|
- [ ] Field validator 測試
|
|
- [ ] 資料轉換測試
|
|
|
|
### 整合測試
|
|
- [ ] API 端點測試 (CRUD)
|
|
- [ ] 多租戶隔離測試
|
|
- [ ] 審計日誌記錄測試
|
|
- [ ] 錯誤處理測試
|
|
|
|
### 性能測試
|
|
- [ ] 分頁查詢效能
|
|
- [ ] joinedload 優化驗證
|
|
- [ ] 批量操作效能
|
|
|
|
---
|
|
|
|
## 🔄 與前端整合
|
|
|
|
### API 客戶端設定
|
|
前端需要配置以下 API 端點:
|
|
|
|
```typescript
|
|
// Email Accounts API
|
|
const emailAccountsAPI = {
|
|
list: '/api/v1/email-accounts',
|
|
get: (id) => `/api/v1/email-accounts/${id}`,
|
|
create: '/api/v1/email-accounts',
|
|
update: (id) => `/api/v1/email-accounts/${id}`,
|
|
updateQuota: (id) => `/api/v1/email-accounts/${id}/quota`,
|
|
delete: (id) => `/api/v1/email-accounts/${id}`,
|
|
getByEmployee: (employeeId) =>
|
|
`/api/v1/email-accounts/employees/${employeeId}/email-accounts`,
|
|
}
|
|
|
|
// Permissions API
|
|
const permissionsAPI = {
|
|
list: '/api/v1/permissions',
|
|
get: (id) => `/api/v1/permissions/${id}`,
|
|
create: '/api/v1/permissions',
|
|
update: (id) => `/api/v1/permissions/${id}`,
|
|
delete: (id) => `/api/v1/permissions/${id}`,
|
|
getByEmployee: (employeeId) =>
|
|
`/api/v1/permissions/employees/${employeeId}/permissions`,
|
|
batchCreate: '/api/v1/permissions/batch',
|
|
getSystems: '/api/v1/permissions/systems',
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## 📚 下一步 (Phase 1.3)
|
|
|
|
### 前端專案架構建立
|
|
- [ ] React + TypeScript 專案初始化
|
|
- [ ] Tailwind CSS 設定
|
|
- [ ] 路由配置 (React Router)
|
|
- [ ] 狀態管理 (Zustand / Redux Toolkit)
|
|
- [ ] API 客戶端設定 (Axios / React Query)
|
|
- [ ] 表單驗證 (React Hook Form + Zod)
|
|
- [ ] UI 元件庫整合
|
|
|
|
### 元件開發優先順序
|
|
1. 員工列表頁面
|
|
2. 員工詳情頁面
|
|
3. 郵件帳號管理元件
|
|
4. 系統權限管理元件
|
|
5. 表單元件 (員工、郵件、權限)
|
|
|
|
---
|
|
|
|
## 💡 經驗總結
|
|
|
|
### 做得好的地方
|
|
✅ **一致的程式碼風格**: 遵循現有專案規範
|
|
✅ **完整的型別提示**: 所有函數都有完整的 type hints
|
|
✅ **詳細的文件註解**: 每個端點都有清楚的 docstring
|
|
✅ **審計日誌整合**: 所有變更都有記錄
|
|
✅ **多租戶架構**: 為未來擴展做好準備
|
|
|
|
### 遇到的挑戰
|
|
⚠️ **循環導入問題**: Models 之間的相互引用導致導入錯誤
|
|
⚠️ **網路磁碟延遲**: 檔案操作因網路延遲而緩慢
|
|
⚠️ **Unicode 編碼**: Windows console 對 Unicode 字元支援不佳
|
|
|
|
### 解決方案
|
|
✅ 使用延遲初始化避免循環導入
|
|
✅ 使用背景任務處理長時間操作
|
|
✅ 避免在輸出中使用 Unicode 特殊字元
|
|
|
|
---
|
|
|
|
## 📋 檢查清單
|
|
|
|
- [x] Pydantic Schemas 建立完成
|
|
- [x] API Endpoints 實作完成
|
|
- [x] 路由註冊完成
|
|
- [x] 審計日誌整合
|
|
- [x] 多租戶支援
|
|
- [x] 資料驗證
|
|
- [x] 錯誤處理
|
|
- [x] 文件產出 (API_ENDPOINTS.md)
|
|
- [x] 測試腳本建立
|
|
- [x] 程式碼檢查 (語法)
|
|
- [ ] 單元測試 (待 Phase 2)
|
|
- [ ] 整合測試 (待 Phase 2)
|
|
- [ ] API 文件檢視 (/docs)
|
|
- [ ] 實際 API 測試 (Postman/curl)
|
|
|
|
---
|
|
|
|
## 🎯 結論
|
|
|
|
Phase 1.2 成功完成了 HR Portal 後端架構的核心功能建置。新增的郵件帳號管理和系統權限管理 API 為系統提供了完整的帳號生命週期管理能力,符合 ISO 帳號管理流程要求。
|
|
|
|
所有 API 端點都遵循 RESTful 設計原則,支援分頁、篩選、搜尋等常用功能。程式碼品質良好,具有完整的型別提示和文件註解,為後續的維護和擴展奠定了良好基礎。
|
|
|
|
**準備進入 Phase 1.3**: 前端專案架構建立
|
|
|
|
---
|
|
|
|
**報告產出日期**: 2026-02-15
|
|
**撰寫者**: Claude AI
|
|
**審核者**: (待填寫)
|