1616
1717
1818class 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 )
0 commit comments