Skip to content

Commit 07b7479

Browse files
committed
🐛 refactor: rename service availability check functions for clarity
1 parent 7cbacf2 commit 07b7479

File tree

3 files changed

+28
-21
lines changed

3 files changed

+28
-21
lines changed

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

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
from aiohttp import web
44
from common_library.json_serialization import json_dumps
5+
from models_library.api_schemas_catalog.services import MyServiceGet
56
from models_library.api_schemas_webserver.projects import (
67
EmptyModel,
78
ProjectCopyOverride,
@@ -39,7 +40,6 @@
3940
from .. import _crud_api_create, _crud_api_read, _projects_service
4041
from .._permalink_service import update_or_pop_permalink_in_project
4142
from ..models import ProjectDict
42-
from ..utils import get_project_unavailable_services, project_uses_available_services
4343
from . import _rest_utils
4444
from ._rest_exceptions import handle_plugin_requests_exceptions
4545
from ._rest_schemas import (
@@ -277,25 +277,31 @@ async def get_project(request: web.Request):
277277
req_ctx = RequestContext.model_validate(request)
278278
path_params = parse_request_path_parameters_as(ProjectPathParams, request)
279279

280-
user_available_services: list[dict] = (
281-
await catalog_service.get_services_for_user_in_product(
282-
request.app, req_ctx.user_id, req_ctx.product_name, only_key_versions=True
283-
)
284-
)
285-
286280
project = await _projects_service.get_project_for_user(
287281
request.app,
288282
project_uuid=f"{path_params.project_id}",
289283
user_id=req_ctx.user_id,
290284
include_state=True,
291285
include_trashed_by_primary_gid=True,
292286
)
293-
if not await project_uses_available_services(project, user_available_services):
294-
unavilable_services = get_project_unavailable_services(
295-
project, user_available_services
296-
)
287+
288+
services_in_project = {
289+
(srv["key"], srv["version"]) for _, srv in project.get("workbench", {}).items()
290+
}
291+
292+
my_services: list[MyServiceGet] = await catalog_service.batch_get_my_services(
293+
request.app,
294+
product_name=req_ctx.product_name,
295+
user_id=req_ctx.user_id,
296+
services_ids=list(services_in_project),
297+
)
298+
not_my_services = services_in_project.difference(
299+
{(srv.key, srv.release.version) for srv in my_services}
300+
)
301+
302+
if not_my_services:
297303
formatted_services = ", ".join(
298-
f"{service}:{version}" for service, version in unavilable_services
304+
f"{service}:{version}" for service, version in not_my_services
299305
)
300306
# TODO: lack of permissions should be notified with https://httpstatuses.com/403 web.HTTPForbidden
301307
raise web.HTTPNotFound(

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
ProjectNotFoundError,
3333
)
3434
from .models import ProjectDict
35-
from .utils import find_changed_node_keys, project_uses_available_services
35+
from .utils import are_project_services_available, find_changed_node_keys
3636

3737
logger = logging.getLogger(__name__)
3838

@@ -222,7 +222,7 @@ async def _execute_without_permission_check(
222222
filter_by_services is not None
223223
# This checks only old projects that are not in the projects_to_products table.
224224
and row[projects_to_products.c.product_name] is None
225-
and not await project_uses_available_services(prj, filter_by_services)
225+
and not are_project_services_available(prj, filter_by_services)
226226
):
227227
logger.warning(
228228
"Project %s will not be listed for user %s since it has no access rights"

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

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -189,20 +189,21 @@ def is_graph_equal(
189189
return True
190190

191191

192-
async def project_uses_available_services(
192+
def are_project_services_available(
193193
project: dict[str, Any], available_services: list[dict[str, Any]]
194194
) -> bool:
195195
if not project["workbench"]:
196196
# empty project
197197
return True
198-
# get project services
199-
needed_services: set[tuple[str, str]] = {
200-
(s["key"], s["version"]) for _, s in project["workbench"].items()
198+
199+
# list services in project
200+
needed_services = {
201+
(srv["key"], srv["version"]) for _, srv in project["workbench"].items()
201202
}
202203

203-
# get available services
204-
available_services_set: set[tuple[str, str]] = {
205-
(s["key"], s["version"]) for s in available_services
204+
# list available services
205+
available_services_set = {
206+
(srv["key"], srv["version"]) for srv in available_services
206207
}
207208

208209
return needed_services.issubset(available_services_set)

0 commit comments

Comments
 (0)