Skip to content

Commit 2e956b0

Browse files
committed
cleanup
1 parent 2389116 commit 2e956b0

File tree

2 files changed

+79
-71
lines changed

2 files changed

+79
-71
lines changed

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

Lines changed: 72 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
66
"""
77

8+
from typing import Any, Coroutine
9+
810
from aiohttp import web
911
from models_library.folders import FolderID, FolderQuery, FolderScope
1012
from models_library.projects import ProjectID
@@ -15,6 +17,9 @@
1517
from servicelib.utils import logged_gather
1618
from simcore_postgres_database.models.projects import ProjectType
1719
from simcore_postgres_database.webserver_models import ProjectType as ProjectTypeDB
20+
from simcore_service_webserver.projects._permalink_api import (
21+
aggregate_permalink_in_project,
22+
)
1823
from simcore_service_webserver.projects._projects_db import (
1924
batch_get_trashed_by_primary_gid,
2025
)
@@ -27,21 +32,74 @@
2732
from .models import ProjectDict, ProjectTypeAPI
2833

2934

30-
async def _batch_update_list_of_project_dict(
31-
app: web.Application, list_of_project_dict: list[ProjectDict]
32-
) -> list[ProjectDict]:
35+
def _batch_update(
36+
key: str,
37+
value_per_object: list[Any],
38+
objects: list[dict[str, Any]],
39+
):
40+
for obj, value in zip(objects, value_per_object, strict=True):
41+
obj[key] = value
42+
return objects
43+
44+
45+
async def _paralell_update(*update_per_object: Coroutine):
46+
return await logged_gather(
47+
*update_per_object,
48+
reraise=True,
49+
max_concurrency=100,
50+
)
3351

34-
# updating `trashed_by_primary_gid`
52+
53+
async def _aggregate_data_to_projects_from_other_sources(
54+
app: web.Application,
55+
*,
56+
db_projects: list[ProjectDict],
57+
db_project_types: list[ProjectTypeDB],
58+
user_id: UserID,
59+
) -> list[ProjectDict]:
60+
"""
61+
Aggregates data to each project from other sources, first as a batch-update and then as a parallel-update.
62+
"""
63+
# updating `project.trashed_by_primary_gid`
3564
trashed_by_primary_gid_values = await batch_get_trashed_by_primary_gid(
36-
app, projects_uuids=[ProjectID(p["uuid"]) for p in list_of_project_dict]
65+
app, projects_uuids=[ProjectID(p["uuid"]) for p in db_projects]
66+
)
67+
68+
_batch_update("trashed_by_primary_gid", trashed_by_primary_gid_values, db_projects)
69+
70+
# udpating `project.state`
71+
update_state_per_project = [
72+
projects_service.add_project_states_for_user(
73+
user_id=user_id,
74+
project=prj,
75+
is_template=prj_type == ProjectTypeDB.TEMPLATE,
76+
app=app,
77+
)
78+
for prj, prj_type in zip(db_projects, db_project_types, strict=False)
79+
]
80+
81+
updated_projects: list[ProjectDict] = await _paralell_update(
82+
*update_state_per_project,
3783
)
3884

39-
for project_dict, value in zip(
40-
list_of_project_dict, trashed_by_primary_gid_values, strict=True
41-
):
42-
project_dict.update(trashed_by_primary_gid=value)
85+
return updated_projects
86+
4387

44-
return list_of_project_dict
88+
async def aggregate_data_to_projects_from_request(
89+
request: web.Request,
90+
projects: list[ProjectDict],
91+
) -> list[ProjectDict]:
92+
93+
update_permalink_per_project = [
94+
# permalink
95+
aggregate_permalink_in_project(request, project=prj)
96+
for prj in projects
97+
]
98+
99+
updated_projects: list[ProjectDict] = await _paralell_update(
100+
*update_permalink_per_project,
101+
)
102+
return updated_projects
45103

46104

47105
async def list_projects( # pylint: disable=too-many-arguments
@@ -122,23 +180,8 @@ async def list_projects( # pylint: disable=too-many-arguments
122180
order_by=order_by,
123181
)
124182

125-
# AGGREGATE data to the project from other sources, first some sources
126-
# as batch-update and then as parallel-update
127-
db_projects = await _batch_update_list_of_project_dict(app, db_projects)
128-
129-
projects: list[ProjectDict] = await logged_gather(
130-
*(
131-
# state
132-
projects_service.add_project_states_for_user(
133-
user_id=user_id,
134-
project=prj,
135-
is_template=prj_type == ProjectTypeDB.TEMPLATE,
136-
app=app,
137-
)
138-
for prj, prj_type in zip(db_projects, db_project_types, strict=False)
139-
),
140-
reraise=True,
141-
max_concurrency=100,
183+
projects = await _aggregate_data_to_projects_from_other_sources(
184+
app, db_projects=db_projects, db_project_types=db_project_types, user_id=user_id
142185
)
143186

144187
return projects, total_number_projects
@@ -182,23 +225,8 @@ async def list_projects_full_depth(
182225
order_by=order_by,
183226
)
184227

185-
# AGGREGATE data to the project from other sources, first some sources
186-
# as BATCH-update and then as PARALLEL-update
187-
db_projects = await _batch_update_list_of_project_dict(app, db_projects)
188-
189-
projects: list[ProjectDict] = await logged_gather(
190-
*(
191-
# state
192-
projects_service.add_project_states_for_user(
193-
user_id=user_id,
194-
project=prj,
195-
is_template=prj_type == ProjectTypeDB.TEMPLATE,
196-
app=app,
197-
)
198-
for prj, prj_type in zip(db_projects, db_project_types, strict=False)
199-
),
200-
reraise=True,
201-
max_concurrency=100,
228+
projects = await _aggregate_data_to_projects_from_other_sources(
229+
app, db_projects=db_projects, db_project_types=db_project_types, user_id=user_id
202230
)
203231

204232
return projects, total_number_projects

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

Lines changed: 7 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@
3939
from servicelib.mimetype_constants import MIMETYPE_APPLICATION_JSON
4040
from servicelib.redis import get_project_locked_state
4141
from servicelib.rest_constants import RESPONSE_MODEL_POLICY
42-
from servicelib.utils import logged_gather
4342
from simcore_service_webserver.projects.models import ProjectDict
4443

4544
from .._meta import API_VTAG as VTAG
@@ -62,10 +61,7 @@
6261
ProjectsListQueryParams,
6362
ProjectsSearchQueryParams,
6463
)
65-
from ._permalink_api import (
66-
aggregate_permalink_in_project,
67-
update_or_pop_permalink_in_project,
68-
)
64+
from ._permalink_api import update_or_pop_permalink_in_project
6965
from .exceptions import (
7066
ProjectDeleteError,
7167
ProjectInvalidRightsError,
@@ -232,20 +228,12 @@ async def list_projects(request: web.Request):
232228
order_by=OrderBy.model_construct(**query_params.order_by.model_dump()),
233229
)
234230

235-
updated_projects: list[ProjectDict] = await logged_gather(
236-
# AGGREGATE data to the project from other sources and
237-
# that depend on the **request**.
238-
*(
239-
# permalink
240-
aggregate_permalink_in_project(request, project=prj)
241-
for prj in projects
242-
),
243-
reraise=True,
244-
max_concurrency=100,
231+
projects = await _crud_api_read.aggregate_data_to_projects_from_request(
232+
request, projects
245233
)
246234

247235
return _create_page_response(
248-
projects=updated_projects,
236+
projects=projects,
249237
request_url=request.url,
250238
total=total_number_of_projects,
251239
limit=query_params.limit,
@@ -280,20 +268,12 @@ async def list_projects_full_search(request: web.Request):
280268
order_by=OrderBy.model_construct(**query_params.order_by.model_dump()),
281269
)
282270

283-
updated_projects: list[ProjectDict] = await logged_gather(
284-
# AGGREGATE data to the project from other sources and
285-
# that depend on the **request**.
286-
*(
287-
# permalink
288-
aggregate_permalink_in_project(request, project=prj)
289-
for prj in projects
290-
),
291-
reraise=True,
292-
max_concurrency=100,
271+
projects = await _crud_api_read.aggregate_data_to_projects_from_request(
272+
request, projects
293273
)
294274

295275
return _create_page_response(
296-
projects=updated_projects,
276+
projects=projects,
297277
request_url=request.url,
298278
total=total_number_of_projects,
299279
limit=query_params.limit,

0 commit comments

Comments
 (0)