Logs
This commit is contained in:
1 parent
c500c3fadf
commit
5732e26380
10 files changed
+176
-2
No files matched your search
@@ -1,7 +1,32 @@
|
||||
from fastapi import APIRouter
|
||||
from sqlalchemy.orm import selectinload
|
||||
from sqlmodel import Session, 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
|
||||
|
||||
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.exec(statement).all()
|
||||
return [
|
||||
LogEntryResponse(
|
||||
id=entry.id,
|
||||
log_type=entry.log_type.code,
|
||||
created_at=entry.created_at,
|
||||
message=entry.message,
|
||||
)
|
||||
for entry in entries
|
||||
]
|
||||
Whitespace-only changes.
@@ -0,0 +1,17 @@
|
||||
from datetime import datetime, timezone
|
||||
|
||||
from sqlmodel import SQLModel, Field, Relationship
|
||||
|
||||
|
||||
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 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)
|
||||
@@ -0,0 +1,10 @@
|
||||
from datetime import datetime
|
||||
|
||||
from pydantic import BaseModel
|
||||
|
||||
|
||||
class LogEntryResponse(BaseModel):
|
||||
id: int
|
||||
log_type: str
|
||||
created_at: datetime
|
||||
message: str
|
||||
@@ -0,0 +1,27 @@
|
||||
import asyncio
|
||||
|
||||
from sqlmodel import Session, select
|
||||
|
||||
from loon.web.db import engine
|
||||
from loon.web.logs.models import LogType, LogEntry
|
||||
from loon.web.logs.types import LogTypeEnum
|
||||
|
||||
|
||||
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()
|
||||
|
||||
if not log_type_object:
|
||||
log_type_object = LogType(code=log_type.value)
|
||||
session.add(log_type_object)
|
||||
session.commit()
|
||||
session.refresh(log_type_object)
|
||||
|
||||
log_entry = LogEntry(log_type_id=log_type_object.id, message=message)
|
||||
session.add(log_entry)
|
||||
session.commit()
|
||||
|
||||
|
||||
async def write_log(log_type: LogTypeEnum, message: str) -> None:
|
||||
await asyncio.to_thread(_write_log, log_type, message)
|
||||
@@ -0,0 +1,11 @@
|
||||
from enum import Enum
|
||||
|
||||
|
||||
class LogTypeEnum(Enum):
|
||||
PLAYER_DEAD = "player_dead"
|
||||
PLAYER_JOINED = "player_joined"
|
||||
PLAYER_LEFT = "player_left"
|
||||
PLAYER_KICKED = "player_kicked"
|
||||
PLAYER_BANNED = "player_banned"
|
||||
PLAYER_REGISTERED = "player_registered"
|
||||
PLAYER_PASSWORD_CHANGED = "player_password_changed"
|
||||
Reference in new issue
Block a user