diff --git a/geomagio/api/secure/MetadataQuery.py b/geomagio/api/secure/MetadataQuery.py index 6b30699d9ef1371019a6b89aaa0244b5b0c30111..f414dd47829b1d2b0718a0aca063bd5145455ae5 100644 --- a/geomagio/api/secure/MetadataQuery.py +++ b/geomagio/api/secure/MetadataQuery.py @@ -2,6 +2,7 @@ from datetime import timezone from obspy import UTCDateTime from pydantic import BaseModel +from typing import Optional from ...metadata import MetadataCategory from ... import pydantic_utcdatetime @@ -18,8 +19,8 @@ class MetadataQuery(BaseModel): station: str = None channel: str = None location: str = None - data_valid: bool = None - metadata_valid: bool = True + data_valid: Optional[bool] = None + metadata_valid: Optional[bool] = None def datetime_dict(self, **kwargs): values = self.dict(**kwargs) diff --git a/geomagio/apiclient/__init__.py b/geomagio/apiclient/__init__.py index a2e83d717b06eb25c744abfc79c90fb0cc83942c..53bb45e4c2ebd258886d2bcf0d41522b7a519bdb 100644 --- a/geomagio/apiclient/__init__.py +++ b/geomagio/apiclient/__init__.py @@ -1,4 +1,4 @@ -from .metadata import client +from .metadata import app from .MetadataFactory import MetadataFactory -__all__ = ["client", "MetadataFactory"] +__all__ = ["app", "MetadataFactory"] diff --git a/geomagio/apiclient/metadata.py b/geomagio/apiclient/metadata.py index 535c881c03cb886a945e7e554e4f006d52077dac..fae26289b701340fbd1387d92a1ce4b7d9bdc412 100644 --- a/geomagio/apiclient/metadata.py +++ b/geomagio/apiclient/metadata.py @@ -1,6 +1,6 @@ import json import os -from typing import Optional +from typing import Dict, Optional from obspy import UTCDateTime import typer @@ -10,14 +10,20 @@ from ..metadata import Metadata, MetadataCategory from .MetadataFactory import MetadataFactory -def main(): - typer.run(client) +def load_metadata(input_file) -> Optional[Dict]: + try: + with open(input_file, "r") as file: + data = json.load(file) + return data + except (FileNotFoundError, TypeError): + return None -def client( - action: str = typer.Option( - default="get", help="get(default), delete, create, or update" - ), +app = typer.Typer() + + +@app.command() +def create( url: str = "http://{}/ws/secure/metadata".format( os.getenv("GEOMAG_API_HOST", "127.0.0.1:8000") ), @@ -52,38 +58,98 @@ def client( data_valid=data_valid, metadata_valid=metadata_valid, ) + metadata.metadata = load_metadata(input_file=input_file) + response = MetadataFactory(url=url).create_metadata(metadata=metadata) + return response + + +@app.command() +def delete( + id: int, + url: str = "http://{}/ws/secure/metadata".format( + os.getenv("GEOMAG_API_HOST", "127.0.0.1:8000") + ), +): + response = MetadataFactory(url=url).delete_metadata(metadata=Metadata(id=id)) + return response + + +@app.command() +def get( + url: str = "http://{}/ws/secure/metadata".format( + os.getenv("GEOMAG_API_HOST", "127.0.0.1:8000") + ), + id: Optional[int] = None, + category: Optional[MetadataCategory] = None, + starttime: Optional[str] = None, + endtime: Optional[str] = None, + created_after: Optional[str] = None, + created_before: Optional[str] = None, + network: Optional[str] = None, + station: Optional[str] = None, + channel: Optional[str] = None, + location: Optional[str] = None, + data_valid: Optional[bool] = None, + metadata_valid: Optional[bool] = None, +): + query = MetadataQuery( + id=id, + category=category, + starttime=UTCDateTime(starttime) if starttime else None, + endtime=UTCDateTime(endtime) if endtime else None, + created_after=UTCDateTime(created_after) if created_after else None, + created_before=UTCDateTime(created_before) if created_before else None, + network=network, + station=station, + channel=channel, + location=location, + data_valid=data_valid, + metadata_valid=metadata_valid, + ) + metadata = MetadataFactory(url=url).get_metadata(query=query) + return metadata + - factory = MetadataFactory(url=url, token=os.getenv("GITLAB_API_TOKEN")) - if action == "delete": - response = factory.delete_metadata(metadata=metadata) - elif action == "get": - response = factory.get_metadata( - query=MetadataQuery( - id=id, - category=category, - starttime=UTCDateTime(starttime) if starttime else None, - endtime=UTCDateTime(endtime) if endtime else None, - created_after=UTCDateTime(created_after) if created_after else None, - created_before=UTCDateTime(created_before) if created_before else None, - network=network, - station=station, - channel=channel, - location=location, - data_valid=data_valid, - metadata_valid=metadata_valid, - ) - ) - elif action in ["create", "update"]: - try: - with open(input_file, "r") as file: - data = json.load(file) - except (FileNotFoundError, TypeError): - data = None - metadata.metadata = data - if action == "create": - response = factory.create_metadata(metadata=metadata) - elif action == "update": - response = factory.update_metadata(metadata=metadata) - else: - raise ValueError("Invalid action") +@app.command() +def update( + id: int, + url: str = "http://{}/ws/secure/metadata".format( + os.getenv("GEOMAG_API_HOST", "127.0.0.1:8000") + ), + category: Optional[MetadataCategory] = None, + starttime: Optional[str] = None, + endtime: Optional[str] = None, + created_after: Optional[str] = None, + created_before: Optional[str] = None, + network: Optional[str] = None, + station: Optional[str] = None, + channel: Optional[str] = None, + location: Optional[str] = None, + data_valid: Optional[bool] = True, + metadata_valid: Optional[bool] = True, + input_file: Optional[str] = typer.Option( + None, + help="JSON formatted file containing non-shared metadata information", + ), +): + metadata = Metadata( + id=id, + category=category, + starttime=UTCDateTime(starttime) if starttime else None, + endtime=UTCDateTime(endtime) if endtime else None, + created_after=UTCDateTime(created_after) if created_after else None, + created_before=UTCDateTime(created_before) if created_before else None, + network=network, + station=station, + channel=channel, + location=location, + data_valid=data_valid, + metadata_valid=metadata_valid, + ) + metadata.metadata = load_metadata(input_file=input_file) + response = MetadataFactory(url=url).update_metadata(metadata=metadata) return response + + +def main(): + app()