add migrations and switch to sqlalchemy
This commit is contained in:
parent
9c41144985
commit
9148e2068f
12 changed files with 358 additions and 63 deletions
|
|
@ -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}"}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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
25
cef_3M/sql_generated.py
Normal 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'))
|
||||
Loading…
Add table
Add a link
Reference in a new issue