Experimental pagination feedback for API

This commit is contained in:
krateng 2023-10-24 23:00:10 +02:00
parent 7ac6473ce3
commit f613abaa20
2 changed files with 40 additions and 2 deletions

View File

@ -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.

View File

@ -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")