Yes Chef is an intelligent meal planning application that can ingest a link to a recipe and generate a list of ingredients and the steps to make it, along with other helpful features for meal planning and grocery shopping.
Required Must-have Stories
Optional Nice-to-have Stories
Tab Navigation (Tab to Screen)
Flow Navigation (Screen to Screen)
User
Property | Type | Description |
---|---|---|
userID | String | Generated by back4app (default field) |
Username | String | Users email address |
DisplayedName | String | Name displayed to users of the app |
Password | String | Hashed user password |
ProfilePic | File | User’s uploaded profile pic |
About | String | User’s description |
FirstName | String | User’s first name |
LastName | String | User’s last name |
Post
Property | Type | Description |
---|---|---|
postID | String | Generated by back4app (default field) |
RecipeID | Pointer to Recipe object | Subject of post |
Image | File | Picture of finished recipe (optional) |
Description | String | User’s description of recipe |
Likes | Array | Array of userID pointers who liked the post |
Comments | Array | Array of JSON objects representing comments |
UserID | Pointer to User object | User who made post |
Recipe
Property | Type | Description |
---|---|---|
Private | Boolean | Controls visibility of recipe on app |
recipeID | String | Generated by back4app (default field) |
userID | Pointer to user | User who uploaded recipe |
savesCount | Number | Number of users who have saved this recipe to their profile |
Source | String | url string if generated from web, ‘Manual’ if manually entered by user |
createdAt | DateTime | Date when recipe is created (default field) |
Ingredients | Array | Array of JSON objects representing the ingredients for this recipe |
Steps | Array | Array of JSON objects representing the steps for this recipe |
Meal Plan
Property | Type | Description |
---|---|---|
Private | Boolean | Controls visibility of meal plan on app |
planID | String | Generated by back4app (default field) |
userID | Pointer to user | User who uploaded meal plan |
savesCount | Number | Number of users who have saved this meal plan to their profile |
Recipes | Array | Array of JSON objects representing the day / meal and the pointer to recipe |
createdAt | DateTime | Date when meal plan is created (default field) |
updatedAt | DateTime | Date when meal plan is updated (default field) |
Shopping List
Property | Type | Description |
---|---|---|
listID | String | Generated by back4app (default field) |
userID | Pointer to user | User who created shopping list |
sharedWith | Array | Array of pointers to user objects representing those who have access to the shopping list |
Ingredients | Array | Array of JSON objects representing the ingredients that make up the shopping list |
createdAt | DateTime | Date when shopping list is created (default field) |
updatedAt | DateTime | Date when shopping list is updated (default field) |
Splash Screen
Register Screen
ParseUser newUser = new ParseUser();
newUser.put("display_name",display_name);
newUser.put("username", username);
newUser.put("password", password);
//Profile pic, About, fname, lname could be in other screens such as profile settings or app tutorial if we get one,
newUser.signUpInBackground(e -> {
if(e!=null){
Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(this, "Account was created!\nYou can now log in!", Toast.LENGTH_LONG).show();
}
});
Login Screen
ParseUser.logInInBackground(username, password, new LogInCallback(){
@Override
public void done(ParseUser user, ParseException e) {
if (e!=null){
Log.e(TAG, "Issue with login", e);
return;
}
goMainActivity();
}
});
Home Screen
ParseQuery<ParseObject> query = ParseQuery.getQuery("Post");
query.getInBackground(postID, (post, e) -> {
if (e == null) {
//Object was successfully retrieved
// Update the fields we want to
post.setLikes(post.getLikes()+1);
post.setUsersLikedArray(post.getUsersLikedArray().add(currentUser));
} else {
Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
}
});
ParseQuery<ParseObject> query = ParseQuery.getQuery("Post");
query.getInBackground(postID, (post, e) -> {
if (e == null) {
//Object was successfully retrieved
// Update the fields we want to
post.setLikes(post.getLikes()-1);
post.setUsersLikedArray(post.getUsersLikedArray().remove(currentUser));
}else {
Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
}
});
ParseQuery<ParseObject> query = ParseQuery.getQuery("Post");
query.getInBackground(postID, (post, e) -> {
if (e == null) {
//Object was successfully retrieved
// Update the fields we want to
post.addUserComment(userCommentObj); //Adds comment to the array in the Post Object
} else {
Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
}
});
ParseQuery<ParseObject> query = ParseQuery.getQuery("Post");
query.getInBackground(postID, (post, e) -> {
if (e == null) {
//Object was successfully retrieved
// Update the fields we want to
post.deleteUserComment(userCommentObj); \\Uses id in the User object to get rid of comment in the User Comment Array
} else {
Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
}
});
ParseQuery<ParseObject> query = ParseQuery.getQuery("Post");
query.getInBackground(postID, (post, e) -> {
if (e == null) {
//Object was successfully retrieved
// Update the fields we want to
post.updateUserComment(userCommentObj); \\Uses id in the User object to update of comment in the User Comment Array
} else {
Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
}
});
Individual Post Screen
ParseQuery<ParseObject> query = ParseQuery.getQuery("Post");
query.getInBackground(postID, (post, e) -> {
if (e == null) {
//Object was successfully retrieved
// Update the fields we want to
post.setLikes(post.getLikes()+1);
post.setUsersLikedArray(post.getUsersLikedArray().add(currentUser));
} else {
Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
}
});
ParseQuery<ParseObject> query = ParseQuery.getQuery("Post");
query.getInBackground(postID, (post, e) -> {
if (e == null) {
//Object was successfully retrieved
// Update the fields we want to
post.setLikes(post.getLikes()+1);
post.setUsersLikedArray(post.getUsersLikedArray().add(currentUser));
} else {
Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
}
});
Create Post Screen
Post post = new Post();
post.setRecipe(recipe);
post.setDescription(description);
post.setImage(new ParseFile(photoFile)); //Recommended but optional
post.setUser(currentUser);
post.saveInBackground(new SaveCallback() { @Override public void done(ParseException e) { if(e!=null){ Log.e(TAG, "Error while saving", e); Toast.makeText(getContext(), "Error while saving!", Toast.LENGTH_SHORT).show(); } Log.i(TAG, "POST save was successful!"); Toast.makeText(getContext(), "Posted!", Toast.LENGTH_SHORT).show(); } });
Recipes Screen
Recipe Library Screen
URL Extractor / Recipe Creator Screen
Meal Planning Screen
Shopping List Screen
Find Store Screen
My Profile Screen
[OPTIONAL: List endpoints if using existing API such as Yelp]