@@ -88,3 +88,107 @@ async def list_senders(
8888 "page_size" : page_size ,
8989 "total_pages" : (total + page_size - 1 ) // page_size if total else 0 ,
9090 }
91+
92+
93+ @router .get ("/{sender_id}" )
94+ async def get_sender_detail (
95+ sender_id : int ,
96+ db : AsyncSession = Depends (get_db ),
97+ ):
98+ 获取发送者详情
99+ from app .models .message import Message
100+ result = await db .execute (select (Sender ).where (Sender .id == sender_id ))
101+ sender = result .scalar_one_or_none ()
102+ if not sender :
103+ from fastapi import HTTPException
104+ raise HTTPException (status_code = 404 , detail = 发送者不存在 )
105+
106+ # 实时统计告警数
107+ alert_count_result = await db .execute (
108+ select (func .count (Alert .id )).where (Alert .sender_id == sender_id )
109+ )
110+ alert_count = alert_count_result .scalar () or 0
111+
112+ # 统计消息类型分布
113+ type_result = await db .execute (
114+ select (Message .message_type , func .count (Message .id ))
115+ .where (Message .sender_id == sender_id )
116+ .group_by (Message .message_type )
117+ )
118+ message_types = {row [0 ]: row [1 ] for row in type_result .all ()}
119+
120+ return {
121+ id : sender .id ,
122+ user_id : sender .user_id ,
123+ username : sender .username ,
124+ first_name : sender .first_name ,
125+ last_name : sender .last_name ,
126+ phone : sender .phone ,
127+ is_bot : sender .is_bot ,
128+ is_verified : sender .is_verified ,
129+ is_premium : sender .is_premium ,
130+ message_count : sender .message_count ,
131+ alert_count : alert_count ,
132+ message_types : message_types ,
133+ created_at : sender .created_at .isoformat () if sender .created_at else None ,
134+ }
135+
136+
137+ @router .get ("/{sender_id}/messages" )
138+ async def get_sender_messages (
139+ sender_id : int ,
140+ page : int = Query (1 , ge = 1 ),
141+ page_size : int = Query (20 , ge = 1 , le = 100 ),
142+ db : AsyncSession = Depends (get_db ),
143+ ):
144+ 获取发送者的消息历史
145+ from app .models .message import Message
146+ from app .models .conversation import Conversation
147+
148+ # 验证发送者存在
149+ sender_result = await db .execute (select (Sender ).where (Sender .id == sender_id ))
150+ if not sender_result .scalar_one_or_none ():
151+ from fastapi import HTTPException
152+ raise HTTPException (status_code = 404 , detail = 发送者不存在 )
153+
154+ # 总数
155+ count_result = await db .execute (
156+ select (func .count (Message .id )).where (Message .sender_id == sender_id )
157+ )
158+ total = count_result .scalar () or 0
159+
160+ # 分页查询
161+ query = (
162+ select (Message , Conversation .title )
163+ .join (Conversation , Message .conversation_id == Conversation .id )
164+ .where (Message .sender_id == sender_id )
165+ .order_by (Message .date .desc ())
166+ .offset ((page - 1 ) * page_size )
167+ .limit (page_size )
168+ )
169+ result = await db .execute (query )
170+ rows = result .all ()
171+
172+ items = []
173+ for msg , conv_title in rows :
174+ items .append ({
175+ id : msg .id ,
176+ conversation_id : msg .conversation_id ,
177+ conversation_title : conv_title ,
178+ message_type : msg .message_type ,
179+ text : msg .text ,
180+ caption : msg .caption ,
181+ date : msg .date .isoformat () if msg .date else None ,
182+ views : msg .views ,
183+ forwards : msg .forwards ,
184+ has_media : msg .has_media ,
185+ is_reply : msg .is_reply ,
186+ })
187+
188+ return {
189+ items : items ,
190+ total : total ,
191+ page : page ,
192+ page_size : page_size ,
193+ total_pages : (total + page_size - 1 ) // page_size if total else 0 ,
194+ }
0 commit comments