From 2d8ee21bc6763434765984ef95d47208cea67a2d Mon Sep 17 00:00:00 2001
From: Glaisher
Date: Mon, 8 Jun 2020 17:39:10 +0500
Subject: [PATCH 1/2] Add default sorts to list API endpoints
---
main.py | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/main.py b/main.py
index 13eab4e..06b94f0 100644
--- a/main.py
+++ b/main.py
@@ -1,5 +1,6 @@
from flask import Flask, jsonify
from flask_swagger import swagger
+from sqlalchemy import func
app = Flask(__name__)
app.config.from_object('config.Config')
@@ -19,7 +20,7 @@ def spec():
@app.route('/v1/collections', methods=['GET'])
def api_collections():
- queryset = HadithCollection.query.all()
+ queryset = HadithCollection.query.order_by(HadithCollection.collectionID).all()
results = [x.serialize() for x in queryset]
return jsonify(results)
@@ -52,7 +53,7 @@ def api_collection(name):
@app.route('/v1/collections//books', methods=['GET'])
def api_collection_books(name):
- queryset = Book.query.filter_by(collection=name).all()
+ queryset = Book.query.filter_by(collection=name).order_by(func.abs(Book.ourBookID)).all()
results = [x.serialize() for x in queryset]
return jsonify(results)
@@ -63,7 +64,7 @@ def api_collection_book(name, book_id):
@app.route('/v1/collections//books//hadiths', methods=['GET'])
def api_collection_book_hadiths(collection_name, book_id):
- queryset = Hadith.query.filter_by(collection=collection_name, bookID=book_id).all()
+ queryset = Hadith.query.filter_by(collection=collection_name, bookID=book_id).order_by(Hadith.englishURN).all()
results = [x.serialize() for x in queryset]
return jsonify(results)
From 55ca1beae9d38db262fface29325b83e2346beb2 Mon Sep 17 00:00:00 2001
From: Glaisher
Date: Mon, 8 Jun 2020 18:05:40 +0500
Subject: [PATCH 2/2] Implement pagination on list API endpoints
Default limit: 50
Max limit: 100
Example usage:
/v1/collections/bukhari/books/2/hadiths?limit=20&page=2
---
main.py | 35 +++++++++++++++++++++++++----------
1 file changed, 25 insertions(+), 10 deletions(-)
diff --git a/main.py b/main.py
index 06b94f0..29f5559 100644
--- a/main.py
+++ b/main.py
@@ -1,4 +1,5 @@
-from flask import Flask, jsonify
+import functools
+from flask import Flask, jsonify, request
from flask_swagger import swagger
from sqlalchemy import func
@@ -7,6 +8,23 @@
from models import db, HadithCollection, Book, Hadith
+def paginate_results(f):
+ @functools.wraps(f)
+ def decorated_function(*args, **kwargs):
+ limit = int(request.args.get('limit', 50))
+ page = int(request.args.get('page', 1))
+
+ queryset = f(*args, **kwargs).paginate(page=page, per_page=limit, max_per_page=100)
+ result = {
+ 'data': [x.serialize() for x in queryset.items],
+ 'total': queryset.total,
+ 'limit': queryset.per_page,
+ 'previous': queryset.prev_num,
+ 'next': queryset.next_num
+ }
+ return jsonify(result)
+ return decorated_function
+
@app.route('/', methods=['GET'])
def home():
return "Welcome to sunnah.com API.
"
@@ -19,10 +37,9 @@ def spec():
return jsonify(swag)
@app.route('/v1/collections', methods=['GET'])
+@paginate_results
def api_collections():
- queryset = HadithCollection.query.order_by(HadithCollection.collectionID).all()
- results = [x.serialize() for x in queryset]
- return jsonify(results)
+ return HadithCollection.query.order_by(HadithCollection.collectionID)
@app.route('/v1/collections/', methods=['GET'])
def api_collection(name):
@@ -52,10 +69,9 @@ def api_collection(name):
return jsonify(collection.serialize())
@app.route('/v1/collections//books', methods=['GET'])
+@paginate_results
def api_collection_books(name):
- queryset = Book.query.filter_by(collection=name).order_by(func.abs(Book.ourBookID)).all()
- results = [x.serialize() for x in queryset]
- return jsonify(results)
+ return Book.query.filter_by(collection=name).order_by(func.abs(Book.ourBookID))
@app.route('/v1/collections//books/', methods=['GET'])
def api_collection_book(name, book_id):
@@ -63,10 +79,9 @@ def api_collection_book(name, book_id):
return jsonify(book.serialize())
@app.route('/v1/collections//books//hadiths', methods=['GET'])
+@paginate_results
def api_collection_book_hadiths(collection_name, book_id):
- queryset = Hadith.query.filter_by(collection=collection_name, bookID=book_id).order_by(Hadith.englishURN).all()
- results = [x.serialize() for x in queryset]
- return jsonify(results)
+ return Hadith.query.filter_by(collection=collection_name, bookID=book_id).order_by(Hadith.englishURN)
if __name__ == '__main__':
app.run(host='0.0.0.0')