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')