# 飲食紀錄管理 # update notes | 日期 | 說明 | | -------- | -------- | | 2020/12/11 | review Meeting 在App"健康總覽"頁面加入"脂肪" | ### 飲食紀錄目標 [ 飲食目標(DietGoals)](Untitled%2010/DietGoals.csv) # Schema example: ```json= { "height": 170, "weight": 65, "calorie": 1883, "protein": 78, "dietaryFiber": 117, "carbohydrate": 56 } ``` ### 飲食紀錄 (DietDiary) | Name | Tags | 建立時傳入 |說明 | | -------- | -------- | -------- | -------- | | id | number | N | 飲食紀錄編號 | | image | string | Y | 新增時,APP 會傳入圖片 base64 字串,後端會儲存成影像檔後,在 image 屬性裡存入飲食紀錄圖片 url | | imageType | string | Y | enum: ['jpg', 'png'] | | patientId | number | Y | 個案 ID (若不傳入 patientId,則會由 token 取得個案資料) | | time | timestamp | Y | 飲食紀錄時間 | | hhmmOfTime | number | N | time 的 hhmm 格式,比如早上 10:30, 這個值就是 1030,作為搜尋的條件之用 | | timePeriod | number |Y | 飲食紀錄時段 enum: [1: "早上", 2: "中午", 3: "晚上", 4: "睡前"] | | timePeriodType | number | Y |飲食紀錄餐別 enum: [10: "早餐", 11: "早午餐", 20: "午餐", 21: "下午茶", 30: "晚餐", 31: "點心", 40: "宵夜"] | | foodId | number | Y |飲食紀錄的的食品編號 | | timeAndTimePeriodType | timestamp | N | 作為排序之用,先依 time 排出每日的飲食紀錄,再依 timePeriodType 來排序 | | quantity | number | Y |飲食紀錄的的食品數量| | calorie | number | N |建議熱量 (需乘上 quantity,四捨五入到小數點第一位) | | protein | number | N |建議蛋白質 (需乘上 quantity,四捨五入到小數點第一位) | | dietaryFiber | number | N |建議膳食纖維 (需乘上 quantity,四捨五入到小數點第一位) | | carbohydrate | number | N |建議碳水化合|物 (需乘上 quantity,四捨五入到小數點第一位) | | fat | number | N | 脂肪 | example: ```json= { "id": 1, "image": "http://example.com/image.jpg", "time": 1585546156101, "patientId": 6, "timePeriod": 2, "timePeriodType": 21, "foodId": 12, "quantity": 2, "calorie": 500, "protein": 12.9, "dietaryFiber": 8.09, "carbohydrate": 73.0587, "fat": 30 } ``` ### 食品 [食品(Food)](Untitled%2010/Food.csv) example: ```json= { "id": 1, "name": "美而美 紅茶", "foodType": "飲料類", "unit": "ml", "calorie": 350, "quantity": 350, "fat": 30, "size": "杯" } ``` # API ## 飲食目標 ### 新增/編輯飲食目標 Request: POST /diet/goal Header: ```json= { "Authorization": "Bearer Owicare::<token>" } ``` Payload: ```json= { "height": 170, "weight": 65 } ``` Response (成功): ```json= { "success": true, "data": { "height": 170, "weight": 65, "calorie": 1883, "protein": 78, "dietaryFiber": 117, "carbohydrate": 56 } } ``` ### 取得飲食目標 Request: GET /user/$uid/diet/goal Header: ```json= { "Authorization": "Bearer Owicare::<token>" } ``` Response (成功): ```json= { "success": true, "data": { "height": 170, "weight": 65, "calorie": 1883, "protein": 78, "dietaryFiber": 117, "carbohydrate": 56, "fat": 30 } } ``` ## 飲食紀錄 ### 新增飲食紀錄 Request: POST /diet/diary/bulkAdd Header: ```json= { "Authorization": "Bearer Owicare::<token>" } ``` Payload: ```json= { "patientId": 23, // 若不傳入 patientId,則會由 token 取得個案資料 "image": 'XXXXXXXXXXXX', // base64 編碼 "imageType": 'jpg', "dietDiaryList": [ { "time": 1585546156101, "timePeriod": 1, "timePeriodType": 11, "foodId": 232, "quantity": 2 }, { "time": 1585546165445, "timePeriod": 2, "timePeriodType": 20, "foodId": 232, "quantity": 1 } ] } ``` Response (成功): * deprecated ```json= { "success": true, "data": [ DietDiary, DietDiary, ... ] } ``` * Updated for now as below ```json= { "httpCode": 200, "result": { "data": [ { "image": "diet/diary/90862aa4-d4e1-412b-aa67-3d5cb2a4e1c0.png", "imageType": "png", "householdMemberId": "123", "time": 1585546156101, "hhmmOfTime": 1126, "timePeriod": 2, "timePeriodType": 21, "foodId": 0, "foodName": "test food", "timeAndTimePeriodType": 1607961600021, "quantity": 2, "calorie": 0, "protein": 0, "dietaryFiber": 0, "carbohydrate": 0, "fat": 0, "createdAt": 1608002816917 } ] } } ``` ### 依飲食紀錄餐別整批更新 依照PayLoad陣列裡面的timePeriod來批次刪除並批次新增 Request: POST /diet/diary/bulkUpdate Header: ```json= { "Authorization": "Bearer Owicare::<token>" } ``` Payload: ```json= { "patientId": 6, // 若不傳入 patientId,則會由 token 取得個案資料 "date": "2020/02/03", "timePeriod": 1, "timePeriodType": 21, "image": 'XXXX', //base64 "imageType": 'jpg' "dietDiaryList": [ { "time": 1585546156101, "foodId": 232, "quantity": 2 }, { "time": 1585546156101, "foodId": 112, "quantity": 1 } ] } ``` Response (成功): ```json= { "success": true, "data": [ { "id": 1, "image": "http://example.com/foodimage1.jpg", "time": 1585546156101, "patientId": 6, "timePeriod": 2, "timePeriodType": 21, "foodId": 232, "quantity": 2 }, { "id": 2, "image": "http://example.com/foodimage2.jpg", "time": 1585546156101, "patientId": 6, "timePeriod": 2, "timePeriodType": 21, "foodId": 112, "quantity": 1 } ] } ``` ### 編輯飲食紀錄 Request: PUT /diet/diary/:id Header: ```json= { "Authorization": "Bearer Owicare::<token>" } ``` Payload: ```json= { "image": "http://example.com/image.jpg", "time": "1585546156101", "patientId": 6, "timePeriod": "2", "timePeriodType": "21 ", "foodId": 12, "quantity": 2 } ``` Response (成功): ```json= { "success": true, "data": { "id": 1, "image": "http://example.com/image.jpg", "time": "1585546156101", "patientId": 6, "timePeriod": "2", "timePeriodType": "21 ", "foodId": 12, "quantity": 2 } } ``` ### 查詢飲食紀錄 Request: GET /diet/diary/$id Header: ```json= { "Authorization": "Bearer Owicare::<token>" } ``` Response (成功): ```json= { "success": true, "data": { DietDiary } } ``` ### 查詢飲食紀錄列表 Request: GET /diet/diary?$queryParams (WEB/APP 共用) [Query Params:] | 欄位 | 型態 | 預設 | 說明 | | -------- | -------- | -------- |-------- | | page | number | 1 | 當前頁數 | | pageSize | number | -1 | 每頁結果數量,-1 為顯示所有 | | sort | string | 無 | 排序欄位,"timeAndTimePeriodType":這個可以先依 time 排出每日的飲食紀錄,再依 timePeriodType 來排序 | | desc | boolean | false | 是否倒序排列 ? | | startedAt | timestamp | 無 | 要搜尋的日期區間 | | endAt | timestamp | 無 | 要搜尋的日期區間| | patientId | number | 無 | 要搜尋的 patient id,若沒有傳入 patient id,就以改由 token 取得個案資料 | Header: ```json= { "Authorization": "Bearer Owicare::<token>" } ``` Response (成功): ```json= { "success": true, "total": 2, "data": [ { id:2, time: 1587447592675, patientId: 6, image: "/images/foodimage1.jpg", timePeriod: 1, timePeriodType: 20, quantity: 2, foodName: '土司', calorie: 283, protein: 9.5, dietaryFiber: 3, carbohydrate: 48.6, fat: 30 }, { id:3, time: 1587447592675, patientId: 6, image: "/images/foodimage2.jpg", timePeriod: 1, timePeriodType: 20, quantity: 1, foodName: '豆漿', calorie: 283, protein: 9.5, dietaryFiber: 3, carbohydrate: 48.6, fat: 33 } ] } ``` ### 查詢特定時段的飲食紀錄列表 Request: GET /diet/Diary/timeframe?$queryParams [Query Params:] | 欄位 | 型態 | 預設 | 說明 | | -------- | -------- | -------- |-------- | | page | number | 1 | 當前頁數 | | pageSize | number | -1 | 每頁結果數量,-1 為顯示所有 | | sort | string | 無 | 排序欄位| | desc | boolean | false | 是否倒序排列 ? | | patientId | number | 無 | 要搜尋的 patient id | | startDate | string | 無 | 要搜尋的日期區間,範例:"2020/02/19"| | endDate | string | 無 | 要搜尋的日期區間,範例:"2020/02/19"| | startTime | string | 無 | 要搜尋的時間區間,範例:"12:02"| | endTime | string | 無 | 要搜尋的時間區間,範例:"12:02"| | timePeriod | number | -1 | 飲食紀錄時段 enum: [-1: 全部, 1: "早上", 2: "中午", 3: "晚上", 4: "睡前"] | | timePeriodType | number | -1 | 飲食紀錄餐別 enum: [-1: 全部, 10: "早餐", 11: "早午餐", 20: "午餐", 21: "下午茶", 30: "晚餐", 31: "點心", 40: "宵夜"] | Header: ```json= { "Authorization": "Bearer Owicare::<token>" } ``` Response (成功): ```json= { "success": true, "total": 2, "data": [ { id:2, time: 1587447592675, patientId: 6, image: "/images/foodimage1.jpg", timePeriod: 1, timePeriodType: 20, quantity: 2, foodName: '土司', calorie: 283, protein: 9.5, dietaryFiber: 3, carbohydrate: 48.6, fat: 28 }, { id:3, time: 1587447592675, patientId: 6, image: "/images/foodimage2.jpg", timePeriod: 1, timePeriodType: 20, quantity: 1, foodName: '豆漿', calorie: 182, protein: 19.6, dietaryFiber: 6, carbohydrate: 20.6, fat: 21 } ] } ``` ### 刪除飲食紀錄 Request: DELETE /diet/diary/$id Header: ```json= { "Authorization": "Bearer Owicare::<token>" } ``` Response (成功): ```json= { "success": true, "data": {} } ``` ## 食品 ### 新增食品 Request: POST /diet/food Header: ```json= { "Authorization": "Bearer Owicare::<token>" } ``` Payload: ```json= { Food } ``` Response (成功): ```json= { "success": true, "data": { Food } } ``` ### 編輯食品 Request: PUT /diet/food/$id Header: ```json= { "Authorization": "Bearer Owicare::<token>" } ``` Payload: ```json= { Food } ``` Response (成功): ```json= { "success": true, "data": { Food } } ``` ### 查詢食品列表 Request: GET /diet/food Header: ```json= { "Authorization": "Bearer Owicare::<token>" } ``` Response (成功): ```json= { "success": true, "total": 5, "data": [ Food, Food, ... ] } ``` ### 查詢食品 Request: GET /diet/food/$id Header: ```json= { "Authorization": "Bearer Owicare::<token>" } ``` Response (成功): ```json= { "success": true, "data": { Food } } ``` ### 刪除食品 Request: DELETE /diet/food/$id Header: ```json= { "Authorization": "Bearer Owicare::<token>" } ``` Response (成功): ```json= { "success": true, "data": {} } ```