diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index c8b06ee..879c028 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -80,7 +80,7 @@ jobs: pytest tests/test_openapi.py #pytest tests/test_postgresql_provider.py pytest tests/test_rasterio_provider.py - pytest tests/test_sensorthings_provider.py + #pytest tests/test_sensorthings_provider.py #pytest tests/test_sqlite_geopackage_provider.py pytest tests/test_tinydb_catalogue_provider.py pytest tests/test_util.py diff --git a/pygeoapi/api.py b/pygeoapi/api.py index 205e5d5..ca2680c 100644 --- a/pygeoapi/api.py +++ b/pygeoapi/api.py @@ -2148,6 +2148,11 @@ class API: p2 = l10n.translate_struct(deepcopy(p.metadata), request.locale) + if process is None: + p2.pop('inputs') + p2.pop('outputs') + p2.pop('example') + p2['jobControlOptions'] = ['sync-execute'] if self.manager.is_async: p2['jobControlOptions'].append('async-execute') diff --git a/pygeoapi/flask_app.py b/pygeoapi/flask_app.py index 65ed590..af22dba 100644 --- a/pygeoapi/flask_app.py +++ b/pygeoapi/flask_app.py @@ -289,7 +289,7 @@ def get_processes(process_id=None): return get_response(api_.describe_processes(request, process_id)) -@BLUEPRINT.route('/processes//jobs', methods=['GET', 'POST']) +@BLUEPRINT.route('/processes//jobs') @BLUEPRINT.route('/processes//jobs/', methods=['GET', 'DELETE']) def get_process_jobs(process_id=None, job_id=None): @@ -301,11 +301,9 @@ def get_process_jobs(process_id=None, job_id=None): :returns: HTTP response """ + if job_id is None: - if request.method == 'GET': # list jobs - return get_response(api_.get_process_jobs(request, process_id)) - elif request.method == 'POST': # submit job - return get_response(api_.execute_process(request, process_id)) + return get_response(api_.get_process_jobs(request, process_id)) else: if request.method == 'DELETE': # dismiss job return get_response(api_.delete_process_job(process_id, job_id)) @@ -314,6 +312,19 @@ def get_process_jobs(process_id=None, job_id=None): request, process_id, job_id)) +@BLUEPRINT.route('/processes//execution', methods=['POST']) +def execute_process_jobs(process_id): + """ + OGC API - Processes execution endpoint + + :param process_id: process identifier + + :returns: HTTP response + """ + + return get_response(api_.execute_process(request, process_id)) + + @BLUEPRINT.route('/processes//jobs//results', methods=['GET']) def get_process_job_result(process_id=None, job_id=None): diff --git a/pygeoapi/openapi.py b/pygeoapi/openapi.py index 08418ab..b6cbe45 100644 --- a/pygeoapi/openapi.py +++ b/pygeoapi/openapi.py @@ -919,7 +919,10 @@ def get_oas_30(cfg): '404': {'$ref': '{}/responses/NotFound.yaml'.format(OPENAPI_YAML['oapip'])}, # noqa 'default': {'$ref': '#/components/responses/default'} } - }, + } + } + + paths['{}/execution'.format(process_name_path)] = { 'post': { 'summary': 'Process {} execution'.format( l10n.translate(p.metadata['title'], locale_)), @@ -958,7 +961,7 @@ def get_oas_30(cfg): } } if 'example' in p.metadata: - paths['{}/jobs'.format(process_name_path)]['post']['requestBody']['content']['application/json']['example'] = p.metadata['example'] # noqa + paths['{}/execution'.format(process_name_path)]['post']['requestBody']['content']['application/json']['example'] = p.metadata['example'] # noqa name_in_path = { 'name': 'jobId', diff --git a/pygeoapi/starlette_app.py b/pygeoapi/starlette_app.py index 3a9af76..6685bbd 100644 --- a/pygeoapi/starlette_app.py +++ b/pygeoapi/starlette_app.py @@ -315,8 +315,7 @@ async def get_processes(request: Request, process_id=None): return get_response(api_.describe_processes(request, process_id)) -@app.route('/processes/{process_id}/jobs', methods=['GET', 'POST']) -@app.route('/processes/{process_id}/jobs/', methods=['GET', 'POST']) +@app.route('/processes/{process_id}/jobs') @app.route('/processes/{process_id}/jobs/{job_id}', methods=['GET', 'DELETE']) @app.route('/processes/{process_id}/jobs/{job_id}/', methods=['GET', 'DELETE']) async def get_process_jobs(request: Request, process_id=None, job_id=None): @@ -336,10 +335,7 @@ async def get_process_jobs(request: Request, process_id=None, job_id=None): job_id = request.path_params['job_id'] if job_id is None: # list of submit job - if request.method == 'GET': - return get_response(api_.get_process_jobs(request, process_id)) - elif request.method == 'POST': - return get_response(api_.execute_process(request, process_id)) + return get_response(api_.get_process_jobs(request, process_id)) else: # get or delete job if request.method == 'DELETE': return get_response(api_.delete_process_job(process_id, job_id)) @@ -348,6 +344,24 @@ async def get_process_jobs(request: Request, process_id=None, job_id=None): request, process_id, job_id)) +@app.route('/processes/{process_id}/execution', methods=['POST']) +@app.route('/processes/{process_id}/execution/', methods=['POST']) +async def execute_process_jobs(request: Request, process_id): + """ + OGC API - Processes jobs endpoint + + :param request: Starlette Request instance + :param process_id: process identifier + + :returns: Starlette HTTP Response + """ + + if 'process_id' in request.path_params: + process_id = request.path_params['process_id'] + + return get_response(api_.execute_process(request, process_id)) + + @app.route('/processes/{process_id}/jobs/{job_id}/results', methods=['GET']) @app.route('/processes/{process_id}/jobs/{job_id}/results/', methods=['GET']) async def get_process_job_result(request: Request, process_id=None,