barker/barker/barker/routers/device.py

115 lines
3.1 KiB
Python
Raw Normal View History

2019-06-22 20:05:00 +00:00
import uuid
2020-09-22 02:29:14 +00:00
from typing import Optional
from fastapi import APIRouter, HTTPException, status, Depends, Security
from sqlalchemy.exc import SQLAlchemyError
from sqlalchemy.orm import Session
from ..schemas.auth import UserToken
import barker.schemas.master as schemas
from ..core.security import get_current_active_user as get_user
from ..db.session import SessionLocal
from ..models.master import Device
router = APIRouter()
# Dependency
def get_db():
try:
db = SessionLocal()
yield db
finally:
db.close()
@router.post("", response_model=schemas.Device)
def save(
data: schemas.DeviceIn, db: Session = Depends(get_db), user: UserToken = Security(get_user, scopes=["devices"]),
):
try:
item = Device(name=data.name, section_id=data.section.id_)
db.add(item)
db.commit()
return device_info(item)
except SQLAlchemyError as e:
db.rollback()
raise HTTPException(
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=str(e),
)
except Exception:
db.rollback()
raise
@router.put("/{id_}", response_model=schemas.Device)
def update(
id_: uuid.UUID,
data: schemas.DeviceIn,
db: Session = Depends(get_db),
user: UserToken = Security(get_user, scopes=["devices"]),
):
try:
item: Device = db.query(Device).filter(Device.id == id_).first()
item.name = data.name
item.section_id = data.section.id_
db.commit()
return device_info(item)
except SQLAlchemyError as e:
db.rollback()
raise HTTPException(
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=str(e),
)
except Exception:
db.rollback()
raise
@router.delete("/{id_}")
def delete(
id_: uuid.UUID, db: Session = Depends(get_db), user: UserToken = Security(get_user, scopes=["devices"]),
):
try:
item: Device = db.query(Device).filter(Device.id == id_).first()
db.delete(item)
db.commit()
return device_info(item)
except SQLAlchemyError as e:
db.rollback()
raise HTTPException(
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=str(e),
)
except Exception:
db.rollback()
raise
2019-06-22 20:05:00 +00:00
2020-09-22 02:29:14 +00:00
@router.get("")
def show_blank(
db: Session = Depends(get_db), user: UserToken = Security(get_user, scopes=["devices"]),
):
return device_info(None)
2019-06-22 20:05:00 +00:00
2020-09-22 02:29:14 +00:00
@router.get("/list")
def show_list(db: Session = Depends(get_db), user: UserToken = Depends(get_user)):
return [device_info(item) for item in db.query(Device).order_by(Device.name).all()]
2019-06-22 20:05:00 +00:00
2020-09-22 02:29:14 +00:00
@router.get("/{id_}")
def show_id(
id_: uuid.UUID, db: Session = Depends(get_db), user: UserToken = Security(get_user, scopes=["devices"]),
):
item: Device = db.query(Device).filter(Device.id == id_).first()
return device_info(item)
2019-06-22 20:05:00 +00:00
2020-09-22 02:29:14 +00:00
def device_info(item: Optional[Device]):
2019-06-22 20:05:00 +00:00
if item is None:
return {"name": "", "section": {}}
2019-06-22 20:05:00 +00:00
return {
"id": item.id,
"name": item.name,
"section": {"id": item.section_id, "name": item.section.name},
2019-06-22 20:05:00 +00:00
}