Esempio n. 1
0
def api_books_delete():
    """ 
    API. Delete book by internal id (couchdb doc_id that is).
    """
    try:
        apikey = request.args.get("key", None)
        doc_id = request.args.get("id", None)  # doc id
    except KeyError:
        response = jsonify(status="400", message="key and id parameters are required")
        response.code = 400
        return response

    user = User.query.filter(User.apikey == apikey).first()
    if user == None:
        response = jsonify(apikey=apikey, status="400", message="user not found")
        response.code = 400
        return response

    # remove book from couchdb
    try:
        store = get_store()
        doc = store[doc_id]
        metadata = doc["metadata"]
        store.delete(doc)
    except couchdb.http.ResourceNotFound, not_found:
        return jsonify(key=apikey, status="200", message="OK")
Esempio n. 2
0
def api_books_put():
    """ 
    API. Add a new book by isbn. PUT is idempotent.
    """
    try:
        apikey = request.form["key"]
        isbn = request.form["isbn"]
    except KeyError:
        response = jsonify(status="400", message="key and isbn parameters are required")
        response.code = 400
        return response

    user = User.query.filter(User.apikey == apikey).first()
    if user == None:
        response = jsonify(apikey=apikey, status="400", message="user not found")
        response.code = 400
        return response

    try:
        metadata = get_book(isbn)
    except KeyError:
        response = jsonify(apikey=apikey, isbn=isbn, status="404", message="book with this ISBN not found")
        response.code = 404
        return response

    # see if user already got this books stored
    conn = pyelasticsearch.ElasticSearch(app.config["ELASTICSEARCH_URL"])
    results = conn.search("%s AND user_id:%s" % (isbn, user.id))
    if len(results["hits"]["hits"]) > 0:
        metadata = results["hits"]["hits"][0]["_source"]["metadata"]
        doc_id = results["hits"]["hits"][0]["_source"]["_id"]
        return jsonify(key=apikey, status="200", isbn=isbn, message="OK", metadata=metadata, doc_id=doc_id)

    # if not found, store it in CouchDB
    store = get_store()

    doc = {"user_id": user.id, "metadata": metadata}
    doc_id, doc_rev = store.save(doc)

    # add to social stream
    event = Event(
        user_id=user.id,
        event="book added",
        time=time.time(),
        data=json.dumps(
            {
                "verbose": "%s added %s to their collection" % (user.username, metadata["title"]),
                "metadata": metadata,
                "doc_id": doc_id,
            }
        ),
    )
    db.session.add(event)
    db.session.commit()

    # get book info by isbn ...
    # return data gathered and stored
    return jsonify(key=apikey, status="200", isbn=isbn, message="OK", metadata=metadata, doc_id=doc_id)
Esempio n. 3
0
def item(id):
    """
    Display details for an item.
    """
    store = get_store()
    try:
        doc = store[id]
    except couchdb.http.ResourceNotFound, not_found:
        return abort(404)
Esempio n. 4
0
def add():
    """
    Add a book by isbn. Since this uses only the Open Library API at the
    moment, expect missing books.
    """
    try:
        isbn = request.form["isbn"]
    except KeyError:
        abort(404)

    user = session["user"]
    if user == None:
        abort(404)

    try:
        metadata = get_book(isbn)
    except KeyError:
        flash("ISBN not found")
        return redirect(url_for("home", id=user.id))

    # see if user already got this books stored
    conn = pyelasticsearch.ElasticSearch(app.config["ELASTICSEARCH_URL"])
    results = conn.search("%s AND user_id:%s" % (isbn, user.id))

    if len(results["hits"]["hits"]) > 0:
        metadata = results["hits"]["hits"][0]["_source"]["metadata"]
        doc_id = results["hits"]["hits"][0]["_source"]["_id"]
        return jsonify(key=apikey, status="200", isbn=isbn, message="OK", metadata=metadata, doc_id=doc_id)

    # if not found, store it in CouchDB
    store = get_store()

    doc = {"user_id": user.id, "metadata": metadata}
    doc_id, doc_rev = store.save(doc)

    # add to social stream
    event = Event(
        user_id=user.id,
        event="book added",
        time=time.time(),
        data=json.dumps(
            {
                "verbose": "%s added %s to their collection" % (user.username, metadata["title"]),
                "metadata": metadata,
                "doc_id": doc_id,
            }
        ),
    )
    db.session.add(event)
    db.session.commit()

    flash("Successfully added book")
    return redirect(url_for("home", id=user.id))