Skip to content

Commit 58368e3

Browse files
committed
draft test and api in catalog
1 parent d7529d3 commit 58368e3

File tree

6 files changed

+131
-4
lines changed

6 files changed

+131
-4
lines changed

packages/models-library/src/models_library/api_schemas_catalog/services.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -310,3 +310,11 @@ class ServiceUpdateV2(CatalogInputSchema):
310310
assert set(ServiceUpdateV2.model_fields.keys()) - set( # nosec
311311
ServiceGetV2.model_fields.keys()
312312
) == {"deprecated"}
313+
314+
315+
class MyServiceGet(CatalogOutputSchema):
316+
key: ServiceKey
317+
release: ServiceRelease
318+
319+
owner: GroupID
320+
my_access_rights: ServiceGroupAccessRightsV2

services/catalog/src/simcore_service_catalog/api/rest/_services.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ async def cached_registry_services() -> dict[str, Any]:
152152
services_owner_emails,
153153
) = await asyncio.gather(
154154
cached_registry_services(),
155-
services_repo.list_services_access_rights(
155+
services_repo.batch_get_services_access_rights(
156156
key_versions=services_in_db,
157157
product_name=x_simcore_products_name,
158158
),

services/catalog/src/simcore_service_catalog/api/rpc/_services.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
from fastapi import FastAPI
66
from models_library.api_schemas_catalog.services import (
7+
MyServiceGet,
78
PageRpcServicesGetV2,
89
ServiceGetV2,
910
ServiceUpdateV2,
@@ -165,3 +166,21 @@ async def check_for_service(
165166
service_key=service_key,
166167
service_version=service_version,
167168
)
169+
170+
171+
@router.expose(reraise_if_error_type=(CatalogForbiddenError,))
172+
@log_decorator(_logger, level=logging.DEBUG)
173+
async def batch_get_my_services(
174+
app: FastAPI,
175+
*,
176+
product_name: ProductName,
177+
user_id: UserID,
178+
ids: list[
179+
tuple[
180+
ServiceKey,
181+
ServiceVersion,
182+
]
183+
],
184+
) -> list[MyServiceGet]:
185+
186+
raise NotImplementedError

services/catalog/src/simcore_service_catalog/db/repositories/services.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -481,7 +481,7 @@ async def get_service_access_rights(
481481
async for row in await conn.stream(query)
482482
]
483483

484-
async def list_services_access_rights(
484+
async def batch_get_services_access_rights(
485485
self,
486486
key_versions: Iterable[tuple[str, str]],
487487
product_name: str | None = None,

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

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
import logging
22

3-
from models_library.api_schemas_catalog.services import ServiceGetV2, ServiceUpdateV2
3+
from models_library.api_schemas_catalog.services import (
4+
MyServiceGet,
5+
ServiceGetV2,
6+
ServiceUpdateV2,
7+
)
48
from models_library.products import ProductName
59
from models_library.rest_pagination import PageLimitInt
610
from models_library.services_access import ServiceGroupAccessRightsV2
@@ -93,7 +97,7 @@ async def list_services_paginated(
9397
# injects access-rights
9498
access_rights: dict[
9599
tuple[str, str], list[ServiceAccessRightsAtDB]
96-
] = await repo.list_services_access_rights(
100+
] = await repo.batch_get_services_access_rights(
97101
((s.key, s.version) for s in services), product_name=product_name
98102
)
99103
if not access_rights:
@@ -333,3 +337,33 @@ async def check_for_service(
333337
user_id=user_id,
334338
product_name=product_name,
335339
)
340+
341+
342+
async def batch_get_my_services(
343+
*,
344+
repo: ServicesRepository,
345+
product_name: ProductName,
346+
user_id: UserID,
347+
ids: list[
348+
tuple[
349+
ServiceKey,
350+
ServiceVersion,
351+
]
352+
],
353+
) -> list[MyServiceGet]:
354+
355+
raise NotImplementedError
356+
357+
# user_groups = []
358+
359+
# result = []
360+
361+
# services_access_rights = await repo.batch_get_services_access_rights(key_versions=ids, product_name=product_name)
362+
363+
# for service_key, service_version in ids:
364+
# my_access_rights = {"read": False, "execute": False}
365+
366+
# if (service_access_rights_db := services_access_rights.get((service_key,service_version)))
367+
368+
# if service_access_rights_db.gid in user_groups:
369+
# my_access_rights.append()

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

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,3 +143,69 @@ async def test_list_services_paginated(
143143

144144
# since it is cached, it should only call it `limit` times
145145
assert mocked_director_service_api["get_service"].call_count == limit
146+
147+
148+
async def test_batch_get_my_services(
149+
background_sync_task_mocked: None,
150+
rabbitmq_and_rpc_setup_disabled: None,
151+
mocked_director_service_api: MockRouter,
152+
target_product: ProductName,
153+
services_repo: ServicesRepository,
154+
user_id: UserID,
155+
director_client: DirectorApi,
156+
create_fake_service_data: Callable,
157+
services_db_tables_injector: Callable,
158+
):
159+
# Create fake services data
160+
service_key = "simcore/services/comp/some-service"
161+
service_version_1 = "1.0.0"
162+
service_version_2 = "2.0.0"
163+
other_service_key = "simcore/services/comp/other-service"
164+
other_service_version = "1.0.0"
165+
166+
fake_service_1 = create_fake_service_data(
167+
service_key,
168+
service_version_1,
169+
team_access=None,
170+
everyone_access=None,
171+
product=target_product,
172+
)
173+
fake_service_2 = create_fake_service_data(
174+
service_key,
175+
service_version_2,
176+
team_access="x",
177+
everyone_access=None,
178+
product=target_product,
179+
)
180+
fake_service_3 = create_fake_service_data(
181+
other_service_key,
182+
other_service_version,
183+
team_access=None,
184+
everyone_access=None,
185+
product=target_product,
186+
)
187+
188+
# Inject fake services into the database
189+
await services_db_tables_injector([fake_service_1, fake_service_2, fake_service_3])
190+
191+
# Batch get my services
192+
ids = [
193+
(service_key, service_version_1),
194+
(service_key, service_version_2),
195+
(other_service_key, other_service_version),
196+
]
197+
198+
my_services = await services_api.batch_get_my_services(
199+
repo=services_repo,
200+
product_name=target_product,
201+
user_id=user_id,
202+
ids=ids,
203+
)
204+
205+
assert len(my_services) == 3
206+
207+
# Check access rights
208+
assert my_services[0].my_access_rights == {}
209+
assert my_services[1].my_access_rights is not None
210+
assert my_services[2].my_access_rights is not None
211+
assert my_services[2].owner is not None

0 commit comments

Comments
 (0)