Skip to content

Commit 88cd8b4

Browse files
fix RPC on webserver side
1 parent 01b08e6 commit 88cd8b4

File tree

7 files changed

+82
-41
lines changed

7 files changed

+82
-41
lines changed

packages/models-library/src/models_library/api_schemas_webserver/licensed_items.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,11 @@
2020

2121
class LicensedItemRpcGet(BaseModel):
2222
licensed_item_id: LicensedItemID
23+
key: str
24+
version: str
2325
display_name: str
2426
licensed_resource_type: LicensedResourceType
25-
licensed_resource_data: dict[str, Any]
27+
licensed_resources: list[dict[str, Any]]
2628
pricing_plan_id: PricingPlanId
2729
created_at: datetime
2830
modified_at: datetime
@@ -32,9 +34,11 @@ class LicensedItemRpcGet(BaseModel):
3234
"examples": [
3335
{
3436
"licensed_item_id": "0362b88b-91f8-4b41-867c-35544ad1f7a1",
37+
"key": "Duke",
38+
"version": "1.0.0",
3539
"display_name": "best-model",
3640
"licensed_resource_type": f"{LicensedResourceType.VIP_MODEL}",
37-
"licensed_resource_data": cast(JsonDict, VIP_DETAILS_EXAMPLE),
41+
"licensed_resources": [cast(JsonDict, VIP_DETAILS_EXAMPLE)],
3842
"pricing_plan_id": "15",
3943
"created_at": "2024-12-12 09:59:26.422140",
4044
"modified_at": "2024-12-12 09:59:26.422140",
@@ -58,6 +62,7 @@ class _ItisVipRestData(OutputSchema):
5862
thumbnail: str
5963
features: FeaturesDict # NOTE: here there is a bit of coupling with domain model
6064
doi: str | None
65+
license_version: str
6166

6267

6368
class _ItisVipResourceRestData(OutputSchema):

packages/postgres-database/src/simcore_postgres_database/migration/versions/68777fdf9539_add_licensed_resources.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717

1818

1919
# Reuse the existing Enum type
20-
# existing_enum = sa.Enum("VIP_MODEL", name="licensedresourcetype", native_enum=False)
2120
licensed_resource_type = postgresql.ENUM(
2221
"VIP_MODEL", name="licensedresourcetype", create_type=False
2322
)

packages/service-library/src/servicelib/rabbitmq/rpc_interfaces/webserver/licenses/licensed_items.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
from models_library.api_schemas_webserver.licensed_items_checkouts import (
66
LicensedItemCheckoutRpcGet,
77
)
8-
from models_library.licenses import LicensedItemID
98
from models_library.products import ProductName
109
from models_library.rabbitmq_basic_types import RPCMethodName
1110
from models_library.resource_tracker_licensed_items_checkouts import (
@@ -72,17 +71,19 @@ async def checkout_licensed_item_for_wallet(
7271
product_name: ProductName,
7372
user_id: UserID,
7473
wallet_id: WalletID,
75-
licensed_item_id: LicensedItemID,
74+
key: str,
75+
version: str,
7676
num_of_seats: int,
7777
service_run_id: ServiceRunID,
7878
) -> LicensedItemCheckoutRpcGet:
7979
result = await rabbitmq_rpc_client.request(
8080
WEBSERVER_RPC_NAMESPACE,
8181
TypeAdapter(RPCMethodName).validate_python("checkout_licensed_item_for_wallet"),
82+
key=key,
83+
version=version,
8284
product_name=product_name,
8385
user_id=user_id,
8486
wallet_id=wallet_id,
85-
licensed_item_id=licensed_item_id,
8687
num_of_seats=num_of_seats,
8788
service_run_id=service_run_id,
8889
)

services/api-server/src/simcore_service_api_server/api/routes/wallets.py

Lines changed: 20 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,10 @@
88
from ...api.dependencies.authentication import get_current_user_id, get_product_name
99
from ...api.dependencies.webserver_rpc import get_wb_api_rpc_client
1010
from ...exceptions.service_errors_utils import DEFAULT_BACKEND_SERVICE_STATUS_CODES
11-
from ...models.pagination import Page, PaginationParams
1211
from ...models.schemas.errors import ErrorGet
1312
from ...models.schemas.licensed_items import LicensedItemCheckoutData
1413
from ...models.schemas.model_adapter import (
1514
LicensedItemCheckoutGet,
16-
LicensedItemGet,
1715
WalletGetWithAvailableCreditsLegacy,
1816
)
1917
from ...services_rpc.wb_api_server import WbApiRpcClient
@@ -62,26 +60,26 @@ async def get_wallet(
6260
return await webserver_api.get_wallet(wallet_id=wallet_id)
6361

6462

65-
@router.get(
66-
"/{wallet_id}/licensed-items",
67-
response_model=Page[LicensedItemGet],
68-
status_code=status.HTTP_200_OK,
69-
responses=WALLET_STATUS_CODES,
70-
description="Get all available licensed items for a given wallet",
71-
)
72-
async def get_available_licensed_items_for_wallet(
73-
wallet_id: int,
74-
page_params: Annotated[PaginationParams, Depends()],
75-
web_api_rpc: Annotated[WbApiRpcClient, Depends(get_wb_api_rpc_client)],
76-
product_name: Annotated[str, Depends(get_product_name)],
77-
user_id: Annotated[PositiveInt, Depends(get_current_user_id)],
78-
):
79-
return await web_api_rpc.get_available_licensed_items_for_wallet(
80-
product_name=product_name,
81-
wallet_id=wallet_id,
82-
user_id=user_id,
83-
page_params=page_params,
84-
)
63+
# @router.get(
64+
# "/{wallet_id}/licensed-items",
65+
# response_model=Page[LicensedItemGet],
66+
# status_code=status.HTTP_200_OK,
67+
# responses=WALLET_STATUS_CODES,
68+
# description="Get all available licensed items for a given wallet",
69+
# )
70+
# async def get_available_licensed_items_for_wallet(
71+
# wallet_id: int,
72+
# page_params: Annotated[PaginationParams, Depends()],
73+
# web_api_rpc: Annotated[WbApiRpcClient, Depends(get_wb_api_rpc_client)],
74+
# product_name: Annotated[str, Depends(get_product_name)],
75+
# user_id: Annotated[PositiveInt, Depends(get_current_user_id)],
76+
# ):
77+
# return await web_api_rpc.get_available_licensed_items_for_wallet(
78+
# product_name=product_name,
79+
# wallet_id=wallet_id,
80+
# user_id=user_id,
81+
# page_params=page_params,
82+
# )
8583

8684

8785
@router.post(

services/web/server/src/simcore_service_webserver/licenses/_licensed_items_checkouts_service.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
from models_library.api_schemas_resource_usage_tracker import (
33
licensed_items_checkouts as rut_licensed_items_checkouts,
44
)
5-
from models_library.licenses import LicensedItemID
65
from models_library.products import ProductName
76
from models_library.resource_tracker_licensed_items_checkouts import (
87
LicensedItemCheckoutID,
@@ -18,6 +17,7 @@
1817
from ..rabbitmq import get_rabbitmq_rpc_client
1918
from ..users.api import get_user
2019
from ..wallets.api import get_wallet_by_user
20+
from . import _licensed_items_repository
2121
from ._licensed_items_checkouts_models import (
2222
LicensedItemCheckoutGet,
2323
LicensedItemCheckoutGetPage,
@@ -122,7 +122,6 @@ async def checkout_licensed_item_for_wallet(
122122
wallet_id: WalletID,
123123
user_id: UserID,
124124
# checkout args
125-
licensed_item_id: LicensedItemID,
126125
key: str,
127126
version: str,
128127
num_of_seats: int,
@@ -138,11 +137,15 @@ async def checkout_licensed_item_for_wallet(
138137

139138
user = await get_user(app, user_id=user_id)
140139

140+
licensed_item = await _licensed_items_repository.get_licensed_item_by_key_version(
141+
app, key=key, version=version, product_name=product_name
142+
)
143+
141144
rpc_client = get_rabbitmq_rpc_client(app)
142145
licensed_item_get: rut_licensed_items_checkouts.LicensedItemCheckoutGet = (
143146
await licensed_items_checkouts.checkout_licensed_item(
144147
rpc_client,
145-
licensed_item_id=licensed_item_id,
148+
licensed_item_id=licensed_item.licensed_item_id,
146149
key=key,
147150
version=version,
148151
wallet_id=wallet_id,

services/web/server/src/simcore_service_webserver/licenses/_rpc.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
LicensedItemCheckoutRpcGet,
99
)
1010
from models_library.basic_types import IDStr
11-
from models_library.licenses import LicensedItemID, LicensedItemPage
11+
from models_library.licenses import LicensedItemPage
1212
from models_library.products import ProductName
1313
from models_library.resource_tracker_licensed_items_checkouts import (
1414
LicensedItemCheckoutID,
@@ -46,17 +46,19 @@ async def get_licensed_items(
4646
product_name=product_name,
4747
offset=offset,
4848
limit=limit,
49-
order_by=OrderBy(field=IDStr("licensed_resource_name")),
49+
order_by=OrderBy(field=IDStr("display_name")),
5050
)
5151
)
5252

5353
licensed_item_get_page: LicensedItemRpcGetPage = LicensedItemRpcGetPage(
5454
items=[
5555
LicensedItemRpcGet.model_construct(
5656
licensed_item_id=licensed_item.licensed_item_id,
57+
key=licensed_item.key,
58+
version=licensed_item.version,
5759
display_name=licensed_item.display_name,
5860
licensed_resource_type=licensed_item.licensed_resource_type,
59-
licensed_resource_data=licensed_item.licensed_resource_data,
61+
licensed_resources=licensed_item.array_of_licensed_resource_data,
6062
pricing_plan_id=licensed_item.pricing_plan_id,
6163
created_at=licensed_item.created_at,
6264
modified_at=licensed_item.modified_at,
@@ -94,7 +96,6 @@ async def checkout_licensed_item_for_wallet(
9496
product_name: ProductName,
9597
user_id: UserID,
9698
wallet_id: WalletID,
97-
licensed_item_id: LicensedItemID,
9899
key: str,
99100
version: str,
100101
num_of_seats: int,
@@ -103,7 +104,6 @@ async def checkout_licensed_item_for_wallet(
103104
licensed_item_get = (
104105
await _licensed_items_checkouts_service.checkout_licensed_item_for_wallet(
105106
app,
106-
licensed_item_id=licensed_item_id,
107107
key=key,
108108
version=version,
109109
wallet_id=wallet_id,
@@ -146,6 +146,8 @@ async def release_licensed_item_for_wallet(
146146
return LicensedItemCheckoutRpcGet.model_construct(
147147
licensed_item_checkout_id=licensed_item_get.licensed_item_checkout_id,
148148
licensed_item_id=licensed_item_get.licensed_item_id,
149+
key=licensed_item_get.key,
150+
version=licensed_item_get.version,
149151
wallet_id=licensed_item_get.wallet_id,
150152
user_id=licensed_item_get.user_id,
151153
product_name=licensed_item_get.product_name,

services/web/server/tests/unit/with_dbs/04/licenses/test_licenses_rpc.py

Lines changed: 38 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,17 @@
2525
release_licensed_item_for_wallet,
2626
)
2727
from settings_library.rabbit import RabbitSettings
28+
from simcore_postgres_database.models.licensed_item_to_resource import (
29+
licensed_item_to_resource,
30+
)
2831
from simcore_postgres_database.models.users import UserRole
32+
from simcore_postgres_database.utils_repos import transaction_context
2933
from simcore_service_webserver.application_settings import ApplicationSettings
30-
from simcore_service_webserver.licenses import _licensed_items_repository
34+
from simcore_service_webserver.db.plugin import get_asyncpg_engine
35+
from simcore_service_webserver.licenses import (
36+
_licensed_items_repository,
37+
_licensed_resources_repository,
38+
)
3139

3240
pytest_simcore_core_services_selection = [
3341
"rabbit",
@@ -133,15 +141,39 @@ async def test_license_checkout_workflow(
133141
assert len(result.items) == 0
134142
assert result.total == 0
135143

136-
license_item_db = await _licensed_items_repository.create(
144+
licensed_item_db = await _licensed_items_repository.create(
137145
client.app,
146+
key="Duke",
147+
version="1.0.0",
138148
product_name=osparc_product_name,
139149
display_name="Model A display name",
140-
licensed_resource_name="Model A",
141150
licensed_resource_type=LicensedResourceType.VIP_MODEL,
142151
pricing_plan_id=pricing_plan_id,
143-
licensed_resource_data=VIP_DETAILS_EXAMPLE,
144152
)
153+
_licensed_item_id = licensed_item_db.licensed_item_id
154+
155+
got_licensed_resource_duke = (
156+
await _licensed_resources_repository.create_if_not_exists(
157+
client.app,
158+
display_name="Duke",
159+
licensed_resource_name="Duke",
160+
licensed_resource_type=LicensedResourceType.VIP_MODEL,
161+
licensed_resource_data={
162+
"category_id": "HumanWholeBody",
163+
"category_display": "Humans",
164+
"source": VIP_DETAILS_EXAMPLE,
165+
},
166+
)
167+
)
168+
169+
# Connect them via licensed_item_to_resorce DB table
170+
async with transaction_context(get_asyncpg_engine(client.app)) as conn:
171+
await conn.execute(
172+
licensed_item_to_resource.insert().values(
173+
licensed_item_id=_licensed_item_id,
174+
licensed_resource_id=got_licensed_resource_duke.licensed_resource_id,
175+
)
176+
)
145177

146178
result = await get_licensed_items(
147179
rpc_client, product_name=osparc_product_name, offset=0, limit=20
@@ -160,10 +192,11 @@ async def test_license_checkout_workflow(
160192

161193
checkout = await checkout_licensed_item_for_wallet(
162194
rpc_client,
195+
key=licensed_item_db.key,
196+
version=licensed_item_db.version,
163197
product_name=osparc_product_name,
164198
user_id=logged_user["id"],
165199
wallet_id=1,
166-
licensed_item_id=license_item_db.licensed_item_id,
167200
num_of_seats=1,
168201
service_run_id="run_1",
169202
)

0 commit comments

Comments
 (0)