Skip to content

Commit 7549430

Browse files
committed
draft 2
1 parent f20baa4 commit 7549430

File tree

3 files changed

+53
-29
lines changed

3 files changed

+53
-29
lines changed

services/catalog/src/simcore_service_catalog/models/services_db.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,14 @@
33

44
from common_library.basic_types import DEFAULT_FACTORY
55
from models_library.basic_types import IdInt
6+
from models_library.groups import GroupID
67
from models_library.products import ProductName
78
from models_library.services_access import ServiceGroupAccessRights
89
from models_library.services_base import ServiceKeyVersion
910
from models_library.services_types import ServiceKey, ServiceVersion
1011
from models_library.utils.common_validators import empty_str_to_none_pre_validator
1112
from pydantic import BaseModel, ConfigDict, Field, field_validator
1213
from pydantic.config import JsonDict
13-
from pydantic.types import PositiveInt
1414
from simcore_postgres_database.models.services_compatibility import CompatiblePolicyDict
1515

1616

@@ -20,7 +20,7 @@ class ServiceMetaDataDBGet(BaseModel):
2020
version: ServiceVersion
2121

2222
# ownership
23-
owner: IdInt | None
23+
owner: GroupID | None
2424

2525
# display
2626
name: str
@@ -208,7 +208,7 @@ class ServiceWithHistoryDBGet(BaseModel):
208208

209209

210210
class ServiceAccessRightsAtDB(ServiceKeyVersion, ServiceGroupAccessRights):
211-
gid: PositiveInt
211+
gid: GroupID
212212
product_name: ProductName
213213

214214
@staticmethod

services/catalog/src/simcore_service_catalog/services/services_api.py

Lines changed: 48 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
CatalogForbiddenError,
1818
CatalogItemNotFoundError,
1919
)
20+
from simcore_service_catalog.db.repositories.groups import GroupsRepository
2021

2122
from ..db.repositories.services import ServicesRepository
2223
from ..models.services_db import (
@@ -341,7 +342,7 @@ async def check_for_service(
341342

342343
async def batch_get_my_services(
343344
repo: ServicesRepository,
344-
director_api: DirectorApi,
345+
groups_repo: GroupsRepository,
345346
*,
346347
product_name: ProductName,
347348
user_id: UserID,
@@ -357,45 +358,67 @@ async def batch_get_my_services(
357358
key_versions=ids, product_name=product_name
358359
)
359360

361+
user_groups = await groups_repo.list_user_groups(user_id=user_id)
362+
my_group_ids = {g.gid for g in user_groups}
363+
360364
my_services = []
361365
for service_key, service_version in ids:
362366
access_rights = services_access_rights.get((service_key, service_version), [])
367+
363368
my_access_rights = {
364-
"read": any(ar.execute_access for ar in access_rights),
365-
"write": any(ar.write_access for ar in access_rights),
369+
"execute": False,
370+
"write": False,
366371
}
367372

368-
service = await repo.get_service_with_history(
373+
for ar in access_rights:
374+
if ar.gid in my_group_ids:
375+
my_access_rights["execute"] |= ar.execute_access
376+
my_access_rights["write"] |= ar.write_access
377+
378+
service_db = await repo.get_service(
369379
product_name=product_name,
370-
user_id=user_id,
371380
key=service_key,
372381
version=service_version,
373382
)
383+
assert service_db # nosec
374384

375-
if service:
376-
service_manifest = await manifest.get_service(
377-
key=service_key,
378-
version=service_version,
379-
director_client=director_api,
385+
owner = service_db.owner
386+
if not owner:
387+
# TODO: raise error to indicate that no owner is registered for a given service
388+
owner = next(
389+
ar.gid for ar in access_rights if ar.write_access and ar.execute_access
380390
)
381391

382-
compatibility_map = await evaluate_service_compatibility_map(
383-
repo,
384-
product_name=product_name,
385-
user_id=user_id,
386-
service_release_history=service.history,
387-
)
392+
assert owner is not None # nosec
388393

389-
my_services.append(
390-
MyServiceGet(
391-
**_db_to_api_model(
392-
service_db=service,
393-
access_rights_db=access_rights,
394-
service_manifest=service_manifest,
395-
compatibility_map=compatibility_map,
396-
).model_dump(),
397-
my_access_rights=my_access_rights,
394+
compatibility_map = {}
395+
if my_access_rights != {"execute": False, "write": False}:
396+
history = await repo.get_service_history(
397+
product_name=product_name, user_id=user_id, key=service_key
398+
)
399+
if history:
400+
compatibility_map = await evaluate_service_compatibility_map(
401+
repo,
402+
product_name=product_name,
403+
user_id=user_id,
404+
service_release_history=history,
398405
)
406+
407+
my_services.append(
408+
MyServiceGet(
409+
key=service_db.key,
410+
release=ServiceRelease.model_construct(
411+
version=service_db.version,
412+
version_display=service_db.version_display,
413+
released=service_db.created,
414+
retired=service_db.deprecated,
415+
compatibility=compatibility_map.get(service_db.version),
416+
),
417+
owner=owner,
418+
my_access_rights=my_access_rights,
399419
)
420+
)
421+
422+
# TODO: else error
400423

401424
return my_services

services/catalog/tests/unit/with_dbs/test_services_services_api.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,8 @@ async def test_batch_get_my_services(
196196
]
197197

198198
my_services = await services_api.batch_get_my_services(
199-
repo=services_repo,
199+
services_repo,
200+
director_client,
200201
product_name=target_product,
201202
user_id=user_id,
202203
ids=ids,

0 commit comments

Comments
 (0)