1
1
from typing import Any
2
-
2
+ import json
3
3
import requests
4
4
import urllib3
5
5
from django .conf import settings
32
32
"query_name" : "query-sde-primary" ,
33
33
"base_url" : "https://sciencediscoveryengine.nasa.gov" ,
34
34
},
35
- "lis_server " : {
35
+ "xli " : {
36
36
"app_name" : "nasa-sba-smd" ,
37
37
"query_name" : "query-smd-primary" ,
38
38
"base_url" : "http://sde-xli.nasa-impact.net" ,
39
39
},
40
- "lrm_dev_server " : {
40
+ "lrm_dev " : {
41
41
"app_name" : "sde-init-check" ,
42
42
"query_name" : "query-init-check" ,
43
43
"base_url" : "https://sde-lrm.nasa-impact.net" ,
44
44
},
45
- "lrm_qa_server " : {
45
+ "lrm_qa " : {
46
46
"app_name" : "sde-init-check" ,
47
47
"query_name" : "query-init-check" ,
48
48
"base_url" : "https://sde-qa.nasa-impact.net" ,
53
53
class Api :
54
54
def __init__ (self , server_name : str ) -> None :
55
55
self .server_name = server_name
56
- self .app_name : str = server_configs [server_name ]["app_name" ]
57
- self .query_name : str = server_configs [server_name ]["query_name" ]
58
- self .base_url : str = server_configs [server_name ]["base_url" ]
59
- self .xli_user = settings .XLI_USER
60
- self .xli_password = settings .XLI_PASSWORD
61
- self .lrm_user = settings .LRM_USER
62
- self .lrm_password = settings .LRM_PASSWORD
63
- self .lrm_qa_user = settings .LRM_QA_USER
64
- self .lrm_qa_password = settings .LRM_QA_PASSWORD
56
+ config = server_configs [server_name ]
57
+ self .app_name : str = config ["app_name" ]
58
+ self .query_name : str = config ["query_name" ]
59
+ self .base_url : str = config ["base_url" ]
60
+ self .user = getattr (settings , f"{ server_name } _USER" .upper (), None )
61
+ self .password = getattr (settings , f"{ server_name } _PASSWORD" .upper (), None )
62
+ self .token = getattr (settings , f"{ server_name } _TOKEN" .upper (), None )
65
63
66
64
def process_response (self , url : str , payload : dict [str , Any ]) -> Any :
67
65
response = requests .post (url , headers = {}, json = payload , verify = False )
@@ -74,14 +72,7 @@ def process_response(self, url: str, payload: dict[str, Any]) -> Any:
74
72
return meaningful_response
75
73
76
74
def query (self , page : int , collection_config_folder : str = "" ) -> Any :
77
- if self .server_name == "lis_server" :
78
- url = f"{ self .base_url } /api/v1/search.query?Password={ self .xli_password } &User={ self .xli_user } "
79
- elif self .server_name == "lrm_dev_server" :
80
- url = f"{ self .base_url } /api/v1/search.query?Password={ self .lrm_password } &User={ self .lrm_user } "
81
- elif self .server_name == "lrm_qa_server" :
82
- url = f"{ self .base_url } /api/v1/search.query?Password={ self .lrm_qa_password } &User={ self .lrm_qa_user } "
83
- else :
84
- url = f"{ self .base_url } /api/v1/search.query"
75
+ url = f"{ self .base_url } /api/v1/search.query?Password={ self .password } &User={ self .user } "
85
76
payload = {
86
77
"app" : self .app_name ,
87
78
"query" : {
@@ -94,11 +85,41 @@ def query(self, page: int, collection_config_folder: str = "") -> Any:
94
85
}
95
86
96
87
if collection_config_folder :
97
- if self .server_name in ["lis_server " , "lrm_dev_server " , "lrm_qa_server " ]:
88
+ if self .server_name in ["xli " , "lrm_dev " , "lrm_qa " ]:
98
89
payload ["query" ]["advanced" ]["collection" ] = f"/scrapers/{ collection_config_folder } /"
99
90
else :
100
91
payload ["query" ]["advanced" ]["collection" ] = f"/SDE/{ collection_config_folder } /"
101
92
102
93
response = self .process_response (url , payload )
103
94
104
95
return response
96
+
97
+ def sql_query (self , sql : str ) -> Any :
98
+ """Executes an SQL query on the configured server using token-based authentication."""
99
+ if not self .token :
100
+ raise ValueError ("You must have a token to use the SQL endpoint" )
101
+
102
+ url = f"{ self .base_url } /api/v1/engine.sql"
103
+ headers = {
104
+ "Content-Type" : "application/json" ,
105
+ "Authorization" : f"Bearer { self .token } "
106
+ }
107
+ payload = json .dumps ({
108
+ "method" : "engine.sql" ,
109
+ "sql" : sql ,
110
+ "pretty" : True ,
111
+ "log" : False ,
112
+ "output" : "json" ,
113
+ "resolveIndexList" : "false" ,
114
+ "engines" : "default" ,
115
+ })
116
+ try :
117
+ response = requests .post (url , headers = headers , data = payload , timeout = 10 )
118
+ response .raise_for_status ()
119
+ return response .json ()
120
+ except requests .exceptions .RequestException as e :
121
+ raise Exception (f"API request failed: { str (e )} " )
122
+
123
+ def get_full_texts (self , collection_config_folder : str ) -> Any :
124
+ sql = f"SELECT url1, text, title FROM sde_index WHERE collection = '/SDE/{ collection_config_folder } /'"
125
+ return self .sql_query (sql )
0 commit comments