from fastapi import APIRouter, Query, HTTPException, Body from app.services.bybit_service import get_bybit_client import json import os from typing import List, Optional router = APIRouter() ACCOUNTS_FILE = os.path.join(os.path.dirname(__file__), '../../accounts.json') def get_user_api(user_id: str): try: with open(ACCOUNTS_FILE, 'r', encoding='utf-8') as f: accounts = json.load(f) for acc in accounts: if acc['id'] == user_id: return acc['bybit_api_key'], acc['bybit_api_secret'] except Exception as e: raise HTTPException(status_code=500, detail=f"Lỗi đọc file accounts: {e}") raise HTTPException(status_code=404, detail="Không tìm thấy userId") # API lấy danh sách user @router.get("/users") def list_users(): try: with open(ACCOUNTS_FILE, 'r', encoding='utf-8') as f: accounts = json.load(f) return accounts except Exception as e: raise HTTPException(status_code=500, detail=f"Lỗi đọc file accounts: {e}") # API thêm user @router.post("/users") def add_user( id: str = Body(..., description="ID user"), bybit_api_key: str = Body(..., description="Bybit API Key"), bybit_api_secret: str = Body(..., description="Bybit API Secret"), user_name: str = Body(..., description="Tên user") ): try: with open(ACCOUNTS_FILE, 'r+', encoding='utf-8') as f: accounts = json.load(f) if any(acc['id'] == id for acc in accounts): raise HTTPException(status_code=400, detail="ID đã tồn tại") new_user = { "id": id, "bybit_api_key": bybit_api_key, "bybit_api_secret": bybit_api_secret, "user_name": user_name } accounts.append(new_user) f.seek(0) json.dump(accounts, f, ensure_ascii=False, indent=2) f.truncate() return {"message": "Thêm user thành công"} except HTTPException as e: raise e except Exception as e: raise HTTPException(status_code=500, detail=f"Lỗi ghi file accounts: {e}") # API sửa user @router.put("/users/{user_id}") def update_user( user_id: str, bybit_api_key: Optional[str] = Body(None), bybit_api_secret: Optional[str] = Body(None), user_name: Optional[str] = Body(None) ): try: with open(ACCOUNTS_FILE, 'r+', encoding='utf-8') as f: accounts = json.load(f) for acc in accounts: if acc['id'] == user_id: if bybit_api_key is not None: acc['bybit_api_key'] = bybit_api_key if bybit_api_secret is not None: acc['bybit_api_secret'] = bybit_api_secret if user_name is not None: acc['user_name'] = user_name f.seek(0) json.dump(accounts, f, ensure_ascii=False, indent=2) f.truncate() return {"message": "Cập nhật user thành công"} raise HTTPException(status_code=404, detail="Không tìm thấy userId") except HTTPException as e: raise e except Exception as e: raise HTTPException(status_code=500, detail=f"Lỗi ghi file accounts: {e}") # API xóa user @router.delete("/users/{user_id}") def delete_user(user_id: str): try: with open(ACCOUNTS_FILE, 'r+', encoding='utf-8') as f: accounts = json.load(f) new_accounts = [acc for acc in accounts if acc['id'] != user_id] if len(new_accounts) == len(accounts): raise HTTPException(status_code=404, detail="Không tìm thấy userId") f.seek(0) json.dump(new_accounts, f, ensure_ascii=False, indent=2) f.truncate() return {"message": "Xóa user thành công"} except HTTPException as e: raise e except Exception as e: raise HTTPException(status_code=500, detail=f"Lỗi ghi file accounts: {e}") @router.get("/account") def get_account_info(userId: str = Query(..., description="ID của user để lấy API key/secret")): try: api_key, api_secret = get_user_api(userId) client = get_bybit_client(api_key, api_secret) res = client.get_wallet_balance(accountType="UNIFIED") if 'retCode' in res and res['retCode'] != 0: raise HTTPException(status_code=400, detail=f"Bybit API error: {res.get('retMsg', 'Unknown error')}") return res except HTTPException as e: raise e except Exception as e: raise HTTPException(status_code=500, detail=f"Lỗi hệ thống: {e}")