diff --git a/spaceweather_processing/app.py b/spaceweather_processing/app.py index b133e4c76723668b984848bd8af5570d6c77ddfc..93fde0bd315645cb935b82af420db41e1c0f4746 100644 --- a/spaceweather_processing/app.py +++ b/spaceweather_processing/app.py @@ -5,6 +5,7 @@ from datetime import datetime from typing import Union from fastapi import FastAPI, exceptions, Request + from pymongo import MongoClient, DESCENDING from pymongo.collection import Collection from bson.objectid import ObjectId @@ -116,10 +117,14 @@ class DataProductDB: item = augment_item(item) return item - def get_items(self, collection_name, query, skip=0, limit=100, url=None, select=None): + def get_distinct_field(self, collection_name, query, distinct=None): + results = self.db[collection_name].find(query,distinct).distinct(distinct) + return {'results': results} + + + def get_items(self, collection_name, query, skip=0, limit=100, url=None, select=None, sort=None): n_results = self.db[collection_name].count_documents(query) - selected_fields = {} if "additional_files_path" in select or "additional_files_url" in select: @@ -128,8 +133,15 @@ class DataProductDB: for item in select: selected_fields[item] = 1 - results = [augment_item(item) for item in - self.db[collection_name].find(query, selected_fields).skip(skip).limit(limit)] + + # if a &sort=<field> url parameter is given then use sort, otherwise omit it (backward compatibility) + if sort: + results = [augment_item(item) for item in + self.db[collection_name].find(query, selected_fields).skip(skip).limit(limit).sort(sort)] + else: + results = [augment_item(item) for item in + self.db[collection_name].find(query, selected_fields).skip(skip).limit(limit)] + quoted_query = urlparse.quote(json.dumps(query)) quoted_select = urlparse.quote(json.dumps(select)) if url: @@ -142,7 +154,6 @@ class DataProductDB: DB = DataProductDB() app = FastAPI(default_response_class=ORJSONResponse) - def validate_date(date_str): date_items = date_str.split('-') if len(date_items) != 3: @@ -193,8 +204,25 @@ def get_tasks(collection_name: str, task_id: str, request: Request): else: raise exceptions.HTTPException(status_code=404, detail=f'Collection {collection_name} does not exist') +@app.get('/{collection_name}/distinct/') +def get_tasks_distinct_field(collection_name: str, request: Request, filter: Union[str, None] = None, distinct: str = None): + + DB.base_url = from_urlobj_to_url(request.url) + try: + if filter: + query = json.loads(filter) + else: + query = {} + + except: + raise exceptions.HTTPException(status_code=422, detail='filter syntax invalid') + if DB.does_collection_exist(collection_name): + return DB.get_distinct_field(collection_name, query=query, distinct=distinct) + else: + raise exceptions.HTTPException(status_code=404, detail=f'collection {collection_name} does not exist') + @app.get('/{collection_name}/tasks/') -def get_tasks(collection_name: str, request: Request, skip: int = 0, limit: int = 100, filter: Union[str, None] = None, select: Union[str, None] = None): +def get_tasks(collection_name: str, request: Request, skip: int = 0, limit: int = 100, filter: Union[str, None] = None, select: Union[str, None] = None, sort: str = None): DB.base_url = from_urlobj_to_url(request.url) try: if filter: @@ -208,7 +236,7 @@ def get_tasks(collection_name: str, request: Request, skip: int = 0, limit: int except: raise exceptions.HTTPException(status_code=422, detail='filter syntax invalid') if DB.does_collection_exist(collection_name): - return DB.get_items(collection_name, query=query, limit=limit, skip=skip, url=from_urlobj_to_url(request.url), select=select) + return DB.get_items(collection_name, query=query, limit=limit, skip=skip, url=from_urlobj_to_url(request.url), select=select, sort=sort) else: raise exceptions.HTTPException(status_code=404, detail=f'collection {collection_name} does not exist')