diff --git a/app/api/endpoints/message.py b/app/api/endpoints/message.py index fa0f1300..e42ad4bd 100644 --- a/app/api/endpoints/message.py +++ b/app/api/endpoints/message.py @@ -1,14 +1,18 @@ +import json from typing import Union, Any, List from fastapi import APIRouter, BackgroundTasks, Depends from fastapi import Request +from sqlalchemy.orm import Session from starlette.responses import PlainTextResponse from app import schemas from app.chain.message import MessageChain from app.core.config import settings from app.core.security import verify_token +from app.db import get_db from app.db.models import User +from app.db.models.message import Message from app.db.systemconfig_oper import SystemConfigOper from app.db.userauth import get_current_active_superuser from app.log import logger @@ -52,6 +56,25 @@ async def web_message(text: str, current_user: User = Depends(get_current_active return schemas.Response(success=True) +@router.get("/web", summary="获取WEB消息", response_model=List[dict]) +def get_web_message(_: schemas.TokenPayload = Depends(verify_token), + db: Session = Depends(get_db), + page: int = 1, + count: int = 20): + """ + 获取WEB消息列表 + """ + ret_messages = [] + messages = Message.list_by_page(db, page=page, count=count) + for message in messages: + try: + ret_messages.append(message.to_dict()) + except Exception as e: + logger.error(f"获取WEB消息列表失败: {str(e)}") + continue + return ret_messages + + def wechat_verify(echostr: str, msg_signature: str, timestamp: Union[str, int], nonce: str) -> Any: """ diff --git a/app/helper/message.py b/app/helper/message.py index eaa9475c..f8606188 100644 --- a/app/helper/message.py +++ b/app/helper/message.py @@ -1,5 +1,6 @@ import json import queue +import time from typing import Optional, Any from app.utils.singleton import Singleton @@ -24,8 +25,10 @@ class MessageHelper(metaclass=Singleton): else: if isinstance(message, str): self.user_queue.put(message) - elif hasattr(message, "dict"): - self.user_queue.put(json.dumps(message.dict())) + elif hasattr(message, "to_dict"): + content = message.to_dict() + content['date'] = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) + self.user_queue.put(json.dumps(content)) def get(self, role: str = "sys") -> Optional[str]: """ diff --git a/app/schemas/message.py b/app/schemas/message.py index da125ad1..55999947 100644 --- a/app/schemas/message.py +++ b/app/schemas/message.py @@ -17,18 +17,20 @@ class CommingMessage(BaseModel): channel: Optional[MessageChannel] = None # 消息体 text: Optional[str] = None + # 时间 + date: Optional[str] = None + # 消息方向 + action: Optional[int] = 0 - def dict(self): + def to_dict(self): """ 转换为字典 """ - return { - "userid": self.userid, - "username": self.username, - "channel": self.channel.value if self.channel else None, - "text": self.text, - "action": 0 - } + items = self.dict() + for k, v in items.items(): + if isinstance(v, MessageChannel): + items[k] = v.value + return items class Notification(BaseModel): @@ -49,18 +51,21 @@ class Notification(BaseModel): link: Optional[str] = None # 用户ID userid: Optional[Union[str, int]] = None + # 时间 + date: Optional[str] = None + # 消息方向 + action: Optional[int] = 1 - def dict(self): - return { - "channel": self.channel.value if self.channel else None, - "mtype": self.mtype.value if self.mtype else None, - "title": self.title, - "text": self.text, - "image": self.image, - "link": self.link, - "userid": self.userid, - "action": 1 - } + def to_dict(self): + """ + 转换为字典 + """ + items = self.dict() + for k, v in items.items(): + if isinstance(v, MessageChannel) \ + or isinstance(v, NotificationType): + items[k] = v.value + return items class NotificationSwitch(BaseModel):