[feat]:[FL-154][系统消息页面一致性优化]
Co-authored-by: multica-agent <github@multica.ai>
This commit is contained in:
@@ -9,6 +9,7 @@ from ...schemas.system_message import (
|
||||
SystemMessageListResponse,
|
||||
SystemMessageMarkReadRequest,
|
||||
SystemMessagePublic,
|
||||
SystemMessageType,
|
||||
)
|
||||
from ...services.system_message_service import (
|
||||
create_system_message,
|
||||
@@ -37,6 +38,7 @@ def get_my_messages(
|
||||
limit: int = Query(default=50, ge=1, le=200),
|
||||
offset: int = Query(default=0, ge=0),
|
||||
unread_only: bool = Query(default=False),
|
||||
message_type: SystemMessageType | None = Query(default=None),
|
||||
current_user: CurrentUser = Depends(get_current_user),
|
||||
db: Session = Depends(get_db),
|
||||
) -> SystemMessageListResponse:
|
||||
@@ -47,6 +49,7 @@ def get_my_messages(
|
||||
limit=limit,
|
||||
offset=offset,
|
||||
unread_only=unread_only,
|
||||
message_type=message_type,
|
||||
)
|
||||
return SystemMessageListResponse(
|
||||
items=[SystemMessagePublic.model_validate(m) for m in messages],
|
||||
|
||||
@@ -3,6 +3,8 @@ from typing import Literal
|
||||
|
||||
from pydantic import BaseModel, ConfigDict, Field
|
||||
|
||||
SystemMessageType = Literal["info", "warning", "error", "success"]
|
||||
|
||||
|
||||
class SystemMessagePublic(BaseModel):
|
||||
model_config = ConfigDict(from_attributes=True)
|
||||
@@ -10,7 +12,7 @@ class SystemMessagePublic(BaseModel):
|
||||
id: str
|
||||
title: str
|
||||
content: str
|
||||
message_type: str
|
||||
message_type: SystemMessageType
|
||||
target_user_id: str | None
|
||||
is_read: bool
|
||||
created_at: datetime
|
||||
@@ -26,7 +28,7 @@ class SystemMessageListResponse(BaseModel):
|
||||
class SystemMessageCreateRequest(BaseModel):
|
||||
title: str = Field(min_length=1, max_length=255)
|
||||
content: str = Field(min_length=1)
|
||||
message_type: Literal["info", "warning", "error", "success"] = Field(default="info")
|
||||
message_type: SystemMessageType = Field(default="info")
|
||||
target_user_id: str | None = Field(default=None, description="发送给特定用户,为空则全员广播")
|
||||
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@ from sqlalchemy import delete, func, select, update
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from ..models.system_message import SystemMessage
|
||||
from ..schemas.system_message import SystemMessageCreateRequest
|
||||
from ..schemas.system_message import SystemMessageCreateRequest, SystemMessageType
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from ..schemas.system_message import SystemMessagePublic
|
||||
@@ -34,20 +34,23 @@ def list_user_messages(
|
||||
limit: int = 50,
|
||||
offset: int = 0,
|
||||
unread_only: bool = False,
|
||||
message_type: SystemMessageType | None = None,
|
||||
) -> tuple[list[SystemMessage], int, int]:
|
||||
"""获取用户的系统消息列表"""
|
||||
# 构建查询条件:全员广播或者特定用户
|
||||
query = select(SystemMessage).where(
|
||||
(SystemMessage.target_user_id == user_id) | (SystemMessage.target_user_id.is_(None))
|
||||
)
|
||||
base_conditions = [
|
||||
(SystemMessage.target_user_id == user_id) | (SystemMessage.target_user_id.is_(None)),
|
||||
]
|
||||
|
||||
if unread_only:
|
||||
query = query.where(SystemMessage.is_read == False)
|
||||
base_conditions.append(SystemMessage.is_read == False)
|
||||
|
||||
if message_type:
|
||||
base_conditions.append(SystemMessage.message_type == message_type)
|
||||
|
||||
query = select(SystemMessage).where(*base_conditions)
|
||||
|
||||
# 获取总数
|
||||
total_query = select(func.count()).select_from(SystemMessage).where(
|
||||
(SystemMessage.target_user_id == user_id) | (SystemMessage.target_user_id.is_(None))
|
||||
)
|
||||
total_query = select(func.count()).select_from(SystemMessage).where(*base_conditions)
|
||||
total = db.scalar(total_query)
|
||||
|
||||
# 获取未读数
|
||||
|
||||
@@ -6,7 +6,11 @@ from sqlalchemy.orm import Session
|
||||
from app.core.database import Base
|
||||
from app.models.system_message import SystemMessage
|
||||
from app.schemas.system_message import SystemMessageCreateRequest
|
||||
from app.services.system_message_service import create_system_message, delete_system_message
|
||||
from app.services.system_message_service import (
|
||||
create_system_message,
|
||||
delete_system_message,
|
||||
list_user_messages,
|
||||
)
|
||||
|
||||
|
||||
def test_delete_system_message_removes_existing_message() -> None:
|
||||
@@ -37,3 +41,36 @@ def test_delete_system_message_returns_false_when_missing() -> None:
|
||||
deleted = delete_system_message(db, "missing-message-id")
|
||||
|
||||
assert deleted is False
|
||||
|
||||
|
||||
def test_list_user_messages_filters_items_and_total_by_type() -> None:
|
||||
engine = create_engine("sqlite+pysqlite:///:memory:")
|
||||
Base.metadata.create_all(bind=engine, tables=[SystemMessage.__table__])
|
||||
|
||||
with Session(engine) as db:
|
||||
info_message = create_system_message(
|
||||
db,
|
||||
SystemMessageCreateRequest(
|
||||
title="通知",
|
||||
content="测试内容",
|
||||
message_type="info",
|
||||
),
|
||||
)
|
||||
create_system_message(
|
||||
db,
|
||||
SystemMessageCreateRequest(
|
||||
title="警告",
|
||||
content="测试内容",
|
||||
message_type="warning",
|
||||
),
|
||||
)
|
||||
|
||||
messages, total, unread_count = list_user_messages(
|
||||
db,
|
||||
user_id="user-1",
|
||||
message_type="info",
|
||||
)
|
||||
|
||||
assert [message.id for message in messages] == [info_message.id]
|
||||
assert total == 1
|
||||
assert unread_count == 2
|
||||
|
||||
Reference in New Issue
Block a user