from fastapi import FastAPI, UploadFile, Request, Depends from fastapi.middleware.cors import CORSMiddleware import mimetypes from .auth import JWTBearer from .sql import SessionMaker, Uploads from . import util import config from datetime import datetime, timedelta from . import endpoints app = FastAPI() app.add_middleware( CORSMiddleware, allow_origins=config.ALLOWED_DOMAINS, allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) app.include_router(endpoints.router) @app.post("/upload", dependencies=[Depends(JWTBearer())]) 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) session = SessionMaker() 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}"} __all__ = ["sql", "auth", "util"]