@@ -40,7 +40,7 @@ class ApiExecutorRequest(pydantic.BaseModel):
4040 title : str | None = None
4141 query : str | None = None
4242 query_path : str | list [str ] | None = None
43- context : garf_executors .api_executor . ApiExecutionContext
43+ context : garf_executors .ApiExecutionContext
4444
4545 @pydantic .model_validator (mode = 'after' )
4646 def check_query_specified (self ):
@@ -57,35 +57,42 @@ def model_post_init(self, __context__) -> None:
5757 self .title = str (self .query_path )
5858
5959
60+ class ApiExecutorResponse (pydantic .BaseModel ):
61+ """Response after executing a query.
62+
63+ Attributes:
64+ results: Results of query execution.
65+ """
66+
67+ results : list [str ]
68+
69+
6070router = fastapi .APIRouter (prefix = '/api' )
6171
6272
6373@router .post ('/execute' )
64- async def execute (request : ApiExecutorRequest ) -> dict [ str , str ] :
74+ async def execute (request : ApiExecutorRequest ) -> ApiExecutorResponse :
6575 if not (concrete_api_fetcher := garf_executors .FETCHERS .get (request .source )):
6676 raise exceptions .GarfExecutorError (
6777 f'Source { request .source } is not available.'
6878 )
6979
70- query_executor = garf_executors .api_executor . ApiQueryExecutor (
80+ query_executor = garf_executors .ApiQueryExecutor (
7181 concrete_api_fetcher (** request .context .fetcher_parameters )
7282 )
7383
7484 result = query_executor .execute (request .query , request .title , request .context )
75-
76- return fastapi .responses .JSONResponse (
77- content = fastapi .encoders .jsonable_encoder ({'result' : result })
78- )
85+ return ApiExecutorResponse (results = [result ])
7986
8087
8188@router .post ('/execute:batch' )
82- async def execute_batch (request : ApiExecutorRequest ) -> dict [ str , str ] :
89+ async def execute_batch (request : ApiExecutorRequest ) -> ApiExecutorResponse :
8390 if not (concrete_api_fetcher := garf_executors .FETCHERS .get (request .source )):
8491 raise exceptions .GarfExecutorError (
8592 f'Source { request .source } is not available.'
8693 )
8794
88- query_executor = garf_executors .api_executor . ApiQueryExecutor (
95+ query_executor = garf_executors .ApiQueryExecutor (
8996 concrete_api_fetcher (** request .context .fetcher_parameters )
9097 )
9198 file_reader = reader .FileReader ()
@@ -102,10 +109,7 @@ async def execute_batch(request: ApiExecutorRequest) -> dict[str, str]:
102109 }
103110 for future in futures .as_completed (future_to_query ):
104111 results .append (future .result ())
105-
106- return fastapi .responses .JSONResponse (
107- content = fastapi .encoders .jsonable_encoder ({'result' : results })
108- )
112+ return ApiExecutorResponse (results = results )
109113
110114
111115if __name__ == '__main__' :
0 commit comments