Skip to content

Commit 087ec30

Browse files
committed
remove define _projects_service.get_project_for_user
1 parent a9b80b2 commit 087ec30

File tree

3 files changed

+72
-40
lines changed

3 files changed

+72
-40
lines changed

services/web/server/src/simcore_service_webserver/projects/_controller/ports_rest.py

Lines changed: 39 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,8 @@
88
ProjectOutputGet,
99
)
1010
from models_library.basic_types import KeyIDStr
11-
from models_library.projects import ProjectID
1211
from models_library.projects_nodes import Node
1312
from models_library.projects_nodes_io import NodeID
14-
from models_library.users import UserID
1513
from models_library.utils.fastapi_encoders import jsonable_encoder
1614
from models_library.utils.services_io import JsonSchemaDict
1715
from pydantic import BaseModel, Field, TypeAdapter
@@ -26,29 +24,14 @@
2624
from ...models import ClientSessionHeaderParams
2725
from ...security.decorators import permission_required
2826
from ...utils_aiohttp import envelope_json_response
29-
from .. import _ports_service, _projects_service
30-
from .._access_rights_service import check_user_project_permission
27+
from .. import _access_rights_service, _nodes_service, _ports_service
3128
from .._projects_repository_legacy import ProjectDBAPI
32-
from ..models import ProjectDict
3329
from ._rest_exceptions import handle_plugin_requests_exceptions
3430
from ._rest_schemas import AuthenticatedRequestContext, ProjectPathParams
3531

3632
log = logging.getLogger(__name__)
3733

3834

39-
async def _get_validated_workbench_model(
40-
app: web.Application, project_id: ProjectID, user_id: UserID
41-
) -> dict[NodeID, Node]:
42-
project: ProjectDict = await _projects_service.get_project_for_user(
43-
app,
44-
project_uuid=f"{project_id}",
45-
user_id=user_id,
46-
include_state=False,
47-
)
48-
49-
return TypeAdapter(dict[NodeID, Node]).validate_python(project["workbench"])
50-
51-
5235
routes = web.RouteTableDef()
5336

5437

@@ -66,9 +49,17 @@ async def get_project_inputs(request: web.Request) -> web.Response:
6649

6750
assert request.app # nosec
6851

69-
workbench = await _get_validated_workbench_model(
70-
app=request.app, project_id=path_params.project_id, user_id=req_ctx.user_id
52+
await _access_rights_service.check_user_project_permission(
53+
request.app,
54+
product_name=req_ctx.product_name,
55+
user_id=req_ctx.user_id,
56+
project_id=path_params.project_id,
57+
permission="read",
58+
)
59+
workbench = await _nodes_service.get_project_nodes_map(
60+
app=request.app, project_id=path_params.project_id
7161
)
62+
7263
inputs: dict[NodeID, Any] = _ports_service.get_project_inputs(workbench)
7364

7465
return envelope_json_response(
@@ -94,8 +85,15 @@ async def update_project_inputs(request: web.Request) -> web.Response:
9485

9586
assert request.app # nosec
9687

97-
workbench = await _get_validated_workbench_model(
98-
app=request.app, project_id=path_params.project_id, user_id=req_ctx.user_id
88+
await _access_rights_service.check_user_project_permission(
89+
request.app,
90+
product_name=req_ctx.product_name,
91+
user_id=req_ctx.user_id,
92+
project_id=path_params.project_id,
93+
permission="write", # because we are updating inputs later
94+
)
95+
workbench = await _nodes_service.get_project_nodes_map(
96+
app=request.app, project_id=path_params.project_id
9997
)
10098
current_inputs: dict[NodeID, Any] = _ports_service.get_project_inputs(workbench)
10199

@@ -112,14 +110,6 @@ async def update_project_inputs(request: web.Request) -> web.Response:
112110
)
113111

114112
# patch workbench
115-
await check_user_project_permission(
116-
request.app,
117-
project_id=path_params.project_id,
118-
user_id=req_ctx.user_id,
119-
product_name=req_ctx.product_name,
120-
permission="write",
121-
)
122-
123113
assert db # nosec
124114
updated_project, _ = await db.update_project_multiple_node_data(
125115
user_id=req_ctx.user_id,
@@ -159,9 +149,17 @@ async def get_project_outputs(request: web.Request) -> web.Response:
159149

160150
assert request.app # nosec
161151

162-
workbench = await _get_validated_workbench_model(
163-
app=request.app, project_id=path_params.project_id, user_id=req_ctx.user_id
152+
await _access_rights_service.check_user_project_permission(
153+
request.app,
154+
product_name=req_ctx.product_name,
155+
user_id=req_ctx.user_id,
156+
project_id=path_params.project_id,
157+
permission="read",
164158
)
159+
workbench = await _nodes_service.get_project_nodes_map(
160+
app=request.app, project_id=path_params.project_id
161+
)
162+
165163
outputs: dict[NodeID, Any] = await _ports_service.get_project_outputs(
166164
request.app, project_id=path_params.project_id, workbench=workbench
167165
)
@@ -206,10 +204,16 @@ async def list_project_metadata_ports(request: web.Request) -> web.Response:
206204

207205
assert request.app # nosec
208206

209-
workbench = await _get_validated_workbench_model(
210-
app=request.app, project_id=path_params.project_id, user_id=req_ctx.user_id
207+
await _access_rights_service.check_user_project_permission(
208+
request.app,
209+
product_name=req_ctx.product_name,
210+
user_id=req_ctx.user_id,
211+
project_id=path_params.project_id,
212+
permission="read",
213+
)
214+
workbench = await _nodes_service.get_project_nodes_map(
215+
app=request.app, project_id=path_params.project_id
211216
)
212-
213217
return envelope_json_response(
214218
[
215219
ProjectMetadataPortGet(
Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,37 @@
11
from aiohttp import web
22
from models_library.projects import ProjectID
3+
from models_library.projects_nodes import Node
4+
from models_library.projects_nodes_io import NodeID
35
from models_library.services_types import ServiceKey, ServiceVersion
6+
from pydantic import TypeAdapter
47
from simcore_postgres_database.utils_projects_nodes import ProjectNodesRepo
5-
6-
from ..db.plugin import get_database_engine_legacy
8+
from simcore_postgres_database.utils_repos import pass_or_acquire_connection
9+
from simcore_service_webserver.db.plugin import get_asyncpg_engine
710

811

912
async def get_project_nodes_services(
1013
app: web.Application, *, project_uuid: ProjectID
1114
) -> list[tuple[ServiceKey, ServiceVersion]]:
1215
repo = ProjectNodesRepo(project_uuid=project_uuid)
1316

14-
async with get_database_engine_legacy(app).acquire() as conn:
15-
nodes = await repo.list(conn)
17+
async with pass_or_acquire_connection(get_asyncpg_engine(app)) as conn:
18+
project_nodes = await repo.list(conn)
1619

1720
# removes duplicates by preserving order
18-
return list(dict.fromkeys((node.key, node.version) for node in nodes))
21+
return list(dict.fromkeys((node.key, node.version) for node in project_nodes))
22+
23+
24+
async def get_project_nodes_map(
25+
app: web.Application, *, project_id: ProjectID
26+
) -> dict[NodeID, Node]:
27+
28+
repo = ProjectNodesRepo(project_uuid=project_id)
29+
30+
async with pass_or_acquire_connection(get_asyncpg_engine(app)) as conn:
31+
project_nodes = await repo.list(conn)
32+
33+
workbench = {
34+
project_node.node_id: project_node.model_dump_as_node()
35+
for project_node in project_nodes
36+
}
37+
return TypeAdapter(dict[NodeID, Node]).validate_python(workbench)

services/web/server/src/simcore_service_webserver/projects/_nodes_service.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,15 @@ async def get_project_nodes_services(
8181
)
8282

8383

84+
async def get_project_nodes_map(
85+
app: web.Application, *, project_id: ProjectID
86+
) -> dict[NodeID, Node]:
87+
"""
88+
Returns a map of node_id to Node for the given project_id which used to be called the project's `workbench`
89+
"""
90+
return await _nodes_repository.get_project_nodes_map(app, project_id=project_id)
91+
92+
8493
#
8594
# PREVIEWS
8695
#

0 commit comments

Comments
 (0)