Skip to content

Commit f232f79

Browse files
committed
cleanup
1 parent b11b6a4 commit f232f79

File tree

4 files changed

+62
-53
lines changed

4 files changed

+62
-53
lines changed

services/web/server/src/simcore_service_webserver/groups/_classifiers_rest.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ async def get_scicrunch_resource(request: web.Request):
5151
rrid = request.match_info["rrid"]
5252

5353
service = ScicrunchResourcesService(request.app)
54-
resource = await service.get_or_fetch_resource(rrid)
54+
resource = await service.get_or_fetch_reseach_resource(rrid)
5555

5656
return envelope_json_response(resource.model_dump())
5757

@@ -67,7 +67,7 @@ async def add_scicrunch_resource(request: web.Request):
6767
rrid = request.match_info["rrid"]
6868

6969
service = ScicrunchResourcesService(request.app)
70-
resource = await service.add_resource(rrid)
70+
resource = await service.create_research_resource(rrid)
7171

7272
return envelope_json_response(resource.model_dump())
7373

@@ -83,6 +83,6 @@ async def search_scicrunch_resources(request: web.Request):
8383
guess_name = str(request.query["guess_name"]).strip()
8484

8585
service = ScicrunchResourcesService(request.app)
86-
hits: list[ResourceHit] = await service.search_resources(guess_name)
86+
hits: list[ResourceHit] = await service.search_research_resources(guess_name)
8787

8888
return envelope_json_response([hit.model_dump() for hit in hits])

services/web/server/src/simcore_service_webserver/groups/_classifiers_service.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ async def _build_rrids_tree_view(
122122
service = ScicrunchResourcesService(self.app)
123123

124124
flat_tree_view: dict[TreePath, ClassifierItem] = {}
125-
for resource in await service.list_resources():
125+
for resource in await service.list_research_resources():
126126
try:
127127
validated_item = ClassifierItem(
128128
classifier=resource.rrid,

services/web/server/src/simcore_service_webserver/scicrunch/_service.py

Lines changed: 54 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,18 @@
1616

1717

1818
class ScicrunchResourcesService:
19-
"""Service layer handling business logic for scicrunch resources."""
19+
"""Service layer handling business logic for scicrunch resources.
20+
21+
- Research Resources operations (RRID = Research Resource ID)
22+
"""
2023

2124
def __init__(self, app: web.Application):
2225
self.app = app
2326
self._repo = ScicrunchResourcesRepository.create_from_app(app)
24-
self._scicrunch = SciCrunch.get_instance(self.app)
27+
# client to interact with scicrunch.org service
28+
self._client = SciCrunch.get_instance(self.app)
2529

26-
async def list_resources(self) -> list[ResearchResource]:
30+
async def list_research_resources(self) -> list[ResearchResource]:
2731
"""List all research resources as domain models."""
2832
rows = await self._repo.list_all_resources()
2933
if not rows:
@@ -47,85 +51,89 @@ async def list_resources(self) -> list[ResearchResource]:
4751

4852
return resources
4953

50-
def get_resolver_web_url(self, rrid: str) -> HttpUrl:
51-
"""Get the resolver web URL for a given RRID."""
52-
return self._scicrunch.get_resolver_web_url(rrid)
53-
54-
async def get_resource_atdb(self, rrid: str) -> ResearchResourceAtdB | None:
55-
"""Get resource with all database fields."""
56-
row = await self._repo.get_resource_by_rrid(rrid)
57-
if not row:
54+
async def get_research_resource(self, rrid: str) -> ResearchResource | None:
55+
"""Get resource as domain model."""
56+
resource_atdb = await self.get_resource_atdb(rrid)
57+
if not resource_atdb:
5858
return None
5959

6060
try:
61-
return ResearchResourceAtdB.model_validate(dict(row))
61+
return ResearchResource.model_validate(resource_atdb.model_dump())
6262
except ValidationError as err:
6363
_logger.exception(
6464
**create_troubleshooting_log_kwargs(
65-
f"Invalid data for resource {rrid}",
65+
f"Failed to convert resource {rrid} to domain model",
6666
error=err,
67-
error_context={"rrid": rrid, "row_data": dict(row)},
67+
error_context={
68+
"rrid": rrid,
69+
"resource_data": resource_atdb.model_dump(),
70+
},
6871
)
6972
)
7073
return None
7174

72-
async def get_resource(self, rrid: str) -> ResearchResource | None:
73-
"""Get resource as domain model."""
74-
resource_atdb = await self.get_resource_atdb(rrid)
75-
if not resource_atdb:
75+
async def get_or_fetch_reseach_resource(self, rrid: str) -> ResearchResource:
76+
"""Get resource from database first, fetch from SciCrunch API if not found."""
77+
# Validate the RRID format first
78+
validated_rrid = SciCrunch.validate_identifier(rrid)
79+
80+
# Check if in database first
81+
resource = await self.get_research_resource(validated_rrid)
82+
if resource:
83+
return resource
84+
85+
# Otherwise, request from scicrunch service
86+
return await self._client.get_resource_fields(validated_rrid)
87+
88+
async def get_resource_atdb(self, rrid: str) -> ResearchResourceAtdB | None:
89+
"""Get resource with all database fields."""
90+
row = await self._repo.get_resource_by_rrid(rrid)
91+
if not row:
7692
return None
7793

7894
try:
79-
return ResearchResource.model_validate(resource_atdb.model_dump())
95+
return ResearchResourceAtdB.model_validate(dict(row))
8096
except ValidationError as err:
8197
_logger.exception(
8298
**create_troubleshooting_log_kwargs(
83-
f"Failed to convert resource {rrid} to domain model",
99+
f"Invalid data for resource {rrid}",
84100
error=err,
85-
error_context={
86-
"rrid": rrid,
87-
"resource_data": resource_atdb.model_dump(),
88-
},
101+
error_context={"rrid": rrid, "row_data": dict(row)},
89102
)
90103
)
91104
return None
92105

93-
async def upsert_resource(self, resource: ResearchResource) -> ResearchResource:
94-
"""Create or update a research resource."""
95-
values = resource.model_dump(exclude_unset=True)
96-
row = await self._repo.upsert_resource(values)
97-
return ResearchResource.model_validate(dict(row))
98-
99-
async def search_resources(self, guess_name: str) -> list[ResourceHit]:
106+
async def search_research_resources(self, guess_name: str) -> list[ResourceHit]:
100107
"""Search for research resources using SciCrunch API."""
101108
guess_name = guess_name.strip()
102109
if not guess_name:
103110
return []
104111

105-
return await self._scicrunch.search_resource(guess_name)
112+
return await self._client.search_resource(guess_name)
106113

107-
async def add_resource(self, rrid: str) -> ResearchResource:
114+
async def create_research_resource(self, rrid: str) -> ResearchResource:
108115
"""Add a research resource by RRID, fetching from SciCrunch if not in database."""
109116
# Check if exists in database first
110-
resource = await self.get_resource(rrid)
117+
resource = await self.get_research_resource(rrid)
111118
if resource:
112119
return resource
113120

114121
# If not found, request from scicrunch service
115-
resource = await self._scicrunch.get_resource_fields(rrid)
122+
resource = await self._client.get_resource_fields(rrid)
116123

117124
# Insert new or update if exists
118-
return await self.upsert_resource(resource)
125+
return await self.upsert_research_resource(resource)
119126

120-
async def get_or_fetch_resource(self, rrid: str) -> ResearchResource:
121-
"""Get resource from database first, fetch from SciCrunch API if not found."""
122-
# Validate the RRID format first
123-
validated_rrid = SciCrunch.validate_identifier(rrid)
127+
async def upsert_research_resource(
128+
self, resource: ResearchResource
129+
) -> ResearchResource:
130+
"""Create or update a research resource."""
131+
values = resource.model_dump(exclude_unset=True)
132+
row = await self._repo.upsert_resource(values)
133+
return ResearchResource.model_validate(dict(row))
124134

125-
# Check if in database first
126-
resource = await self.get_resource(validated_rrid)
127-
if resource:
128-
return resource
135+
# HELPERS --
129136

130-
# Otherwise, request from scicrunch service
131-
return await self._scicrunch.get_resource_fields(validated_rrid)
137+
def get_resolver_web_url(self, rrid: str) -> HttpUrl:
138+
"""Get the resolver web URL for a given RRID."""
139+
return self._client.get_resolver_web_url(rrid)

services/web/server/tests/unit/with_dbs/01/test_groups_classifiers_repository.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
# pylint: disable=too-many-arguments
55

66
import pytest
7+
from models_library.groups import EVERYONE_GROUP_ID
78
from pytest_simcore.helpers.faker_factories import random_group_classifier
89
from pytest_simcore.helpers.postgres_tools import insert_and_get_row_lifespan
910
from simcore_postgres_database.models.classifiers import group_classifiers
@@ -16,10 +17,10 @@
1617
@pytest.fixture
1718
async def group_classifier_in_db(asyncpg_engine: AsyncEngine):
1819
"""Pre-populate group_classifiers table with test data."""
19-
data = random_group_classifier(
20-
gid=1,
21-
)
20+
data = random_group_classifier(gid=EVERYONE_GROUP_ID)
2221

22+
# pylint: disable=contextmanager-generator-missing-cleanup
23+
# NOTE: this code is safe since `@asynccontextmanager` takes care of the cleanup
2324
async with insert_and_get_row_lifespan(
2425
asyncpg_engine,
2526
table=group_classifiers,

0 commit comments

Comments
 (0)