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