86 lines
2.7 KiB
Python
86 lines
2.7 KiB
Python
from fastapi import APIRouter, HTTPException
|
|
from sqlalchemy.orm import selectinload, Session
|
|
from sqlalchemy import select
|
|
from starlette.requests import Request
|
|
|
|
from loon.web.auth.middleware import admin
|
|
from loon.web.db import engine
|
|
from loon.web.logs.models import LogEntry
|
|
from loon.web.logs.schema import LogEntryResponse
|
|
from loon.web.users.models import MinecraftUser, User
|
|
from loon.web.users.schema import MinecraftUserPublic, UserPublic
|
|
|
|
router = APIRouter(prefix="/admin", tags=["admin"])
|
|
|
|
|
|
@router.get("/logs", response_model=list[LogEntryResponse])
|
|
@admin
|
|
async def list_logs(request: Request):
|
|
with Session(engine) as session:
|
|
statement = (
|
|
select(LogEntry)
|
|
.options(selectinload(LogEntry.log_type))
|
|
.order_by(LogEntry.created_at)
|
|
)
|
|
entries = session.execute(statement).scalars().all()
|
|
return [
|
|
LogEntryResponse(
|
|
id=entry.id,
|
|
log_type=entry.log_type.code,
|
|
created_at=entry.created_at,
|
|
message=entry.message,
|
|
)
|
|
for entry in entries
|
|
]
|
|
|
|
|
|
@router.get("/mc-users", response_model=list[MinecraftUserPublic])
|
|
@admin
|
|
async def list_mc_users(request: Request):
|
|
with Session(engine) as session:
|
|
statement = select(MinecraftUser).order_by(MinecraftUser.username)
|
|
return session.execute(statement).scalars().all()
|
|
|
|
|
|
@router.get("/users", response_model=list[UserPublic])
|
|
@admin
|
|
async def list_users(request: Request):
|
|
with Session(engine) as session:
|
|
statement = (
|
|
select(User)
|
|
.options(selectinload(User.minecraft_user))
|
|
.order_by(User.internal_username)
|
|
)
|
|
return session.execute(statement).scalars().all()
|
|
|
|
|
|
@router.get("/users/{internal_username}", response_model=UserPublic)
|
|
@admin
|
|
async def get_user(request: Request, internal_username: str):
|
|
with Session(engine) as session:
|
|
statement = (
|
|
select(User)
|
|
.where(User.internal_username == internal_username)
|
|
.options(selectinload(User.minecraft_user))
|
|
)
|
|
user = session.execute(statement).scalars().first()
|
|
if user is None:
|
|
raise HTTPException(status_code=404)
|
|
return user
|
|
|
|
|
|
@router.get("/users/by-uuid/{uuid}", response_model=UserPublic)
|
|
@admin
|
|
async def get_user_by_uuid(request: Request, uuid: str):
|
|
with Session(engine) as session:
|
|
statement = (
|
|
select(User)
|
|
.join(MinecraftUser)
|
|
.where(MinecraftUser.uuid == uuid)
|
|
.options(selectinload(User.minecraft_user))
|
|
)
|
|
user = session.execute(statement).scalars().first()
|
|
if user is None:
|
|
raise HTTPException(status_code=404)
|
|
return user
|