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
« prev ^ index » next coverage.py v7.10.7, created at 2025-10-13 18:58 +0000
1"""
2券商管理API端点
3"""
5from typing import List
7from fastapi import APIRouter, Depends, HTTPException, status
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
18router = APIRouter()
19broker_service = BrokerService()
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
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
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
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
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="券商不存在")
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
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
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
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
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
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 )
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
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 获取券商费用配置
167 Args:
168 broker_id: 券商ID
169 current_user: 当前用户
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
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 更新券商费用配置
191 Args:
192 broker_id: 券商ID
193 fee_config: 费用配置对象
194 current_user: 当前用户
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
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 计算预估交易费用
220 Args:
221 broker_id: 券商ID
222 request: 费用计算请求(包含数量、价格、方向、市场)
223 current_user: 当前用户
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