Skip to content

Commit f8ca49f

Browse files
committed
permalink factory: changes interface
1 parent a334d69 commit f8ca49f

File tree

5 files changed

+24
-21
lines changed

5 files changed

+24
-21
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, new_project)
416+
await update_or_pop_permalink_in_project(request.app, 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: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ async def _update_project_dict(
4444
)
4545

4646
# permalink
47-
await update_or_pop_permalink_in_project(request, project)
47+
await update_or_pop_permalink_in_project(request.app, project)
4848

4949
return project
5050

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -312,7 +312,7 @@ async def get_active_project(request: web.Request) -> web.Response:
312312
)
313313

314314
# updates project's permalink field
315-
await update_or_pop_permalink_in_project(request, project)
315+
await update_or_pop_permalink_in_project(request.app, project)
316316

317317
data = ProjectGet.from_domain_model(project).data(exclude_unset=True)
318318

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

372372
# Adds permalink
373-
await update_or_pop_permalink_in_project(request, project)
373+
await update_or_pop_permalink_in_project(request.app, project)
374374

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

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

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import asyncio
22
import logging
3-
from collections.abc import Callable, Coroutine
4-
from typing import Any, cast
3+
from typing import Protocol, cast
54

65
from aiohttp import web
76
from models_library.api_schemas_webserver.permalinks import ProjectPermalink
@@ -13,21 +12,24 @@
1312
_PROJECT_PERMALINK = f"{__name__}"
1413
_logger = logging.getLogger(__name__)
1514

16-
_CreateLinkCallable = Callable[
17-
[web.Request, ProjectID], Coroutine[Any, Any, ProjectPermalink]
18-
]
1915

16+
class CreateLinkCoroutine(Protocol):
17+
async def __call__(
18+
self, app: web.Application, project_id: ProjectID
19+
) -> ProjectPermalink:
20+
...
2021

21-
def register_factory(app: web.Application, factory_coro: _CreateLinkCallable):
22+
23+
def register_factory(app: web.Application, factory_coro: CreateLinkCoroutine):
2224
if _create := app.get(_PROJECT_PERMALINK):
2325
msg = f"Permalink factory can only be set once: registered {_create}"
2426
raise PermalinkFactoryError(msg)
2527
app[_PROJECT_PERMALINK] = factory_coro
2628

2729

28-
def _get_factory(app: web.Application) -> _CreateLinkCallable:
30+
def _get_factory(app: web.Application) -> CreateLinkCoroutine:
2931
if _create := app.get(_PROJECT_PERMALINK):
30-
return cast(_CreateLinkCallable, _create)
32+
return cast(CreateLinkCoroutine, _create)
3133

3234
msg = "Undefined permalink factory. Check plugin initialization."
3335
raise PermalinkFactoryError(msg)
@@ -37,22 +39,23 @@ def _get_factory(app: web.Application) -> _CreateLinkCallable:
3739

3840

3941
async def _create_permalink(
40-
request: web.Request, project_id: ProjectID
42+
app: web.Application, project_id: ProjectID
4143
) -> ProjectPermalink:
42-
create = _get_factory(request.app)
44+
create_coro: CreateLinkCoroutine = _get_factory(app)
4345

4446
try:
4547
permalink: ProjectPermalink = await asyncio.wait_for(
46-
create(request, project_id), timeout=_PERMALINK_CREATE_TIMEOUT_S
48+
create_coro(app, project_id),
49+
timeout=_PERMALINK_CREATE_TIMEOUT_S,
4750
)
4851
return permalink
49-
except asyncio.TimeoutError as err:
50-
msg = f"Permalink factory callback '{create}' timed out after {_PERMALINK_CREATE_TIMEOUT_S} secs"
52+
except TimeoutError as err:
53+
msg = f"Permalink factory callback '{create_coro}' timed out after {_PERMALINK_CREATE_TIMEOUT_S} secs"
5154
raise PermalinkFactoryError(msg) from err
5255

5356

5457
async def update_or_pop_permalink_in_project(
55-
request: web.Request, project: ProjectDict
58+
app: web.Application, project: ProjectDict
5659
) -> ProjectPermalink | None:
5760
"""Updates permalink entry in project
5861
@@ -61,7 +64,7 @@ async def update_or_pop_permalink_in_project(
6164
If fails, it pops it from project (so it is not set in the pydantic model. SEE ProjectGet.permalink)
6265
"""
6366
try:
64-
permalink = await _create_permalink(request, project_id=project["uuid"])
67+
permalink = await _create_permalink(app, project_id=project["uuid"])
6568

6669
assert permalink # nosec
6770
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-
request: web.Request, project_uuid: ProjectID
77+
app: web.Application, 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(request.app)
84+
engine = get_database_engine(app)
8585
async with engine.acquire() as conn:
8686
access_rights_subquery = (
8787
sa.select(

0 commit comments

Comments
 (0)