add migrations and switch to sqlalchemy

This commit is contained in:
CEF Server 2024-05-15 00:01:58 +00:00
parent 9c41144985
commit 9148e2068f
12 changed files with 358 additions and 63 deletions

View file

@ -4,17 +4,18 @@ from minio import Minio
import mimetypes
import re
from . import sql
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,
).g
)
app = FastAPI()
app.add_middleware(
@ -34,12 +35,15 @@ async def upload(file: UploadFile, request: Request):
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)
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])
sql.SqlExecute("INSERT INTO `uploads`(`hash`) VALUES (%s)", sha)
up = Uploads(hash=sha)
session.add(up)
session.commit()
return {"url": f"https://{config.MINIO_ADDR}/uploads/{sha}/{safeFilename}"}

View file

@ -1,52 +1,14 @@
import pymysql
import config
from typing import Tuple
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from .sql_generated import *
import configparser
pymysql.install_as_MySQLdb()
alembic = configparser.ConfigParser()
alembic.read("alembic.ini")
import MySQLdb as maraidb
engine = create_engine(
alembic.get("alembic", "sqlalchemy.url")
)
DB: pymysql = maraidb.connect(user=config.MARIADB_USER, password=config.MARIADB_PASSWORD, db=config.MARIADB_DB, autocommit=True)
DB.autocommit(True)
SessionMaker = sessionmaker(autocommit=False, autoflush=False, bind=engine)
def reconnect(f):
def wrap(*args, **kwargs):
DB.ping()
return f(*args, **kwargs)
return wrap
@reconnect
def SqlExecute(query, *args):
cursor = DB.cursor(pymysql.cursors.DictCursor)
cursor.execute(query, args)
cursor.close()
return cursor.lastrowid
@reconnect
def SqlExecuteFetchOne(query, *args):
cursor = DB.cursor(pymysql.cursors.DictCursor)
cursor.execute(query, args)
row = cursor.fetchone()
cursor.close()
return row
@reconnect
def MultipleSqlExecuteFetchOne(*queries: Tuple[str, tuple]):
cursor = DB.cursor(pymysql.cursors.DictCursor)
ret = []
for query, args in queries:
cursor.execute(query, args)
ret.append(cursor.fetchone())
cursor.close()
return ret
@reconnect
def SqlExecuteFetchAll(query, *args):
cursor = DB.cursor(pymysql.cursors.DictCursor)
cursor.execute(query, args)
rows = cursor.fetchall()
cursor.close()
return rows
CACHE = {}

25
cef_3M/sql_generated.py Normal file
View file

@ -0,0 +1,25 @@
from typing import Optional
from sqlalchemy import CHAR, String, TIMESTAMP, text
from sqlalchemy.dialects.mysql import TINYINT
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
import datetime
class Base(DeclarativeBase):
pass
class Uploads(Base):
__tablename__ = 'uploads'
hash: Mapped[str] = mapped_column(CHAR(64), primary_key=True)
expiry: Mapped[Optional[datetime.datetime]] = mapped_column(TIMESTAMP, server_default=text('(current_timestamp()'))
class Users(Base):
__tablename__ = 'users'
username: Mapped[str] = mapped_column(String(64), primary_key=True)
password: Mapped[str] = mapped_column(String(128))
created_at: Mapped[Optional[datetime.datetime]] = mapped_column(TIMESTAMP, server_default=text('current_timestamp()'))
temporary: Mapped[Optional[int]] = mapped_column(TINYINT(1), server_default=text('1'))