yj
2025-08-27 307236190c98c13395b114df990eec50a9160251
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
"""
好友忽略列表管理API
"""
 
from fastapi import APIRouter, HTTPException
from pydantic import BaseModel
from typing import List, Set
from loguru import logger
 
from app.services.friend_ignore_service import friend_ignore_service
from app.services.contact_sync import contact_sync_service
from config import settings
 
 
router = APIRouter()
 
 
class AddFriendsRequest(BaseModel):
    """添加好友到忽略列表请求模型"""
 
    friends: List[str]
 
 
class RemoveFriendRequest(BaseModel):
    """从忽略列表移除好友请求模型"""
 
    w_id: str
 
 
class IgnoreListResponse(BaseModel):
    """忽略列表响应模型"""
 
    success: bool
    message: str
    data: Set[str] = None
    count: int = 0
 
 
@router.get("/ignore-list", response_model=IgnoreListResponse)
async def get_ignore_list():
    """
    获取当前的好友忽略列表
 
    Returns:
        忽略列表响应
    """
    try:
        ignore_list = friend_ignore_service.get_ignore_list()
        count = friend_ignore_service.get_ignore_list_count()
 
        return IgnoreListResponse(
            success=True, message="获取忽略列表成功", data=ignore_list, count=count
        )
    except Exception as e:
        logger.error(f"获取忽略列表失败: {str(e)}")
        raise HTTPException(status_code=500, detail=f"获取忽略列表失败: {str(e)}")
 
 
@router.post("/ignore-list/add", response_model=IgnoreListResponse)
async def add_friends_to_ignore_list(request: AddFriendsRequest):
    """
    添加好友到忽略列表
 
    Args:
        request: 添加好友请求
 
    Returns:
        操作结果
    """
    try:
        success = friend_ignore_service.add_friends_to_ignore_list(request.friends)
 
        if success:
            count = friend_ignore_service.get_ignore_list_count()
            return IgnoreListResponse(
                success=True,
                message=f"成功添加 {len(request.friends)} 个好友到忽略列表",
                count=count,
            )
        else:
            raise HTTPException(status_code=400, detail="添加好友到忽略列表失败")
 
    except Exception as e:
        logger.error(f"添加好友到忽略列表失败: {str(e)}")
        raise HTTPException(status_code=500, detail=f"添加好友到忽略列表失败: {str(e)}")
 
 
@router.post("/ignore-list/remove", response_model=IgnoreListResponse)
async def remove_friend_from_ignore_list(request: RemoveFriendRequest):
    """
    从忽略列表中移除好友
 
    Args:
        request: 移除好友请求
 
    Returns:
        操作结果
    """
    try:
        success = friend_ignore_service.remove_friend_from_ignore_list(request.w_id)
 
        if success:
            count = friend_ignore_service.get_ignore_list_count()
            return IgnoreListResponse(
                success=True,
                message=f"成功从忽略列表中移除好友: {request.w_id}",
                count=count,
            )
        else:
            raise HTTPException(status_code=400, detail="从忽略列表移除好友失败")
 
    except Exception as e:
        logger.error(f"从忽略列表移除好友失败: {str(e)}")
        raise HTTPException(status_code=500, detail=f"从忽略列表移除好友失败: {str(e)}")
 
 
@router.delete("/ignore-list", response_model=IgnoreListResponse)
async def clear_ignore_list():
    """
    清空忽略列表
 
    Returns:
        操作结果
    """
    try:
        success = friend_ignore_service.clear_ignore_list()
 
        if success:
            return IgnoreListResponse(success=True, message="成功清空忽略列表", count=0)
        else:
            raise HTTPException(status_code=400, detail="清空忽略列表失败")
 
    except Exception as e:
        logger.error(f"清空忽略列表失败: {str(e)}")
        raise HTTPException(status_code=500, detail=f"清空忽略列表失败: {str(e)}")
 
 
@router.post("/sync-contacts", response_model=IgnoreListResponse)
async def sync_contacts_and_rebuild_ignore_list():
    """
    重新同步联系人并重建忽略列表
 
    Returns:
        操作结果
    """
    try:
        if not settings.ecloud_w_id:
            raise HTTPException(status_code=400, detail="未配置ecloud_w_id")
 
        success = contact_sync_service.sync_contacts_on_startup(settings.ecloud_w_id)
 
        if success:
            count = friend_ignore_service.get_ignore_list_count()
            return IgnoreListResponse(
                success=True, message="联系人同步完成,忽略列表已重建", count=count
            )
        else:
            raise HTTPException(status_code=400, detail="联系人同步失败")
 
    except Exception as e:
        logger.error(f"联系人同步失败: {str(e)}")
        raise HTTPException(status_code=500, detail=f"联系人同步失败: {str(e)}")
 
 
@router.get("/ignore-list/check/{w_id}")
async def check_if_friend_ignored(w_id: str):
    """
    检查指定w_id的详细忽略状态
 
    Args:
        w_id: 要检查的w_id
 
    Returns:
        详细的检查结果
    """
    try:
        status_info = friend_ignore_service.get_ignore_status_info(w_id)
 
        return {
            "success": True,
            "data": status_info,
            "message": f"w_id {w_id} 状态检查完成",
        }
 
    except Exception as e:
        logger.error(f"检查忽略状态失败: {str(e)}")
        raise HTTPException(status_code=500, detail=f"检查忽略状态失败: {str(e)}")
 
 
@router.get("/whitelist")
async def get_whitelist():
    """
    获取当前的白名单列表
 
    Returns:
        白名单列表
    """
    try:
        whitelist = friend_ignore_service.get_whitelist()
 
        return {
            "success": True,
            "data": whitelist,
            "count": len(whitelist),
            "message": "获取白名单成功",
        }
 
    except Exception as e:
        logger.error(f"获取白名单失败: {str(e)}")
        raise HTTPException(status_code=500, detail=f"获取白名单失败: {str(e)}")
 
 
@router.get("/config")
async def get_ignore_config():
    """
    获取好友忽略功能的配置信息
 
    Returns:
        配置信息
    """
    try:
        return {
            "success": True,
            "data": {
                "ignore_enabled": settings.friend_ignore_enabled,
                "whitelist": settings.friend_ignore_whitelist,
                "whitelist_count": len(settings.friend_ignore_whitelist),
                "ignore_list_count": friend_ignore_service.get_ignore_list_count(),
            },
            "message": "获取配置信息成功",
        }
 
    except Exception as e:
        logger.error(f"获取配置信息失败: {str(e)}")
        raise HTTPException(status_code=500, detail=f"获取配置信息失败: {str(e)}")