Skip to content

Commit 1028d5b

Browse files
committed
error handling update
1 parent 663d572 commit 1028d5b

File tree

1 file changed

+39
-25
lines changed

1 file changed

+39
-25
lines changed

src/handlers/api.py

Lines changed: 39 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -687,6 +687,25 @@ async def get(self, *args, **kwargs):
687687
self.finish(res)
688688

689689
class MetaKGParserHandler(BaseHandler):
690+
"""
691+
Handles parsing of SmartAPI metadata from a given URL or request body.
692+
693+
This handler processes SmartAPI metadata and returns structured,
694+
cleaned results based on the specified query parameters.
695+
696+
Supported HTTP methods:
697+
- **GET**: Parses metadata from a provided URL.
698+
- **POST**: Parses metadata from the request body.
699+
700+
Query Parameters:
701+
- `url` (str, required): The URL of the SmartAPI metadata to parse.
702+
Maximum length: 1000 characters.
703+
- `api_details` (bool, optional, default: `False`):
704+
Whether to return detailed API information.
705+
- `bte` (bool, optional, default: `False`):
706+
Whether to include BTE (BioThings Explorer) specific metadata.
707+
"""
708+
690709
kwargs = {
691710
"GET": {
692711
"url": {
@@ -713,17 +732,18 @@ def get_filtered_api(self, api_dict):
713732
"""Extract and return filtered API information."""
714733
api_info = api_dict["api"]
715734

735+
# Convert arguments to integers for consistency
736+
bte = int(self.args.bte)
737+
api_details = int(self.args.api_details)
738+
716739
# Default structure to preserve top-level keys
717740
filtered_dict = {
718-
"subject": api_dict.get("subject"),
719-
"object": api_dict.get("object"),
720-
"predicate": api_dict.get("predicate"),
721-
"subject_prefix": api_dict.get("subject_prefix"),
722-
"object_prefix": api_dict.get("object_prefix"),
723-
}
741+
key: api_dict.get(key)
742+
for key in ["subject", "object", "predicate", "subject_prefix", "object_prefix"]
743+
}
724744

725-
# case: bte=1, api_details=0
726-
if self.args.bte == "1" and self.args.api_details == "0":
745+
# Determine filtered API structure based on `bte` and `api_details`
746+
if bte == 1 and api_details == 0:
727747
filtered_api = {
728748
**({"name": api_info["name"]} if "name" in api_info else {}),
729749
**(
@@ -733,18 +753,12 @@ def get_filtered_api(self, api_dict):
733753
),
734754
"bte": api_info.get("bte", {}),
735755
}
736-
737-
# case: bte=0, api_details=1
738-
elif self.args.bte == "0" and self.args.api_details == "1":
739-
api_info.pop("bte", None)
740-
filtered_api = api_info
741-
742-
# case: api_details=1, bte=1
743-
elif self.args.bte == "1" and self.args.api_details == "1":
744-
filtered_api = api_info
745-
746-
# case: bte=0, api_details=0
747-
else:
756+
elif api_details == 1:
757+
# Covers both (bte=0, api_details=1) and (bte=1, api_details=1)
758+
filtered_api = api_info.copy()
759+
if bte == 0:
760+
filtered_api.pop("bte", None)
761+
else: # bte == 0 and api_details == 0
748762
filtered_api = {
749763
**({"name": api_info["name"]} if "name" in api_info else {}),
750764
**(
@@ -753,15 +767,17 @@ def get_filtered_api(self, api_dict):
753767
else {}
754768
),
755769
}
770+
756771
# Add the filtered 'api' key to the preserved top-level structure
757772
filtered_dict["api"] = filtered_api
758773

759-
# Remove 'bte' from 'api' if it exists
774+
# Remove 'bte' from 'api' and move it to the top level
760775
if "bte" in filtered_dict["api"]:
761-
filtered_dict['bte'] = filtered_dict["api"].pop("bte", None)
776+
filtered_dict["bte"] = filtered_dict["api"].pop("bte")
762777

763778
return filtered_dict
764779

780+
765781
def process_apis(self, apis):
766782
"""Process each API dict based on provided args."""
767783
if isinstance(apis, list):
@@ -779,9 +795,7 @@ def process_apis(self, apis):
779795

780796
async def get(self, *args, **kwargs):
781797
if not self.get_argument("url", None):
782-
self.set_status(400)
783-
self.write({"error": "Missing 'url' argument"})
784-
return
798+
raise HTTPError(400, reason="A url value is expected for the request, please provide a url.")
785799

786800
parser = MetaKGParser()
787801
url = self.get_argument("url")

0 commit comments

Comments
 (0)