queries¶
General /queries endpoint to handle gateway queries
This file describes the router for:
/queries/{id}
where, id
may be left out.
get_queries(request, params=Depends(NoneType))
async
¶
GET /queries
Return overview of all (active) queries.
Source code in optimade_gateway/routers/queries.py
@ROUTER.get(
"/queries",
response_model=QueriesResponse,
response_model_exclude_defaults=False,
response_model_exclude_none=False,
response_model_exclude_unset=True,
tags=["Queries"],
responses=ERROR_RESPONSES,
)
async def get_queries(
request: Request,
params: EntryListingQueryParams = Depends(),
) -> QueriesResponse:
"""`GET /queries`
Return overview of all (active) queries.
"""
return await get_entries(
collection=await collection_factory(CONFIG.queries_collection),
response_cls=QueriesResponse,
request=request,
params=params,
)
get_query(request, query_id, response)
async
¶
GET /queries/{query_id}
Return a single QueryResource
.
Source code in optimade_gateway/routers/queries.py
@ROUTER.get(
"/queries/{query_id}",
response_model=QueriesResponseSingle,
response_model_exclude_defaults=False,
response_model_exclude_none=False,
response_model_exclude_unset=True,
tags=["Queries"],
responses=ERROR_RESPONSES,
)
async def get_query(
request: Request,
query_id: str,
response: Response,
) -> QueriesResponseSingle:
"""`GET /queries/{query_id}`
Return a single [`QueryResource`][optimade_gateway.models.queries.QueryResource].
"""
collection = await collection_factory(CONFIG.queries_collection)
query: QueryResource = await get_valid_resource(collection, query_id)
if query.attributes.response and query.attributes.response.errors:
for error in query.attributes.response.errors:
if error.status:
for part in error.status.split(" "):
try:
response.status_code = int(part)
break
except ValueError:
pass
if response.status_code and response.status_code >= 300:
break
else:
response.status_code = 500
return QueriesResponseSingle(
links=ToplevelLinks(next=None),
data=query,
meta=meta_values(
url=request.url,
data_returned=1,
data_available=await collection.acount(),
more_data_available=False,
),
)
post_queries(request, query)
async
¶
POST /queries
Create or return existing gateway query according to query
.
Source code in optimade_gateway/routers/queries.py
@ROUTER.post(
"/queries",
response_model=QueriesResponseSingle,
response_model_exclude_defaults=False,
response_model_exclude_none=False,
response_model_exclude_unset=True,
tags=["Queries"],
status_code=status.HTTP_202_ACCEPTED,
responses=ERROR_RESPONSES,
)
async def post_queries(
request: Request,
query: QueryCreate,
) -> QueriesResponseSingle:
"""`POST /queries`
Create or return existing gateway query according to `query`.
"""
await validate_resource(
await collection_factory(CONFIG.gateways_collection), query.gateway_id
)
result, created = await resource_factory(query)
if created:
asyncio.create_task(perform_query(url=request.url, query=result))
collection = await collection_factory(CONFIG.queries_collection)
return QueriesResponseSingle(
links=ToplevelLinks(next=None),
data=result,
meta=meta_values(
url=request.url,
data_returned=1,
data_available=await collection.acount(),
more_data_available=False,
**{f"_{CONFIG.provider.prefix}_created": created},
),
)