Skip to content

Commit 894505a

Browse files
committed
states
1 parent 684e28f commit 894505a

File tree

2 files changed

+80
-38
lines changed

2 files changed

+80
-38
lines changed

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

Lines changed: 26 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
import logging
44
from datetime import UTC, datetime, timedelta
5+
from enum import Enum, auto
6+
from pprint import pformat
57

68
from aiohttp import web
79
from models_library.api_schemas_webserver.licensed_items import (
@@ -37,6 +39,12 @@
3739
_logger = logging.getLogger(__name__)
3840

3941

42+
class RegistrationState(Enum):
43+
ALREADY_REGISTERED = auto()
44+
DIFFERENT_RESOURCE = auto()
45+
NEWLY_REGISTERED = auto()
46+
47+
4048
def _compute_difference(old_data: dict, new_data: dict):
4149
differences = {
4250
k: {"old": old_data[k], "new": new_data[k]}
@@ -49,44 +57,45 @@ def _compute_difference(old_data: dict, new_data: dict):
4957
return differences
5058

5159

52-
async def register_licensed_item_from_resource(
60+
async def register_resource_as_licensed_item(
5361
app: web.Application,
5462
*,
5563
licensed_resource_name: str,
5664
licensed_resource_type: LicensedResourceType,
5765
licensed_resource_data: BaseModel,
5866
license_key: str | None,
59-
) -> LicensedItemDB:
60-
67+
) -> tuple[LicensedItemDB, RegistrationState]:
6168
try:
62-
license_item = await _licensed_items_repository.get_by_resource_identifier(
69+
licensed_item = await _licensed_items_repository.get_by_resource_identifier(
6370
app,
6471
licensed_resource_name=licensed_resource_name,
6572
licensed_resource_type=licensed_resource_type,
6673
)
6774

68-
if license_item.licensed_resource_data != licensed_resource_data.model_dump(
75+
if licensed_item.licensed_resource_data != licensed_resource_data.model_dump(
6976
mode="json", exclude_unset=True
7077
):
7178
differences = _compute_difference(
72-
license_item.licensed_resource_data or {},
79+
licensed_item.licensed_resource_data or {},
7380
licensed_resource_data.model_dump(mode="json", exclude_unset=True),
7481
)
7582
_logger.warning(
76-
"CHANGES: NEEDED for %s, %s: Resource differs from the one registered: %s",
77-
licensed_resource_name,
78-
licensed_resource_type,
79-
differences,
80-
)
81-
else:
82-
_logger.info(
83-
"Resource %s, %s already registered",
83+
"DIFFERENT_RESOURCE: %s, %s. Difference: %s",
8484
licensed_resource_name,
8585
licensed_resource_type,
86+
pformat(differences),
8687
)
88+
return licensed_item, RegistrationState.DIFFERENT_RESOURCE
89+
90+
_logger.info(
91+
"ALREADY_REGISTERED: %s, %s",
92+
licensed_resource_name,
93+
licensed_resource_type,
94+
)
95+
return licensed_item, RegistrationState.ALREADY_REGISTERED
8796

8897
except LicensedItemNotFoundError:
89-
license_item = await _licensed_items_repository.create_if_not_exists(
98+
licensed_item = await _licensed_items_repository.create_if_not_exists(
9099
app,
91100
licensed_resource_name=licensed_resource_name,
92101
licensed_resource_type=licensed_resource_type,
@@ -99,12 +108,11 @@ async def register_licensed_item_from_resource(
99108
)
100109

101110
_logger.info(
102-
"NEW license with resource %s, %s already registered",
111+
"NEWLY_REGISTERED: %s, %s",
103112
licensed_resource_name,
104113
licensed_resource_type,
105114
)
106-
107-
return license_item
115+
return licensed_item, RegistrationState.NEWLY_REGISTERED
108116

109117

110118
async def get_licensed_item(

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

Lines changed: 54 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ def mock_itis_vip_downloadables_api(
6363
"msg": 0,
6464
"availableDownloads": [
6565
{
66-
"ID": faker.random_int(min=70, max=90),
66+
"ID": i,
6767
"Description": faker.sentence(),
6868
"Thumbnail": faker.image_url(),
6969
# NOTE: this is manually added in the server side so be more robust to errors
@@ -74,7 +74,7 @@ def mock_itis_vip_downloadables_api(
7474
"Protection": faker.random_element(elements=["Code", "PayPal"]),
7575
"AvailableFromURL": faker.random_element(elements=[None, faker.url()]),
7676
}
77-
for _ in range(8)
77+
for i in range(8)
7878
],
7979
}
8080

@@ -148,26 +148,60 @@ async def test_sync_itis_vip_as_licensed_items(
148148
assert items[0].features["functionality"] == "Posable"
149149

150150
for vip_item in items:
151-
# TODO: how to update to minimize collisions? one by one?
152-
153-
got1 = (
154-
await _licensed_items_service.register_licensed_item_from_resource(
155-
client.app,
156-
licensed_resource_name=f"{category}/{vip_item.id}",
157-
licensed_resource_type=LicensedResourceType.VIP_MODEL,
158-
licensed_resource_data=vip_item,
159-
license_key=vip_item.license_key,
160-
)
151+
(
152+
got1,
153+
state1,
154+
) = await _licensed_items_service.register_resource_as_licensed_item(
155+
client.app,
156+
licensed_resource_name=f"{category}/{vip_item.id}",
157+
licensed_resource_type=LicensedResourceType.VIP_MODEL,
158+
licensed_resource_data=vip_item,
159+
license_key=vip_item.license_key,
160+
)
161+
assert (
162+
state1 == _licensed_items_service.RegistrationState.NEWLY_REGISTERED
161163
)
162164

163-
got2 = (
164-
await _licensed_items_service.register_licensed_item_from_resource(
165-
client.app,
166-
licensed_resource_name=f"{category}/{vip_item.id}",
167-
licensed_resource_type=LicensedResourceType.VIP_MODEL,
168-
licensed_resource_data=vip_item,
169-
license_key=vip_item.license_key,
170-
)
165+
(
166+
got2,
167+
state2,
168+
) = await _licensed_items_service.register_resource_as_licensed_item(
169+
client.app,
170+
licensed_resource_name=f"{category}/{vip_item.id}",
171+
licensed_resource_type=LicensedResourceType.VIP_MODEL,
172+
licensed_resource_data=vip_item,
173+
license_key=vip_item.license_key,
171174
)
172175

176+
assert (
177+
state2
178+
== _licensed_items_service.RegistrationState.ALREADY_REGISTERED
179+
)
173180
assert got1 == got2
181+
182+
# Modify vip_item and register again
183+
vip_item_modified = vip_item.model_copy(
184+
update={
185+
"features": {
186+
**vip_item.features,
187+
"functionality": "Non-Posable",
188+
}
189+
}
190+
)
191+
(
192+
got3,
193+
state3,
194+
) = await _licensed_items_service.register_resource_as_licensed_item(
195+
client.app,
196+
licensed_resource_name=f"{category}/{vip_item.id}",
197+
licensed_resource_type=LicensedResourceType.VIP_MODEL,
198+
licensed_resource_data=vip_item_modified,
199+
license_key=vip_item.license_key,
200+
)
201+
202+
assert (
203+
state3
204+
== _licensed_items_service.RegistrationState.DIFFERENT_RESOURCE
205+
)
206+
# not stored!
207+
assert got2 == got3

0 commit comments

Comments
 (0)