Coverage for api/v1/endpoints/broker.py: 43.18%

88 statements  

« prev     ^ index     » next       coverage.py v7.10.7, created at 2025-10-13 18:58 +0000

1""" 

2券商管理API端点 

3""" 

4 

5from typing import List 

6 

7from fastapi import APIRouter, Depends, HTTPException, status 

8 

9from core.middleware.auth_middleware import get_current_user 

10from core.models.broker import (Broker, BrokerCreate, BrokerResponse, 

11 BrokerTestRequest, BrokerUpdate, DataSource, 

12 DataSourceCreate, DataSourceTestRequest, 

13 DataSourceUpdate, FeeCalculateRequest, 

14 FeeCalculateResponse, FeeConfig, TestResponse) 

15from core.models.user import User 

16from core.services.broker_service import BrokerService 

17 

18router = APIRouter() 

19broker_service = BrokerService() 

20 

21 

22# 券商管理API 

23@router.get("/brokers", response_model=List[BrokerResponse]) 

24async def get_all_brokers(current_user: User = Depends(get_current_user)): 

25 """获取券商列表""" 

26 brokers = broker_service.get_all_brokers(current_user) 

27 return brokers 

28 

29 

30@router.post( 

31 "/brokers", response_model=BrokerResponse, status_code=status.HTTP_201_CREATED 

32) 

33async def create_broker( 

34 broker_data: BrokerCreate, current_user: User = Depends(get_current_user) 

35): 

36 """创建券商""" 

37 broker = broker_service.create_broker(broker_data, current_user) 

38 if not broker: 

39 raise HTTPException( 

40 status_code=status.HTTP_400_BAD_REQUEST, detail="券商代码已存在" 

41 ) 

42 return broker 

43 

44 

45@router.get("/brokers/{broker_id}", response_model=BrokerResponse) 

46async def get_broker(broker_id: str, current_user: User = Depends(get_current_user)): 

47 """获取券商详情""" 

48 broker = broker_service.get_broker_by_id(broker_id, current_user) 

49 if not broker: 

50 raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="券商不存在") 

51 return broker 

52 

53 

54@router.put("/brokers/{broker_id}", response_model=BrokerResponse) 

55async def update_broker( 

56 broker_id: str, 

57 broker_data: BrokerUpdate, 

58 current_user: User = Depends(get_current_user), 

59): 

60 """更新券商""" 

61 broker = broker_service.update_broker(broker_id, broker_data, current_user) 

62 if not broker: 

63 raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="券商不存在") 

64 return broker 

65 

66 

67@router.delete("/brokers/{broker_id}", status_code=status.HTTP_204_NO_CONTENT) 

68async def delete_broker(broker_id: str, current_user: User = Depends(get_current_user)): 

69 """删除券商""" 

70 success = broker_service.delete_broker(broker_id, current_user) 

71 if not success: 

72 raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="券商不存在") 

73 

74 

75@router.post("/brokers/{broker_id}/test", response_model=TestResponse) 

76async def test_broker_connection( 

77 broker_id: str, current_user: User = Depends(get_current_user) 

78): 

79 """测试券商连接""" 

80 result = broker_service.test_broker_connection(broker_id, current_user) 

81 return result 

82 

83 

84# 数据源管理API 

85@router.get("/data-sources", response_model=List[DataSource]) 

86async def get_all_data_sources(current_user: User = Depends(get_current_user)): 

87 """获取数据源列表""" 

88 data_sources = broker_service.get_all_data_sources(current_user) 

89 return data_sources 

90 

91 

92@router.post( 

93 "/data-sources", response_model=DataSource, status_code=status.HTTP_201_CREATED 

94) 

95async def create_data_source( 

96 data_source_data: DataSourceCreate, current_user: User = Depends(get_current_user) 

97): 

98 """创建数据源(仅管理员)""" 

99 data_source = broker_service.create_data_source(data_source_data, current_user) 

100 if not data_source: 

101 raise HTTPException( 

102 status_code=status.HTTP_403_FORBIDDEN, 

103 detail="需要管理员权限或关联券商不存在", 

104 ) 

105 return data_source 

106 

107 

108@router.get("/data-sources/{data_source_id}", response_model=DataSource) 

109async def get_data_source( 

110 data_source_id: str, current_user: User = Depends(get_current_user) 

111): 

112 """获取数据源详情""" 

113 data_source = broker_service.get_data_source_by_id(data_source_id, current_user) 

114 if not data_source: 

115 raise HTTPException( 

116 status_code=status.HTTP_404_NOT_FOUND, detail="数据源不存在" 

117 ) 

118 return data_source 

119 

120 

121@router.put("/data-sources/{data_source_id}", response_model=DataSource) 

122async def update_data_source( 

123 data_source_id: str, 

124 data_source_data: DataSourceUpdate, 

125 current_user: User = Depends(get_current_user), 

126): 

127 """更新数据源(仅管理员)""" 

128 data_source = broker_service.update_data_source( 

129 data_source_id, data_source_data, current_user 

130 ) 

131 if not data_source: 

132 raise HTTPException( 

133 status_code=status.HTTP_404_NOT_FOUND, detail="数据源不存在或无权限" 

134 ) 

135 return data_source 

136 

137 

138@router.delete("/data-sources/{data_source_id}", status_code=status.HTTP_204_NO_CONTENT) 

139async def delete_data_source( 

140 data_source_id: str, current_user: User = Depends(get_current_user) 

141): 

142 """删除数据源(仅管理员)""" 

143 success = broker_service.delete_data_source(data_source_id, current_user) 

144 if not success: 

145 raise HTTPException( 

146 status_code=status.HTTP_404_NOT_FOUND, detail="数据源不存在或无权限" 

147 ) 

148 

149 

150@router.post("/data-sources/{data_source_id}/test", response_model=TestResponse) 

151async def test_data_source_connection( 

152 data_source_id: str, current_user: User = Depends(get_current_user) 

153): 

154 """测试数据源连接""" 

155 result = broker_service.test_data_source_connection(data_source_id, current_user) 

156 return result 

157 

158 

159# 费用配置管理API 

160@router.get("/brokers/{broker_id}/fee-config", response_model=FeeConfig) 

161async def get_fee_config( 

162 broker_id: str, current_user: User = Depends(get_current_user) 

163): 

164 """ 

165 获取券商费用配置 

166 

167 Args: 

168 broker_id: 券商ID 

169 current_user: 当前用户 

170 

171 Returns: 

172 FeeConfig: 费用配置对象 

173 """ 

174 fee_config = broker_service.get_fee_config(broker_id, current_user) 

175 if not fee_config: 

176 raise HTTPException( 

177 status_code=status.HTTP_404_NOT_FOUND, detail="券商不存在或无权限" 

178 ) 

179 return fee_config 

180 

181 

182@router.put("/brokers/{broker_id}/fee-config", response_model=FeeConfig) 

183async def update_fee_config( 

184 broker_id: str, 

185 fee_config: FeeConfig, 

186 current_user: User = Depends(get_current_user), 

187): 

188 """ 

189 更新券商费用配置 

190 

191 Args: 

192 broker_id: 券商ID 

193 fee_config: 费用配置对象 

194 current_user: 当前用户 

195 

196 Returns: 

197 FeeConfig: 更新后的费用配置对象 

198 """ 

199 updated_config = broker_service.update_fee_config( 

200 broker_id, fee_config, current_user 

201 ) 

202 if not updated_config: 

203 raise HTTPException( 

204 status_code=status.HTTP_404_NOT_FOUND, detail="券商不存在或无权限" 

205 ) 

206 return updated_config 

207 

208 

209@router.post( 

210 "/brokers/{broker_id}/fee-config/calculate", response_model=FeeCalculateResponse 

211) 

212async def calculate_fee( 

213 broker_id: str, 

214 request: FeeCalculateRequest, 

215 current_user: User = Depends(get_current_user), 

216): 

217 """ 

218 计算预估交易费用 

219 

220 Args: 

221 broker_id: 券商ID 

222 request: 费用计算请求(包含数量、价格、方向、市场) 

223 current_user: 当前用户 

224 

225 Returns: 

226 FeeCalculateResponse: 费用计算结果(包含明细和总成本) 

227 """ 

228 result = broker_service.calculate_fee(broker_id, request, current_user) 

229 if not result: 

230 raise HTTPException( 

231 status_code=status.HTTP_404_NOT_FOUND, detail="券商不存在或无权限" 

232 ) 

233 return result