playersMeet

Table of Contents

  1. Overview
  2. Product Spec
  3. Wireframes
  4. Schema
  5. Final

Overview

Description

This app lets you have fun with sports you enjoy, while also meeting new people. It allows you to choose a particular sport and team up with people nearby.

App Evaluation

  • Category: Social Networking
  • Mobile: This is developed for mobile due to its efficiency and accessibility, but its functions can also be transfered over to a website application as well.
  • Story: Allows users to select groups and meetup with people beased on location and sport specification.
  • Market: Any individual interested in sports can use this app.
  • Habit: This app can be used anytime based on the user's liking and preference for a particular sport.
  • Scope: It will start off with a few people, but once the users grow it will allow for a better interaction/matching among users based on the type of sport and location.

Product Spec

1. User Stories (Required and Optional)

Required Must-have Stories

  • User can sign up.
  • User can login.
  • User can logout.
  • User can choose location.
  • User can form/join a team.
  • Profile pages for each user

Optional Nice-to-have Stories

  • User can choose location from map.
  • Users can message with each other in team.
  • User can add friends.
  • User can rate location.
  • User can use app as a guest.

2. Screen Archetypes

  • Login
  • Register
  • Profile Screen
  • Start a Game Screen - User can choose their preferences/sport.
  • Select a Team Screen - User sees a list of teams and choose one.
  • Settings Screen

3. Navigation

Tab Navigation (Tab to Screen)

  • Profile
  • Game
  • Settings

Flow Navigation (Screen to Screen)

  • Forced Log-in -> Account creation if no log in is available
  • Profile -> Settings

Wireframes

Progress GIF

Sign Up/Sign In/Logout

Sign Up/Sign In/Logout & Show Locations & Join/Leave Team


Editing Profile


Joining Team & Messaging & Viewing Profiles


Schema

Models

User

Property Type Description
userId Number unique id for the user
username String unique username for the user
profilePic File profile picture for the user
bio String profile description for the user

Game

Property Type Description
gameId Number unique id for game
location String location of the meetup place
sport String sport to be played

Team

Property Type Description
teamId Number unique id for team
noUsers Number number of users in the team
createdBy Pointer to User team creator

Networking

List of network requests by screen

  • Profile Screen
    • (Read/GET) Get logged in user information
      guard let user = PFUser.current() else {
          print("Failed to get user")
      }
      let username = user["profilePic"] as? String
      let bio = user["bio"] as? String
      let profilePicFile = user["profilePic"] as! PFFileObject
    • (Update/PUT) Update user information
      guard let user = PFUser.current() else {
          print("Failed to get user")
      }
      user["username"] = "michaeljordan23"
      user["bio"] = "I love basketball!"
      
      let profilePicData = photoView.image?.pngData()
      let file = PFFileObject(name: "profile.png", data: profilePicData!)
      user["profilePic"] = file
      
      user.save()
  • Game Screen
    • (Read/GET) Get games
      let query = PFQuery(className:"Game")
      query.whereKey("sport", equalTo: sport)
      query.findObjectsInBackground { (games: [PFObject]?, error: Error?) in
         if let error = error {
            print(error.localizedDescription)
         } else if let games = games {
            print("Successfully retrieved \(games.count) games.")
            // TODO: Do something with games...
         }
      }
    • (Read/GET) Get game by id
      let query = PFQuery(className:"Game")
      query.whereKey("gameId", equalTo: gameId)
      query.findObjectsInBackground { (games: [PFObject]?, error: Error?) in
         if let error = error {
            print(error.localizedDescription)
         } else if let games = games {
            print("Successfully retrieved \(games.count) games.")
            // TODO: Do something with games...
         }
      }
  • Team Screen
    • (Read/GET) Get teams
      let team1query = PFQuery(className:"Team")
      team1query.whereKey("teamId", equalTo: teamId1)
      
      let team2query = PFQuery(className:"Team")
      team2query.whereKey("teamId", equalTo: teamId2)
      
      let query = PFQuery.orQuery(withSubqueries: [team1query, team2query])    
      query.findObjectsInBackground { (teams: [PFObject]?, error: Error?) in
         if let error = error {
            print(error.localizedDescription)
         } else if let teams = teams {
            print("Successfully retrieved \(teams.count) teams.")
            // TODO: Do something with teams...
         }
      }
    • (Create/POST) Create team
      guard let user = PFUser.current() else {
          print("Failed to get user")
      }
      let team = PFObject(className: "Team")
      team["createdBy"] = user
      team["noUsers"] = 1
      
      team.saveInBackground { (success, error) in
          if success {
              print("Successfully created team!")
          }
          else {
              print("Failed to create team!")
          }
      }

[OPTIONAL:] Existing API Endpoints

Yelp API
HTTP Endpoint Description
GET /businesses/search search businesses
GET /businesses/search?location=location search businesses by location (i.e. city)
GET /businesses/search?latitude=latitude&longitude=longitude search businesses by latitude & longitude coordinates (i.e. current location)
GET /businesses/search?location=location&categories=categories search businesses by location (i.e. city) and categories (i.e. basketballcourts)
GET /businesses/{id} return specific business by id

Final

Final Demo Presentation of our project can be viewed here.

Video Demo can be viewed here.