from fastapi import FastAPI, UploadFile, Request, Depends from fastapi.middleware.cors import CORSMiddleware from minio import Minio import mimetypes import re from .auth import JWTBearer from .sql import SessionMaker, Uploads from . import util import config from datetime import datetime, timedelta minioClient = Minio( config.MINIO_ADDR, access_key=config.MINIO_ACCESS_KEY, secret_key=config.MINIO_SECRET_KEY, ) app = FastAPI() app.add_middleware( CORSMiddleware, allow_origins=config.ALLOWED_DOMAINS, allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) @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) 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_ADDR}/uploads/{sha}/{safeFilename}"} __all__ = ["sql", "auth", "util"]