No SQLModel
This commit is contained in:
1 parent
5f0e8c11b4
commit
9964fbf044
16 files changed
+91
-84
No files matched your search
@@ -1,4 +1,5 @@
|
||||
from sqlmodel import Session, select
|
||||
from sqlalchemy import select
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from loon.web.db import engine
|
||||
from loon.web.users.models import User
|
||||
@@ -6,9 +7,9 @@ from loon.web.users.models import User
|
||||
|
||||
def choose_admin(username: str) -> None:
|
||||
with Session(engine) as session:
|
||||
user = session.exec(
|
||||
user = session.execute(
|
||||
select(User).where(User.internal_username == username)
|
||||
).first()
|
||||
).scalars().first()
|
||||
|
||||
if user is None:
|
||||
print(f"No user named {username!r}.")
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
from fastapi import APIRouter, HTTPException
|
||||
from sqlalchemy.orm import selectinload
|
||||
from sqlmodel import Session, select
|
||||
from sqlalchemy.orm import selectinload, Session
|
||||
from sqlalchemy import select
|
||||
from starlette.requests import Request
|
||||
|
||||
from loon.web.auth.middleware import admin
|
||||
@@ -22,7 +22,7 @@ async def list_logs(request: Request):
|
||||
.options(selectinload(LogEntry.log_type))
|
||||
.order_by(LogEntry.created_at)
|
||||
)
|
||||
entries = session.exec(statement).all()
|
||||
entries = session.execute(statement).scalars().all()
|
||||
return [
|
||||
LogEntryResponse(
|
||||
id=entry.id,
|
||||
@@ -39,7 +39,7 @@ async def list_logs(request: Request):
|
||||
async def list_mc_users(request: Request):
|
||||
with Session(engine) as session:
|
||||
statement = select(MinecraftUser).order_by(MinecraftUser.username)
|
||||
return session.exec(statement).all()
|
||||
return session.execute(statement).scalars().all()
|
||||
|
||||
|
||||
@router.get("/users", response_model=list[UserPublic])
|
||||
@@ -51,7 +51,7 @@ async def list_users(request: Request):
|
||||
.options(selectinload(User.minecraft_user))
|
||||
.order_by(User.internal_username)
|
||||
)
|
||||
return session.exec(statement).all()
|
||||
return session.execute(statement).scalars().all()
|
||||
|
||||
|
||||
@router.get("/users/{internal_username}", response_model=UserPublic)
|
||||
@@ -63,7 +63,7 @@ async def get_user(request: Request, internal_username: str):
|
||||
.where(User.internal_username == internal_username)
|
||||
.options(selectinload(User.minecraft_user))
|
||||
)
|
||||
user = session.exec(statement).first()
|
||||
user = session.execute(statement).scalars().first()
|
||||
if user is None:
|
||||
raise HTTPException(status_code=404)
|
||||
return user
|
||||
@@ -79,7 +79,7 @@ async def get_user_by_uuid(request: Request, uuid: str):
|
||||
.where(MinecraftUser.uuid == uuid)
|
||||
.options(selectinload(User.minecraft_user))
|
||||
)
|
||||
user = session.exec(statement).first()
|
||||
user = session.execute(statement).scalars().first()
|
||||
if user is None:
|
||||
raise HTTPException(status_code=404)
|
||||
return user
|
||||
@@ -8,8 +8,8 @@ from starlette.authentication import (
|
||||
)
|
||||
from starlette.requests import HTTPConnection
|
||||
from starlette.responses import JSONResponse, Response
|
||||
from sqlalchemy.orm import selectinload
|
||||
from sqlmodel import Session, select
|
||||
from sqlalchemy.orm import selectinload, Session
|
||||
from sqlalchemy import select
|
||||
|
||||
from loon.web.db import engine
|
||||
from loon.web.users.models import User
|
||||
@@ -63,9 +63,9 @@ class JWTAuthBackend(AuthenticationBackend):
|
||||
raise AuthenticationError("Invalid or expired token")
|
||||
|
||||
with Session(engine) as session:
|
||||
user = session.exec(
|
||||
user = session.execute(
|
||||
select(User).where(User.id == user_id).options(selectinload(User.minecraft_user))
|
||||
).first()
|
||||
).scalars().first()
|
||||
|
||||
if user is None:
|
||||
raise AuthenticationError("User not found")
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
from fastapi import APIRouter, HTTPException, Request, status
|
||||
from sqlmodel import Session, select
|
||||
from sqlalchemy import select
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from loon.web import limiter
|
||||
from loon.web.auth.middleware import authenticated
|
||||
@@ -17,7 +18,7 @@ router = APIRouter(prefix="/auth", tags=["auth"])
|
||||
async def get_jwt(request: Request, body: JWTRequest) -> JWTResponse:
|
||||
with Session(engine) as session:
|
||||
statement = select(User).where(User.internal_username == body.username)
|
||||
user = session.exec(statement).first()
|
||||
user = session.execute(statement).scalars().first()
|
||||
|
||||
if user is None or user.id is None or not verify_password(body.password, user.password):
|
||||
raise HTTPException(
|
||||
|
||||
@@ -1,8 +1,13 @@
|
||||
from sqlmodel import SQLModel, create_engine
|
||||
from sqlalchemy import create_engine
|
||||
from sqlalchemy.orm import DeclarativeBase
|
||||
|
||||
from config import settings
|
||||
|
||||
|
||||
class Base(DeclarativeBase):
|
||||
pass
|
||||
|
||||
|
||||
def database_url(url: str | None = None) -> str:
|
||||
url = url or settings.database.url
|
||||
for src, dst in (
|
||||
|
||||
+18
-11
@@ -1,17 +1,24 @@
|
||||
from datetime import datetime, timezone
|
||||
|
||||
from sqlmodel import SQLModel, Field, Relationship
|
||||
from sqlalchemy import ForeignKey
|
||||
from sqlalchemy.orm import Mapped, mapped_column, relationship
|
||||
|
||||
from loon.web.db import Base
|
||||
|
||||
|
||||
class LogType(SQLModel, table=True):
|
||||
id: int = Field(default=None, primary_key=True)
|
||||
code: str = Field(nullable=False, unique=True)
|
||||
entries: list["LogEntry"] = Relationship(back_populates="log_type")
|
||||
class LogType(Base):
|
||||
__tablename__ = "logtype"
|
||||
|
||||
id: Mapped[int] = mapped_column(primary_key=True)
|
||||
code: Mapped[str] = mapped_column(unique=True)
|
||||
entries: Mapped[list["LogEntry"]] = relationship(back_populates="log_type")
|
||||
|
||||
|
||||
class LogEntry(SQLModel, table=True):
|
||||
id: int = Field(default=None, primary_key=True)
|
||||
log_type_id: int = Field(foreign_key="logtype.id", nullable=False)
|
||||
log_type: LogType = Relationship(back_populates="entries")
|
||||
created_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc))
|
||||
message: str = Field(nullable=False)
|
||||
class LogEntry(Base):
|
||||
__tablename__ = "logentry"
|
||||
|
||||
id: Mapped[int] = mapped_column(primary_key=True)
|
||||
log_type_id: Mapped[int] = mapped_column(ForeignKey("logtype.id"))
|
||||
log_type: Mapped[LogType] = relationship(back_populates="entries")
|
||||
created_at: Mapped[datetime] = mapped_column(default=lambda: datetime.now(timezone.utc))
|
||||
message: Mapped[str]
|
||||
@@ -1,6 +1,7 @@
|
||||
import asyncio
|
||||
|
||||
from sqlmodel import Session, select
|
||||
from sqlalchemy import select
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from loon.web.db import engine
|
||||
from loon.web.logs.models import LogType, LogEntry
|
||||
@@ -14,7 +15,7 @@ def player_tag(uuid: str, username: str) -> str:
|
||||
def _write_log(log_type: LogTypeEnum, message: str) -> None:
|
||||
with Session(engine) as session:
|
||||
statement = select(LogType).where(LogType.code == log_type.value)
|
||||
log_type_object = session.exec(statement).first()
|
||||
log_type_object = session.execute(statement).scalars().first()
|
||||
|
||||
if not log_type_object:
|
||||
log_type_object = LogType(code=log_type.value)
|
||||
|
||||
+20
-13
@@ -1,22 +1,29 @@
|
||||
from sqlmodel import SQLModel, Field, Relationship
|
||||
from sqlalchemy import ForeignKey
|
||||
from sqlalchemy.orm import Mapped, mapped_column, relationship
|
||||
|
||||
from loon.web.db import Base
|
||||
|
||||
|
||||
class MinecraftUser(SQLModel, table=True):
|
||||
id: int = Field(default=None, primary_key=True)
|
||||
uuid: str = Field(unique=True)
|
||||
username: str
|
||||
user: "User" = Relationship(back_populates="minecraft_user")
|
||||
class MinecraftUser(Base):
|
||||
__tablename__ = "minecraftuser"
|
||||
|
||||
id: Mapped[int] = mapped_column(primary_key=True)
|
||||
uuid: Mapped[str] = mapped_column(unique=True)
|
||||
username: Mapped[str]
|
||||
user: Mapped["User"] = relationship(back_populates="minecraft_user")
|
||||
|
||||
|
||||
class User(SQLModel, table=True):
|
||||
id: int = Field(default=None, primary_key=True)
|
||||
class User(Base):
|
||||
__tablename__ = "user"
|
||||
|
||||
minecraft_user_id: int = Field(foreign_key="minecraftuser.id", nullable=False, unique=True)
|
||||
minecraft_user: MinecraftUser = Relationship(back_populates="user")
|
||||
id: Mapped[int] = mapped_column(primary_key=True)
|
||||
|
||||
internal_username: str = Field(unique=True)
|
||||
password: str
|
||||
admin: bool = Field(default=False)
|
||||
minecraft_user_id: Mapped[int] = mapped_column(ForeignKey("minecraftuser.id"), unique=True)
|
||||
minecraft_user: Mapped[MinecraftUser] = relationship(back_populates="user")
|
||||
|
||||
internal_username: Mapped[str] = mapped_column(unique=True)
|
||||
password: Mapped[str]
|
||||
admin: Mapped[bool] = mapped_column(default=False)
|
||||
|
||||
@property
|
||||
def uuid(self) -> str:
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import asyncio
|
||||
|
||||
from sqlmodel import Session, select
|
||||
from sqlalchemy import select
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from loon.web.db import engine
|
||||
from loon.web.users.models import MinecraftUser
|
||||
@@ -10,9 +11,9 @@ def _sync_minecraft_users(players: list[dict]) -> list[MinecraftUser]:
|
||||
players_by_uuid = {player["uuid"]: player["username"] for player in players}
|
||||
|
||||
with Session(engine) as session:
|
||||
existing = session.exec(
|
||||
existing = session.execute(
|
||||
select(MinecraftUser).where(MinecraftUser.uuid.in_(players_by_uuid))
|
||||
).all()
|
||||
).scalars().all()
|
||||
existing_by_uuid = {minecraft_user.uuid: minecraft_user for minecraft_user in existing}
|
||||
|
||||
new_users = []
|
||||
|
||||
Reference in new issue
Block a user