""" Simple test API for timeseries management """ from typing import List from fastapi import APIRouter, Depends, HTTPException, Body from sqlalchemy.orm import Session from . import crud, schemas from toardb.utils.database import ToarDbSession, get_db from toardb.generic.models import RC_enum, RS_enum from toardb.utils.utils import get_str_from_value from toardb.contacts.crud import get_contact router = APIRouter() # plain views to post and get timeseries #get all entries of table timeseries @router.get('/timeseries/', response_model=List[schemas.Timeseries]) def get_all_timeseries(skip: int = 0, limit: int = None, db: Session = Depends(get_db)): return crud.get_all_timeseries(db, skip=skip, limit=limit) #get all metadata of one timeseries (known its ID) @router.get('/timeseries/{timeseries_id}', response_model=schemas.Timeseries) def get_timeseries(timeseries_id: int, db: Session = Depends(get_db)): db_timeseries = crud.get_timeseries(db, timeseries_id=timeseries_id) if db_timeseries is None: raise HTTPException(status_code=404, detail="Timeseries not found.") return db_timeseries #get all metadata of one timeseries (known its ID) @router.get('/timeseries/id/{timeseries_id}', response_model=schemas.Timeseries) def get_timeseries2(timeseries_id: int, db: Session = Depends(get_db)): db_timeseries = crud.get_timeseries(db, timeseries_id=timeseries_id) if db_timeseries is None: raise HTTPException(status_code=404, detail="Timeseries not found.") return db_timeseries #get all metadata of one timeseries (known its unique label) @router.get('/timeseries/unique/', response_model=schemas.Timeseries) def get_timeseries(station_id: int, variable_id: int, resource_provider: str , label: str='', db: Session = Depends(get_db)): db_timeseries = crud.get_timeseries_by_unique_constraints(db, station_id=station_id, variable_id=variable_id, resource_provider=resource_provider, label=label) if db_timeseries is None: raise HTTPException(status_code=404, detail="Timeseries not found.") return db_timeseries @router.get('/timeseries_changelog/{timeseries_id}', response_model=List[schemas.TimeseriesChangelog]) def get_timeseries_changelog(timeseries_id: int, db: Session = Depends(get_db)): db_changelog = crud.get_timeseries_changelog(db, timeseries_id=timeseries_id) return db_changelog #some more gets to be tested: # # # #problems with Roles!!! prelimarily return TimeseriesPatch (instead of Timeseries!) @router.post('/timeseries/', response_model=schemas.TimeseriesPatch) def create_timeseries(timeseries: schemas.TimeseriesCreate = Body(..., embed = True), db: Session = Depends(get_db)): #to be done! resource_provider!!! resource_provider = '' for role in timeseries.roles: if role.role == 'ResourceProvider': contact = get_contact(db, contact_id=role.contact_id) resource_provider=contact.organisation.longname db_timeseries = crud.get_timeseries_by_unique_constraints(db, station_id=timeseries.station_id, variable_id=timeseries.variable_id, label=timeseries.label, resource_provider=resource_provider) if db_timeseries: raise HTTPException(status_code=400, detail="Timeseries already registered.") db_timeseries=crud.create_timeseries(db=db, timeseries=timeseries) return db_timeseries @router.patch('/timeseries/{timeseries_id}', response_model=schemas.TimeseriesPatch) def patch_timeseries(timeseries_id: int, description: str, timeseries: schemas.TimeseriesPatch = Body(..., embed = True), db: Session = Depends(get_db)): db_timeseries = crud.get_timeseries(db, timeseries_id=timeseries_id) if db_timeseries is None: raise HTTPException(status_code=404, detail="Time series for patching not found.") return crud.patch_timeseries(db=db, description=description, timeseries_id=db_timeseries.id, timeseries=timeseries) @router.patch('/timeseries/delete_field/{timeseries_id}', response_model=schemas.TimeseriesPatch) def patch_timeseries(timeseries_id: int, field: str, db: Session = Depends(get_db)): db_timeseries = crud.get_timeseries(db, timeseries_id=timeseries_id) if db_timeseries is None: raise HTTPException(status_code=404, detail="Time series for deleting field not found.") return crud.delete_timeseries_field(db=db, timeseries_id=db_timeseries.id, keyword=field)