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")
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)
def item(id): """ Display details for an item. """ store = get_store() try: doc = store[id] except couchdb.http.ResourceNotFound, not_found: return abort(404)
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))