3M/cef_3M/__init__.py

46 lines
No EOL
1.4 KiB
Python

from fastapi import FastAPI, UploadFile, Request, Depends
from fastapi.middleware.cors import CORSMiddleware
from minio import Minio
import mimetypes
import re
from . import sql
from .auth import JWTBearer
from . import util
import config
minioClient = Minio(
config.MINIO_ADDR,
access_key=config.MINIO_ACCESS_KEY,
secret_key=config.MINIO_SECRET_KEY,
).g
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)
if sql.SqlExecuteFetchOne("SELECT * FROM `uploads` WHERE `hash` = %s", sha):
sql.SqlExecute("UPDATE `uploads` SET `expiry` = (NOW() + INTERVAL 1 WEEK) WHERE `hash` = %s", sha)
else:
mime = mimetypes.guess_type(safeFilename)
minioClient.put_object("uploads", sha, file.file, file.size, content_type=mime[0])
sql.SqlExecute("INSERT INTO `uploads`(`hash`) VALUES (%s)", sha)
return {"url": f"https://{config.MINIO_ADDR}/uploads/{sha}/{safeFilename}"}
__all__ = ["sql", "auth", "util"]