diff --git a/app/database/events.py b/app/database/events.py new file mode 100644 index 0000000..e473adb --- /dev/null +++ b/app/database/events.py @@ -0,0 +1,54 @@ +from __future__ import annotations + +from datetime import datetime +from enum import Enum +import json + +from app.database.lazer_user import User + +from sqlmodel import Field, Relationship, SQLModel + + +class EventType(str, Enum): + ACHIEVEMENT = "achievement" + BEATMAP_PLAYCOUNT = "beatmap_playcount" + BEATMAPSET_APPROVE = "beatmapset_approve" + BEATMAPSET_DELETE = "beatmapset_delete" + BEATMAPSET_REVIVE = "beatmapset_revive" + BEATMAPSET_UPDATE = "beatmapset_update" + BEATMAPSET_UPLOAD = "beatmapset_upload" + RANK = "rank" + RANK_LOST = "rank_lost" + # 鉴于本服务器没有 supporter 这一说,这三个字段没有必要 + # USER_SUPPORT_AGAIN="user_support_again" + # USER_SUPPORT_FIRST="user_support" + # USER_SUPPORT_GIFT="user_support_gift" + USERNAME_CHANGE = "username_change" + + +class EventBase(SQLModel): + id: int = Field(default=None, primary_key=True) + createdAt: datetime + type: EventType + event_payload: str + + +class Event(EventBase, table=True): + __tablename__ = "user_events" # pyright: ignore[reportAssignmentType] + user_id: int | None = Field(default=None, foreign_key="lazer_users.id") + user: User = Relationship(back_populates="events") + + +class EventResp(EventBase): + _payload: dict + + def merge_payload(self) -> "EventResp": + parsed = {} + try: + parsed = json.loads(self.event_payload or "{}") + except json.JSONDecodeError: + parsed = {} + for key, value in parsed.items(): + setattr(self, key, value) + self._payload = parsed + return self