3M/cef_3M/__init__.py
2024-05-15 00:01:58 +00:00

50 lines
No EOL
1.5 KiB
Python

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"]