# 東毅中 Order Service - SDD Order Service 用於管理訂單,包含創建訂單、更新訂單狀態 (已完成、運送中等) 等。並在創建訂單成功後發送 Email 給客戶。 ## A. 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 | API Design | 12/14 | Ateto | | 2.0 | Upd product model | 12/18 | Ateto | | 2.1 | Upd `order-01` | 12/19 | Ateto | | 2.2 | Upd `order-03` | 12/21 | Ateto | | 2.3 | Upd `order-04` | 12/25 | Ateto | ## B. Tech Stack - Spring Boot (Java) - MySQL - Redis (Good to Have) - Kafka (Good to Have) ## C. Architecture - Clean Architecture ### Product Structure ``` - .github/workflows/main.yml - src/main - java/serv.dongyi.order - domain/ - Order.java - Product.java - repository/ - OrderRepository.java - useCases/ - OrderUseCase.java - controller/ - OrderController.java - OrderServiceApplication.java - resources - application.properties ``` ## D. Model ### 1. Product Model - ID: string - Product ID - Spec: map - key: size (string) - value: quantity (int) ### 2. Order Model - ID: string - UUID - Owner: string - User ID (email) - Content: []Product - List of product model - Status: string - Enumeration: Created, Pending, Delivery, Completed, Rejected, Failed - Progess: []string - 用空格隔開進度狀態和時間戳 e.g.`pending 2024-11-24T11:09:06.544936+08:00` - CreateAt: string ## E. API - URI Prefix: `order/api/` ### 1. CreateOrder - ID: `order-01` - Description: 使用 Owner ID 和 Product ID List 創建 Order - Workflow: - check if stock is sufficient from product service - create order - (not complete) remove cart item from cart service - sent an email with order info to customer - Method: `POST` - URI: `/order-create` - Status Code: - `200`: OK - `404`: Not Found - Owner 不存在 - Body :::spoiler Request ```json { "owner": "demo@gmail.com", "content": [ { "id": "p1", "price": 299, "spec": { "M": 2 } }, { "id": "p2", "price": 249, "spec": { "L": 1 } }, { "id": "p3", "price": 399, "spec": { "XL": 1, "XXL": 2 } } ] } ``` ::: :::spoiler Reponse ```json { "id":"demo-order-id", "owner": "demo@gmail.com", "content": [ { "id": "p1", "price": 299, "spec": { "M": 2 } }, { "id": "p2", "price": 249, "spec": { "L": 1 } }, { "id": "p3", "price": 399, "spec": { "XL": 1, "XXL": 2 } } ], "status": "delivery", progess": [ "created 2024-11-24T11:09:06.544936+08:00", ], "create_at": "2024-11-24T11:09:06.544936+08:00" } ``` ::: ### 2. GetOrder - ID: `order-02` - Description: 使用 Order ID 來取得 Order Info,並使用 Owner ID 驗證身份,Owner ID 可以是客戶或管理員 ID。 - Method: `POST` - URI: `/order-get` - State Code: - `200`: OK - `401`: Unauthorized - Owner 未授權 - `404`: Not Found - Order 或 Owner 不存在 - Body :::spoiler Request ```json { "id":"demo-order-id", "owner":"demo@gmail.com" } ``` ::: :::spoiler Response ```json { "id":"demo-order-id", "owner": "demo@gmail.com", "content": [ { "id": "p1", "price": 299, "spec": { "M": 2 } }, { "id": "p2", "price": 249, "spec": { "L": 1 } }, { "id": "p3", "price": 399, "spec": { "XL": 1, "XXL": 2 } } ], "status": "delivery", "progess": [ "created 2024-11-24T11:09:06.544936+08:00", "pending 2024-11-24T11:09:06.544936+08:00", "delivery 2024-11-24T11:09:06.544936+08:00" ], "create_at": "2024-11-24T11:09:06.544936+08:00" } ``` ::: ### 3. UpdOrderStatus (not completed) - ID: `order-03` - Description: 更新 Order Status。 - Method: `PATCH` - URI: `/status-upd` - Status Code - `200`: OK - `400`: Bad Request - `404`: Not Found - `500`: Internal Error - Body :::spoiler Request ```json { "id": "demo-order-id", "admin": "demo-user-id", "status": "expected-upd-status" } ``` ::: :::spoiler Response ```json { "status": "expected-upd-status", "progess": [ "created 2024-11-24T11:09:06.544936+08:00", "pending 2024-11-24T11:09:06.544936+08:00", "delivery 2024-11-24T11:09:06.544936+08:00", "expected-upd-status demo-local-date-time" // 用空白格開 ] } ``` ::: ### 4. GetAllOrders - ID: `order-04` - Description: 取得所有訂單 ID,只有管理員可以存取。 - Method: `POST` - URI: `/orders-get` ( `order-02` 的 routes 是 `/order-get` 沒有 s ) - Status Code - `200`: OK - `400`: Bad Request - `404`: Not Found - `500`: Internal Error - Body :::spoiler Request ```json { "id": "demo-order-id" } ``` ::: :::spoiler Response ```json { [ "demo-order-01", "demo-order-02", "demo-order-03" ] } ``` ::: ## F. Test Cases ### 1. Create Order ### 2. Get Order ### 3. Order Not Found ### 4. Order Unauthorized