# 東毅中 Product Service - SDD ## Tech Stack - FastAPI (Python) - MySQL ## Model ### 1. Product - id: int - name: str - price: int - size: dict - key 是 str 儲存尺寸 - value 是 int 儲存該尺寸剩餘數量 - description: str - categories: str - discount: int - image_url: str ## API - prefix: `product` ### 1. Create Product 方法: `POST` URL: `/api/product/` 請求參數: * `product` (`Product`, Body): 要新增的產品資料 回應: * `200 OK`: 新增成功,返回新增產品的 id (整數型態) ```json= { "id": 1, "name": "Product Name", "price": 100, "color": "color", "size": {}, "remain_amount": 50 } ``` ### 2. Delete Product 方法: `DELETE` URL: `/api/product/{product_id}` 請求參數: * `product_id` (路徑參數): 要刪除的產品 ID 回應: * 200 OK: 刪除成功,返回 true * 404 Not Found: 若產品不存在,返回錯誤訊息 ```json= { "result": true } ``` ### 3. Update Product 方法: `PATCH` URL: `/api/product/{product_id}` 請求參數: * `product_id` (路徑參數): 要更新的產品 ID * `update_data` (`UpdateProduct`, Body): 要更新的產品資料,允許部分更新 回應: * `200 OK`: 更新成功,返回 `true` * `404 Not Found`: 若產品不存在,返回錯誤訊息 ```json= { "price": 150, "color": "blue" } ``` ### 4. Get Product 方法: `GET` URL: `/api/product/{product_id}` 請求參數: * `product_id` (路徑參數): 要查詢的產品 ID 回應: * `200 OK`: 返回產品資訊,資料型態為 `Product` * `404 Not Found`: 若產品不存在,返回錯誤訊息 ```json= { "id": 1, "name": "Product Name", "price": 100, "color": "red", "size": "M", "remain_amount": 50 } ``` ### 5. Get All Product 方法: `GET` URL: `/api/product` 請求參數: 無 回應: `200 OK`: 返回所有產品列表,資料型態為 `List[Product]` ```json= [ { "id": 1, "name": "Product Name", "price": 100, "color": "red", "size": {"S":50, "M":30}, "remain_amount": 50 }, { "id": 2, "name": "Another Product", "price": 150, "color": "blue", "size": {"S":50, "M":30, "L":20}, "remain_amount": 30 } ] ``` ### 6. Get By Category 方法: `GET` URL: `/api/product/categories/{category}` 請求參數: * `category` (路徑參數): 要查詢的商品種類 回應: `200 OK`: 返回該分類產品列表,資料型態為 `List[Product]` ```json= [ { "id": 1, "name": "string", "price": 0, "color": "string", "size": {"S":50, "M":30, "L":20}, "remain_amount": 0, "description": "string", "categories": "string", "discount": 0, "image_url": "2820a182-151c-4eb0-89e7-86127e46f7e1.jpeg" }, { "id": 2, "name": "string", "price": 0, "color": "string", "size": {"S":50, "M":30, "L":20}, "remain_amount": 0, "description": "string", "categories": "string", "discount": 0, "image_url": "ca00f852-cd6d-40bf-880b-2d67104b29b2.jpeg" } ] ``` ### 7. Get By Name 方法: `GET` URL: `/api/productname/{name}` 請求參數: * `name` (路徑參數): 要查詢的商品名稱 回應: `200 OK`: 返回該分類產品列表,資料型態為 `List[Product]` ```json= [ { "id": 10, "name": "我要全部", "price": 1000, "color": "Blue", "size": {"S":50, "M":30, "L":20}, "remain_amount": 200, "description": "Nope", "categories": "Glove", "discount": 5, "image_url": null }, { "id": 11, "name": "我要全部", "price": 1000, "color": "Blue", "size": {"S":50, "M":30, "L":20}, "remain_amount": 200, "description": "Nope", "categories": "Glove", "discount": 5, "image_url": null } ] ``` ### 8. Upload Product Image URL: `/api/product/upload_image` 方法: `PATCH` 請求參數: * `product_id` * `image file` 回應: ```jsonld! { "message" : "Image uploaded successfully", "image_url" : ["image_url"] } ``` ### 9. Get Product Image URL:`/api/product/get_image` 方法: `GET` 請求參數: * `product_id` 回應: ```jsonld! { "image_urls" : ["urls"] } ``` ### 10. Upd Stock - Description: 確認庫存夠不夠,不夠回傳 `false`,夠的話就扣掉然後回傳 `true`。 - URL: `/api/product/stock-upd` - Method: `PUT` - Body: - Request ```json { [ { "id": "demo-product-id", "spec": { "M": 2, "L": 1 } }, { "id": "demo-product-id2", "spec": { "L": 3, "XL": 1 } } ] } ``` - Response ```json { boolean // true or false } ``` ### 11. delete image - Description: 刪除該商品的所有圖片 - URL: `api/product/delete_image/{product_id}` - Method: `DELETE` - 請求參數: - `product_id` : `int` - Body: - Response ```JSON true ```