Skip to content

Commit

Permalink
rest: paginate get_files endpoint
Browse files Browse the repository at this point in the history
  • Loading branch information
mvidalgarcia committed Jul 15, 2020
1 parent b47e6f5 commit 771d130
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 7 deletions.
14 changes: 14 additions & 0 deletions docs/openapi.json
Expand Up @@ -1034,6 +1034,20 @@
"name": "workflow_id_or_name",
"required": true,
"type": "string"
},
{
"description": "Results page number (pagination).",
"in": "query",
"name": "page",
"required": false,
"type": "integer"
},
{
"description": "Number of results per page (pagination).",
"in": "query",
"name": "size",
"required": false,
"type": "integer"
}
],
"produces": [
Expand Down
15 changes: 9 additions & 6 deletions reana_workflow_controller/rest/utils.py
Expand Up @@ -129,12 +129,11 @@ def get_workflow_name(workflow):

def build_workflow_logs(workflow, steps=None, paginate=None):
"""Return the logs for all jobs of a workflow."""

query = Session.query(Job).filter_by(workflow_uuid=workflow.id_)
if steps:
query = query.filter(Job.job_name.in_(steps))
query = query.order_by(Job.created)
jobs = paginate(query).get("items")
jobs = paginate(query).get("items") if paginate else query
all_logs = OrderedDict()
for job in jobs:
item = {
Expand Down Expand Up @@ -572,13 +571,17 @@ def inner(*args, **kwargs):
)
)

def paginate(query):
items = query
def paginate(query_or_list):
items = query_or_list
has_prev, has_next = False, False
if req.get("size"):
items = query.slice(req["from_idx"], req["to_idx"])
if isinstance(query_or_list, list):
items = query_or_list[req["from_idx"] : req["to_idx"]]
has_next = req["to_idx"] < len(query_or_list)
else:
items = query_or_list.slice(req["from_idx"], req["to_idx"])
has_next = req["to_idx"] < query_or_list.count()
has_prev = req["from_idx"] > 0
has_next = req["to_idx"] < query.count()
req.update(dict(items=items, has_prev=has_prev, has_next=has_next))
return req

Expand Down
15 changes: 14 additions & 1 deletion reana_workflow_controller/rest/workflows_workspace.py
Expand Up @@ -27,6 +27,7 @@
get_workflow_name,
list_directory_files,
remove_files_recursive_wildcard,
use_paginate_args,
)
from reana_workflow_controller.rest.utils import mv_files

Expand Down Expand Up @@ -372,7 +373,8 @@ def delete_file(workflow_id_or_name, file_name): # noqa


@blueprint.route("/workflows/<workflow_id_or_name>/workspace", methods=["GET"])
def get_files(workflow_id_or_name): # noqa
@use_paginate_args()
def get_files(workflow_id_or_name, paginate=None): # noqa
r"""List all files contained in a workspace.
---
Expand All @@ -395,6 +397,16 @@ def get_files(workflow_id_or_name): # noqa
description: Required. Workflow UUID or name.
required: true
type: string
- name: page
in: query
description: Results page number (pagination).
required: false
type: integer
- name: size
in: query
description: Number of results per page (pagination).
required: false
type: integer
responses:
200:
description: >-
Expand Down Expand Up @@ -448,6 +460,7 @@ def get_files(workflow_id_or_name): # noqa
current_app.config["SHARED_VOLUME_PATH"], workflow.workspace_path
)
)
file_list = paginate(file_list)["items"]
return jsonify(file_list), 200

except ValueError:
Expand Down

0 comments on commit 771d130

Please sign in to comment.