Skip to content

Commit e01614b

Browse files
committed
permalink factory: undo
1 parent b60215c commit e01614b

File tree

5 files changed

+45
-38
lines changed

5 files changed

+45
-38
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -413,7 +413,7 @@ async def create_project( # pylint: disable=too-many-arguments,too-many-branche
413413
task_progress.update()
414414

415415
# Adds permalink
416-
await update_or_pop_permalink_in_project(request.app, new_project)
416+
await update_or_pop_permalink_in_project(request, new_project)
417417

418418
# Adds folderId
419419
user_specific_project_data_db = (

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

Lines changed: 20 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -28,25 +28,9 @@
2828
from .models import ProjectDict, ProjectTypeAPI
2929

3030

31-
async def _update_project_dict(
32-
app: web.Application,
33-
*,
34-
user_id: UserID,
35-
project: ProjectDict,
36-
is_template: bool,
37-
) -> ProjectDict:
38-
# state
39-
await projects_service.add_project_states_for_user(
40-
user_id=user_id,
41-
project=project,
42-
is_template=is_template,
43-
app=app,
44-
)
45-
46-
# permalink
47-
await update_or_pop_permalink_in_project(app, project)
48-
49-
return project
31+
async def _sequential_execution(*coros):
32+
for coro in coros:
33+
await coro # Ensures each coroutine runs in sequence
5034

5135

5236
async def _batch_update_list_of_project_dict(
@@ -145,15 +129,22 @@ async def list_projects( # pylint: disable=too-many-arguments
145129
order_by=order_by,
146130
)
147131

132+
# AGGREGATE data to the project from other sources, first some sources
133+
# as batch-update and then as parallel-update
148134
db_projects = await _batch_update_list_of_project_dict(app, db_projects)
149135

150136
projects: list[ProjectDict] = await logged_gather(
151137
*(
152-
_update_project_dict(
153-
request.app,
154-
user_id=user_id,
155-
project=prj,
156-
is_template=prj_type == ProjectTypeDB.TEMPLATE,
138+
_sequential_execution(
139+
# state
140+
projects_service.add_project_states_for_user(
141+
user_id=user_id,
142+
project=prj,
143+
is_template=prj_type == ProjectTypeDB.TEMPLATE,
144+
app=request.app,
145+
),
146+
# permalink
147+
update_or_pop_permalink_in_project(request, project=prj),
157148
)
158149
for prj, prj_type in zip(db_projects, db_project_types, strict=False)
159150
),
@@ -202,15 +193,18 @@ async def list_projects_full_depth(
202193
order_by=order_by,
203194
)
204195

196+
# AGGREGATE data to the project from other sources, first some sources
197+
# as BATCH-update and then as PARALLEL-update
205198
db_projects = await _batch_update_list_of_project_dict(app, db_projects)
206199

207200
projects: list[ProjectDict] = await logged_gather(
208201
*(
209-
_update_project_dict(
210-
app,
202+
# state
203+
projects_service.add_project_states_for_user(
211204
user_id=user_id,
212205
project=prj,
213206
is_template=prj_type == ProjectTypeDB.TEMPLATE,
207+
app=app,
214208
)
215209
for prj, prj_type in zip(db_projects, db_project_types, strict=False)
216210
),

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

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
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
4243
from simcore_service_webserver.projects.models import ProjectDict
4344

4445
from .._meta import API_VTAG as VTAG
@@ -264,8 +265,20 @@ async def list_projects_full_search(request: web.Request):
264265
order_by=OrderBy.model_construct(**query_params.order_by.model_dump()),
265266
)
266267

268+
updated_projects: list[ProjectDict] = await logged_gather(
269+
# AGGREGATE data to the project from other sources and
270+
# that depend on the **request**.
271+
*(
272+
# permalink
273+
update_or_pop_permalink_in_project(request, prj)
274+
for prj in projects
275+
),
276+
reraise=True,
277+
max_concurrency=100,
278+
)
279+
267280
return _create_page_response(
268-
projects=projects,
281+
projects=updated_projects,
269282
request_url=request.url,
270283
total=total_number_of_projects,
271284
limit=query_params.limit,
@@ -312,7 +325,7 @@ async def get_active_project(request: web.Request) -> web.Response:
312325
)
313326

314327
# updates project's permalink field
315-
await update_or_pop_permalink_in_project(request.app, project)
328+
await update_or_pop_permalink_in_project(request, project)
316329

317330
data = ProjectGet.from_domain_model(project).data(exclude_unset=True)
318331

@@ -370,7 +383,7 @@ async def get_project(request: web.Request):
370383
project["uuid"] = new_uuid
371384

372385
# Adds permalink
373-
await update_or_pop_permalink_in_project(request.app, project)
386+
await update_or_pop_permalink_in_project(request, project)
374387

375388
data = ProjectGet.from_domain_model(project).data(exclude_unset=True)
376389
return web.json_response({"data": data}, dumps=json_dumps)

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515

1616
class CreateLinkCoroutine(Protocol):
1717
async def __call__(
18-
self, app: web.Application, project_id: ProjectID
18+
self, request: web.Request, project_uuid: ProjectID
1919
) -> ProjectPermalink:
2020
...
2121

@@ -39,13 +39,13 @@ def _get_factory(app: web.Application) -> CreateLinkCoroutine:
3939

4040

4141
async def _create_permalink(
42-
app: web.Application, project_id: ProjectID
42+
request: web.Request, project_uuid: ProjectID
4343
) -> ProjectPermalink:
44-
create_coro: CreateLinkCoroutine = _get_factory(app)
44+
create_coro: CreateLinkCoroutine = _get_factory(request.app)
4545

4646
try:
4747
permalink: ProjectPermalink = await asyncio.wait_for(
48-
create_coro(app, project_id),
48+
create_coro(request=request, project_uuid=project_uuid),
4949
timeout=_PERMALINK_CREATE_TIMEOUT_S,
5050
)
5151
return permalink
@@ -55,7 +55,7 @@ async def _create_permalink(
5555

5656

5757
async def update_or_pop_permalink_in_project(
58-
app: web.Application, project: ProjectDict
58+
request: web.Request, project: ProjectDict
5959
) -> ProjectPermalink | None:
6060
"""Updates permalink entry in project
6161
@@ -64,7 +64,7 @@ async def update_or_pop_permalink_in_project(
6464
If fails, it pops it from project (so it is not set in the pydantic model. SEE ProjectGet.permalink)
6565
"""
6666
try:
67-
permalink = await _create_permalink(app, project_id=project["uuid"])
67+
permalink = await _create_permalink(request, project_uuid=project["uuid"])
6868

6969
assert permalink # nosec
7070
project["permalink"] = permalink

services/web/server/src/simcore_service_webserver/studies_dispatcher/_projects_permalinks.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,14 +74,14 @@ def create_permalink_for_study(
7474

7575

7676
async def permalink_factory(
77-
app: web.Application, project_uuid: ProjectID
77+
request: web.Request, project_uuid: ProjectID
7878
) -> ProjectPermalink:
7979
"""
8080
- Assumes project_id is up-to-date in the database
8181
8282
"""
8383
# NOTE: next iterations will mobe this as part of the project repository pattern
84-
engine = get_database_engine(app)
84+
engine = get_database_engine(request.app)
8585
async with engine.acquire() as conn:
8686
access_rights_subquery = (
8787
sa.select(

0 commit comments

Comments
 (0)