""" Simple test API for data management """ import json from typing import List from fastapi import APIRouter, Depends, HTTPException, \ File, UploadFile from sqlalchemy.orm import Session from sqlalchemy.engine import Engine from . import crud, schemas from toardb.utils.database import ToarDbSession, engine, get_engine, get_db router = APIRouter() # plain views to post and get data #get all data of table data @router.get('/data/', response_model=List[schemas.Data]) def get_all_data(skip: int = 0, limit: int = None, db: Session = Depends(get_db)): data = crud.get_all_data(db, skip=skip, limit=limit) return data #get all data of one timeseries @router.get('/data/{timeseries_id}', response_model=List[schemas.Data]) def get_data(timeseries_id: int, db: Session = Depends(get_db)): db_data = crud.get_data(db, timeseries_id=timeseries_id) if db_data is None: raise HTTPException(status_code=404, detail="Data not found.") return db_data #some more gets to be tested: # - get all data of one special timestamp # - get all data of one special timestamp and timeseries # - ... @router.post('/data/', response_model=schemas.DataCreate) async def create_data(file: UploadFile = File(...), db: Session = Depends(get_db), engine: Engine = Depends(get_engine)): # # the next three lines are automatically done by database management, # # but we do want helpful error messages! # db_data = crud.get_data_by_datetime_and_timeseriesid(db, datetime=data.datetime, timeseries_id=data.timeseries_id) # if db_data: # raise HTTPException(status_code=400, detail="Data already registered.") # BUT: # we want to upload a whole file! # response = crud.create_data(db, engine, input_handle=file) if response.status_code != 200: msg = response.body.decode('utf-8') # try to parse error messages from DBS (to be more understandable) msg2 = '"An error occurred in data insertion: <class \'psycopg2.errors.UniqueViolation\'>"' if (msg == msg2): msg = 'Data for timeseries already registered.' raise HTTPException(status_code=400, detail=msg) return response