steam.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350
  1. """
  2. Steam账号管理接口
  3. """
  4. from fastapi import APIRouter, Depends, HTTPException, Request
  5. from sqlalchemy.orm import Session
  6. from pydantic import BaseModel
  7. from typing import Optional, List
  8. from app.database import get_db
  9. from app.models.steam_account import SteamAccount
  10. from app.models.user import User
  11. from app.core.encrypt import encryptor
  12. from app.core.logger import get_client_logger
  13. logger = get_client_logger()
  14. from app.config import settings
  15. from datetime import datetime
  16. from app.utils.timezone import beijing_now
  17. router = APIRouter()
  18. class SteamAccountRequest(BaseModel):
  19. """Steam账号请求"""
  20. user_id: int
  21. steam_username: str
  22. steam_id: Optional[str] = None
  23. shared_secret: str
  24. identity_secret: str
  25. class SteamAccountUpdateRequest(BaseModel):
  26. """Steam账号更新请求"""
  27. user_id: int
  28. steam_username: Optional[str] = None
  29. steam_id: Optional[str] = None
  30. shared_secret: Optional[str] = None
  31. identity_secret: Optional[str] = None
  32. is_active: Optional[int] = None
  33. @router.get("/steam-accounts")
  34. async def get_steam_accounts(
  35. request: Request,
  36. db: Session = Depends(get_db)
  37. ):
  38. """获取Steam账号列表"""
  39. try:
  40. # 获取请求参数
  41. params = dict(request.query_params)
  42. # 解密请求数据(如果有)
  43. user_id = None
  44. if settings.ENCRYPT_ENABLED:
  45. encrypted_data = params.get("encrypted", "")
  46. if encrypted_data:
  47. decrypted = encryptor.decrypt(encrypted_data)
  48. user_id = decrypted.get("user_id")
  49. else:
  50. user_id = params.get("user_id")
  51. if user_id:
  52. user_id = int(user_id)
  53. if not user_id:
  54. return {"code": 400, "msg": "缺少用户ID"}
  55. # 验证用户是否存在
  56. user = db.query(User).filter(User.id == user_id).first()
  57. if not user:
  58. return {"code": 404, "msg": "用户不存在"}
  59. # 查询Steam账号列表
  60. accounts = db.query(SteamAccount).filter(
  61. SteamAccount.user_id == user_id,
  62. SteamAccount.is_deleted == 0
  63. ).order_by(SteamAccount.created_at.desc()).all()
  64. # 格式化返回数据
  65. accounts_data = []
  66. for account in accounts:
  67. # 解密共享密钥和身份密钥
  68. shared_secret = ""
  69. identity_secret = ""
  70. try:
  71. if account.shared_secret:
  72. shared_secret = encryptor.decrypt(account.shared_secret)
  73. if account.identity_secret:
  74. identity_secret = encryptor.decrypt(account.identity_secret)
  75. except Exception as e:
  76. logger.error(f"解密Steam账号密钥失败: {e}")
  77. accounts_data.append({
  78. "id": account.id,
  79. "steam_username": account.steam_username,
  80. "steam_id": account.steam_id,
  81. "shared_secret": shared_secret,
  82. "identity_secret": identity_secret,
  83. "is_active": account.is_active,
  84. "last_used_time": account.last_used_time.isoformat() if account.last_used_time else None,
  85. "created_at": account.created_at.isoformat() if account.created_at else None,
  86. "updated_at": account.updated_at.isoformat() if account.updated_at else None
  87. })
  88. return {
  89. "code": 200,
  90. "msg": "成功",
  91. "data": accounts_data
  92. }
  93. except Exception as e:
  94. logger.exception("获取Steam账号列表失败")
  95. return {"code": 500, "msg": "系统异常,操作未完成,请稍后重试;若持续发生请联系客服"}
  96. @router.post("/steam-accounts")
  97. async def create_steam_account(
  98. request: Request,
  99. db: Session = Depends(get_db)
  100. ):
  101. """添加Steam账号"""
  102. try:
  103. # 获取请求数据
  104. data = await request.json()
  105. # 解密请求数据
  106. if settings.ENCRYPT_ENABLED:
  107. encrypted_data = data.get("encrypted", "")
  108. if not encrypted_data:
  109. return {"code": 400, "msg": "缺少加密数据"}
  110. decrypted = encryptor.decrypt(encrypted_data)
  111. else:
  112. decrypted = data
  113. req = SteamAccountRequest(**decrypted)
  114. # 验证用户是否存在
  115. user = db.query(User).filter(User.id == req.user_id).first()
  116. if not user:
  117. return {"code": 404, "msg": "用户不存在"}
  118. # 检查Steam用户名是否已存在
  119. existing = db.query(SteamAccount).filter(
  120. SteamAccount.user_id == req.user_id,
  121. SteamAccount.steam_username == req.steam_username
  122. ).first()
  123. if existing:
  124. return {"code": 400, "msg": "该Steam账号已存在"}
  125. # 加密存储共享密钥和身份密钥
  126. encrypted_shared_secret = encryptor.encrypt(req.shared_secret)
  127. encrypted_identity_secret = encryptor.encrypt(req.identity_secret)
  128. # 创建Steam账号
  129. steam_account = SteamAccount(
  130. user_id=req.user_id,
  131. steam_username=req.steam_username,
  132. steam_id=req.steam_id,
  133. shared_secret=encrypted_shared_secret,
  134. identity_secret=encrypted_identity_secret,
  135. is_active=1,
  136. created_at=beijing_now(),
  137. updated_at=beijing_now()
  138. )
  139. db.add(steam_account)
  140. # 创建历史记录
  141. from app.utils.history import create_steam_account_history
  142. create_steam_account_history(db, steam_account, "INSERT")
  143. # 一次性提交所有更改
  144. db.commit()
  145. db.refresh(steam_account)
  146. logger.info(f"用户 {req.user_id} 添加Steam账号成功: {req.steam_username}")
  147. return {
  148. "code": 200,
  149. "msg": "添加成功",
  150. "data": {
  151. "id": steam_account.id,
  152. "steam_username": steam_account.steam_username
  153. }
  154. }
  155. except Exception as e:
  156. try:
  157. db.rollback()
  158. except Exception:
  159. logger.warning("回滚数据库事务时发生异常")
  160. logger.exception("添加Steam账号失败")
  161. return {"code": 500, "msg": "系统异常,操作未完成,请稍后重试;若持续发生请联系客服"}
  162. @router.put("/steam-accounts/{account_id}")
  163. async def update_steam_account(
  164. account_id: int,
  165. request: Request,
  166. db: Session = Depends(get_db)
  167. ):
  168. """更新Steam账号"""
  169. try:
  170. # 获取请求数据
  171. data = await request.json()
  172. # 解密请求数据
  173. if settings.ENCRYPT_ENABLED:
  174. encrypted_data = data.get("encrypted", "")
  175. if not encrypted_data:
  176. return {"code": 400, "msg": "缺少加密数据"}
  177. decrypted = encryptor.decrypt(encrypted_data)
  178. else:
  179. decrypted = data
  180. req = SteamAccountUpdateRequest(**decrypted)
  181. # 查找Steam账号
  182. account = db.query(SteamAccount).filter(SteamAccount.id == account_id).first()
  183. if not account:
  184. return {"code": 404, "msg": "Steam账号不存在"}
  185. # 验证用户ID是否匹配
  186. if account.user_id != req.user_id:
  187. return {"code": 403, "msg": "无权访问该账号"}
  188. # 更新字段
  189. if req.steam_username is not None:
  190. # 检查新用户名是否与其他账号冲突
  191. existing = db.query(SteamAccount).filter(
  192. SteamAccount.user_id == req.user_id,
  193. SteamAccount.steam_username == req.steam_username,
  194. SteamAccount.id != account_id
  195. ).first()
  196. if existing:
  197. return {"code": 400, "msg": "该Steam账号已存在"}
  198. account.steam_username = req.steam_username
  199. if req.steam_id is not None:
  200. account.steam_id = req.steam_id
  201. if req.shared_secret is not None:
  202. account.shared_secret = encryptor.encrypt(req.shared_secret)
  203. if req.identity_secret is not None:
  204. account.identity_secret = encryptor.encrypt(req.identity_secret)
  205. if req.is_active is not None:
  206. account.is_active = req.is_active
  207. account.updated_at = beijing_now()
  208. # 创建历史记录
  209. from app.utils.history import create_steam_account_history
  210. create_steam_account_history(db, account, "UPDATE")
  211. # 一次性提交所有更改
  212. db.commit()
  213. logger.info(f"用户 {req.user_id} 更新Steam账号成功: {account_id}")
  214. return {
  215. "code": 200,
  216. "msg": "更新成功",
  217. "data": {
  218. "id": account.id,
  219. "steam_username": account.steam_username
  220. }
  221. }
  222. except Exception as e:
  223. try:
  224. db.rollback()
  225. except Exception:
  226. logger.warning("回滚数据库事务时发生异常")
  227. logger.exception("更新Steam账号失败")
  228. return {"code": 500, "msg": "系统异常,操作未完成,请稍后重试;若持续发生请联系客服"}
  229. @router.delete("/steam-accounts/{account_id}")
  230. async def delete_steam_account(
  231. account_id: int,
  232. request: Request,
  233. db: Session = Depends(get_db)
  234. ):
  235. """删除Steam账号"""
  236. try:
  237. # 获取请求数据(从body或query参数)
  238. data = {}
  239. try:
  240. # 尝试从body获取
  241. body = await request.body()
  242. if body:
  243. import json
  244. data = json.loads(body)
  245. except:
  246. pass
  247. # 如果body为空,尝试从query参数获取
  248. if not data:
  249. params = dict(request.query_params)
  250. if settings.ENCRYPT_ENABLED:
  251. encrypted_data = params.get("encrypted", "")
  252. if encrypted_data:
  253. data = encryptor.decrypt(encrypted_data)
  254. else:
  255. data = params
  256. else:
  257. data = params
  258. # 解密请求数据
  259. user_id = None
  260. if settings.ENCRYPT_ENABLED and isinstance(data, dict):
  261. encrypted_data = data.get("encrypted", "")
  262. if encrypted_data:
  263. decrypted = encryptor.decrypt(encrypted_data)
  264. user_id = decrypted.get("user_id")
  265. elif isinstance(data, dict):
  266. user_id = data.get("user_id")
  267. if user_id:
  268. try:
  269. user_id = int(user_id)
  270. except:
  271. pass
  272. if not user_id:
  273. return {"code": 400, "msg": "缺少用户ID"}
  274. # 查找Steam账号
  275. account = db.query(SteamAccount).filter(SteamAccount.id == account_id, SteamAccount.is_deleted == 0).first()
  276. if not account:
  277. return {"code": 404, "msg": "Steam账号不存在"}
  278. # 验证用户ID是否匹配
  279. if account.user_id != user_id:
  280. return {"code": 403, "msg": "无权访问该账号"}
  281. # 软删除账号
  282. account.is_deleted = 1
  283. account.updated_at = beijing_now()
  284. # 创建历史记录
  285. from app.utils.history import create_steam_account_history
  286. create_steam_account_history(db, account, "DELETE")
  287. # 一次性提交所有更改
  288. db.commit()
  289. logger.info(f"用户 {user_id} 删除Steam账号成功: {account_id}")
  290. return {
  291. "code": 200,
  292. "msg": "删除成功"
  293. }
  294. except Exception as e:
  295. try:
  296. db.rollback()
  297. except Exception:
  298. logger.warning("回滚数据库事务时发生异常")
  299. logger.exception("删除Steam账号失败")
  300. return {"code": 500, "msg": "系统异常,操作未完成,请稍后重试;若持续发生请联系客服"}