diff --git a/Pipfile b/Pipfile index af51971f70bc61506574281a3faf774ecac34541..95d02b849f8fbbf6a68042bd764ce3feb810da9b 100644 --- a/Pipfile +++ b/Pipfile @@ -17,5 +17,8 @@ gevent = "==20.9.0" TheCodeLabs-BaseUtils = "*" TheCodeLabs-FlaskUtils = "*" pyyaml = "==5.3.1" +fastapi = "==0.63.0" +uvicorn = "==0.13.3" +sqlalchemy = "==1.3.22" [dev-packages] diff --git a/src/logic/databaseNew/Crud.py b/src/logic/databaseNew/Crud.py new file mode 100644 index 0000000000000000000000000000000000000000..084cc5c10f912c784cf5e38a981455ce89c737e5 --- /dev/null +++ b/src/logic/databaseNew/Crud.py @@ -0,0 +1,35 @@ +from sqlalchemy.orm import Session + +from logic.databaseNew import Models, Schemas + + +def get_devices(db: Session, skip: int = 0, limit: int = 100): + return db.query(Models.Device).offset(skip).limit(limit).all() + + +def get_device(db: Session, deviceId: int): + return db.query(Models.Device).filter(Models.Device.id == deviceId).first() + + +def get_device_by_name(db: Session, name: str): + return db.query(Models.Device).filter(Models.Device.name == name).first() + + +def create_device(db: Session, device: Schemas.DeviceCreate): + dbDevice = Models.Device(name=device.name) + db.add(dbDevice) + db.commit() + db.refresh(dbDevice) + return dbDevice + + +def get_sensors(db: Session, skip: int = 0, limit: int = 100): + return db.query(Models.Sensor).offset(skip).limit(limit).all() + + +def create_sensor(db: Session, item: Schemas.SensorCreate, deviceId: int): + dbSensor = Models.Sensor(**item.dict(), deviceId=deviceId) + db.add(dbSensor) + db.commit() + db.refresh(dbSensor) + return dbSensor diff --git a/src/logic/databaseNew/Database.py b/src/logic/databaseNew/Database.py new file mode 100644 index 0000000000000000000000000000000000000000..72be7a8b49ce842371fc3d9b79c7eeda05e9a536 --- /dev/null +++ b/src/logic/databaseNew/Database.py @@ -0,0 +1,13 @@ +from sqlalchemy import create_engine +from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.orm import sessionmaker + +SQLALCHEMY_DATABASE_URL = 'sqlite:///../../storageLeaf_new.db' + +engine = create_engine( + SQLALCHEMY_DATABASE_URL, connect_args={'check_same_thread': False} +) + +SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) + +Base = declarative_base() diff --git a/src/logic/databaseNew/Models.py b/src/logic/databaseNew/Models.py new file mode 100644 index 0000000000000000000000000000000000000000..f8fc1ea8cc8778d4a49e31848f89890c15b33e1b --- /dev/null +++ b/src/logic/databaseNew/Models.py @@ -0,0 +1,24 @@ +from sqlalchemy import Column, ForeignKey, Integer, String +from sqlalchemy.orm import relationship + +from logic.databaseNew.Database import Base + + +class Device(Base): + __tablename__ = 'device' + + id = Column(Integer, primary_key=True, index=True) + name = Column(String, unique=True, index=True, nullable=False) + + sensors = relationship('Sensor', back_populates='device') + + +class Sensor(Base): + __tablename__ = 'sensor' + + id = Column(Integer, primary_key=True, index=True) + name = Column(String, index=True, nullable=False) + type = Column(String, index=True, nullable=False) + deviceId = Column(Integer, ForeignKey('device.id')) + + device = relationship('Device', back_populates='sensors') diff --git a/src/logic/databaseNew/Schemas.py b/src/logic/databaseNew/Schemas.py new file mode 100644 index 0000000000000000000000000000000000000000..cc0e4f260f7cfb7568c67b3945a4ce7f12f9cf57 --- /dev/null +++ b/src/logic/databaseNew/Schemas.py @@ -0,0 +1,40 @@ +from typing import List + +from pydantic import BaseModel + + +class SensorBase(BaseModel): + id: int + name: str + type: str + + +class SensorCreate(BaseModel): + name: str + type: str + + +class Sensor(BaseModel): + id: int + name: str + type: str + deviceId: int + + class Config: + orm_mode = True + + +class DeviceBase(BaseModel): + id: int + name: str + + +class DeviceCreate(BaseModel): + name: str + + +class Device(DeviceBase): + sensors: List[SensorBase] + + class Config: + orm_mode = True diff --git a/src/logic/databaseNew/__init__.py b/src/logic/databaseNew/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/src/main.py b/src/main.py new file mode 100644 index 0000000000000000000000000000000000000000..700d0560ebab138571c53d49adbe61d1d011fef6 --- /dev/null +++ b/src/main.py @@ -0,0 +1,56 @@ +import json +from typing import List + +import uvicorn +from fastapi import FastAPI, Depends, HTTPException +from pydantic import BaseModel +from sqlalchemy.orm import Session + +from logic.databaseNew import Models, Schemas, Crud +from logic.databaseNew.Database import engine, SessionLocal + +Models.Base.metadata.create_all(bind=engine) + +app = FastAPI() + +with open('../settings.json', 'r', encoding='UTF-8') as f: + settings = json.load(f) + + +# Dependency +def get_db(): + db = SessionLocal() + try: + yield db + finally: + db.close() + + +class Device(BaseModel): + id: int + name: str + + +@app.get('/devices/', response_model=List[Schemas.Device]) +def read_devices(skip: int = 0, limit: int = 100, db: Session = Depends(get_db)): + return Crud.get_devices(db, skip=skip, limit=limit) + + +@app.get('/devices/{deviceId}', response_model=Schemas.Device) +def read_device(deviceId: int, db: Session = Depends(get_db)): + device = Crud.get_device(db, deviceId=deviceId) + if device is None: + raise HTTPException(status_code=404, detail='Device not found') + return device + + +@app.post("/devices/", response_model=Schemas.Device) +def create_user(device: Schemas.DeviceCreate, db: Session = Depends(get_db)): + createdDevice = Crud.get_device_by_name(db, device.name) + if createdDevice: + raise HTTPException(status_code=400, detail="Device with this name already exists") + return Crud.create_device(db=db, device=device) + + +if __name__ == '__main__': + uvicorn.run(app, host='0.0.0.0', port=8000)