From b78eabff6959fb88aafebadcbee365255e0cddb9 Mon Sep 17 00:00:00 2001
From: Daniel K Lyons <dlyons@nrao.edu>
Date: Wed, 2 Sep 2020 09:53:27 -0600
Subject: [PATCH] Move some of the processing into the route manipulations

---
 services/workflow/src/workflow/__init__.py |  9 +++++---
 services/workflow/src/workflow/workflow.py | 25 ++++++++++++++++++----
 2 files changed, 27 insertions(+), 7 deletions(-)

diff --git a/services/workflow/src/workflow/__init__.py b/services/workflow/src/workflow/__init__.py
index 4a8734bb7..62aa295e9 100644
--- a/services/workflow/src/workflow/__init__.py
+++ b/services/workflow/src/workflow/__init__.py
@@ -5,6 +5,8 @@ from sqlalchemy.orm import scoped_session, sessionmaker
 from zope.sqlalchemy import ZopeTransactionExtension
 from pyramid.renderers import JSONP
 
+from workflow.workflow import lookup_workflow, lookup_file
+
 DB = {}
 
 
@@ -17,9 +19,10 @@ def main(global_config, **settings):
         config.add_renderer('jsonp', JSONP(param_name='callback'))
 
         config.add_route('workflows', '/workflows')
-        config.add_route('workflow', '/workflows/{id}')
-        config.add_route('submit_workflow', '/workflows/{id}/submit')
-        config.add_route('workflow_files', '/workflows/{id}/files')
+        config.add_route('workflow', '/workflows/{id}', factory=lookup_workflow)
+        config.add_route('submit_workflow', '/workflows/{id}/submit', factory=lookup_workflow)
+        config.add_route('workflow_files', '/workflows/{id}/files', factory=lookup_workflow)
+        config.add_route('workflow_file', '/workflows/{id}/files/{filename}', factory=lookup_file)
 
         config.include('pyramid_beaker')
         config.scan('workflow.workflow')
diff --git a/services/workflow/src/workflow/workflow.py b/services/workflow/src/workflow/workflow.py
index 4c72c7737..46c9f890a 100644
--- a/services/workflow/src/workflow/workflow.py
+++ b/services/workflow/src/workflow/workflow.py
@@ -1,6 +1,15 @@
+from pyramid.response import Response
 from pyramid.view import view_config, view_defaults
 
-WORKFLOWS = [{'id': 1, 'name': 'foo', 'files': [{'id': 1, 'name': 'first file'}]}]
+WORKFLOWS = [{'id': 1, 'name': 'foo', 'files': {'file.txt': {'id': 1, 'name': 'file.txt', 'content': 'Hello, world!'}}}]
+
+
+def lookup_workflow(request):
+    return WORKFLOWS[int(request.matchdict['id'])]
+
+
+def lookup_file(request):
+    return lookup_workflow(request)['files'][request.matchdict['filename']]
 
 
 @view_defaults(route_name='workflows', renderer='json')
@@ -19,12 +28,12 @@ class WorkflowService:
 
     @view_config(request_method='GET', route_name='workflow')
     def get_workflow(self):
-        return WORKFLOWS[int(self.request.matchdict['id'])]
+        return self.request.context
 
     @view_config(request_method='POST', route_name='submit_workflow')
     def submit_workflow(self):
         # submit the workflow for processing
-        print(f"Submitting workflow {self.request.matchdict['id']}")
+        print(f"Submitting workflow {self.request.context['id']}")
 
     @view_config(request_method='POST', route_name='workflow_files')
     def add_file(self):
@@ -33,4 +42,12 @@ class WorkflowService:
 
     @view_config(request_method='GET', route_name='workflow_files')
     def get_files(self):
-        return WORKFLOWS[int(self.request.matchdict['id'])]['files']
+        return self.request.context['files']
+
+    @view_config(request_method='GET', route_name='workflow_file', accept='text/plain', renderer='string')
+    def get_file_text(self):
+        return self.request.context['content']
+
+    @view_config(request_method='GET', route_name='workflow_file', accept='application/json')
+    def get_file_json(self):
+        return self.request.context
\ No newline at end of file
-- 
GitLab