Skip to content

Commit 3f30f05

Browse files
add get and list license usages
1 parent b803038 commit 3f30f05

File tree

7 files changed

+147
-72
lines changed

7 files changed

+147
-72
lines changed

packages/service-library/src/servicelib/rabbitmq/rpc_interfaces/resource_usage_tracker/licensed_items_purchases.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,14 @@ async def get_licensed_items_purchases_page(
3838
wallet_id: WalletID,
3939
offset: int = 0,
4040
limit: int = 20,
41-
order_by: OrderBy = OrderBy(field=IDStr("purchased_at")),
41+
order_by: OrderBy | None = None,
4242
) -> LicensedItemsPurchasesPage:
43+
"""
44+
Default order_by field is "purchased_at"
45+
"""
46+
if order_by is None:
47+
order_by = OrderBy(field=IDStr("purchased_at"))
48+
4349
result = await rabbitmq_rpc_client.request(
4450
RESOURCE_USAGE_TRACKER_RPC_NAMESPACE,
4551
_RPC_METHOD_NAME_ADAPTER.validate_python("get_licensed_items_purchases_page"),

packages/service-library/src/servicelib/rabbitmq/rpc_interfaces/resource_usage_tracker/licensed_items_usages.py

Lines changed: 48 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,16 @@
77
from models_library.api_schemas_resource_usage_tracker.licensed_items_usages import (
88
LicenseCheckoutGet,
99
LicenseCheckoutID,
10+
LicensedItemsUsagesPage,
1011
LicensedItemUsageGet,
1112
)
13+
from models_library.basic_types import IDStr
1214
from models_library.licensed_items import LicensedItemID
1315
from models_library.products import ProductName
1416
from models_library.rabbitmq_basic_types import RPCMethodName
1517
from models_library.resource_tracker import ServiceRunId
18+
from models_library.resource_tracker_licensed_items_usages import LicensedItemUsageID
19+
from models_library.rest_ordering import OrderBy
1620
from models_library.users import UserID
1721
from models_library.wallets import WalletID
1822
from pydantic import NonNegativeInt, TypeAdapter
@@ -28,46 +32,52 @@
2832
_RPC_METHOD_NAME_ADAPTER: TypeAdapter[RPCMethodName] = TypeAdapter(RPCMethodName)
2933

3034

31-
# @log_decorator(_logger, level=logging.DEBUG)
32-
# async def get_licensed_items_usages_page(
33-
# rabbitmq_rpc_client: RabbitMQRPCClient,
34-
# *,
35-
# product_name: ProductName,
36-
# wallet_id: WalletID,
37-
# offset: int = 0,
38-
# limit: int = 20,
39-
# order_by: OrderBy = OrderBy(field=IDStr("purchased_at")),
40-
# ) -> LicensedItemsPurchasesPage:
41-
# result = await rabbitmq_rpc_client.request(
42-
# RESOURCE_USAGE_TRACKER_RPC_NAMESPACE,
43-
# _RPC_METHOD_NAME_ADAPTER.validate_python("get_licensed_items_purchases_page"),
44-
# product_name=product_name,
45-
# wallet_id=wallet_id,
46-
# limit=limit,
47-
# offset=offset,
48-
# order_by=order_by,
49-
# timeout_s=_DEFAULT_TIMEOUT_S,
50-
# )
51-
# assert isinstance(result, LicensedItemsPurchasesPage) # nosec
52-
# return result
35+
@log_decorator(_logger, level=logging.DEBUG)
36+
async def get_licensed_item_usage(
37+
rabbitmq_rpc_client: RabbitMQRPCClient,
38+
*,
39+
product_name: ProductName,
40+
licensed_item_usage_id: LicensedItemUsageID,
41+
) -> LicensedItemUsageGet:
42+
result = await rabbitmq_rpc_client.request(
43+
RESOURCE_USAGE_TRACKER_RPC_NAMESPACE,
44+
_RPC_METHOD_NAME_ADAPTER.validate_python("get_licensed_item_usage"),
45+
product_name=product_name,
46+
licensed_item_usage_id=licensed_item_usage_id,
47+
timeout_s=_DEFAULT_TIMEOUT_S,
48+
)
49+
assert isinstance(result, LicensedItemUsageGet) # nosec
50+
return result
5351

5452

55-
# @log_decorator(_logger, level=logging.DEBUG)
56-
# async def get_licensed_item_usage(
57-
# rabbitmq_rpc_client: RabbitMQRPCClient,
58-
# *,
59-
# product_name: ProductName,
60-
# licensed_item_purchase_id: LicensedItemPurchaseID,
61-
# ) -> LicensedItemPurchaseGet:
62-
# result = await rabbitmq_rpc_client.request(
63-
# RESOURCE_USAGE_TRACKER_RPC_NAMESPACE,
64-
# _RPC_METHOD_NAME_ADAPTER.validate_python("get_licensed_item_purchase"),
65-
# product_name=product_name,
66-
# licensed_item_purchase_id=licensed_item_purchase_id,
67-
# timeout_s=_DEFAULT_TIMEOUT_S,
68-
# )
69-
# assert isinstance(result, LicensedItemPurchaseGet) # nosec
70-
# return result
53+
@log_decorator(_logger, level=logging.DEBUG)
54+
async def get_licensed_items_usages_page(
55+
rabbitmq_rpc_client: RabbitMQRPCClient,
56+
*,
57+
product_name: ProductName,
58+
filter_wallet_id: WalletID,
59+
offset: int = 0,
60+
limit: int = 20,
61+
order_by: OrderBy | None = None,
62+
) -> LicensedItemsUsagesPage:
63+
"""
64+
Default order_by field is "started_at"
65+
"""
66+
if order_by is None:
67+
order_by = OrderBy(field=IDStr("started_at"))
68+
69+
result = await rabbitmq_rpc_client.request(
70+
RESOURCE_USAGE_TRACKER_RPC_NAMESPACE,
71+
_RPC_METHOD_NAME_ADAPTER.validate_python("get_licensed_items_usages_page"),
72+
product_name=product_name,
73+
filter_wallet_id=filter_wallet_id,
74+
limit=limit,
75+
offset=offset,
76+
order_by=order_by,
77+
timeout_s=_DEFAULT_TIMEOUT_S,
78+
)
79+
assert isinstance(result, LicensedItemsUsagesPage) # nosec
80+
return result
7181

7282

7383
@log_decorator(_logger, level=logging.DEBUG)

services/resource-usage-tracker/src/simcore_service_resource_usage_tracker/api/rpc/_licensed_items_usages.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,14 @@
22
from models_library.api_schemas_resource_usage_tracker.licensed_items_usages import (
33
LicenseCheckoutGet,
44
LicenseCheckoutID,
5+
LicensedItemsUsagesPage,
56
LicensedItemUsageGet,
67
)
78
from models_library.licensed_items import LicensedItemID
89
from models_library.products import ProductName
910
from models_library.resource_tracker import ServiceRunId
11+
from models_library.resource_tracker_licensed_items_usages import LicensedItemUsageID
12+
from models_library.rest_ordering import OrderBy
1013
from models_library.users import UserID
1114
from models_library.wallets import WalletID
1215
from servicelib.rabbitmq import RPCRouter
@@ -16,6 +19,40 @@
1619
router = RPCRouter()
1720

1821

22+
@router.expose(reraise_if_error_type=())
23+
async def get_licensed_item_usage(
24+
app: FastAPI,
25+
*,
26+
product_name: ProductName,
27+
licensed_item_usage_id: LicensedItemUsageID,
28+
) -> LicensedItemUsageGet:
29+
return await licensed_items_usages.get_licensed_item_usage(
30+
db_engine=app.state.engine,
31+
product_name=product_name,
32+
licensed_item_usage_id=licensed_item_usage_id,
33+
)
34+
35+
36+
@router.expose(reraise_if_error_type=())
37+
async def get_licensed_items_usages_page(
38+
app: FastAPI,
39+
*,
40+
product_name: ProductName,
41+
filter_wallet_id: WalletID,
42+
offset: int = 0,
43+
limit: int = 20,
44+
order_by: OrderBy,
45+
) -> LicensedItemsUsagesPage:
46+
return await licensed_items_usages.list_licensed_items_usages(
47+
db_engine=app.state.engine,
48+
product_name=product_name,
49+
filter_wallet_id=filter_wallet_id,
50+
offset=offset,
51+
limit=limit,
52+
order_by=order_by,
53+
)
54+
55+
1956
@router.expose(reraise_if_error_type=())
2057
async def checkout_licensed_item(
2158
app: FastAPI,

services/resource-usage-tracker/src/simcore_service_resource_usage_tracker/services/licensed_items_usages.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,13 @@
2929
)
3030

3131

32-
async def list_licensed_items_purchases(
32+
async def list_licensed_items_usages(
3333
db_engine: Annotated[AsyncEngine, Depends(get_resource_tracker_db_engine)],
3434
*,
3535
product_name: ProductName,
3636
filter_wallet_id: WalletID,
37-
offset: int = 0,
38-
limit: int = 20,
37+
offset: int,
38+
limit: int,
3939
order_by: OrderBy,
4040
) -> LicensedItemsUsagesPage:
4141
total, licensed_items_usages_list_db = await licensed_items_usages_db.list_(

services/resource-usage-tracker/src/simcore_service_resource_usage_tracker/services/modules/db/licensed_items_usages_db.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ async def get(
128128
.select_from(resource_tracker_licensed_items_usage)
129129
.where(
130130
(
131-
resource_tracker_licensed_items_usage.c.licensed_item_purchase_id
131+
resource_tracker_licensed_items_usage.c.licensed_item_usage_id
132132
== licensed_item_usage_id
133133
)
134134
& (resource_tracker_licensed_items_usage.c.product_name == product_name)

services/resource-usage-tracker/tests/unit/with_dbs/test_api_licensed_items_usages.py

Lines changed: 34 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@
1010

1111
import pytest
1212
import sqlalchemy as sa
13+
from models_library.api_schemas_resource_usage_tracker.licensed_items_usages import (
14+
LicensedItemsUsagesPage,
15+
LicensedItemUsageGet,
16+
)
1317
from models_library.resource_tracker_licensed_items_purchases import (
1418
LicensedItemsPurchasesCreate,
1519
)
@@ -18,6 +22,9 @@
1822
licensed_items_purchases,
1923
licensed_items_usages,
2024
)
25+
from simcore_postgres_database.models.resource_tracker_licensed_items_usage import (
26+
resource_tracker_licensed_items_usage,
27+
)
2128
from simcore_postgres_database.models.resource_tracker_service_runs import (
2229
resource_tracker_service_runs,
2330
)
@@ -31,18 +38,6 @@
3138
]
3239

3340

34-
async def test_service_licensed_items_usages(
35-
mocked_redis_server: None,
36-
postgres_db: sa.engine.Engine,
37-
rpc_client: RabbitMQRPCClient,
38-
):
39-
...
40-
41-
# List licensed items usages
42-
43-
# Get licensed items usages
44-
45-
4641
_USER_ID_1 = 1
4742
_WALLET_ID = 6
4843

@@ -66,15 +61,24 @@ def resource_tracker_service_run_id(
6661

6762
yield row[0]
6863

64+
con.execute(resource_tracker_licensed_items_usage.delete())
6965
con.execute(resource_tracker_service_runs.delete())
7066

7167

7268
async def test_rpc_licensed_items_usages_workflow(
7369
mocked_redis_server: None,
74-
postgres_db: sa.engine.Engine,
7570
resource_tracker_service_run_id: str,
7671
rpc_client: RabbitMQRPCClient,
7772
):
73+
# List licensed items usages
74+
output = await licensed_items_usages.get_licensed_items_usages_page(
75+
rpc_client,
76+
product_name="osparc",
77+
filter_wallet_id=_WALLET_ID,
78+
)
79+
assert output.total == 0
80+
assert output.items == []
81+
7882
# Purchase license item
7983
_create_data = LicensedItemsPurchasesCreate(
8084
product_name="osparc",
@@ -108,6 +112,23 @@ async def test_rpc_licensed_items_usages_workflow(
108112
user_email="[email protected]",
109113
)
110114

115+
# List licensed items usages
116+
output = await licensed_items_usages.get_licensed_items_usages_page(
117+
rpc_client,
118+
product_name="osparc",
119+
filter_wallet_id=_WALLET_ID,
120+
)
121+
assert output.total == 1
122+
assert isinstance(output, LicensedItemsUsagesPage)
123+
124+
# Get licensed items usages
125+
output = await licensed_items_usages.get_licensed_item_usage(
126+
rpc_client,
127+
product_name="osparc",
128+
licensed_item_usage_id=output.items[0].licensed_item_usage_id,
129+
)
130+
assert isinstance(output, LicensedItemUsageGet)
131+
111132
# Release num of seats
112133
license_item_usage = await licensed_items_usages.release_licensed_item(
113134
rpc_client, checkout_id=checkout.checkout_id, product_name="osparc"

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

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -62,33 +62,34 @@ async def release_licensed_item_for_wallet(
6262
checkout_id: rut_licensed_items_usages.LicenseCheckoutID,
6363
) -> webserver_licensed_items_usages.LicensedItemUsageGet:
6464
rpc_client = get_rabbitmq_rpc_client(app)
65-
licensed_item_get: rut_licensed_items_usages.LicensedItemUsageGet = (
66-
await licensed_items_usages.release_licensed_item(
67-
rpc_client,
68-
product_name=product_name,
69-
checkout_id=checkout_id,
70-
)
65+
# Get
66+
checkout_item = await licensed_items_usages.get_licensed_item_usage(
67+
rpc_client, product_name=product_name, licensed_item_usage_id=checkout_id
7168
)
7269

7370
# Check whether user has access to the wallet
7471
await get_wallet_by_user(
7572
app,
7673
user_id=user_id,
77-
wallet_id=licensed_item_get.wallet_id,
74+
wallet_id=checkout_item.wallet_id,
7875
product_name=product_name,
7976
)
8077

78+
licensed_item_get: rut_licensed_items_usages.LicensedItemUsageGet = (
79+
await licensed_items_usages.release_licensed_item(
80+
rpc_client,
81+
product_name=product_name,
82+
checkout_id=checkout_id,
83+
)
84+
)
85+
8186
return webserver_licensed_items_usages.LicensedItemUsageGet(
82-
licensed_item_purchase_id=licensed_item_get.licensed_item_purchase_id,
83-
product_name=licensed_item_get.product_name,
87+
licensed_item_usage_id=licensed_item_get.licensed_item_usage_id,
8488
licensed_item_id=licensed_item_get.licensed_item_id,
8589
wallet_id=licensed_item_get.wallet_id,
86-
pricing_unit_cost_id=licensed_item_get.pricing_unit_cost_id,
87-
pricing_unit_cost=licensed_item_get.pricing_unit_cost,
88-
start_at=licensed_item_get.start_at,
89-
expire_at=licensed_item_get.expire_at,
90+
user_id=licensed_item_get.user_id,
91+
product_name=licensed_item_get.product_name,
92+
started_at=licensed_item_get.started_at,
93+
stopped_at=licensed_item_get.stopped_at,
9094
num_of_seats=licensed_item_get.num_of_seats,
91-
purchased_by_user=licensed_item_get.purchased_by_user,
92-
purchased_at=licensed_item_get.purchased_at,
93-
modified_at=licensed_item_get.modified,
9495
)

0 commit comments

Comments
 (0)