Coverage for core/services/settings_service.py: 42.00%
50 statements
« prev ^ index » next coverage.py v7.10.7, created at 2025-10-13 18:58 +0000
« prev ^ index » next coverage.py v7.10.7, created at 2025-10-13 18:58 +0000
1"""
2系统设置服务
3"""
5from typing import Optional
7from core.data_source.adapters.trade_adapter import TradeDataSourceAdapter
8from core.data_source.factories.client_factory import ClientFactory
9from core.data_source.factories.config_factory import ConfigFactory
10from core.models.settings import (AssetModeType, DataSourceConfig,
11 LongportConfig)
12from core.models.user import User
13from core.repositories.settings_repository import SettingsRepository
16class SettingsService:
17 def __init__(self, settings_repository: Optional[SettingsRepository] = None):
18 self.settings_repository = settings_repository or SettingsRepository()
20 def get_data_source_config(self, current_user: User) -> Optional[DataSourceConfig]:
21 """获取数据源配置"""
22 return self.settings_repository.get_data_source_config(current_user.id)
24 def update_data_source_config(
25 self, current_user: User, data_source_config: DataSourceConfig
26 ) -> bool:
27 """更新数据源配置"""
28 return self.settings_repository.update_data_source_config(
29 current_user.id, data_source_config
30 )
32 def get_longport_config(self, current_user: User) -> Optional[LongportConfig]:
33 """获取长桥证券配置"""
34 return self.settings_repository.get_longport_config(current_user.id)
36 def update_longport_config(
37 self, current_user: User, longport_config: LongportConfig
38 ) -> bool:
39 """更新长桥证券配置"""
40 return self.settings_repository.update_longport_config(
41 current_user.id, longport_config
42 )
44 def get_asset_mode(self, current_user: User) -> AssetModeType:
45 """获取资产模式"""
46 return self.settings_repository.get_asset_mode(current_user.id)
48 def update_asset_mode(self, current_user: User, asset_mode: AssetModeType) -> bool:
49 """更新资产模式"""
50 return self.settings_repository.update_asset_mode(current_user.id, asset_mode)
52 def refresh_longport_token(self, current_user: User) -> dict:
53 """刷新长桥访问令牌"""
54 try:
55 # 使用TradeDataSourceAdapter刷新token
56 trade_adapter = TradeDataSourceAdapter(current_user.id)
57 result = trade_adapter.refresh_access_token()
59 if result and result.get("success"):
60 new_token = result.get("new_token")
61 if new_token:
62 # 获取当前长桥配置
63 current_config = self.get_longport_config(current_user)
64 if current_config:
65 # 更新access_token
66 updated_config = LongportConfig(
67 app_key=current_config.app_key,
68 app_secret=current_config.app_secret,
69 access_token=new_token,
70 language=current_config.language,
71 enable_overnight=current_config.enable_overnight,
72 )
74 # 保存到数据库
75 success = self.update_longport_config(
76 current_user, updated_config
77 )
78 if success:
79 # 清理用户相关缓存
80 self._clear_user_caches(current_user.id)
81 return {
82 "success": True,
83 "message": "Token刷新成功",
84 "new_token": new_token,
85 }
86 else:
87 return {
88 "success": False,
89 "message": "Token刷新成功但保存到数据库失败",
90 }
91 else:
92 return {"success": False, "message": "未找到长桥配置"}
93 else:
94 return {"success": False, "message": "Token刷新成功但未返回新token"}
95 else:
96 return result or {"success": False, "message": "Token刷新失败"}
97 except Exception as e:
98 return {"success": False, "message": f"Token刷新失败: {str(e)}"}
100 def _clear_user_caches(self, user_id: str):
101 """清理用户相关缓存"""
102 try:
103 # 清理配置缓存
104 config_factory = ConfigFactory()
105 config_factory.clear_cache(user_id)
107 # 清理客户端缓存
108 client_factory = ClientFactory()
109 client_factory.clear_cache(user_id)
110 except Exception as e:
111 print(f"清理用户缓存失败: {e}")