Ejemplo n.º 1
0
def vote_post(postid):
    data = request.get_json()

    user = retrieve_user_from_request(request)
    if (user is None):
        return generate_error_response(ERR_403_vote, 403)

    # checks for necessary data params
    if ('vote' not in data):
        return generate_error_response(ERR_400, 400)

    # create a new post and add it to the db session
    vote = int(data['vote'])

    # find the post to vote on
    post = Post.find_post(postid)

    if (post is None):
        return generate_error_response(ERR_404, 404)

    # Call apply_vote
    userid = user.get_user_id()
    post.apply_vote(userid, postid, vote)

    return post.to_json_fields_for_FE(userid), 200
Ejemplo n.º 2
0
def get_user_posts(userid):
    # look for user to make sure this user exists
    user = User.find_user_by_id(userid)

    # return 404 if not found
    if (user is None):
        return generate_error_response(ERR_404, 404)

    info = request.environ['META_INFO']
    no_id = request.environ['NOID']
    bad_token = request.environ['BADTOKEN']
    if (info is None or no_id or bad_token
            or user.get_google_aud() != info['audCode']):
        return generate_error_response(ERR_403_posts, 403)

    posts = Post.find_user_posts(userid)
    img_tag = user.get_image_tag()

    to_rtn = {}
    posts_arr = []
    for post in posts:
        posts_arr.append(json.loads(post.to_json_fields_for_FE(\
         user.get_user_id(), img_tag)))

    to_rtn['posts'] = posts_arr

    return json.dumps(to_rtn)
Ejemplo n.º 3
0
def get_post(postid):
    post = Post.find_post(postid)

    if (post is None):
        return generate_error_response(ERR_404, 404)

    user = retrieve_user_from_request(request)
    if (user is None):
        return generate_error_response(ERR_403, 403)

    return post.to_json_fields_for_FE(user.get_user_id()), 200
Ejemplo n.º 4
0
def delete_post(postid):
    # no checking of authentication is happening yet...
    post = Post.find_post(postid)

    if (post is None):
        return generate_error_response(ERR_404, 404)

    user = retrieve_user_from_request(request)
    if (user is None or post.get_poster_id() != user.get_user_id()):
        return generate_error_response(ERR_403, 403)

    jsonified_post = post.to_json_fields_for_FE(user.get_user_id())
    post.delete_post()

    return jsonified_post, 200
Ejemplo n.º 5
0
def get_posts_coordinates():
    try:
        # query db for all posts in this area
        lat = (float)(request.args.get('latitude'))
        lon = (float)(request.args.get('longitude'))
        radius = (float)(request.args.get('radius'))
    except:
        # Either the params are not there, or they are not convertable to floats
        return generate_error_response(ERR_400, 400)

    posts = Post.find_all_posts_within_loc(lon, lat, radius)

    # This is commented out for now, because it from the wiki that there is no
    # authentication necessary. This can be changed easily by commenting out
    # these lines.

    # info = request.environ['META_INFO']
    # no_id = request.environ['NOID']
    # bad_token = request.environ['BADTOKEN']
    # if (info is None or no_id or bad_token):
    # 	return generate_error_response(ERR_403, 403)
    # user = User.get_user_by_google_aud(info['audCode'])

    # if (user is None):
    # 	return generate_error_response(ERR_403, 403)

    to_ret = {}
    coords = []
    for post in posts:
        coord = {}
        coord['longitude'] = post.get_longitude()
        coord['latitude'] = post.get_latitude()
        coords.append(coord)
    to_ret['coordinates'] = coords
    return json.dumps(to_ret), 200
Ejemplo n.º 6
0
def get_user(userid):
    # look for user
    user = User.find_user_by_id(userid)

    # return 404 if not found
    if (user is None):
        return generate_error_response(ERR_404, 404)

    return user.to_json_fields_for_FE(), 200
Ejemplo n.º 7
0
def create_post():
    data = request.get_json()

    # checks for necessary data params
    if ('location' not in data or 'type' not in data
            or 'latitude' not in data['location']
            or 'longitude' not in data['location']):
        return generate_error_response(ERR_400, 400)

    try:
        lon = (float)(data['location']['longitude'])
        lat = (float)(data['location']['latitude'])
    except:
        # Either the params are not there, or they are not convertable to floats
        return generate_error_response(ERR_400, 400)

    user = retrieve_user_from_request(request)
    if (user is None):
        return generate_error_response(ERR_400, 400)

    user_id = user.get_user_id()

    # create a new post and add it to the db session
    # 0 for text, 1 for image, anything else is invalid
    post_type = data['type']
    if (post_type == 0):
        text = data['text']
        if (not validate_text(text)):
            return generate_error_response(ERR_400, 400)
        # image is empty
        post = Post(text, lon, lat, user_id, 0)
        post.save_post()
    elif (post_type == 1):
        post_type = 1
        img_data = data['image']
        # empty text
        post = Post('', lon, lat, user_id, 1)
        post.save_post()
        post.upload_img_to_s3(img_data)
    else:
        return generate_error_response(ERR_400, 400)

    return post.to_json_fields_for_FE(user_id), 200
Ejemplo n.º 8
0
def get_post_by_location():
    try:
        # query db for all posts in this area
        lat = (float)(request.args.get('latitude'))
        lon = (float)(request.args.get('longitude'))
    except:
        # Either the params are not there, or they are not convertable to floats
        return generate_error_response(ERR_400, 400)

    radius = 1  # TODO find out what number this should be
    user = retrieve_user_from_request(request)
    if (user is None):
        return generate_error_response(ERR_403, 403)

    try:
        # if time_before is given, return 15 posts before specified time
        # otherwise, return 15 newest posts
        time_before = (float)(request.args.get('time_before'))
        posts = Post.find_limited_posts_within_loc_before_time(\
         lon, lat, radius, time_before)
    except:
        posts = Post.find_limited_posts_within_loc(lon, lat, radius)

    # map from poster_id to img_tags of the poster
    img_tags = {}
    for post in posts:
        poster_id = post.get_poster_id()
        if poster_id not in img_tags:
            img_tags[poster_id] = User.find_user_by_id(poster_id)\
             .get_image_tag()

    user_id = user.get_user_id()
    to_ret = {}
    jsonified_posts = []
    for post in posts:
        # passes in the already loaded image tag
        jsonified_posts.append(json.loads(post.to_json_fields_for_FE(\
         user_id, img_tags[post.get_poster_id()])))
    to_ret['posts'] = jsonified_posts
    return json.dumps(to_ret), 200
Ejemplo n.º 9
0
def user_login():
    user = retrieve_user_from_request(request)
    if (user):
        # login with idToken passed in through header
        if (user.get_username() == ''):
            is_new_user = True
        is_new_user = False
    else:
        # create new User object with next userId and empty strings for other
        # fields. Also checks for necessary parameters to make a new user
        info = request.environ['META_INFO']
        if ('audCode' in info and 'email' in info):
            user = User('', info['audCode'], '', '', info['email'], '')
        else:
            return generate_error_response(ERR_401, 401)
        user.save_user()
        is_new_user = True

    # return whether its a new user and the associated user object
    return json.dumps(
        dict(new_user=is_new_user,
             user=json.loads(user.to_json_fields_for_FE()))), 200
Ejemplo n.º 10
0
def update_user(userid):
    # checks for necessary data params
    try:
        data = request.get_json()
    except:
        # if there is no data with the PUT request
        return generate_error_response(ERR_400_invalid, 400)

    if (not data or 'userid' not in data):
        return generate_error_response(ERR_400_invalid, 400)

    user = retrieve_user_from_request(request)
    if (user is None):
        return generate_error_response(ERR_404, 404)

    if (int(data['userid']) != userid and user.get_user_id() != userid):
        return generate_error_response(ERR_403_update, 403)

    # Call set functions and update good_inputs
    good_inputs = True

    # checks if a user with specified username already exists
    username = data['username']
    existing = User.find_user_by_username(username)
    username_taken = False
    # If the user wants to change their username to an existing username
    if (user.get_username() != username and existing):
        username_taken = True
    else:
        good_inputs = good_inputs and user.set_username(username)

    # Not sure if all these checks are necessary?
    if ('name' in data and data['name'] != user.get_name()):
        good_inputs = good_inputs and user.set_name(data['name'])

    if ('phone_number' in data and \
      data['phone_number'] != user.get_phone_number()):
        good_inputs = good_inputs and user.set_phone_number(
            data['phone_number'])

    if ('bio' in data and data['bio'] != user.get_bio()
            and len(data['bio']) < 160):
        good_inputs = good_inputs and user.set_bio(data['bio'])

    # save user before check email because even if user wants to change email,
    # the other fields should still be modified.
    user.save_user()

    # saving image tag because there is no point of uploading it and then
    # re-downloading it to pass back to the FE
    img_tag = []
    if ('img_tag' in data):
        img_tag = data['img_tag']
        good_inputs = good_inputs and user.set_image_tag(img_tag)

    if ('email' in data and data['email'] != user.get_email()):
        return generate_error_response(ERR_403_email, 403)

    # Evaluate bools
    if (username_taken):
        return generate_error_response(ERR_400_taken, 400)
    if (not good_inputs):
        return generate_error_response(ERR_400_invalid, 400)

    return user.to_json_fields_for_FE(img_tag), 200