brewman/brewman/brewman/routers/db_image.py

62 lines
1.5 KiB
Python

import uuid
from io import BytesIO
from typing import List
import brewman.schemas.voucher as output
from fastapi import APIRouter, Depends, Security
from fastapi.responses import StreamingResponse
from sqlalchemy.orm import Session
from ..core.security import get_user
from ..db.session import SessionLocal
from ..models.voucher import DbImage
from ..schemas.auth import UserToken
router = APIRouter()
# Dependency
def get_db() -> Session:
try:
db = SessionLocal()
yield db
finally:
db.close()
@router.get("/{id_}/{type_}")
def db_image(id_: uuid.UUID, type_: str, db: Session = Depends(get_db)):
item = db.query(DbImage).filter(DbImage.id == id_).first()
if type_ == "thumbnail":
item = BytesIO(item.thumbnail)
else:
item = BytesIO(item.image)
return StreamingResponse(item, media_type="image/jpeg")
def save_files(voucher_id: uuid.UUID, i: List[bytes], t: List[bytes], db: Session):
i = i or []
t = t or []
for index, value in enumerate(i):
db.add(DbImage(voucher_id, "voucher", i[index], t[index]))
def update_files(
voucher_id: uuid.UUID,
data: List[output.ImageUpload],
i: List[bytes],
t: List[bytes],
db: Session,
):
i = i or []
t = t or []
old = [f.id_ for f in data if f.id_]
images = db.query(DbImage).filter(DbImage.resource_id == voucher_id).all()
for image in [i for i in images if i.id not in old]:
db.delete(image)
for index, value in enumerate(i):
db.add(DbImage(voucher_id, "voucher", i[index], t[index]))