From 27a1b90359252bd649312cabe0a4594b90e926e7 Mon Sep 17 00:00:00 2001 From: Shengquan Ni Date: Thu, 14 Mar 2019 00:24:31 -0700 Subject: [PATCH] make information panel great again! --- BalancedBite/android/.project | 17 ++ .../org.eclipse.buildship.core.prefs | 2 + BalancedBite/android/app/.classpath | 6 + BalancedBite/android/app/.project | 23 +++ .../org.eclipse.buildship.core.prefs | 2 + new-gui/.expo/packager-info.json | 12 +- new-gui/.expo/settings.json | 2 +- new-gui/src/commons/serverRequest/index.js | 3 +- .../components/UserInformationPanel/index.js | 169 +++++++++++++----- .../src/components/UserSignupPanel/index.js | 2 +- new-gui/src/images/person.png | Bin 0 -> 9280 bytes .../ics/balancedbite/web/api/UserInfo.java | 20 +-- .../web/api/UserInformationRequest.java | 11 -- .../web/resources/CheckSessionResource.java | 3 - .../web/resources/SignUpResource.java | 3 +- .../web/resources/UserDataResource.java | 57 ++++-- 16 files changed, 244 insertions(+), 88 deletions(-) create mode 100644 BalancedBite/android/.project create mode 100644 BalancedBite/android/.settings/org.eclipse.buildship.core.prefs create mode 100644 BalancedBite/android/app/.classpath create mode 100644 BalancedBite/android/app/.project create mode 100644 BalancedBite/android/app/.settings/org.eclipse.buildship.core.prefs create mode 100644 new-gui/src/images/person.png diff --git a/BalancedBite/android/.project b/BalancedBite/android/.project new file mode 100644 index 0000000..b23c840 --- /dev/null +++ b/BalancedBite/android/.project @@ -0,0 +1,17 @@ + + + BalancedBite + Project android created by Buildship. + + + + + org.eclipse.buildship.core.gradleprojectbuilder + + + + + + org.eclipse.buildship.core.gradleprojectnature + + diff --git a/BalancedBite/android/.settings/org.eclipse.buildship.core.prefs b/BalancedBite/android/.settings/org.eclipse.buildship.core.prefs new file mode 100644 index 0000000..e889521 --- /dev/null +++ b/BalancedBite/android/.settings/org.eclipse.buildship.core.prefs @@ -0,0 +1,2 @@ +connection.project.dir= +eclipse.preferences.version=1 diff --git a/BalancedBite/android/app/.classpath b/BalancedBite/android/app/.classpath new file mode 100644 index 0000000..eb19361 --- /dev/null +++ b/BalancedBite/android/app/.classpath @@ -0,0 +1,6 @@ + + + + + + diff --git a/BalancedBite/android/app/.project b/BalancedBite/android/app/.project new file mode 100644 index 0000000..ac485d7 --- /dev/null +++ b/BalancedBite/android/app/.project @@ -0,0 +1,23 @@ + + + app + Project app created by Buildship. + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.buildship.core.gradleprojectbuilder + + + + + + org.eclipse.jdt.core.javanature + org.eclipse.buildship.core.gradleprojectnature + + diff --git a/BalancedBite/android/app/.settings/org.eclipse.buildship.core.prefs b/BalancedBite/android/app/.settings/org.eclipse.buildship.core.prefs new file mode 100644 index 0000000..b1886ad --- /dev/null +++ b/BalancedBite/android/app/.settings/org.eclipse.buildship.core.prefs @@ -0,0 +1,2 @@ +connection.project.dir=.. +eclipse.preferences.version=1 diff --git a/new-gui/.expo/packager-info.json b/new-gui/.expo/packager-info.json index ba74420..e63e1f9 100755 --- a/new-gui/.expo/packager-info.json +++ b/new-gui/.expo/packager-info.json @@ -1,10 +1,10 @@ { - "expoServerNgrokUrl": "https://rp-cnx.anonymous.new-gui.exp.direct", - "packagerNgrokUrl": "https://packager.rp-cnx.anonymous.new-gui.exp.direct", - "ngrokPid": 19628, - "packagerPort": 19001, - "packagerPid": 8452, + "expoServerNgrokUrl": null, + "packagerNgrokUrl": null, + "ngrokPid": null, + "packagerPort": null, + "packagerPid": null, "devToolsPort": 19002, - "expoServerPort": 19000, + "expoServerPort": null, "webpackServerPort": null } \ No newline at end of file diff --git a/new-gui/.expo/settings.json b/new-gui/.expo/settings.json index ad63e25..de4f26b 100755 --- a/new-gui/.expo/settings.json +++ b/new-gui/.expo/settings.json @@ -3,5 +3,5 @@ "lanType": "ip", "dev": true, "minify": false, - "urlRandomness": "rp-cnx" + "urlRandomness": "c8-ats" } \ No newline at end of file diff --git a/new-gui/src/commons/serverRequest/index.js b/new-gui/src/commons/serverRequest/index.js index 6febc7d..c1e2222 100755 --- a/new-gui/src/commons/serverRequest/index.js +++ b/new-gui/src/commons/serverRequest/index.js @@ -1,2 +1,3 @@ -const HOST = "52.39.77.219"; +//const HOST = "52.39.77.219"; +const HOST = "174.77.40.238"; export const SERVER_URL = "http://" + HOST + ":8080"; \ No newline at end of file diff --git a/new-gui/src/components/UserInformationPanel/index.js b/new-gui/src/components/UserInformationPanel/index.js index 47e2313..52d28a7 100755 --- a/new-gui/src/components/UserInformationPanel/index.js +++ b/new-gui/src/components/UserInformationPanel/index.js @@ -1,11 +1,12 @@ import { mapDispatchToProps, mapStateToProps } from "../../commons/redux"; import React, { Component } from "react"; -import { Platform,StatusBar,View,SafeAreaView, Text, Button, SectionList, StyleSheet, TouchableHighlight,Image,TextInput,Dimensions,ImageBackground } from "react-native"; +import { Platform,StatusBar,View,SafeAreaView, Text,Alert, Button, SectionList, StyleSheet, TouchableHighlight,Image,TextInput,Dimensions,ImageBackground } from "react-native"; import { connect } from "react-redux"; import { withNavigation } from "react-navigation"; import { Ionicons } from '@expo/vector-icons'; import { SERVER_URL } from "../../commons/serverRequest"; - +import Expo from "expo"; +import { Pedometer } from "expo"; import Svg from 'react-native-svg'; import { CheckBox,Input } from "react-native-elements"; @@ -22,33 +23,55 @@ class EditableLabel extends Component{ renderInput() { - if(typeof this.state.myText === "string" || typeof this.state.myText === "number") + if(this.props.type === "number" || this.props.type === "string") { return ( this._input = component} textAlign="right" + keyboardType={this.props.type==="number"?"numeric":"default"} style={styles.infoText} onChangeText={(text) =>{this.setState({myText:text})}} editable = {this.state.editable} multiline = {false} - onEndEditing={()=>{this.setState({editable:false}); this.props.receiver(this.props.fieldName,this.state.myText);}} - value={this.state.myText.toString()} + onEndEditing={()=>{ + this.setState({editable:false}); + if(this.props.checker==null || this.props.checker(this.state.myText)) + this.props.receiver(this.props.fieldName,this.props.type==="number"?parseInt(this.state.myText):this.state.myText); + else{ + this.state.myText=this.props.value; + Alert.alert("Error", this.props.errorMessage, [{ + text: "Okay" + }]); + } + }} + value={this.state.myText} />); } - else if(typeof this.state.myText === "boolean") + else if(this.props.type === "boolean") { return ( this._input = component} right={true} iconRight - onPress={() => this.setState({myText: !this.state.myText,editable:false})} + onPress={()=>{ + const val=!this.state.myText; + this.setState({editable:false,myText:!this.state.myText}); + if(this.props.checker==null || this.props.checker(val)) + this.props.receiver(this.props.fieldName,val); + else{ + this.state.myText=this.props.value; + Alert.alert("Error", this.props.errorMessage, [{ + text: "Okay" + }]); + } + }} checked={this.state.myText} disabled={!this.state.editable} /> ); } - else if(Array.isArray(this.state.myText)) + else if(this.props.type === "list") { return( this._input = component} @@ -57,7 +80,17 @@ class EditableLabel extends Component{ onChangeText={(text) =>{this.setState({myText:text})}} editable = {this.state.editable} multiline = {false} - onEndEditing={()=>{this.setState({editable:false}); console.warn(this.state.myText);this.props.receiver(this.props.fieldName,this.state.myText.split(",").filter(element => element.trim().length > 0));}} + onEndEditing={()=>{ + this.setState({editable:false}); + if(this.props.checker==null || this.props.checker(this.state.myText)) + this.props.receiver(this.props.fieldName,this.state.myText.split(",").filter(element => element.trim().length > 0)); + else{ + this.state.myText=this.props.value; + Alert.alert("Error", this.props.errorMessage, [{ + text: "Okay" + }]); + } + }} value={this.state.myText} />); } @@ -85,26 +118,29 @@ class EditableLabel extends Component{ class UserInformationComponent extends Component { - - updateInformation(fieldName,fieldValue){ - fetch(UPDATE_URL, { - method : "POST", - body: JSON.stringify({token: this.props.currentToken, fieldName: fieldValue}), - headers : { - "Content-Type": "application/json" - } - }) - .then(res => res.json()) - .then(res => { - console.warn(res); - this.setState({userInfo:res},()=>{this.forceUpdate();}); - }) + + fetchStepCountThenGetInformation(){ + const now = new Date(); + const todayMidnight = new Date(); + todayMidnight.setHours(0,0,0,0); + Pedometer.getStepCountAsync(todayMidnight,now).then( + result => { + this.setState({ pastStepCount: result.steps }); + this.getInformation(result.steps); + }, + error => { + this.setState({ pastStepCount: "N/A"}); + this.getInformation(0); + } + ); } - componentDidMount(){ + + + getInformation(stepCount){ fetch(FETCH_URL, { method: "POST", - body: JSON.stringify({token: this.props.currentToken, distanceTraveled: 0.42, stepCount: 1055}), + body: JSON.stringify({token: this.props.currentToken, stepCount: stepCount}), headers : { "Content-Type" : "application/json" } @@ -123,17 +159,45 @@ class UserInformationComponent extends Component { ) } + updateInformation(fieldName,fieldValue){ + fetch(UPDATE_URL, { + method : "POST", + body: JSON.stringify({token: this.props.currentToken,fieldName:fieldName,fieldValue:fieldValue}), + headers : { + "Content-Type": "application/json" + } + }) + .then(res => res.json()) + .then(res => { + if(res.code==0){ + console.warn("Fail to update"); + }else{ + this.fetchStepCountThenGetInformation(); + } + }) + } + + componentWillMount(){ + Pedometer.isAvailableAsync(); + this.fetchStepCountThenGetInformation(); + } + + isNormalInteger(str) { + return /^\+?(0|[1-9]\d*)$/.test(str); + } + + render() { - if(this.state) + if(this.state && this.state.userInfo) return ( @@ -144,27 +208,46 @@ class UserInformationComponent extends Component { stickySectionHeadersEnabled={true} renderItem={({item, index, section}) => { if(section.title==="Health Infomation") - return ({item[0]+": "}{item[1]+" "+item[2]}); + return ( + + {item[0]+": "} + {item[1]+" "+item[2]} + + + ); else - return (this.updateInformation(k,v)}>); + return ( + this.updateInformation(k,v)}> + + + ); }} renderSectionHeader={({section: {title}}) => ( {title} )} sections={[ - {title: 'Health Infomation', data: [["BMI",this.state.userInfo.bmi.toFixed(2),""], - ["Calories Needed",4200,"Cal"], - ["Step Count",999,""], - ["Distance Traveled",1253,"m"]]}, - {title: 'User Infomation', data: [['Age',this.state.userInfo.age,'','age'], - ['Weight',this.state.userInfo.weight,'kg','weight'], - ['Height',this.state.userInfo.height,'cm','height'], - ['HealthProblems',this.state.userInfo.healthProblems.join(),"","healthProblems"], - ['DislikeFoods',this.state.userInfo.dislikeFoods.join(),"","dislikeFoods"], - ['Allergies',this.state.userInfo.allergies.join(),"","alleriges"], - ['Workout',this.state.userInfo.workoutBoolean,"","workoutBoolean"], - ['WorkoutFrequency',this.state.userInfo.workoutFrequency,"","workoutFrequency"], - ['WorkoutType',this.state.userInfo.workoutType,"","workoutType"]]}, + {title: 'Health Infomation', data: [["BMI",this.state.userInfo.bmi?this.state.userInfo.bmi.toFixed(2):0,""], + ["Calories Needed",this.state.userInfo.caloriesNeeded,"Cal(s)"], + ["Calories Taken",this.state.userInfo.caloriesTakenCurrently,"Cal(s)"], + ["Foods Eaten",this.state.userInfo.foodsEatenCurrently.join(),""], + ["Step Count",this.state.pastStepCount,""]]}, + {title: 'User Infomation', data: [['Age',this.state.userInfo.age.toString(),'','age',(x)=>this.isNormalInteger(x) && parseInt(x)<150,"Age is not valid(1-150)!","number"], + ['Weight',this.state.userInfo.weight.toString(),'kg','weight',(x)=>this.isNormalInteger(x) && parseInt(x)<1000,"Weight is not valid(1-1000)!","number"], + ['Height',this.state.userInfo.height.toString(),'cm','height',(x)=>this.isNormalInteger(x) && parseInt(x)<1000,"Height is not valid(1-1000)!","number"], + ['HealthProblems',this.state.userInfo.healthProblems.join(),"","healthProblems",null,null,"list"], + ['DislikeFoods',this.state.userInfo.dislikeFoods.join(),"","dislikeFoods",null,null,"list"], + ['Allergies',this.state.userInfo.allergies.join(),"","alleriges",null,null,"list"], + ['Workout',this.state.userInfo.workoutBoolean,"","workoutBoolean",null,null,"boolean"], + ['WorkoutFrequency',this.state.userInfo.workoutFrequency.toString(),"","workoutFrequency",(x)=>this.isNormalInteger(x) && parseInt(x)<=7,"Workout Frequency should be an integer between 0 and 7!","number"], + ['WorkoutType',this.state.userInfo.workoutType,"","workoutType",null,null,"string"]]}, ]} keyExtractor={(item, index) => item + index} /> diff --git a/new-gui/src/components/UserSignupPanel/index.js b/new-gui/src/components/UserSignupPanel/index.js index 6efd018..b2c6ad0 100755 --- a/new-gui/src/components/UserSignupPanel/index.js +++ b/new-gui/src/components/UserSignupPanel/index.js @@ -126,7 +126,7 @@ class UserSignupPanel extends Component { } ); } else { - Alert.alert("Error", "User was not added successfully", [{ + Alert.alert("Error", "User already exists", [{ text: "Okay" }]) } diff --git a/new-gui/src/images/person.png b/new-gui/src/images/person.png new file mode 100644 index 0000000000000000000000000000000000000000..1dc1a9d948aa6300ad0045c0239d6eaff9128b0a GIT binary patch literal 9280 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 dislikeFoods = new ArrayList<> (); private List healthProblems = new ArrayList<> (); private boolean workoutBoolean = false; - private Integer workoutFrequency = null; + private Integer workoutFrequency = 0; private String workoutType = "None"; @@ -183,43 +183,43 @@ public void setSexes(String sexes) { } @JsonProperty - public void getBodyFat(Integer bodyFat) { + public void setBodyFat(Integer bodyFat) { this.bodyFat = bodyFat; } @JsonProperty - public void getFoodRestriction (String foodRestriction) { + public void setFoodRestriction (String foodRestriction) { this.foodRestriction = foodRestriction; } @JsonProperty - public void getAllergies(List allergies) { + public void setAllergies(List allergies) { this.allergies = allergies; } @JsonProperty - public void getDislikeFoods(List dislikeFoods) { + public void setDislikeFoods(List dislikeFoods) { this.dislikeFoods = dislikeFoods; } @JsonProperty - public void getHealthProblems(List healthProblems) { + public void setHealthProblems(List healthProblems) { this.healthProblems = healthProblems; } @JsonProperty - public void getWorkoutBoolean(boolean workoutBoolean) { + public void setWorkoutBoolean(boolean workoutBoolean) { this.workoutBoolean = workoutBoolean; } @JsonProperty - public void getWorkoutFrequency(Integer workoutFrequency) { + public void setWorkoutFrequency(Integer workoutFrequency) { this.workoutFrequency = workoutFrequency; } @JsonProperty - public void getWorkoutType(String workoutType) { + public void setWorkoutType(String workoutType) { this.workoutType = workoutType; } diff --git a/web/balancedbite/src/main/java/edu/uci/ics/balancedbite/web/api/UserInformationRequest.java b/web/balancedbite/src/main/java/edu/uci/ics/balancedbite/web/api/UserInformationRequest.java index 93d6cee..f6661ec 100755 --- a/web/balancedbite/src/main/java/edu/uci/ics/balancedbite/web/api/UserInformationRequest.java +++ b/web/balancedbite/src/main/java/edu/uci/ics/balancedbite/web/api/UserInformationRequest.java @@ -5,7 +5,6 @@ public class UserInformationRequest { private String token; private Integer stepCount; - private Integer distanceTraveled; @JsonProperty public String getToken() { @@ -17,11 +16,6 @@ public Integer getStepCount() { return stepCount; } - @JsonProperty - public Integer getDistanceTraveled() { - return distanceTraveled; - } - // deserialize @JsonProperty @@ -34,9 +28,4 @@ public void setStepCount(Integer stepCount) { this.stepCount = stepCount; } - @JsonProperty - public void setDistanceTraveled(Integer distanceTraveled) { - this.distanceTraveled = distanceTraveled; - } - } diff --git a/web/balancedbite/src/main/java/edu/uci/ics/balancedbite/web/resources/CheckSessionResource.java b/web/balancedbite/src/main/java/edu/uci/ics/balancedbite/web/resources/CheckSessionResource.java index 06a86c8..343a40e 100755 --- a/web/balancedbite/src/main/java/edu/uci/ics/balancedbite/web/resources/CheckSessionResource.java +++ b/web/balancedbite/src/main/java/edu/uci/ics/balancedbite/web/resources/CheckSessionResource.java @@ -97,10 +97,7 @@ public JsonNode checkSessionTokenExist(String tokenInformation) throws JsonParse // update token time to current time tokenCollection.updateOne(Filters.eq("token", currToken), Updates.set("time", dateFormat.format(currentTime))); - response.put("code", 1); - - client.close(); return response; } diff --git a/web/balancedbite/src/main/java/edu/uci/ics/balancedbite/web/resources/SignUpResource.java b/web/balancedbite/src/main/java/edu/uci/ics/balancedbite/web/resources/SignUpResource.java index dab9a6c..1dfb5ab 100755 --- a/web/balancedbite/src/main/java/edu/uci/ics/balancedbite/web/resources/SignUpResource.java +++ b/web/balancedbite/src/main/java/edu/uci/ics/balancedbite/web/resources/SignUpResource.java @@ -135,7 +135,7 @@ public JsonNode signUpNewUser(String newUserMetaData) throws JsonParseException, MongoCollection collection = MongoDBRequest.getInstance().getUserInfoCollection(database); // check if the user exists in the database - UserInfo currUserInfo = collection.find(and(eq("username", username), eq("password", password))).first(); + UserInfo currUserInfo = collection.find(eq("username", username)).first(); // generate response ObjectNode response = new ObjectMapper().createObjectNode(); @@ -148,7 +148,6 @@ public JsonNode signUpNewUser(String newUserMetaData) throws JsonParseException, UserToken newToken = new UserToken(randomID, username, currentTime); MongoCollection tokenCollection = MongoDBRequest.getInstance().getUserTokenCollection(database); tokenCollection.insertOne(newToken); - response.put("code", 1); response.put("token", randomID); } else { diff --git a/web/balancedbite/src/main/java/edu/uci/ics/balancedbite/web/resources/UserDataResource.java b/web/balancedbite/src/main/java/edu/uci/ics/balancedbite/web/resources/UserDataResource.java index 3648a27..20aea65 100755 --- a/web/balancedbite/src/main/java/edu/uci/ics/balancedbite/web/resources/UserDataResource.java +++ b/web/balancedbite/src/main/java/edu/uci/ics/balancedbite/web/resources/UserDataResource.java @@ -3,7 +3,10 @@ import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Calendar; +import java.util.Map; +import java.lang.reflect.Field; +import javax.lang.model.util.ElementScanner6; import javax.ws.rs.Consumes; import javax.ws.rs.POST; import javax.ws.rs.Path; @@ -47,17 +50,17 @@ public UserDataResource(String host, int port) { * https://www.livestrong.com/article/238020-how-to-convert-pedometer-steps-to-calories/ * * @param weight weights in kg - * @param distanceWalked distance in miles * @param stepCount step count currently * @return calories burned currently */ - public static int calculateCaloriesBurned(int weight, int distanceWalked, int stepCount) { - if (distanceWalked == 0 || stepCount == 0) { + public static int calculateCaloriesBurned(int weight, int stepCount) { + if (stepCount == 0) { return 0; } double weightInlbs = weight * 2.20462; double caloriesPerMile = 0.57 * weightInlbs; - double stepsPerMile = (1 / distanceWalked) * stepCount; + // double stepsPerMile = (1 / distanceWalked) * stepCount; : cannot get expo distance travel, bad API + double stepsPerMile = 2300.0; // default double caloriesPerStep = caloriesPerMile / stepsPerMile; return (int)(caloriesPerStep * stepCount); } @@ -76,7 +79,6 @@ public JsonNode fetchUserInformation(String userRequest) throws JsonParseExcepti UserInformationRequest currentRequest = new ObjectMapper().readValue(userRequest, UserInformationRequest.class); String token = currentRequest.getToken(); -// System.out.println("token = " + token); System.out.println(new ObjectMapper().writeValueAsString(currentRequest)); MongoClient client = MongoDBRequest.getInstance().connectToMongoDB(host, port); MongoDatabase database = MongoDBRequest.getInstance().getMongoDatabase(client); @@ -102,9 +104,9 @@ public JsonNode fetchUserInformation(String userRequest) throws JsonParseExcepti client.close(); return response; } - + int caloriesBurnedCurrenlty = calculateCaloriesBurned(currentUserInfo.getWeight(), - currentRequest.getStepCount(), currentRequest.getDistanceTraveled()); + currentRequest.getStepCount()); currentUserInfo.setCaloriesNeeded(currentUserInfo.getCaloriesNeeded() + caloriesBurnedCurrenlty); ObjectNode userObject = new ObjectMapper().valueToTree(currentUserInfo); @@ -118,10 +120,45 @@ public JsonNode fetchUserInformation(String userRequest) throws JsonParseExcepti @POST @Path("/update-user") @Consumes(MediaType.APPLICATION_JSON) - public JsonNode updateUserInformation(String token) throws JsonParseException, JsonMappingException, IOException { - System.out.println("token = " + token); + public JsonNode updateUserInformation(String token) throws JsonParseException, JsonMappingException, IOException, NoSuchFieldException,IllegalAccessException { + //System.out.println("token = " + token); + Map map = new ObjectMapper().readValue(token, Map.class); + MongoClient client = MongoDBRequest.getInstance().connectToMongoDB(host, port); + MongoDatabase database = MongoDBRequest.getInstance().getMongoDatabase(client); + MongoCollection tokenCollection = MongoDBRequest.getInstance().getUserTokenCollection(database); + MongoCollection userCollection = MongoDBRequest.getInstance().getUserInfoCollection(database); + + UserToken userToken = tokenCollection.find(eq("token", map.get("token").toString())).first(); + ObjectNode response = new ObjectMapper().createObjectNode(); + if (userToken == null) { + response.put("code", 0); + client.close(); + return response; + } + String currentUser = userToken.getUsername(); + UserInfo currentUserInfo = userCollection.find(eq("username", currentUser)).first(); + if (currentUserInfo == null) { + response.put("code", 0); + client.close(); + return response; + } + String field=map.get("fieldName").toString(); + Object value=map.get("fieldValue"); + if(field=="age") + currentUserInfo.setAge((Integer)value); + else if(field=="weight") + currentUserInfo.setWeight((Integer)value); + else if(field=="height") + currentUserInfo.setHeight((Integer)value); + else if(field=="workoutFrequency") + currentUserInfo.setWorkoutFrequency((Integer)value); + double userBMI = SignUpResource.calculateBMI(currentUserInfo.getWeight(), currentUserInfo.getHeight()); + int userCaloricIntake = SignUpResource.calculateCalories(currentUserInfo.getSexes(), currentUserInfo.getWeight(), currentUserInfo.getHeight(), + currentUserInfo.getAge(), currentUserInfo.getWorkoutFrequency()); + userCollection.updateOne(Filters.eq("username", currentUser),Updates.combine(Updates.set(field,value),Updates.set("bMI",userBMI),Updates.set("caloriesNeeded",userCaloricIntake))); - return null; + response.put("code", 1); + return response; } }