From a055d8d4dc07b4f9d763b20a7f4c51f600b16b42 Mon Sep 17 00:00:00 2001 From: pcain-usgs <pcain@usgs.gov> Date: Fri, 2 Apr 2021 08:05:56 -0600 Subject: [PATCH] Create table, update table for PUT request, read table from entrypoint --- geomagio/api/db/create.py | 1 + geomagio/api/db/metadata_history.py | 35 +++++++++++++++++++++++++++++ geomagio/api/secure/metadata.py | 15 +++++++++++-- 3 files changed, 49 insertions(+), 2 deletions(-) create mode 100644 geomagio/api/db/metadata_history.py diff --git a/geomagio/api/db/create.py b/geomagio/api/db/create.py index 0ccc0a97..facf8608 100644 --- a/geomagio/api/db/create.py +++ b/geomagio/api/db/create.py @@ -3,6 +3,7 @@ import sqlalchemy from .common import database, sqlalchemy_metadata # register models with sqlalchemy_metadata by importing +from .metadata_history import metadata_history from .metadata_table import metadata from .session_table import session diff --git a/geomagio/api/db/metadata_history.py b/geomagio/api/db/metadata_history.py new file mode 100644 index 00000000..2cb3a6a2 --- /dev/null +++ b/geomagio/api/db/metadata_history.py @@ -0,0 +1,35 @@ +from sqlalchemy import Column, ForeignKey, Integer + +from ...metadata import Metadata +from .common import database, sqlalchemy_metadata +from .metadata_table import metadata + +# create copy of original metadata table and add to sqlalchemy metadata +metadata_history = metadata.tometadata( + metadata=sqlalchemy_metadata, name="metadata_history" +) +metadata_history.append_column( + Column( + "metadata_id", + Integer, + ForeignKey("metadata.id"), + nullable=False, + ), +) +metadata_history.indexes.clear() + + +async def create_metadata(meta: Metadata) -> Metadata: + query = metadata_history.insert() + meta.metadata_id = meta.id + values = meta.datetime_dict(exclude={"id"}, exclude_none=True) + query = query.values(**values) + meta.id = await database.execute(query) + return meta + + +async def get_metadata(metadata_id: int): + query = metadata_history.select() + query = query.where(metadata_history.c.metadata_id == metadata_id) + rows = await database.fetch_all(query) + return [Metadata(**row) for row in rows] diff --git a/geomagio/api/secure/metadata.py b/geomagio/api/secure/metadata.py index 86fad545..fcb694d3 100644 --- a/geomagio/api/secure/metadata.py +++ b/geomagio/api/secure/metadata.py @@ -21,7 +21,7 @@ from obspy import UTCDateTime from ...metadata import Metadata, MetadataCategory, MetadataQuery from ... import pydantic_utcdatetime -from ..db import metadata_table +from ..db import metadata_history, metadata_table from .login import require_user, User # routes for login/logout @@ -45,6 +45,14 @@ async def delete_metadata( await metadata_table.delete_metadata(id) +@router.get("/metadata/{id}/history", response_model=List[Metadata]) +async def get_history_by_metadata_id( + metadata_id: int, + user: User = Depends(require_user([os.getenv("REVIEWER_GROUP", "reviewer")])), +): + return await metadata_history.get_metadata(metadata_id=metadata_id) + + @router.get("/metadata", response_model=List[Metadata]) async def get_metadata( category: MetadataCategory = None, @@ -93,6 +101,9 @@ async def update_metadata( metadata: Metadata = Body(...), user: User = Depends(require_user([os.getenv("REVIEWER_GROUP", "reviewer")])), ): + original_metadata = await get_metadata_by_id(metadata.id) + await metadata_history.create_metadata(original_metadata) + metadata.updated_by = user.nickname + metadata.updated_time = UTCDateTime() await metadata_table.update_metadata(metadata) - # should be same, but read from database return await get_metadata_by_id(metadata.id) -- GitLab