YumSpot is an app that allows users can search good places to eat, upload and share photos of food, and make appointments to eat out.
- Category: Social Networking / Food
- Mobile: This app would be developed for mobile. Functionality would be limited to mobile devices. This app uses map and camera.
- Story: users can search good places to eat, upload and share photos of food, and make appointments to eat out.
- Market: Any individual could choose to use this app whoever enjoys food and likes to eat out. Sharing photos and talking with friends about food will allow users to have more exciting experience.
- Habit: This app could be used as often or unoften as the user wanted depending on how often they are talking about food and eating out.
- Scope: First we would start with sharing food interests. We would like to expand to delivery and advertisement features.
Required Must-have Stories
- Users can log in and sign up for the app.
- Users can access previous chats.
- Users can search restaurants by location and name.
- Users can select food categories to see the list of restaurants.
- Users can see details of restaurants.
- Users can post photos of food.
- Users can talk with their friend.
- Settings (profile, logout)
Optional Nice-to-have Stories
- Include a map on detailed page of restaurant.
- Share map in chat.
- Users can see their preferred restaurants.
- Show posted photos by a user on profile page.
- Include a like button to save user's favorite places.
- Include a phone call feature
- Login Screen
- Users can log in
- Register Screen
- Users can register a new account
- Category Screen
- Food category buttons
- Search Screen
- Users can search restaurants by name or location.
- Users can see the list of restaurants.
- Restaurant Info Screen
- Users can see information of a restaurant such as phone number, location, opening hours, etc.
- Feed Screen
- Users can view photos from other users.
- Post Screen
- Users can post photos and comment on feed.
- Chat Screen
- Allows user to chat with their friends
- Settings Screen
- Lets users can go to their profile page and log out.
- Profile Screen
- Users can view their own posts.
Tab Navigation (Tab to Screen)
- Restaurant
- Feed
- Chat
- Settings
Flow Navigation (Screen to Screen)
- Login Screen (Forced Log-in) -> Register Screen (Account creation if no log in is available)
- Category Screen (selection) -> Search Screen -> Restaurant Info Screen
- Feed Screen -> Post Screen (if post button is clicked)
- Chat Screen
- Settings Screen -> Profile Screen (if profile button is clicked) -> Login Screen (if logout button is clicked)
| Property | Type | Description |
|---|---|---|
| image | File | image that user posts |
| userId | String | unique id for the user post (default field) |
| user | Pointer to User | image user |
| commentsCount | Number | number of comments that has been posted to an image |
| likesCount | Number | number of likes for the post |
| createdAt | DateTime | date when post is created (default field) |
| updatedAt | DateTime | date when post is last updated (default field) |
| userEmail | String | user's email |
| userPassword | String | user's password |
- Register Screen
- (Create/POST) Create a new account
// Create the ParseUser ParseUser user = new ParseUser(); // Set core properties user.setUserId("joestevens"); user.setUserPassword("secret123"); user.setUserEmail("email@example.com"); // Invoke signUpInBackground user.signUpInBackground(new SignUpCallback() { public void done(ParseException e) { if (e == null) { // Hooray! Let them use the app now. } else { // Sign up didn't succeed. Look at the ParseException // to figure out what went wrong } } });
- (Create/POST) Create a new account
- Feed Screen
- (Create/POST) Create a new comment on a post
@ParseClassName("Post") public class Post extends ParseObject { // ... } @ParseClassName("Comment") public class Comment extends ParseObject { // ... // Associate each comment with a user public void setOwner(ParseUser user) { put("owner", user); } // Get the user for this comment public ParseUser getOwner() { return getParseUser("owner"); } // Associate each comment with a post public void setPost(Post post) { put("post", post); } // Get the post for this item public Post getPost() { return (Post) getParseObject("post"); } } // Create the post Post post = new Post("Welcome Spring!"); // Get the user ParseUser currentUser = ParseUser.getCurrentUser(); // Create the comment Comment comment = new Comment("Get milk and eggs"); comment.setPost(post); comment.setOwner(currentUser); comment.saveInBackground(); - (Delete) Delete existing comment
myComment.deleteInBackground(); // After this, the playerName field will be empty myComment.remove("comment"); // Saves the field deletion to your Parse Server myComment.saveInBackground(); - (Read/GET) Query all posts from all users
let query = PFQuery(className:"Post") query.include(Post.USER); query.setLimit(30); query.order(byDescending: "createdAt") query.findObjectsInBackground { (posts: [PFObject]?, error: Error?) in if let error = error { print(error.localizedDescription) } else if let posts = posts { print("Successfully retrieved \(posts.count) posts.") // allpost.addAll(posts) adapter.notifyDatasetChanged(); } }
- (Create/POST) Create a new comment on a post
- Post Screen
- (Create/POST) Create a new post object
private void savePost(String description, ParseUser currentUser, File photoFile) { Post post = new Post(); post.setDescription(description); post.setImage(new ParseFile(photoFile)); 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(MainActivity.this, "Error while saving", Toast.LENGTH_SHORT).show(); } Log.i(TAG, "Post save was successful!!"); etDescription.setText(""); ivPostImage.setImageResource(0); } }); }
- (Create/POST) Create a new post object
- Chat Screen
- Profile Screen
- (Read/GET) Query logged in user object
ParseQuery<ParseUser> query = ParseUser.getQuery(); query.whereKey("user", equalTo: currentUser); query.findInBackground(new FindCallback<ParseUser>() { public void done(List<ParseUser> objects, ParseException e) { if (e == null) { print("Successfully retrieved user.") } else { print(error.localizedDescription) } String userId = item.getUserId(); String userEmail = item.getUserEmail(); } }); - (Read/GET) Query all posts where user is currentUser
let query = PFQuery(className:"Post") query.whereKey("user", equalTo: currentUser); query.order(byDescending: "createdAt") query.findObjectsInBackground { (posts: [PFObject]?, error: Error?) in if let error = error { print(error.localizedDescription) } else if let posts = posts { print("Successfully retrieved \(posts.count) posts.") // allpost.addAll(posts) adapter.notifyDatasetChanged(); } }
- (Delete) Delete existing post
myPost.deleteInBackground(); // After this, the playerName field will be empty myPost.remove("post"); // Saves the field deletion to your Parse Server myPost.saveInBackground(); - (Read/GET) getcurrentUser to check if the user logged out sucessfully
ParseUser.logOut(); ParseUser currentUser = ParseUser.getCurrentUser(); // this will now be null
- (Read/GET) Query logged in user object
-
Base URL - https://api.yelp.com/v3/businesses
HTTP Verb Endpoint Description GET/search returns up to 1000 businesses based on the provided search criteria GET/{id} returns detailed business content GET/{id}/reviews returns up to three review excerpts for a given business

