Skip to content

Commit e9f6427

Browse files
committed
🎨 Refactor create_study_job to utilize StudyService and streamline job creation process
1 parent 2296255 commit e9f6427

File tree

2 files changed

+19
-72
lines changed

2 files changed

+19
-72
lines changed

services/api-server/src/simcore_service_api_server/api/dependencies/services.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,11 +98,19 @@ def get_solver_service(
9898

9999
def get_study_service(
100100
job_service: Annotated[JobService, Depends(get_job_service)],
101+
webserver_api: Annotated[AuthSession, Depends(get_webserver_session)],
102+
wb_api_rpc: Annotated[WbApiRpcClient, Depends(get_wb_api_rpc_client)],
101103
user_id: Annotated[UserID, Depends(get_current_user_id)],
102104
product_name: Annotated[ProductName, Depends(get_product_name)],
103105
) -> StudyService:
106+
"""
107+
"Assembles" the StudyService layer to the underlying service and client interfaces
108+
in the context of the rest controller (i.e. api/dependencies)
109+
"""
104110
return StudyService(
105111
job_service=job_service,
112+
webserver_api=webserver_api,
113+
wb_api_rpc=wb_api_rpc,
106114
user_id=user_id,
107115
product_name=product_name,
108116
)

services/api-server/src/simcore_service_api_server/api/routes/studies_jobs.py

Lines changed: 11 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,13 @@
11
import logging
22
from collections.abc import Callable
33
from typing import Annotated
4-
from uuid import UUID
54

65
from fastapi import APIRouter, Depends, Header, Query, Request, status
76
from fastapi.encoders import jsonable_encoder
87
from fastapi.responses import JSONResponse
98
from fastapi_pagination.api import create_page
10-
from models_library.api_schemas_webserver.projects import ProjectPatch
11-
from models_library.api_schemas_webserver.projects_nodes import NodeOutputs
129
from models_library.clusters import ClusterID
13-
from models_library.function_services_catalog.services import file_picker
1410
from models_library.projects import ProjectID
15-
from models_library.projects_nodes import InputID, InputTypes
1611
from models_library.projects_nodes_io import NodeID
1712
from pydantic import HttpUrl, PositiveInt
1813
from servicelib.logging_utils import log_context
@@ -42,19 +37,13 @@
4237
from ...services_http.solver_job_models_converters import create_jobstatus_from_task
4338
from ...services_http.storage import StorageApi
4439
from ...services_http.study_job_models_converters import (
45-
create_job_from_study,
4640
create_job_outputs_from_project_outputs,
47-
get_project_and_file_inputs_from_job_inputs,
4841
)
4942
from ...services_http.webserver import AuthSession
50-
from ...services_rpc.wb_api_server import WbApiRpcClient
5143
from ..dependencies.application import get_reverse_url_mapper
52-
from ..dependencies.authentication import get_current_user_id, get_product_name
44+
from ..dependencies.authentication import get_current_user_id
5345
from ..dependencies.services import get_api_client, get_study_service
5446
from ..dependencies.webserver_http import AuthSession, get_webserver_session
55-
from ..dependencies.webserver_rpc import (
56-
get_wb_api_rpc_client,
57-
)
5847
from ._constants import (
5948
FMSG_CHANGELOG_CHANGED_IN_VERSION,
6049
FMSG_CHANGELOG_NEW_IN_VERSION,
@@ -98,9 +87,6 @@ async def list_study_jobs(
9887
study_service: Annotated[StudyService, Depends(get_study_service)],
9988
url_for: Annotated[Callable, Depends(get_reverse_url_mapper)],
10089
):
101-
msg = f"list study jobs study_id={study_id!r} with pagination={page_params!r}. SEE https://github.com/ITISFoundation/osparc-simcore/issues/4177"
102-
_logger.debug(msg)
103-
10490
jobs, meta = await study_service.list_jobs(
10591
filter_by_study_id=study_id,
10692
pagination_offset=page_params.offset,
@@ -128,27 +114,24 @@ async def list_study_jobs(
128114
async def create_study_job(
129115
study_id: StudyID,
130116
job_inputs: JobInputs,
131-
webserver_api: Annotated[AuthSession, Depends(get_webserver_session)],
132-
wb_api_rpc: Annotated[WbApiRpcClient, Depends(get_wb_api_rpc_client)],
117+
study_service: Annotated[StudyService, Depends(get_study_service)],
133118
url_for: Annotated[Callable, Depends(get_reverse_url_mapper)],
134-
user_id: Annotated[PositiveInt, Depends(get_current_user_id)],
135-
product_name: Annotated[str, Depends(get_product_name)],
136-
hidden: Annotated[bool, Query()] = True, # noqa: FBT002
119+
hidden: Annotated[
120+
bool, Query(description="If True (default) hides project from UI")
121+
] = True, # noqa: FBT002
137122
x_simcore_parent_project_uuid: ProjectID | None = Header(default=None),
138123
x_simcore_parent_node_id: NodeID | None = Header(default=None),
139124
) -> Job:
140-
"""
141-
hidden -- if True (default) hides project from UI
142-
"""
143-
project = await webserver_api.clone_project(
144-
project_id=study_id,
125+
126+
job = await study_service.create_job(
127+
study_id=study_id,
128+
job_inputs=job_inputs,
145129
hidden=hidden,
146130
parent_project_uuid=x_simcore_parent_project_uuid,
147131
parent_node_id=x_simcore_parent_node_id,
148132
)
149-
job = create_job_from_study(
150-
study_key=study_id, project=project, job_inputs=job_inputs
151-
)
133+
134+
# Set URLs in the controller
152135
job.url = url_for(
153136
"get_study_job",
154137
study_id=study_id,
@@ -161,50 +144,6 @@ async def create_study_job(
161144
job_id=job.id,
162145
)
163146

164-
await webserver_api.patch_project(
165-
project_id=job.id,
166-
patch_params=ProjectPatch(name=job.name), # type: ignore[arg-type]
167-
)
168-
169-
await wb_api_rpc.mark_project_as_job(
170-
product_name=product_name,
171-
user_id=user_id,
172-
project_uuid=job.id,
173-
job_parent_resource_name=job.runner_name,
174-
)
175-
176-
project_inputs = await webserver_api.get_project_inputs(project_id=project.uuid)
177-
178-
file_param_nodes = {}
179-
for node_id, node in project.workbench.items():
180-
if (
181-
node.key == file_picker.META.key
182-
and node.outputs is not None
183-
and len(node.outputs) == 0
184-
):
185-
file_param_nodes[node.label] = node_id
186-
187-
file_inputs: dict[InputID, InputTypes] = {}
188-
189-
(
190-
new_project_inputs,
191-
new_project_file_inputs,
192-
) = get_project_and_file_inputs_from_job_inputs(
193-
project_inputs, file_inputs, job_inputs
194-
)
195-
196-
for node_label, file_link in new_project_file_inputs.items():
197-
await webserver_api.update_node_outputs(
198-
project_id=project.uuid,
199-
node_id=UUID(file_param_nodes[node_label]),
200-
new_node_outputs=NodeOutputs(outputs={"outFile": file_link}),
201-
)
202-
203-
if len(new_project_inputs) > 0:
204-
await webserver_api.update_project_inputs(
205-
project_id=project.uuid, new_inputs=new_project_inputs
206-
)
207-
208147
assert job.name == _compose_job_resource_name(study_id, job.id)
209148

210149
return job

0 commit comments

Comments
 (0)