Example #1
0
def post_get_vinyl():
    if request.method == "POST":
        if not request.data:
            return create_return(status_400(), 400)
        vinyl_info = vinyl_information(request.get_json())

        if not vinyl_info:
            return create_return(status_400(), 400)

        vinyl_info["crate"] = None
        return create_return(
            json.dumps(
                new_object(vinyl_info, vinyl, datastore_client,
                           request.url_root)), 201)

    if request.method == "GET":
        query = datastore_client.query(kind=vinyl)
        collection_size = len(list(query.fetch()))
        q_offset = int(request.args.get('offset', 0))
        vinyl_iterator = query.fetch(limit=paginate_limit, offset=q_offset)
        pages = vinyl_iterator.pages
        results = list(next(pages))
        for result in results:
            result["id"] = str(result.key.id)
            result["self"] = object_self(result.key.id, crates,
                                         request.url_root)

            if result["crate"] is not None:
                crate_key = datastore_client.key(crates,
                                                 int(result["crate"]["id"]))
                crate = datastore_client.get(crate_key)
                crate["id"] = crate.key.id
                crate["self"] = object_self(crate.key.id, crates,
                                            request.url_root)
                crate.pop("vinyl", None)
                result["crate"] = crate

        return_info = {"vinyl": results, "collection_size": collection_size}

        if vinyl_iterator.next_page_token:
            next_offset = q_offset + paginate_limit
            next_url = request.base_url + "?offset=" + str(next_offset)
            return_info["next"] = next_url

        return create_return(json.dumps(return_info), 200)
Example #2
0
def post_crates():
    if request.method == "POST":
        # Verify user
        verified = verify(request.headers)
        if verified == -1:
            return create_return(status_401(), 401)

        if not request.data:
            return create_return(status_400(), 400)

        crate_info = crate_information(request.get_json())
        if not crate_info:
            return create_return(status_400(), 400)

        crate_info["owner"] = verified
        crate_info["vinyl"] = []
        return create_return(
            json.dumps(
                new_object(crate_info, crates, datastore_client,
                           request.url_root)), 201)

    if request.method == "GET":
        #         Verify user but don't return error
        verified = verify(request.headers)
        #         Get crates belonging to this user
        query = datastore_client.query(kind=crates)
        query.add_filter("owner", "=", str(verified))
        collection_size = len(list(query.fetch()))
        q_offset = int(request.args.get('offset', 0))
        crate_iterator = query.fetch(limit=paginate_limit, offset=q_offset)
        pages = crate_iterator.pages
        results = list(next(pages))
        for result in results:
            # Format Vinyl for Crate
            vinyl_in_crate(result, datastore_client, request.url_root)

        return_info = {"crates": results, "collection_size": collection_size}

        if crate_iterator.next_page_token:
            next_offset = q_offset + paginate_limit
            next_url = request.base_url + "?offset=" + str(next_offset)
            return_info["next"] = next_url

        return create_return(json.dumps(return_info), 200)
Example #3
0
def get_users():
    query = datastore_client.query(kind=users)
    results = list(query.fetch())
    for result in results:
        result["id"] = result.pop("sub")
    return create_return(
        json.dumps({
            "users": results,
            "collection_size": len(results)
        }), 200)
Example #4
0
def withdraw_vinyl(crate_id, vinyl_id):
    # Verify user
    verified = verify(request.headers)
    if verified == -1:
        return create_return(status_401(), 401)

    # Get crate and vinyl
    # Get the vinyl
    vinyl_key = datastore_client.key(vinyl, int(vinyl_id))
    vinyl_record = datastore_client.get(key=vinyl_key)

    crate_key = datastore_client.key(crates, int(crate_id))
    crate = datastore_client.get(key=crate_key)

    if crate is None or vinyl_record is None:
        return create_return(status_404_store(), 404)
    #     Verify user is owner of crate
    if crate["owner"] != str(verified):
        return create_return(status_403(), 403)

    record_found = False
    #    Remove relationship
    for i in range(len(crate["vinyl"])):
        if crate["vinyl"][i]["id"] == str(vinyl_id):
            crate["vinyl"].pop(i)
            crate.update(crate)
            datastore_client.put(crate)
            record_found = True
            break

    if not record_found:
        return create_return(status_400_withdraw(), 400)

    vinyl_record["crate"] = None
    vinyl_record.update(vinyl_record)
    datastore_client.put(vinyl_record)

    return create_return("", 204)
Example #5
0
def store_vinyl(crate_id, vinyl_id):
    # Verify user
    verified = verify(request.headers)
    if verified == -1:
        return create_return(status_401(), 401)

    # Get crate and vinyl
    # Get the vinyl
    vinyl_key = datastore_client.key(vinyl, int(vinyl_id))
    vinyl_record = datastore_client.get(key=vinyl_key)

    crate_key = datastore_client.key(crates, int(crate_id))
    crate = datastore_client.get(key=crate_key)

    if crate is None or vinyl_record is None:
        return create_return(status_404_store(), 404)
    #     Verify user is owner of crate
    if crate["owner"] != str(verified):
        return create_return(status_403(), 403)

    #     Verify vinyl does not have crate
    if vinyl_record["crate"] is not None:
        return create_return(status_400_store(), 400)

    #     Verify capacity constraints
    if len(crate["vinyl"]) + 1 > crate["capacity"]:
        return create_return(status_400_store(), 400)

    #     Add vinyl to crate
    crate["vinyl"].append({"id": str(vinyl_record.key.id)})
    crate.update(crate)
    datastore_client.put(crate)

    #     Add crate to vinyl
    vinyl_record["crate"] = {"id": str(crate.key.id)}
    vinyl_record.update(vinyl_record)
    datastore_client.put(vinyl_record)

    #     Return 204
    return create_return("", 204)
Example #6
0
def method_not_allowed(e):
    return create_return(status_405(), 405)
Example #7
0
def request_checks():
    mimetype_dict = dict(request.accept_mimetypes)
    if json_mimetype not in mimetype_dict and all_mimetype not in mimetype_dict:
        return create_return(status_406(), 406)
Example #8
0
def get_patch_put_delete_vinyl_vinylid(vinyl_id):
    # Get the vinyl
    vinyl_key = datastore_client.key(vinyl, int(vinyl_id))
    vinyl_record = datastore_client.get(key=vinyl_key)

    if vinyl_record is None:
        return create_return(status_404(vinyl), 404)

    crate = None
    # If record in crate get crate information
    if vinyl_record["crate"] is not None:
        crate_key = datastore_client.key(crates,
                                         int(vinyl_record["crate"]["id"]))
        crate = datastore_client.get(crate_key)
        crate["self"] = object_self(crate.key.id, crates, request.url_root)
        crate["id"] = str(crate.key.id)
        # vinyl_record["crate"] = crate

    if request.method == "PATCH":
        # Verify the user if the vinyl is in a crate
        if vinyl_record["crate"] is not None:
            verified = verify(request.headers)
            if verified == -1:
                return create_return(status_401(), 401)

            if crate["owner"] != str(verified):
                return create_return(status_403(), 403)

        if not request.data:
            return create_return(status_400(), 400)
        vinyl_attributes = vinyl_information_indiv(request.get_json())

        if not vinyl_attributes:
            return create_return(status_400(), 400)

        vinyl_record.update(vinyl_attributes)
        datastore_client.put(vinyl_record)

    if request.method == "PUT":
        if vinyl_record["crate"] is not None:
            verified = verify(request.headers)
            if verified == -1:
                return create_return(status_401(), 401)

            if crate["owner"] != str(verified):
                return create_return(status_403(), 403)

        if not request.data:
            return create_return(status_400(), 400)

        vinyl_attributes = vinyl_information(request.get_json())

        if not vinyl_attributes:
            return create_return(status_400(), 400)

        vinyl_record.update(vinyl_attributes)
        datastore_client.put(vinyl_record)
        vinyl_record["id"] = vinyl_record.key.id
        vinyl_record["self"] = object_self(vinyl_record.key.id, vinyl,
                                           request.url_root)
        if crate is not None:
            crate.pop("vinyl", None)
        vinyl_record["crate"] = crate

        # For records in vinyl
        #     Return 303
        res = make_response(vinyl_record)
        res.status_code = 303
        res.headers.set("Location", vinyl_record["self"])
        return res

    if request.method == "DELETE":
        # Delete vinyl
        if vinyl_record["crate"] is not None:
            verified = verify(request.headers)
            if verified == -1:
                return create_return(status_401(), 401)

            if crate["owner"] != str(verified):
                return create_return(status_403(), 403)

            for i in range(len(crate["vinyl"])):
                if crate["vinyl"][i]["id"] == str(vinyl_id):
                    crate["vinyl"].pop(i)
                    crate.update(crate)
                    datastore_client.put(crate)
                    break

        datastore_client.delete(vinyl_key)

        return create_return("", 204)

    # Fall through for GET and PATCH
    vinyl_record["id"] = str(vinyl_record.key.id)
    vinyl_record["self"] = object_self(vinyl_record.key.id, vinyl,
                                       request.url_root)
    if crate is not None:
        crate.pop("vinyl", None)
    vinyl_record["crate"] = crate

    return create_return(json.dumps(vinyl_record), 200)
Example #9
0
def get_delete_patch_put_crate_crateid(crate_id):
    # Verify user
    verified = verify(request.headers)
    if verified == -1:
        return create_return(status_401(), 401)

    # Get crate
    crate_key = datastore_client.key(crates, int(crate_id))
    crate = datastore_client.get(key=crate_key)

    if crate is None:
        return create_return(status_404("crate"), 404)

    # Verify ownership
    if crate["owner"] != str(verified):
        return create_return(status_403(), 403)

    if request.method == "DELETE":
        # Delete crate
        for record in crate["vinyl"]:
            # Get vinyl and remove the crate
            vinyl_key = datastore_client.key(vinyl, int(record["id"]))
            vinyl_record = datastore_client.get(key=vinyl_key)
            vinyl_record["crate"] = None
            vinyl_record.update(vinyl_record)
            datastore_client.put(vinyl_record)

        datastore_client.delete(crate_key)

        return create_return("", 204)

    if request.method == "PATCH":
        if not request.data:
            return create_return(status_400(), 400)
        crate_attributes = crate_information_indiv(request.get_json())

        if not crate_attributes:
            return create_return(status_400(), 400)

        crate.update(crate_attributes)
        datastore_client.put(crate)

    if request.method == "PUT":
        if not request.data:
            return create_return(status_400(), 400)

        crate_attributes = crate_information(request.get_json())

        if not crate_attributes:
            return create_return(status_400(), 400)

        crate.update(crate_attributes)
        datastore_client.put(crate)
        vinyl_in_crate(crate, datastore_client, request.url_root)

        # Return 303
        res = make_response(crate)
        res.status_code = 303
        res.headers.set("Location", crate["self"])
        return res

    # Fall through for requests that return 200 response (GET and PATCH)
    vinyl_in_crate(crate, datastore_client, request.url_root)

    return create_return(json.dumps(crate), 200)