From c706b082402998b00759e464da982ec0283145b1 Mon Sep 17 00:00:00 2001 From: chenjintang-shrimp Date: Tue, 12 Aug 2025 14:37:22 +0000 Subject: [PATCH] =?UTF-8?q?feat(database,events):=20=E5=9C=A8=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E6=A8=A1=E5=9E=8B=E4=B8=AD=E6=B7=BB=E5=8A=A0=E4=BA=8B?= =?UTF-8?q?=E4=BB=B6=E5=85=B3=E7=B3=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 User 类中添加了 events 字段,用于存储用户相关的事件 - 通过 Relationship 建立了用户和事件之间的关系 - 引入了 Event 模型以支持事件相关操作 --- app/database/events.py | 54 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 app/database/events.py 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