From 970705c13c49cc62fbe43ded315bf810228d5e2b Mon Sep 17 00:00:00 2001
From: pcain-usgs <pcain@usgs.gov>
Date: Tue, 23 Mar 2021 09:33:11 -0600
Subject: [PATCH] _get_header, get_metadata_by_id, allow exception for no data,
 move query

---
 debugger.py                                   |  3 --
 geomagio/api/secure/metadata.py               |  5 +-
 geomagio/api/ws/metadata.py                   |  3 +-
 geomagio/apiclient/MetadataFactory.py         | 46 +++++++++----------
 geomagio/apiclient/metadata.py                | 10 ++--
 .../{api/secure => metadata}/MetadataQuery.py |  4 +-
 geomagio/metadata/__init__.py                 |  3 +-
 7 files changed, 34 insertions(+), 40 deletions(-)
 delete mode 100644 debugger.py
 rename geomagio/{api/secure => metadata}/MetadataQuery.py (91%)

diff --git a/debugger.py b/debugger.py
deleted file mode 100644
index e62088d4b..000000000
--- a/debugger.py
+++ /dev/null
@@ -1,3 +0,0 @@
-from geomagio.apiclient.metadata import create
-
-create(station="BOU", category="reading")
diff --git a/geomagio/api/secure/metadata.py b/geomagio/api/secure/metadata.py
index 227ce65d0..e619c6636 100644
--- a/geomagio/api/secure/metadata.py
+++ b/geomagio/api/secure/metadata.py
@@ -19,11 +19,10 @@ from typing import List
 from fastapi import APIRouter, Body, Depends, Request, Response
 from obspy import UTCDateTime
 
-from ...metadata import Metadata, MetadataCategory
+from ...metadata import Metadata, MetadataCategory, MetadataQuery
+from ... import pydantic_utcdatetime
 from ..db import metadata_table
 from .login import require_user, User
-from .MetadataQuery import MetadataQuery
-from ... import pydantic_utcdatetime
 
 # routes for login/logout
 router = APIRouter()
diff --git a/geomagio/api/ws/metadata.py b/geomagio/api/ws/metadata.py
index 9f4febeb9..655c33e59 100644
--- a/geomagio/api/ws/metadata.py
+++ b/geomagio/api/ws/metadata.py
@@ -3,8 +3,7 @@ from typing import List
 from fastapi import APIRouter
 from obspy import UTCDateTime
 
-from ...metadata import Metadata, MetadataCategory
-from ..secure.MetadataQuery import MetadataQuery
+from ...metadata import Metadata, MetadataCategory, MetadataQuery
 from ..db import metadata_table
 
 router = APIRouter()
diff --git a/geomagio/apiclient/MetadataFactory.py b/geomagio/apiclient/MetadataFactory.py
index 1d8ded018..288901c68 100644
--- a/geomagio/apiclient/MetadataFactory.py
+++ b/geomagio/apiclient/MetadataFactory.py
@@ -5,8 +5,7 @@ from typing import List, Union
 from obspy import UTCDateTime
 from pydantic import parse_obj_as
 
-from ..api.secure.MetadataQuery import MetadataQuery
-from ..metadata import Metadata
+from ..metadata import Metadata, MetadataQuery
 
 
 class MetadataFactory(object):
@@ -19,7 +18,10 @@ class MetadataFactory(object):
     ):
         self.url = url
         self.token = token
-        self.header = {"Authorization": self.token} if token else None
+        self.header = self._get_headers()
+
+    def _get_headers(self):
+        return {"Authorization": self.token} if self.token else None
 
     def delete_metadata(self, metadata: Metadata) -> bool:
         response = requests.delete(url=f"{self.url}/{metadata.id}", headers=self.header)
@@ -28,19 +30,19 @@ class MetadataFactory(object):
         return False
 
     def get_metadata(self, query: MetadataQuery) -> List[Metadata]:
-        args = parse_params(query=query)
-        if "id" in args:
-            self.url = f"{self.url}/{args['id']}"
-            args = {}
-        response = requests.get(url=self.url, params=args, headers=self.header)
-        try:
-            metadata = parse_obj_as(Union[List[Metadata], Metadata], response.json())
-        except:
-            return []
+        if query.id:
+            response = self.get_metadata_by_id(id=query.id)
+        else:
+            args = parse_params(query=query)
+            response = requests.get(url=self.url, params=args, headers=self.header)
+        metadata = parse_obj_as(Union[List[Metadata], Metadata], response.json())
         if isinstance(metadata, Metadata):
             metadata = [metadata]
         return metadata
 
+    def get_metadata_by_id(self, id: int) -> requests.Response:
+        return requests.get(f"{self.url}/{id}", headers=self.header)
+
     def create_metadata(self, metadata: Metadata) -> Metadata:
         response = requests.post(
             url=self.url, data=metadata.json(), headers=self.header
@@ -55,19 +57,15 @@ class MetadataFactory(object):
 
 
 def parse_params(query: MetadataQuery) -> str:
-    query = query.dict()
+    query = query.dict(exclude_none=True)
     args = {}
     for key in query.keys():
         element = query[key]
-        if element is not None:
-            # convert times to strings
-            if type(element) == UTCDateTime:
-                element = element.isoformat()
-            # get string value of metadata category
-            if key == "category":
-                element = element.value
-            elif key == "id":
-                return {"id": element}
-            args[key] = element
-
+        # convert times to strings
+        if isinstance(element, UTCDateTime):
+            element = element.isoformat()
+        # get string value of metadata category
+        if key == "category":
+            element = element.value
+        args[key] = element
     return args
diff --git a/geomagio/apiclient/metadata.py b/geomagio/apiclient/metadata.py
index 0835d5ae0..afb3ea63e 100644
--- a/geomagio/apiclient/metadata.py
+++ b/geomagio/apiclient/metadata.py
@@ -6,8 +6,7 @@ from typing import Dict, Optional
 from obspy import UTCDateTime
 import typer
 
-from ..api.secure.MetadataQuery import MetadataQuery
-from ..metadata import Metadata, MetadataCategory
+from ..metadata import Metadata, MetadataCategory, MetadataQuery
 from .MetadataFactory import MetadataFactory
 
 
@@ -58,7 +57,7 @@ def create(
             endtime=UTCDateTime(endtime) if endtime else None,
             id=id,
             location=location,
-            metadata=input_metadata["metadata"],
+            metadata=input_metadata,
             metadata_valid=metadata_valid,
             network=network,
             starttime=UTCDateTime(starttime) if starttime else None,
@@ -78,7 +77,8 @@ def delete(
     metadata_dict = load_metadata(input_file=input_file)
     metadata = Metadata(**metadata_dict)
     deleted = MetadataFactory(url=url).delete_metadata(metadata=metadata)
-    print(deleted)
+    if not deleted:
+        sys.exit(1)
 
 
 @app.command()
@@ -124,7 +124,7 @@ def get(
             raise ValueError("More than one matching record")
         print(metadata[0].json())
         return
-    print([m.json() for m in metadata])
+    print("[" + ",".join([m.json() for m in metadata]) + "]")
 
 
 @app.command()
diff --git a/geomagio/api/secure/MetadataQuery.py b/geomagio/metadata/MetadataQuery.py
similarity index 91%
rename from geomagio/api/secure/MetadataQuery.py
rename to geomagio/metadata/MetadataQuery.py
index f414dd478..36e6c3ebe 100644
--- a/geomagio/api/secure/MetadataQuery.py
+++ b/geomagio/metadata/MetadataQuery.py
@@ -4,8 +4,8 @@ from obspy import UTCDateTime
 from pydantic import BaseModel
 from typing import Optional
 
-from ...metadata import MetadataCategory
-from ... import pydantic_utcdatetime
+from .. import pydantic_utcdatetime
+from .MetadataCategory import MetadataCategory
 
 
 class MetadataQuery(BaseModel):
diff --git a/geomagio/metadata/__init__.py b/geomagio/metadata/__init__.py
index 7502db024..37b2adc33 100644
--- a/geomagio/metadata/__init__.py
+++ b/geomagio/metadata/__init__.py
@@ -1,5 +1,6 @@
 from .Metadata import Metadata
 from .MetadataCategory import MetadataCategory
+from .MetadataQuery import MetadataQuery
 
 
-__all__ = ["Metadata", "MetadataCategory"]
+__all__ = ["Metadata", "MetadataCategory", "MetadataQuery"]
-- 
GitLab