steam.py 12 KB

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