From f613abaa2059bd8af53bcdecdc6ceb8761b2e9ad Mon Sep 17 00:00:00 2001 From: krateng Date: Tue, 24 Oct 2023 23:00:10 +0200 Subject: [PATCH] Experimental pagination feedback for API --- maloja/apis/native_v1.py | 34 +++++++++++++++++++++++++++++++++- maloja/malojauri.py | 8 +++++++- 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/maloja/apis/native_v1.py b/maloja/apis/native_v1.py index 1f5d4b2..58c2a8f 100644 --- a/maloja/apis/native_v1.py +++ b/maloja/apis/native_v1.py @@ -18,7 +18,7 @@ from ..pkg_global.conf import malojaconfig, data_dir from ..__pkginfo__ import VERSION -from ..malojauri import uri_to_internal, compose_querystring, internal_to_uri +from ..malojauri import uri_to_internal, compose_querystring, internal_to_uri, create_uri from .. import images from ._apikeys import apikeystore, api_key_correct @@ -142,6 +142,37 @@ def add_common_args_to_docstring(filterkeys=False,limitkeys=False,delimitkeys=Fa + +def add_pagination(endpoint,filterkeys=False,limitkeys=False,delimitkeys=False): + + def decorator(func): + def wrapper(*args,**kwargs): + + k_filter, k_limit, k_delimit, k_amount, _ = uri_to_internal(kwargs,api=True) + keydicts = [] + if filterkeys: keydicts.append(k_filter) + if limitkeys: keydicts.append(k_limit) + if delimitkeys: keydicts.append(k_delimit) + keydicts.append(k_amount) + + + result = func(*args,**kwargs) + + result['pagination'] = { + 'page': k_amount['page'], + 'perpage': k_amount['perpage'] if (k_amount['perpage'] is not math.inf) else None, + 'next_page': create_uri(api.pathprefix + '/' + endpoint,*keydicts,{'page':k_amount['page']+1}) if len(result.get('list',[]))==k_amount['perpage'] else None, + 'prev_page': create_uri(api.pathprefix + '/' + endpoint,*keydicts,{'page':k_amount['page']-1}) if k_amount['page'] > 0 else None + } + + return result + + wrapper.__doc__ = func.__doc__ + wrapper.__annotations__ = func.__annotations__ + return wrapper + + return decorator + @api.get("test") @catch_exceptions def test_server(key=None): @@ -194,6 +225,7 @@ def server_info(): @api.get("scrobbles") @catch_exceptions @add_common_args_to_docstring(filterkeys=True,limitkeys=True,amountkeys=True) +@add_pagination("scrobbles",filterkeys=True,limitkeys=True) def get_scrobbles_external(**keys): """Returns a list of scrobbles. diff --git a/maloja/malojauri.py b/maloja/malojauri.py index 6546317..e95e472 100644 --- a/maloja/malojauri.py +++ b/maloja/malojauri.py @@ -73,7 +73,11 @@ def uri_to_internal(keys,forceTrack=False,forceArtist=False,forceAlbum=False,api #different max than the internal one! the user doesn't get to disable pagination if "page" in keys: amountkeys["page"] = int(keys["page"]) if "perpage" in keys: amountkeys["perpage"] = int(keys["perpage"]) - + #amountkeys["reverse"] = (keys.get("reverse","no").lower() == "yes") + # we have different defaults for different things, so here we need to actually pass true false or nothing dependent + # on whether its specified + if keys.get("reverse","").lower() == 'yes': amountkeys['reverse'] = True + elif keys.get("reverse","").lower() == 'no': amountkeys['reverse'] = False #5 specialkeys = {} @@ -144,6 +148,8 @@ def internal_to_uri(keys): urikeys.append("page",str(keys["page"])) if "perpage" in keys: urikeys.append("perpage",str(keys["perpage"])) + if "reverse" in keys: + urikeys.append("reverse","yes" if keys['reverse'] else "no") if keys.get("separate",False): urikeys.append("separate","yes")