feat: integrate invite API and improve notification handling

- Add invite code display and binding functionality via API
- Fix notification unread count sync on auth state change
- Improve notification mark read with server state validation
- Add auth state listener to trigger notification refresh
- Add YaoCoinConverter for coin-to-yao type conversion
- Remove YaoLegend from divination screens (UI cleanup)
- Abbreviate relation labels in yao detail view
- Add re-register notice to account delete screen
- Update 'coins' terminology to 'points' in localization
- Fix backend points consumption to only run in CHAT mode
- Add HttpxAuthNoiseFilter to suppress auth endpoint logging
- Fix notification static_schema import path
- Add test coverage for notification bloc error handling
- Update AGENTS.md page header rules and image handling
- Delete deprecated run-dev.sh script
This commit is contained in:
qzl
2026-04-13 14:52:22 +08:00
parent da947f9f08
commit 1e22f27de2
52 changed files with 1419 additions and 307 deletions
+3 -3
View File
@@ -25,7 +25,7 @@ class SpecialMark(str, Enum):
class YaoDetail(BaseModel):
model_config = ConfigDict(extra="forbid")
model_config = ConfigDict(extra="forbid", populate_by_name=True)
position: int = Field(ge=1, le=6)
spirit_name: str = Field(alias="spiritName", min_length=1)
@@ -38,7 +38,7 @@ class YaoDetail(BaseModel):
class FushenDetail(BaseModel):
model_config = ConfigDict(extra="forbid")
model_config = ConfigDict(extra="forbid", populate_by_name=True)
position: int = Field(ge=1, le=6)
relation_name: str = Field(alias="relationName", min_length=1)
@@ -47,7 +47,7 @@ class FushenDetail(BaseModel):
class GanzhiDetail(BaseModel):
model_config = ConfigDict(extra="forbid")
model_config = ConfigDict(extra="forbid", populate_by_name=True)
year_gan_zhi: str = Field(alias="yearGanZhi", min_length=2, max_length=2)
month_gan_zhi: str = Field(alias="monthGanZhi", min_length=2, max_length=2)
@@ -0,0 +1,34 @@
from __future__ import annotations
from typing import ClassVar, Literal, Union
from pydantic import BaseModel, ConfigDict, Field
class NotificationPayloadNone(BaseModel):
model_config: ClassVar[ConfigDict] = ConfigDict(extra="forbid")
action: Literal["none"]
class NotificationPayloadRoute(BaseModel):
model_config: ClassVar[ConfigDict] = ConfigDict(extra="forbid")
action: Literal["open_route"]
route: str = Field(max_length=200)
entity_id: str | None = Field(default=None, max_length=64)
tab: str | None = Field(default=None, max_length=32)
class NotificationPayloadUrl(BaseModel):
model_config: ClassVar[ConfigDict] = ConfigDict(extra="forbid")
action: Literal["open_url"]
url: str = Field(max_length=500)
NotificationPayload = Union[
NotificationPayloadNone,
NotificationPayloadRoute,
NotificationPayloadUrl,
]