Skip to content

Commit 6a9b289

Browse files
committed
adding pagination to history
1 parent eec071f commit 6a9b289

File tree

5 files changed

+70
-20
lines changed
  • packages
  • services
    • api-server/src/simcore_service_api_server/services_rpc
    • catalog/src/simcore_service_catalog/api/rpc

5 files changed

+70
-20
lines changed

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -323,11 +323,16 @@ def _update_json_schema_extra(schema: JsonDict) -> None:
323323
)
324324

325325

326-
PageRpcServicesGetV2: TypeAlias = PageRpc[
326+
PageRpcLatestServiceGet: TypeAlias = PageRpc[
327327
# WARNING: keep this definition in models_library and not in the RPC interface
328328
LatestServiceGet
329329
]
330330

331+
PageRpcServiceRelease: TypeAlias = PageRpc[
332+
# WARNING: keep this definition in models_library and not in the RPC interface
333+
ServiceRelease
334+
]
335+
331336
ServiceResourcesGet: TypeAlias = ServiceResourcesDict
332337

333338

packages/pytest-simcore/src/pytest_simcore/helpers/catalog_rpc_server.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@
1010
CatalogServiceUpdate,
1111
)
1212
from models_library.products import ProductName
13+
from models_library.rest_pagination import PageOffsetInt
1314
from models_library.rpc_pagination import PageLimitInt, PageRpc
15+
from models_library.services_history import ServiceRelease
1416
from models_library.services_types import ServiceKey, ServiceVersion
1517
from models_library.users import UserID
1618
from pydantic import NonNegativeInt, TypeAdapter
@@ -84,3 +86,33 @@ async def update_service(
8486
got.version = service_version
8587
got.key = service_key
8688
return got.model_copy(update=update.model_dump(exclude_unset=True))
89+
90+
async def get_my_service_history(
91+
self,
92+
rpc_client: RabbitMQRPCClient,
93+
*,
94+
product_name: ProductName,
95+
user_id: UserID,
96+
service_key: ServiceKey,
97+
limit: PageLimitInt,
98+
offset: PageOffsetInt,
99+
) -> PageRpc[ServiceRelease]:
100+
101+
assert rpc_client
102+
assert product_name
103+
assert user_id
104+
assert service_key
105+
106+
items = TypeAdapter(list[ServiceRelease]).validate_python(
107+
[
108+
ServiceRelease.model_json_schema()["example"],
109+
]
110+
)
111+
total_count = len(items)
112+
113+
return PageRpc[ServiceRelease].create(
114+
items[offset : offset + limit],
115+
total=total_count,
116+
limit=limit,
117+
offset=offset,
118+
)

packages/service-library/src/servicelib/rabbitmq/rpc_interfaces/catalog/services.py

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
from models_library.api_schemas_catalog.services import (
88
LatestServiceGet,
99
MyServiceGet,
10+
PageRpcLatestServiceGet,
11+
PageRpcServiceRelease,
1012
ServiceGetV2,
1113
ServiceRelease,
1214
ServiceUpdateV2,
@@ -37,7 +39,7 @@ async def list_services_paginated( # pylint: disable=too-many-arguments
3739
user_id: UserID,
3840
limit: PageLimitInt = DEFAULT_NUMBER_OF_ITEMS_PER_PAGE,
3941
offset: PageOffsetInt = 0,
40-
) -> PageRpc[LatestServiceGet]:
42+
) -> PageRpcLatestServiceGet:
4143
"""
4244
Raises:
4345
ValidationError: on invalid arguments
@@ -245,7 +247,9 @@ async def get_my_service_history( # pylint: disable=too-many-arguments
245247
product_name: ProductName,
246248
user_id: UserID,
247249
service_key: ServiceKey,
248-
) -> list[ServiceRelease]:
250+
limit: PageLimitInt = DEFAULT_NUMBER_OF_ITEMS_PER_PAGE,
251+
offset: PageOffsetInt = 0,
252+
) -> PageRpcServiceRelease:
249253
"""
250254
Raises:
251255
ValidationError: on invalid arguments
@@ -256,21 +260,28 @@ async def _call(
256260
product_name: ProductName,
257261
user_id: UserID,
258262
service_key: ServiceKey,
263+
limit: PageLimitInt,
264+
offset: PageOffsetInt,
259265
):
260266
return await rpc_client.request(
261267
CATALOG_RPC_NAMESPACE,
262268
TypeAdapter(RPCMethodName).validate_python("get_my_service_history"),
263269
product_name=product_name,
264270
user_id=user_id,
265271
service_key=service_key,
272+
limit=limit,
273+
offset=offset,
266274
)
267275

268276
result = await _call(
269277
product_name=product_name,
270278
user_id=user_id,
271279
service_key=service_key,
280+
limit=limit,
281+
offset=offset,
272282
)
283+
273284
assert ( # nosec
274-
TypeAdapter(list[ServiceRelease]).validate_python(result) is not None
285+
TypeAdapter(PageRpcServiceRelease).validate_python(result) is not None
275286
)
276-
return cast(list[ServiceRelease], result)
287+
return cast(PageRpc[ServiceRelease], result)

services/api-server/src/simcore_service_api_server/services_rpc/catalog.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -55,21 +55,21 @@ async def list_release_history(
5555
limit: PageLimitInt = DEFAULT_NUMBER_OF_ITEMS_PER_PAGE,
5656
) -> tuple[list[ServiceRelease], PageMetaInfoLimitOffset]:
5757

58-
data = await catalog_rpc.get_my_service_history(
58+
page = await catalog_rpc.get_my_service_history(
5959
self._client,
6060
product_name=product_name,
6161
user_id=user_id,
6262
service_key=service_key,
63-
# TODO: offset=offset,
64-
# TODO: limit=limit,
63+
offset=offset,
64+
limit=limit,
6565
)
6666
meta = PageMetaInfoLimitOffset(
67-
limit=limit,
68-
offset=offset,
69-
total=len(data),
70-
count=len(data),
67+
limit=page.meta.limit,
68+
offset=page.meta.offset,
69+
total=page.meta.total,
70+
count=page.meta.count,
7171
)
72-
return data, meta
72+
return page.data, meta
7373

7474
async def get(
7575
self,

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

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,14 @@
55
from fastapi import FastAPI
66
from models_library.api_schemas_catalog.services import (
77
MyServiceGet,
8-
PageRpcServicesGetV2,
8+
PageRpcLatestServiceGet,
9+
PageRpcServiceRelease,
910
ServiceGetV2,
1011
ServiceUpdateV2,
1112
)
1213
from models_library.products import ProductName
1314
from models_library.rest_pagination import PageOffsetInt
1415
from models_library.rpc_pagination import DEFAULT_NUMBER_OF_ITEMS_PER_PAGE, PageLimitInt
15-
from models_library.services_history import ServiceRelease
1616
from models_library.services_types import ServiceKey, ServiceVersion
1717
from models_library.users import UserID
1818
from pydantic import ValidationError, validate_call
@@ -65,7 +65,7 @@ async def list_services_paginated(
6565
user_id: UserID,
6666
limit: PageLimitInt = DEFAULT_NUMBER_OF_ITEMS_PER_PAGE,
6767
offset: PageOffsetInt = 0,
68-
) -> PageRpcServicesGetV2:
68+
) -> PageRpcLatestServiceGet:
6969
assert app.state.engine # nosec
7070

7171
total_count, items = await services_api.list_latest_services(
@@ -81,8 +81,8 @@ async def list_services_paginated(
8181
assert len(items) <= limit # nosec
8282

8383
return cast(
84-
PageRpcServicesGetV2,
85-
PageRpcServicesGetV2.create(
84+
PageRpcLatestServiceGet,
85+
PageRpcLatestServiceGet.create(
8686
items,
8787
total=total_count,
8888
limit=limit,
@@ -232,10 +232,12 @@ async def get_my_service_history(
232232
product_name: ProductName,
233233
user_id: UserID,
234234
service_key: ServiceKey,
235-
) -> list[ServiceRelease]:
235+
limit: PageLimitInt = DEFAULT_NUMBER_OF_ITEMS_PER_PAGE,
236+
offset: PageOffsetInt = 0,
237+
) -> PageRpcServiceRelease:
236238
assert app.state.engine # nosec
237239

238-
return await services_api.get_service_history(
240+
history = await services_api.get_service_history(
239241
repo=ServicesRepository(app.state.engine),
240242
product_name=product_name,
241243
user_id=user_id,

0 commit comments

Comments
 (0)