add authentication
add built-in cleanup general refactor
This commit is contained in:
parent
20ee543ab4
commit
ba2e896813
15 changed files with 313 additions and 106 deletions
|
|
@ -1,15 +1,46 @@
|
|||
from fastapi import FastAPI, UploadFile, Request, Depends
|
||||
import datetime
|
||||
|
||||
from fastapi import FastAPI
|
||||
from fastapi.middleware.cors import CORSMiddleware
|
||||
import mimetypes
|
||||
|
||||
from .auth import JWTBearer
|
||||
from .sql import SessionMaker, Uploads
|
||||
from . import util
|
||||
from .sql import SessionMaker, Uploads, Users
|
||||
import config
|
||||
from datetime import datetime, timedelta
|
||||
from . import endpoints
|
||||
from .util import minioClient, ergo
|
||||
from fastapi_utils.tasks import repeat_every
|
||||
from sqlalchemy import and_
|
||||
from contextlib import asynccontextmanager
|
||||
|
||||
app = FastAPI()
|
||||
|
||||
@repeat_every(seconds=60 * 60)
|
||||
async def cleanup():
|
||||
sess = SessionMaker()
|
||||
toCleanup = sess.query(Uploads).filter(Uploads.expiry < datetime.datetime.utcnow()).all()
|
||||
for upload in toCleanup:
|
||||
minioClient.remove_object("uploads", upload.hash)
|
||||
sess.delete(upload)
|
||||
print(f"Deleted {len(toCleanup)} old files")
|
||||
|
||||
tempUsers = sess.query(Users).filter(and_(
|
||||
Users.temporary == True,
|
||||
Users.created_at < (datetime.datetime.utcnow() - datetime.timedelta(days=1))
|
||||
)).all()
|
||||
for user in tempUsers:
|
||||
await ergo.fullyRemoveUser(user.username)
|
||||
sess.delete(user)
|
||||
print(f"Removed {len(tempUsers)} temp users")
|
||||
sess.commit()
|
||||
sess.close()
|
||||
|
||||
|
||||
@asynccontextmanager
|
||||
async def onStart(app: FastAPI):
|
||||
await cleanup()
|
||||
yield
|
||||
|
||||
|
||||
app = FastAPI(lifespan=onStart)
|
||||
app.add_middleware(
|
||||
CORSMiddleware,
|
||||
allow_origins=config.ALLOWED_DOMAINS,
|
||||
|
|
@ -20,26 +51,4 @@ app.add_middleware(
|
|||
|
||||
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"]
|
||||
__all__ = ["sql", "auth", "util"]
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue