diff --git a/src/models.py b/src/models.py index 1cf739fe055f8067f0341ff2c236aa2625dfc15c..5fd43b4bb7d003e776134620f6bcdbddf0f38cce 100644 --- a/src/models.py +++ b/src/models.py @@ -21,6 +21,7 @@ import datetime from sqlalchemy import create_engine, Column, DateTime, String, Integer, Boolean +from sqlalchemy.event import listen from flask_sqlalchemy import SQLAlchemy from flask_marshmallow import Marshmallow @@ -83,6 +84,28 @@ class PlayLog(db.Model): return track + @staticmethod + def paginate(page, page_size): + """ + Returns a list of entries for a given page. + """ + def q(page=0, page_size=None): + query = db.session.query(PlayLog) + listen(query, 'before_compile', apply_limit(page, page_size), retval=True) + return query + + def apply_limit(page, page_size): + def wrapped(query): + if page_size: + query = query.limit(page_size) + if page: + query = query.offset(page * page_size) + return query + return wrapped + + return q(page, page_size) + + @staticmethod def select_last_hours(n): """ @@ -131,7 +154,7 @@ class PlayLogSchema(ma.SQLAlchemyAutoSchema): sqla_session = db.session -class TrackServiceSchema(ma.SQLAlchemySchema): +class TrackSchema(ma.SQLAlchemySchema): """ Schema for trackservice entries. """ diff --git a/src/rest/controllers/public_controller.py b/src/rest/controllers/public_controller.py index d0e287016fa71f40518a027a57772391399f1e43..f9fc50ddcd18052925ea4c34b310f8c5878869fa 100644 --- a/src/rest/controllers/public_controller.py +++ b/src/rest/controllers/public_controller.py @@ -1,4 +1,3 @@ - import datetime import connexion import six @@ -7,8 +6,6 @@ from src.rest.models.play_log_entry import PlayLogEntry # noqa: E501 from src.rest import util from flask import current_app - - def current_track(): # noqa: E501 """Get current track @@ -21,17 +18,18 @@ def current_track(): # noqa: E501 return service.current_track() -def list_tracks(offset=None, limit=None): # noqa: E501 +def list_tracks(page=None, limit=None): # noqa: E501 """List recent tracks in the play-log - Lists the most recent track-service entries. # noqa: E501 + Lists the track-service entries for a given page. # noqa: E501 - :param offset: The number of items to skip before starting to collect the result set - :type offset: int - :param limit: The numbers of items to return + :param page: The number of items to skip before starting to collect the result set + :type page: int + :param limit: The numbers of items to return per page :type limit: int :rtype: List[PlayLogEntry] """ service = current_app.config['SERVICE'] - return service.list_tracks(offset, limit) \ No newline at end of file + return service.list_tracks(offset, limit) + \ No newline at end of file diff --git a/src/rest/swagger/swagger.yaml b/src/rest/swagger/swagger.yaml index 6faa7e1a333bdfbcf88890841d4cbcd5323f43c1..467ce794e28134657f49ce3e928190b9e79be6d0 100644 --- a/src/rest/swagger/swagger.yaml +++ b/src/rest/swagger/swagger.yaml @@ -41,10 +41,10 @@ paths: - public summary: List recent tracks in the play-log description: | - Lists the most recent track-service entries. + Lists the track-service entries for a given page. operationId: list_tracks parameters: - - name: offset + - name: page in: query description: The number of items to skip before starting to collect the result set @@ -55,7 +55,7 @@ paths: type: integer - name: limit in: query - description: The numbers of items to return + description: The numbers of items to return per page required: false style: form explode: true diff --git a/src/service.py b/src/service.py index 712db26e056d5ba651eef26d7bcef8d3e419b0b8..6223f08b56bdb6a518e912be6297a6262e19aa17 100644 --- a/src/service.py +++ b/src/service.py @@ -19,7 +19,8 @@ import datetime -from models import PlayLog, TrackServiceSchema +from models import PlayLog, TrackSchema + class ApiService(): @@ -44,22 +45,25 @@ class ApiService(): (PlayLogEntry) """ track = PlayLog.select_current() - track_schema = TrackServiceSchema() + track_schema = TrackSchema() return track_schema.dump(track) - def list_tracks(self, offset=None, limit=None): + def list_tracks(self, page=None, size=None): """ - Lists the most recent track-service entries. + Lists track-service entries with pagination. Args: - offset (Integer): The number of items to skip before starting to collect the result set - limit (Integer): The numbers of items to return + page (Integer): The number of the page to return + size (Integer): The numbers of items to return Returns: (List[PlayLogEntry]) """ - return "some list of tracks" + if not size or size > 50 or size < 1: size = 20 + tracklist = PlayLog.paginate(page, size) + tracklist_schema = TrackSchema(many=True) + return tracklist_schema.dump(tracklist) def clock_info(self):