from . import router from fastapi import UploadFile, Request, Depends from ..sql import SessionMaker, Uploads from datetime import datetime, timedelta from .. import util from ..auth import JWTBearer import config import mimetypes @router.post("/upload", dependencies=[Depends(JWTBearer(False))]) async def upload(file: UploadFile, request: Request): if file.size > config.MAX_FILE_SIZE: return {"error": "file too big"} spl = file.filename.rsplit(".", 1) safeFilename = util.safeName.sub("_", spl[0]) if len(spl) == 2: safeFilename += "." + util.safeName.sub("_", spl[1]) sha = await util.SHA256(file) with SessionMaker() as session: if existing := session.query(Uploads).where(Uploads.hash == sha).first(): existing.expiry = datetime.now() + timedelta(days=7) else: mime = mimetypes.guess_type(safeFilename) util.minioClient.put_object("uploads", sha, file.file, file.size, content_type=mime[0]) up = Uploads(hash=sha) session.add(up) session.commit() return {"url": f"https://{config.MINIO_EXTERNAL_ADDR}/uploads/{sha}/{safeFilename}"}