/Rails

back-end

Primary LanguageRuby

TIY Hackathon

Ruby on Rails

This application requires:

  • Ruby 2.1.5
  • Rails 4.2.0

Learn more about Installing Rails.

ROUTING

USER ROUTING

To create a new user

POST /users

  JSON requested: {user: {username: string, email: string, password: string}}`

if the user is successfully created NOTE: THE USER IS NOT SIGNED IN AFTER REGISTRATION

  JSON returned: {user: {email: string, id: string, authentication-token: string}}, status: :created (status 201)

else

  status: {error: {errors thrown}}, status: :ok

To view a list of all users

GET /users

if authenticated

  JSON returned: {users: {user: {email: string, id: integer, total_points: integer}... for each user}}, status: :ok (status 200)

To view an individual user's information

GET /users/:id

  JSON returned: {user: {username: string, email: string, id: integer, game_id: nil OR integer}}, status: :ok (status 200)

else

  JSON returned: {error: {errors thrown}}, status: :unprocessable_entity (status 422)

To sign in a user

POST /users/sign_in

  JSON requested: {user: {email: string, password: string}}

return if successful

  JSON returned: {user: {email: string, id: string, total_points: integer, game_id: nil OR integer}}, status: :ok (status 200)

else

  JSON returned: {error: {errors thrown}}, status: unprocessable_entity (status 422)

GAME ROUTING

To create a game

POST /games/new

  JSON requested: {game: {center_lat: up to 6 decimal places, center_long: up to 6 decimal places, radius: up to 3 decimal places, starts_at: string (this will be a time... example: 5:00pm), duration: integer}}

if successful:

  JSON returned: {game: {center_lat: up to 6 decimal places, center_long: up to 6 decimal places, radius: up to 3 decimal places, starts_at: timestamp, game_duration: integer}}, status: :created (status 201)

else

  JSON returned: {error: {list of errors thrown}}, status: :unprocessable_entity (status 422)

To view an individual game (from PC)

GET /games/:id/admin

  JSON requested: only authentication_token

if authenticated

  JSON returned: {game: {
                      center_lat: up to 6 decimal places, 
                      center_long: up to 6 decimal places, 
                      radius: up to 3 decimal places, 
                      starts_at: timestamp, 
                      ends_at: timestamp}, 
                  users: {
                          user: {
                              id: integer, 
                              email: string, 
                              username: string}
                          user: {
                              id: integer, 
                              email: string, 
                              username: string}
                              }
                            }
                        },
                  players: {
                          player: {
                              id: integer
                              score: integer
                              user_id: integer
                              game_id: integer},
                          player: {
                              id: integer
                              score: integer
                              user_id: integer
                              game_id: integer}
                            },
                  flags: {
                          flag: {
                              flag_id: integer,
                              player_id: integer,
                              flag_lat: decimal,
                              flag_long: decimal},
                          flag: {
                              flag_id: integer,
                              player_id: integer,
                              flag_lat: decimal,
                              flag_long: decimal}
                          }
                    } status: :ok (status 200)

else

  JSON returned: {error: {errors thrown}}, status: :unprocessable_entity (status 422)

To View an Individual Game (from iOS)

GET /games/:id

  query params: only authentication_token

if authenticated

  JSON returned: {game: {
                      center_lat: up to 6 decimal places, 
                      center_long: up to 6 decimal places, 
                      radius: up to 3 decimal places, 
                      starts_at: timestamp, 
                      ends_at: timestamp}, 
                  users: {
                          user: {
                              id: integer, 
                              email: string, 
                              username: string}
                          user: {
                              id: integer, 
                              email: string, 
                              username: string}
                              }
                            }
                        },
                  players: {
                          player: {
                              id: integer
                              score: integer
                              user_id: integer
                              game_id: integer},
                          player: {
                              id: integer
                              score: integer
                              user_id: integer
                              game_id: integer}
                            },
                  flags: {
                          flag: {
                              flag_id: integer,
                              player_id: integer,
                              flag_lat: decimal,
                              flag_long: decimal},
                          flag: {
                              flag_id: integer,
                              player_id: integer,
                              flag_lat: decimal,
                              flag_long: decimal}
                          }
                    } status: :ok (status 200)

else

  JSON returned: {error: {errors thrown}}, status: :unprocessable_entity (status 422)

INVITATION ROUTING

To send Invitations to Users

POST /invitations

  JSON requested: {inviter_id (will be current user's ID): integer, invited_id: integer, game_id: integer}

if successful

  JSON returned: {invitation: {inviter_id: integer, invited_id: integer, game_id: integer}}, status: :created (status 201)

else

  JSON returned: {error: {all errors thrown}}, status: :unprocessable_entity (status 422)

iOS - To View All of User's Invitations

GET /invitations/users/:id

if the user has any invitations

  JSON returned: {invitations: {
                              invitation: { inviter_id: integer
                                          invited_id: integer (this is the current user)
                                          game_id: integer}
                              invitation: { inviter_id: integer
                                          invited_id: integer (this is the current user)
                                          game_id: integer}
                              }
                        }, status: :ok (status 200)

else

  JSON returned: {invitations: nil}, status: :ok (status 200)

iOS - To Accept an Invitation

POST /invitations/:id/accept

  JSON requested: {invitation: {inviter_id: integer, invited_id: integer, game_id: integer}}

if the game is joined successfully

  JSON returned: {game: { center_lat: decimal,
                          center_long: decimal,
                          radius: decimal,
                          starts_at: timestamp,
                          ends_at: timestamp}
                  players: { user: {
                              id: integer, 
                              email: string, 
                              username: string},
                             user: {
                              id: integer, 
                              email: string, 
                              username: string}
                        }
                    }, status: :ok (status 200)                             

else

  JSON returned: {error: {errors thrown}}, status: :unprocessable_entity (status 422)

iOS - To Decline an Invitation

POST /invitations/:id/decline

  JSON requested: {invitation: {inviter_id: integer, invited_id: integer, game_id: integer}}

if the invitation was successfully declined/destroyed

  JSON returned: {invitation: nil}, status: :ok (status 200)

else

  JSON returned: {error: {errors thrown}}, status: :unprocessable_entity (status 422)

FLAG ROUTING

iOS - To Place a Flag

POST /flags

  JSON requested: {flag: {name: string, flag_lat: decimal, flag_long: decimal}}

if created

  JSON returned: {flag: {name: string, flag_lat: decimal, flag_long: decimal, player_id: integer}}, status: :created (status 201)

else

  JSON returned: {error: {errors thrown}}, status: :unprocessable_entity (status 422)

iOS - To Delete a Flag (before game starts)

DELETE /flags/:id

if successful

  JSON returned: {flag: nil}, status: :ok (status 200)

else

  JSON returned: {error: {errors thrown}}, status: :unprocessable_entity (status 422)

TAG ROUTING

iOS - To Tag a Flag

POST /tags

A user cannot tag their own flag! This will throw a Forbidden 403 error!

  JSON requested: {tag: {flag_id: integer}}

if successful

  JSON returned: {tag: {id: integer, flag_id: integer, player_id: integer}}, status: :created (status 201)

else

  JSON returned: {error: {errors thrown}}, status: :unprocessable_entity (status 422)