# 東毅中 User Service - SDD ## Version | 版本 | 內容 | 日期 | 負責人 | | ---- | -------------- | ----- | ----- | | 1.0 | Tech Stack | 12/05 | Ateto | | 1.1 | Model Design | 12/08 | Ateto | | 1.2 | Arch Design | 12/10 | Ateto | | 1.3 | Test Cases | 12/12 | Ateto | | 1.4 | OTP Verify | 12/27 | 劉長諺 | | 1.5 | Get favorites | 12/31 | 劉長諺 | ## A. Tech Stack - FastAPI (Python) - MySQL - Redis (Good to Have) ## B. Architecture - Clean Architecture ### Product Structure ``` - .github/workflows/main.yml - api/ - __init__.py - account_controller.py - auth_controller.py - domain/ - __init__.py - account_entity.py - models.py - infrastructure/ - __init__.py - database.py - mongoDB.py - repository/ - __init__.py - account_repository.py - account_repository_impl.py - auth_repository.py - usecases/ - __init__.py - account_usecase.py - auth_usecase.py - test/ - __init__.py - test_auth.py - __init__.py - main.py - requirement.txt ``` ## C. Model ### 1. Account Model - id: string - email - name: string - user name - orders: List[str] - the list of user's order id - created_at: str - the account created time - updated_at: str - the last updated time - liked: - add products into favorites ## D. API - Gateway Prefix: `user/` ### 1. create_account - ID: `user-01` - Description: 使用 otp 驗證後創建 account - Method: `POST` - URI: `/account/account-create` - Status Code: - `200`: OK - `404`: Not Found - Owner 不存在 - Body :::spoiler Request ```json { "OTP": "demo-otp" "email": "user email" } ``` ::: :::spoiler Reponse ```json { "message": "result of create account" } ``` ::: ### 2. get_account - ID: `user-02` - Description: 使用 Order ID 來取得 Order Info,並使用 Owner ID 驗證身份。 - Method: `POST` - URI: `/account/account-get` - State Code: - `200`: OK - `401`: Unauthorized - Owner 未授權 - `404`: Not Found - Order 或 Owner 不存在 - Body :::spoiler Request ```json { "id":"user@example.com" } ``` ::: :::spoiler Response ```json { "id": "user@example.com", "name": "Demo User", "cart": null, "orders": [], "created_at": "2024-12-16 03:09:32", "updated_at": "2024-12-16 08:58:55", "liked": [] } ``` ::: ### 3. add_order - ID: `user-03` - Description: 新增 User 的 Order Info。 - Method: `PATCH` - URI: `/account/order-add` - Body :::spoiler Request ```json { "id":"user@example.com", "order":"demo-order-id" } ``` ::: :::spoiler Response ```json { "id": "user@example.com", "name": "Demo User", "cart": null, "orders": [ "demo-order-id" ], "created_at": "2024-12-16 03:09:32", "updated_at": "2024-12-16 08:58:55" } ``` ::: ### 4. auth_google - ID: `user-04` - Description: 取得 Google OAuth URL - Method: `GET` - URI: `/auth/login` - Body :::spoiler Response ```json { "auth_url": "http://example.com" } ``` ::: ### 5. auth_google_callback - ID: `user-05` - Description: 前端提供 Auth Code,後端使用 Auth Code 和 Access Token 向 OAuth Provider 請求 User Info - Method: `POST` - URI: `auth/callback` ### 6. add_liked - ID: `user-06` - Description: 提供使用者收藏功能 - Method: `PATCH` - URI: `/account/liked-update` - Body :::spoiler Request ```JSON { "id": "user mail" "liked": product id } ``` ::: :::spoiler Response ```JSON { "message": "the liked updated successfully" } ``` ::: ### 7. isAdmin - ID: `user-07` - Description: 判斷是否為管理員 - Method: `GET` - URI: `/account/isAdmin?id={admin email}` - Body: :::spoiler Response ```JSON { boolean // true or false } ``` ::: ### 8. SendOtp - ID: `user-08` - Description: 使用 email, username 生成 otp 並發送至信箱 - Method: `POST` - URI: `/account/otp-send` - Body: :::spoiler Request ```JSON { "id": "string", //user email "name": "string", } ``` ::: :::spoiler Response ```JSON { "message": "successful or failed" } ``` ::: ### 9. Get user favorites - ID: `user-09` - Description: 取得使用者收藏商品 - Method: `GET` - URI: `/account/get-favorites/{id}` - Body: :::spoiler Response ```JSON { "{user} favorites": [product id] } ``` ::: ## E. Test Cases ### 1. Create Order ### 2. Get Order ### 3. Order Not Found ### 4. Order Unauthorized