diff --git a/backend/src/main/kotlin/com/wrbug/polymarketbot/controller/AccountController.kt b/backend/src/main/kotlin/com/wrbug/polymarketbot/controller/AccountController.kt index 78abcbe..cbb9d31 100644 --- a/backend/src/main/kotlin/com/wrbug/polymarketbot/controller/AccountController.kt +++ b/backend/src/main/kotlin/com/wrbug/polymarketbot/controller/AccountController.kt @@ -1,6 +1,7 @@ package com.wrbug.polymarketbot.controller import com.wrbug.polymarketbot.dto.* +import com.wrbug.polymarketbot.enums.ErrorCode import com.wrbug.polymarketbot.service.AccountService import kotlinx.coroutines.runBlocking import org.slf4j.LoggerFactory @@ -26,10 +27,10 @@ class AccountController( return try { // 参数验证 if (request.privateKey.isBlank()) { - return ResponseEntity.ok(ApiResponse.paramError("私钥不能为空")) + return ResponseEntity.ok(ApiResponse.error(ErrorCode.PARAM_PRIVATE_KEY_EMPTY)) } if (request.walletAddress.isBlank()) { - return ResponseEntity.ok(ApiResponse.paramError("钱包地址不能为空")) + return ResponseEntity.ok(ApiResponse.error(ErrorCode.PARAM_WALLET_ADDRESS_EMPTY)) } val result = accountService.importAccount(request) @@ -40,14 +41,14 @@ class AccountController( onFailure = { e -> logger.error("导入账户失败: ${e.message}", e) when (e) { - is IllegalArgumentException -> ResponseEntity.ok(ApiResponse.paramError(e.message ?: "参数错误")) - else -> ResponseEntity.ok(ApiResponse.serverError("导入账户失败: ${e.message}")) + is IllegalArgumentException -> ResponseEntity.ok(ApiResponse.error(ErrorCode.PARAM_ERROR, e.message)) + else -> ResponseEntity.ok(ApiResponse.error(ErrorCode.SERVER_ACCOUNT_IMPORT_FAILED, e.message)) } } ) } catch (e: Exception) { logger.error("导入账户异常: ${e.message}", e) - ResponseEntity.ok(ApiResponse.serverError("导入账户失败: ${e.message}")) + ResponseEntity.ok(ApiResponse.error(ErrorCode.SERVER_ACCOUNT_IMPORT_FAILED, e.message)) } } @@ -65,14 +66,14 @@ class AccountController( onFailure = { e -> logger.error("更新账户失败: ${e.message}", e) when (e) { - is IllegalArgumentException -> ResponseEntity.ok(ApiResponse.paramError(e.message ?: "参数错误")) - else -> ResponseEntity.ok(ApiResponse.serverError("更新账户失败: ${e.message}")) + is IllegalArgumentException -> ResponseEntity.ok(ApiResponse.error(ErrorCode.PARAM_ERROR, e.message)) + else -> ResponseEntity.ok(ApiResponse.error(ErrorCode.SERVER_ACCOUNT_UPDATE_FAILED, e.message)) } } ) } catch (e: Exception) { logger.error("更新账户异常: ${e.message}", e) - ResponseEntity.ok(ApiResponse.serverError("更新账户失败: ${e.message}")) + ResponseEntity.ok(ApiResponse.error(ErrorCode.SERVER_ACCOUNT_UPDATE_FAILED, e.message)) } } @@ -90,15 +91,15 @@ class AccountController( onFailure = { e -> logger.error("删除账户失败: ${e.message}", e) when (e) { - is IllegalArgumentException -> ResponseEntity.ok(ApiResponse.paramError(e.message ?: "参数错误")) - is IllegalStateException -> ResponseEntity.ok(ApiResponse.businessError(e.message ?: "业务逻辑错误")) - else -> ResponseEntity.ok(ApiResponse.serverError("删除账户失败: ${e.message}")) + is IllegalArgumentException -> ResponseEntity.ok(ApiResponse.error(ErrorCode.PARAM_ERROR, e.message)) + is IllegalStateException -> ResponseEntity.ok(ApiResponse.error(ErrorCode.BUSINESS_ERROR, e.message)) + else -> ResponseEntity.ok(ApiResponse.error(ErrorCode.SERVER_ACCOUNT_DELETE_FAILED, e.message)) } } ) } catch (e: Exception) { logger.error("删除账户异常: ${e.message}", e) - ResponseEntity.ok(ApiResponse.serverError("删除账户失败: ${e.message}")) + ResponseEntity.ok(ApiResponse.error(ErrorCode.SERVER_ACCOUNT_DELETE_FAILED, e.message)) } } @@ -115,12 +116,12 @@ class AccountController( }, onFailure = { e -> logger.error("查询账户列表失败: ${e.message}", e) - ResponseEntity.ok(ApiResponse.serverError("查询账户列表失败: ${e.message}")) + ResponseEntity.ok(ApiResponse.error(ErrorCode.SERVER_ACCOUNT_LIST_FETCH_FAILED, e.message)) } ) } catch (e: Exception) { logger.error("查询账户列表异常: ${e.message}", e) - ResponseEntity.ok(ApiResponse.serverError("查询账户列表失败: ${e.message}")) + ResponseEntity.ok(ApiResponse.error(ErrorCode.SERVER_ACCOUNT_LIST_FETCH_FAILED, e.message)) } } @@ -138,14 +139,14 @@ class AccountController( onFailure = { e -> logger.error("查询账户详情失败: ${e.message}", e) when (e) { - is IllegalArgumentException -> ResponseEntity.ok(ApiResponse.paramError(e.message ?: "参数错误")) - else -> ResponseEntity.ok(ApiResponse.serverError("查询账户详情失败: ${e.message}")) + is IllegalArgumentException -> ResponseEntity.ok(ApiResponse.error(ErrorCode.PARAM_ERROR, e.message)) + else -> ResponseEntity.ok(ApiResponse.error(ErrorCode.SERVER_ACCOUNT_DETAIL_FETCH_FAILED, e.message)) } } ) } catch (e: Exception) { logger.error("查询账户详情异常: ${e.message}", e) - ResponseEntity.ok(ApiResponse.serverError("查询账户详情失败: ${e.message}")) + ResponseEntity.ok(ApiResponse.error(ErrorCode.SERVER_ACCOUNT_DETAIL_FETCH_FAILED, e.message)) } } @@ -163,14 +164,14 @@ class AccountController( onFailure = { e -> logger.error("查询账户余额失败: ${e.message}", e) when (e) { - is IllegalArgumentException -> ResponseEntity.ok(ApiResponse.paramError(e.message ?: "参数错误")) - else -> ResponseEntity.ok(ApiResponse.serverError("查询账户余额失败: ${e.message}")) + is IllegalArgumentException -> ResponseEntity.ok(ApiResponse.error(ErrorCode.PARAM_ERROR, e.message)) + else -> ResponseEntity.ok(ApiResponse.error(ErrorCode.SERVER_ACCOUNT_BALANCE_FETCH_FAILED, e.message)) } } ) } catch (e: Exception) { logger.error("查询账户余额异常: ${e.message}", e) - ResponseEntity.ok(ApiResponse.serverError("查询账户余额失败: ${e.message}")) + ResponseEntity.ok(ApiResponse.error(ErrorCode.SERVER_ACCOUNT_BALANCE_FETCH_FAILED, e.message)) } } @@ -188,14 +189,14 @@ class AccountController( onFailure = { e -> logger.error("设置默认账户失败: ${e.message}", e) when (e) { - is IllegalArgumentException -> ResponseEntity.ok(ApiResponse.paramError(e.message ?: "参数错误")) - else -> ResponseEntity.ok(ApiResponse.serverError("设置默认账户失败: ${e.message}")) + is IllegalArgumentException -> ResponseEntity.ok(ApiResponse.error(ErrorCode.PARAM_ERROR, e.message)) + else -> ResponseEntity.ok(ApiResponse.error(ErrorCode.SERVER_ACCOUNT_DEFAULT_SET_FAILED, e.message)) } } ) } catch (e: Exception) { logger.error("设置默认账户异常: ${e.message}", e) - ResponseEntity.ok(ApiResponse.serverError("设置默认账户失败: ${e.message}")) + ResponseEntity.ok(ApiResponse.error(ErrorCode.SERVER_ACCOUNT_DEFAULT_SET_FAILED, e.message)) } } @@ -208,17 +209,16 @@ class AccountController( val result = runBlocking { accountService.getAllPositions() } result.fold( onSuccess = { positionListResponse -> - val total = positionListResponse.currentPositions.size + positionListResponse.historyPositions.size ResponseEntity.ok(ApiResponse.success(positionListResponse)) }, onFailure = { e -> logger.error("查询仓位列表失败: ${e.message}", e) - ResponseEntity.ok(ApiResponse.serverError("查询仓位列表失败: ${e.message}")) + ResponseEntity.ok(ApiResponse.error(ErrorCode.SERVER_ACCOUNT_POSITIONS_FETCH_FAILED, e.message)) } ) } catch (e: Exception) { logger.error("查询仓位列表异常: ${e.message}", e) - ResponseEntity.ok(ApiResponse.serverError("查询仓位列表失败: ${e.message}")) + ResponseEntity.ok(ApiResponse.error(ErrorCode.SERVER_ACCOUNT_POSITIONS_FETCH_FAILED, e.message)) } } @@ -230,23 +230,23 @@ class AccountController( return try { // 参数验证 if (request.accountId <= 0) { - return ResponseEntity.ok(ApiResponse.paramError("账户ID无效")) + return ResponseEntity.ok(ApiResponse.error(ErrorCode.PARAM_ACCOUNT_ID_INVALID)) } if (request.marketId.isBlank()) { - return ResponseEntity.ok(ApiResponse.paramError("市场ID不能为空")) + return ResponseEntity.ok(ApiResponse.error(ErrorCode.PARAM_MARKET_ID_EMPTY)) } // side 可以是任意结果名称(如 "YES", "NO", "Pakistan" 等),不再限制为 YES/NO if (request.side.isBlank()) { - return ResponseEntity.ok(ApiResponse.paramError("方向不能为空")) + return ResponseEntity.ok(ApiResponse.error(ErrorCode.PARAM_SIDE_EMPTY)) } if (request.orderType !in listOf("MARKET", "LIMIT")) { - return ResponseEntity.ok(ApiResponse.paramError("订单类型必须是MARKET或LIMIT")) + return ResponseEntity.ok(ApiResponse.error(ErrorCode.PARAM_ORDER_TYPE_MUST_BE_MARKET_OR_LIMIT)) } if (request.quantity.isBlank()) { - return ResponseEntity.ok(ApiResponse.paramError("卖出数量不能为空")) + return ResponseEntity.ok(ApiResponse.error(ErrorCode.PARAM_QUANTITY_EMPTY)) } if (request.orderType == "LIMIT" && (request.price == null || request.price.isBlank())) { - return ResponseEntity.ok(ApiResponse.paramError("限价订单必须提供价格")) + return ResponseEntity.ok(ApiResponse.error(ErrorCode.PARAM_PRICE_EMPTY)) } val result = runBlocking { accountService.sellPosition(request) } @@ -257,15 +257,15 @@ class AccountController( onFailure = { e -> logger.error("创建卖出订单失败: ${e.message}", e) when (e) { - is IllegalArgumentException -> ResponseEntity.ok(ApiResponse.paramError(e.message ?: "参数错误")) - is IllegalStateException -> ResponseEntity.ok(ApiResponse.businessError(e.message ?: "业务逻辑错误")) - else -> ResponseEntity.ok(ApiResponse.serverError("创建卖出订单失败: ${e.message}")) + is IllegalArgumentException -> ResponseEntity.ok(ApiResponse.error(ErrorCode.PARAM_ERROR, e.message)) + is IllegalStateException -> ResponseEntity.ok(ApiResponse.error(ErrorCode.BUSINESS_ERROR, e.message)) + else -> ResponseEntity.ok(ApiResponse.error(ErrorCode.SERVER_ACCOUNT_ORDER_CREATE_FAILED, e.message)) } } ) } catch (e: Exception) { logger.error("创建卖出订单异常: ${e.message}", e) - ResponseEntity.ok(ApiResponse.serverError("创建卖出订单失败: ${e.message}")) + ResponseEntity.ok(ApiResponse.error(ErrorCode.SERVER_ACCOUNT_ORDER_CREATE_FAILED, e.message)) } } @@ -283,14 +283,14 @@ class AccountController( onFailure = { e -> logger.error("获取可赎回仓位统计失败: ${e.message}", e) when (e) { - is IllegalArgumentException -> ResponseEntity.ok(ApiResponse.paramError(e.message ?: "参数错误")) - else -> ResponseEntity.ok(ApiResponse.serverError("获取可赎回仓位统计失败: ${e.message}")) + is IllegalArgumentException -> ResponseEntity.ok(ApiResponse.error(ErrorCode.PARAM_ERROR, e.message)) + else -> ResponseEntity.ok(ApiResponse.error(ErrorCode.SERVER_ERROR, "获取可赎回仓位统计失败: ${e.message}")) } } ) } catch (e: Exception) { logger.error("获取可赎回仓位统计异常: ${e.message}", e) - ResponseEntity.ok(ApiResponse.serverError("获取可赎回仓位统计失败: ${e.message}")) + ResponseEntity.ok(ApiResponse.error(ErrorCode.SERVER_ERROR, "获取可赎回仓位统计失败: ${e.message}")) } } @@ -302,19 +302,19 @@ class AccountController( return try { // 参数验证 if (request.positions.isEmpty()) { - return ResponseEntity.ok(ApiResponse.paramError("赎回仓位列表不能为空")) + return ResponseEntity.ok(ApiResponse.error(ErrorCode.PARAM_REDEEM_POSITIONS_EMPTY)) } // 验证每个仓位项 for (item in request.positions) { if (item.accountId <= 0) { - return ResponseEntity.ok(ApiResponse.paramError("账户ID无效")) + return ResponseEntity.ok(ApiResponse.error(ErrorCode.PARAM_ACCOUNT_ID_INVALID)) } if (item.marketId.isBlank()) { - return ResponseEntity.ok(ApiResponse.paramError("市场ID不能为空")) + return ResponseEntity.ok(ApiResponse.error(ErrorCode.PARAM_MARKET_ID_EMPTY)) } if (item.outcomeIndex < 0) { - return ResponseEntity.ok(ApiResponse.paramError("结果索引无效")) + return ResponseEntity.ok(ApiResponse.error(ErrorCode.PARAM_INDEX_SETS_INVALID)) } } @@ -326,15 +326,15 @@ class AccountController( onFailure = { e -> logger.error("赎回仓位失败: ${e.message}", e) when (e) { - is IllegalArgumentException -> ResponseEntity.ok(ApiResponse.paramError(e.message ?: "参数错误")) - is IllegalStateException -> ResponseEntity.ok(ApiResponse.businessError(e.message ?: "业务逻辑错误")) - else -> ResponseEntity.ok(ApiResponse.serverError("赎回仓位失败: ${e.message}")) + is IllegalArgumentException -> ResponseEntity.ok(ApiResponse.error(ErrorCode.PARAM_ERROR, e.message)) + is IllegalStateException -> ResponseEntity.ok(ApiResponse.error(ErrorCode.BUSINESS_ERROR, e.message)) + else -> ResponseEntity.ok(ApiResponse.error(ErrorCode.SERVER_ACCOUNT_REDEEM_POSITIONS_FAILED, e.message)) } } ) } catch (e: Exception) { logger.error("赎回仓位异常: ${e.message}", e) - ResponseEntity.ok(ApiResponse.serverError("赎回仓位失败: ${e.message}")) + ResponseEntity.ok(ApiResponse.error(ErrorCode.SERVER_ACCOUNT_REDEEM_POSITIONS_FAILED, e.message)) } } diff --git a/backend/src/main/kotlin/com/wrbug/polymarketbot/controller/CopyTradingController.kt b/backend/src/main/kotlin/com/wrbug/polymarketbot/controller/CopyTradingController.kt index dfb51fb..1fc4897 100644 --- a/backend/src/main/kotlin/com/wrbug/polymarketbot/controller/CopyTradingController.kt +++ b/backend/src/main/kotlin/com/wrbug/polymarketbot/controller/CopyTradingController.kt @@ -1,6 +1,7 @@ package com.wrbug.polymarketbot.controller import com.wrbug.polymarketbot.dto.* +import com.wrbug.polymarketbot.enums.ErrorCode import com.wrbug.polymarketbot.service.CopyTradingService import org.slf4j.LoggerFactory import org.springframework.http.ResponseEntity @@ -24,13 +25,13 @@ class CopyTradingController( fun createCopyTrading(@RequestBody request: CopyTradingCreateRequest): ResponseEntity> { return try { if (request.accountId <= 0) { - return ResponseEntity.ok(ApiResponse.paramError("账户 ID 无效")) + return ResponseEntity.ok(ApiResponse.error(ErrorCode.PARAM_ACCOUNT_ID_INVALID)) } if (request.templateId <= 0) { - return ResponseEntity.ok(ApiResponse.paramError("模板 ID 无效")) + return ResponseEntity.ok(ApiResponse.error(ErrorCode.PARAM_TEMPLATE_ID_INVALID)) } if (request.leaderId <= 0) { - return ResponseEntity.ok(ApiResponse.paramError("Leader ID 无效")) + return ResponseEntity.ok(ApiResponse.error(ErrorCode.PARAM_LEADER_ID_INVALID)) } val result = copyTradingService.createCopyTrading(request) @@ -41,14 +42,14 @@ class CopyTradingController( onFailure = { e -> logger.error("创建跟单失败: ${e.message}", e) when (e) { - is IllegalArgumentException -> ResponseEntity.ok(ApiResponse.paramError(e.message ?: "参数错误")) - else -> ResponseEntity.ok(ApiResponse.serverError("创建跟单失败: ${e.message}")) + is IllegalArgumentException -> ResponseEntity.ok(ApiResponse.error(ErrorCode.PARAM_ERROR, e.message)) + else -> ResponseEntity.ok(ApiResponse.error(ErrorCode.SERVER_COPY_TRADING_CREATE_FAILED, e.message)) } } ) } catch (e: Exception) { logger.error("创建跟单异常: ${e.message}", e) - ResponseEntity.ok(ApiResponse.serverError("创建跟单失败: ${e.message}")) + ResponseEntity.ok(ApiResponse.error(ErrorCode.SERVER_COPY_TRADING_CREATE_FAILED, e.message)) } } @@ -65,12 +66,12 @@ class CopyTradingController( }, onFailure = { e -> logger.error("查询跟单列表失败: ${e.message}", e) - ResponseEntity.ok(ApiResponse.serverError("查询跟单列表失败: ${e.message}")) + ResponseEntity.ok(ApiResponse.error(ErrorCode.SERVER_COPY_TRADING_LIST_FETCH_FAILED, e.message)) } ) } catch (e: Exception) { logger.error("查询跟单列表异常: ${e.message}", e) - ResponseEntity.ok(ApiResponse.serverError("查询跟单列表失败: ${e.message}")) + ResponseEntity.ok(ApiResponse.error(ErrorCode.SERVER_COPY_TRADING_LIST_FETCH_FAILED, e.message)) } } @@ -81,7 +82,7 @@ class CopyTradingController( fun updateCopyTradingStatus(@RequestBody request: CopyTradingUpdateStatusRequest): ResponseEntity> { return try { if (request.copyTradingId <= 0) { - return ResponseEntity.ok(ApiResponse.paramError("跟单 ID 无效")) + return ResponseEntity.ok(ApiResponse.error(ErrorCode.PARAM_COPY_TRADING_ID_INVALID)) } val result = copyTradingService.updateCopyTradingStatus(request) @@ -92,15 +93,15 @@ class CopyTradingController( onFailure = { e -> logger.error("更新跟单状态失败: ${e.message}", e) when (e) { - is IllegalArgumentException -> ResponseEntity.ok(ApiResponse.paramError(e.message ?: "参数错误")) - is IllegalStateException -> ResponseEntity.ok(ApiResponse.businessError(e.message ?: "业务逻辑错误")) - else -> ResponseEntity.ok(ApiResponse.serverError("更新跟单状态失败: ${e.message}")) + is IllegalArgumentException -> ResponseEntity.ok(ApiResponse.error(ErrorCode.PARAM_ERROR, e.message)) + is IllegalStateException -> ResponseEntity.ok(ApiResponse.error(ErrorCode.BUSINESS_ERROR, e.message)) + else -> ResponseEntity.ok(ApiResponse.error(ErrorCode.SERVER_COPY_TRADING_UPDATE_FAILED, e.message)) } } ) } catch (e: Exception) { logger.error("更新跟单状态异常: ${e.message}", e) - ResponseEntity.ok(ApiResponse.serverError("更新跟单状态失败: ${e.message}")) + ResponseEntity.ok(ApiResponse.error(ErrorCode.SERVER_COPY_TRADING_UPDATE_FAILED, e.message)) } } @@ -111,7 +112,7 @@ class CopyTradingController( fun deleteCopyTrading(@RequestBody request: CopyTradingDeleteRequest): ResponseEntity> { return try { if (request.copyTradingId <= 0) { - return ResponseEntity.ok(ApiResponse.paramError("跟单 ID 无效")) + return ResponseEntity.ok(ApiResponse.error(ErrorCode.PARAM_COPY_TRADING_ID_INVALID)) } val result = copyTradingService.deleteCopyTrading(request.copyTradingId) @@ -122,14 +123,14 @@ class CopyTradingController( onFailure = { e -> logger.error("删除跟单失败: ${e.message}", e) when (e) { - is IllegalArgumentException -> ResponseEntity.ok(ApiResponse.paramError(e.message ?: "参数错误")) - else -> ResponseEntity.ok(ApiResponse.serverError("删除跟单失败: ${e.message}")) + is IllegalArgumentException -> ResponseEntity.ok(ApiResponse.error(ErrorCode.PARAM_ERROR, e.message)) + else -> ResponseEntity.ok(ApiResponse.error(ErrorCode.SERVER_COPY_TRADING_DELETE_FAILED, e.message)) } } ) } catch (e: Exception) { logger.error("删除跟单异常: ${e.message}", e) - ResponseEntity.ok(ApiResponse.serverError("删除跟单失败: ${e.message}")) + ResponseEntity.ok(ApiResponse.error(ErrorCode.SERVER_COPY_TRADING_DELETE_FAILED, e.message)) } } @@ -140,7 +141,7 @@ class CopyTradingController( fun getAccountTemplates(@RequestBody request: AccountTemplatesRequest): ResponseEntity> { return try { if (request.accountId <= 0) { - return ResponseEntity.ok(ApiResponse.paramError("账户 ID 无效")) + return ResponseEntity.ok(ApiResponse.error(ErrorCode.PARAM_ACCOUNT_ID_INVALID)) } val result = copyTradingService.getAccountTemplates(request.accountId) @@ -151,14 +152,14 @@ class CopyTradingController( onFailure = { e -> logger.error("查询钱包绑定的模板失败: ${e.message}", e) when (e) { - is IllegalArgumentException -> ResponseEntity.ok(ApiResponse.paramError(e.message ?: "参数错误")) - else -> ResponseEntity.ok(ApiResponse.serverError("查询钱包绑定的模板失败: ${e.message}")) + is IllegalArgumentException -> ResponseEntity.ok(ApiResponse.error(ErrorCode.PARAM_ERROR, e.message)) + else -> ResponseEntity.ok(ApiResponse.error(ErrorCode.SERVER_COPY_TRADING_TEMPLATES_FETCH_FAILED, e.message)) } } ) } catch (e: Exception) { logger.error("查询钱包绑定的模板异常: ${e.message}", e) - ResponseEntity.ok(ApiResponse.serverError("查询钱包绑定的模板失败: ${e.message}")) + ResponseEntity.ok(ApiResponse.error(ErrorCode.SERVER_COPY_TRADING_TEMPLATES_FETCH_FAILED, e.message)) } } } diff --git a/backend/src/main/kotlin/com/wrbug/polymarketbot/controller/CopyTradingStatisticsController.kt b/backend/src/main/kotlin/com/wrbug/polymarketbot/controller/CopyTradingStatisticsController.kt index fd1ee29..26c4ad5 100644 --- a/backend/src/main/kotlin/com/wrbug/polymarketbot/controller/CopyTradingStatisticsController.kt +++ b/backend/src/main/kotlin/com/wrbug/polymarketbot/controller/CopyTradingStatisticsController.kt @@ -1,6 +1,7 @@ package com.wrbug.polymarketbot.controller import com.wrbug.polymarketbot.dto.* +import com.wrbug.polymarketbot.enums.ErrorCode import com.wrbug.polymarketbot.service.CopyTradingStatisticsService import kotlinx.coroutines.runBlocking import org.slf4j.LoggerFactory @@ -27,7 +28,7 @@ class CopyTradingStatisticsController( fun getStatisticsDetail(@RequestBody request: StatisticsDetailRequest): ResponseEntity> { return try { if (request.copyTradingId <= 0) { - return ResponseEntity.ok(ApiResponse.paramError("跟单关系ID无效")) + return ResponseEntity.ok(ApiResponse.error(ErrorCode.PARAM_COPY_TRADING_ID_INVALID)) } val result = runBlocking { statisticsService.getStatistics(request.copyTradingId) } @@ -38,14 +39,14 @@ class CopyTradingStatisticsController( onFailure = { e -> logger.error("获取统计信息失败: copyTradingId=${request.copyTradingId}", e) when (e) { - is IllegalArgumentException -> ResponseEntity.ok(ApiResponse.paramError(e.message ?: "参数错误")) - else -> ResponseEntity.ok(ApiResponse.serverError("获取统计信息失败: ${e.message}")) + is IllegalArgumentException -> ResponseEntity.ok(ApiResponse.error(ErrorCode.PARAM_ERROR, e.message)) + else -> ResponseEntity.ok(ApiResponse.error(ErrorCode.SERVER_STATISTICS_FETCH_FAILED, e.message)) } } ) } catch (e: Exception) { logger.error("获取统计信息异常: copyTradingId=${request.copyTradingId}", e) - ResponseEntity.ok(ApiResponse.serverError("获取统计信息失败: ${e.message}")) + ResponseEntity.ok(ApiResponse.error(ErrorCode.SERVER_STATISTICS_FETCH_FAILED, e.message)) } } } @@ -70,16 +71,16 @@ class CopyOrderTrackingController( fun getOrderList(@RequestBody request: OrderTrackingRequest): ResponseEntity> { return try { if (request.copyTradingId <= 0) { - return ResponseEntity.ok(ApiResponse.paramError("跟单关系ID无效")) + return ResponseEntity.ok(ApiResponse.error(ErrorCode.PARAM_COPY_TRADING_ID_INVALID)) } if (request.type.isBlank()) { - return ResponseEntity.ok(ApiResponse.paramError("订单类型不能为空")) + return ResponseEntity.ok(ApiResponse.error(ErrorCode.PARAM_EMPTY, "订单类型不能为空")) } val validTypes = listOf("buy", "sell", "matched") if (!validTypes.contains(request.type.lowercase())) { - return ResponseEntity.ok(ApiResponse.paramError("订单类型无效,必须是: buy, sell, matched")) + return ResponseEntity.ok(ApiResponse.error(ErrorCode.PARAM_ORDER_TYPE_INVALID_FOR_TRACKING)) } val result = statisticsService.getOrderList(request) @@ -90,14 +91,14 @@ class CopyOrderTrackingController( onFailure = { e -> logger.error("查询订单列表失败: copyTradingId=${request.copyTradingId}, type=${request.type}", e) when (e) { - is IllegalArgumentException -> ResponseEntity.ok(ApiResponse.paramError(e.message ?: "参数错误")) - else -> ResponseEntity.ok(ApiResponse.serverError("查询订单列表失败: ${e.message}")) + is IllegalArgumentException -> ResponseEntity.ok(ApiResponse.error(ErrorCode.PARAM_ERROR, e.message)) + else -> ResponseEntity.ok(ApiResponse.error(ErrorCode.SERVER_ORDER_TRACKING_LIST_FETCH_FAILED, e.message)) } } ) } catch (e: Exception) { logger.error("查询订单列表异常: copyTradingId=${request.copyTradingId}, type=${request.type}", e) - ResponseEntity.ok(ApiResponse.serverError("查询订单列表失败: ${e.message}")) + ResponseEntity.ok(ApiResponse.error(ErrorCode.SERVER_ORDER_TRACKING_LIST_FETCH_FAILED, e.message)) } } } diff --git a/backend/src/main/kotlin/com/wrbug/polymarketbot/controller/CopyTradingTemplateController.kt b/backend/src/main/kotlin/com/wrbug/polymarketbot/controller/CopyTradingTemplateController.kt index e6230c7..759773c 100644 --- a/backend/src/main/kotlin/com/wrbug/polymarketbot/controller/CopyTradingTemplateController.kt +++ b/backend/src/main/kotlin/com/wrbug/polymarketbot/controller/CopyTradingTemplateController.kt @@ -1,6 +1,7 @@ package com.wrbug.polymarketbot.controller import com.wrbug.polymarketbot.dto.* +import com.wrbug.polymarketbot.enums.ErrorCode import com.wrbug.polymarketbot.service.CopyTradingTemplateService import org.slf4j.LoggerFactory import org.springframework.http.ResponseEntity @@ -24,7 +25,7 @@ class CopyTradingTemplateController( fun createTemplate(@RequestBody request: TemplateCreateRequest): ResponseEntity> { return try { if (request.templateName.isBlank()) { - return ResponseEntity.ok(ApiResponse.paramError("模板名称不能为空")) + return ResponseEntity.ok(ApiResponse.error(ErrorCode.PARAM_TEMPLATE_NAME_EMPTY)) } val result = templateService.createTemplate(request) @@ -35,14 +36,14 @@ class CopyTradingTemplateController( onFailure = { e -> logger.error("创建模板失败: ${e.message}", e) when (e) { - is IllegalArgumentException -> ResponseEntity.ok(ApiResponse.paramError(e.message ?: "参数错误")) - else -> ResponseEntity.ok(ApiResponse.serverError("创建模板失败: ${e.message}")) + is IllegalArgumentException -> ResponseEntity.ok(ApiResponse.error(ErrorCode.PARAM_ERROR, e.message)) + else -> ResponseEntity.ok(ApiResponse.error(ErrorCode.SERVER_TEMPLATE_CREATE_FAILED, e.message)) } } ) } catch (e: Exception) { logger.error("创建模板异常: ${e.message}", e) - ResponseEntity.ok(ApiResponse.serverError("创建模板失败: ${e.message}")) + ResponseEntity.ok(ApiResponse.error(ErrorCode.SERVER_TEMPLATE_CREATE_FAILED, e.message)) } } @@ -53,7 +54,7 @@ class CopyTradingTemplateController( fun updateTemplate(@RequestBody request: TemplateUpdateRequest): ResponseEntity> { return try { if (request.templateId <= 0) { - return ResponseEntity.ok(ApiResponse.paramError("模板 ID 无效")) + return ResponseEntity.ok(ApiResponse.error(ErrorCode.PARAM_TEMPLATE_ID_INVALID)) } val result = templateService.updateTemplate(request) @@ -64,14 +65,14 @@ class CopyTradingTemplateController( onFailure = { e -> logger.error("更新模板失败: ${e.message}", e) when (e) { - is IllegalArgumentException -> ResponseEntity.ok(ApiResponse.paramError(e.message ?: "参数错误")) - else -> ResponseEntity.ok(ApiResponse.serverError("更新模板失败: ${e.message}")) + is IllegalArgumentException -> ResponseEntity.ok(ApiResponse.error(ErrorCode.PARAM_ERROR, e.message)) + else -> ResponseEntity.ok(ApiResponse.error(ErrorCode.SERVER_TEMPLATE_UPDATE_FAILED, e.message)) } } ) } catch (e: Exception) { logger.error("更新模板异常: ${e.message}", e) - ResponseEntity.ok(ApiResponse.serverError("更新模板失败: ${e.message}")) + ResponseEntity.ok(ApiResponse.error(ErrorCode.SERVER_TEMPLATE_UPDATE_FAILED, e.message)) } } @@ -82,7 +83,7 @@ class CopyTradingTemplateController( fun deleteTemplate(@RequestBody request: TemplateDeleteRequest): ResponseEntity> { return try { if (request.templateId <= 0) { - return ResponseEntity.ok(ApiResponse.paramError("模板 ID 无效")) + return ResponseEntity.ok(ApiResponse.error(ErrorCode.PARAM_TEMPLATE_ID_INVALID)) } val result = templateService.deleteTemplate(request.templateId) @@ -93,15 +94,15 @@ class CopyTradingTemplateController( onFailure = { e -> logger.error("删除模板失败: ${e.message}", e) when (e) { - is IllegalArgumentException -> ResponseEntity.ok(ApiResponse.paramError(e.message ?: "参数错误")) - is IllegalStateException -> ResponseEntity.ok(ApiResponse.businessError(e.message ?: "业务逻辑错误")) - else -> ResponseEntity.ok(ApiResponse.serverError("删除模板失败: ${e.message}")) + is IllegalArgumentException -> ResponseEntity.ok(ApiResponse.error(ErrorCode.PARAM_ERROR, e.message)) + is IllegalStateException -> ResponseEntity.ok(ApiResponse.error(ErrorCode.BUSINESS_ERROR, e.message)) + else -> ResponseEntity.ok(ApiResponse.error(ErrorCode.SERVER_TEMPLATE_DELETE_FAILED, e.message)) } } ) } catch (e: Exception) { logger.error("删除模板异常: ${e.message}", e) - ResponseEntity.ok(ApiResponse.serverError("删除模板失败: ${e.message}")) + ResponseEntity.ok(ApiResponse.error(ErrorCode.SERVER_TEMPLATE_DELETE_FAILED, e.message)) } } @@ -112,10 +113,10 @@ class CopyTradingTemplateController( fun copyTemplate(@RequestBody request: TemplateCopyRequest): ResponseEntity> { return try { if (request.templateId <= 0) { - return ResponseEntity.ok(ApiResponse.paramError("模板 ID 无效")) + return ResponseEntity.ok(ApiResponse.error(ErrorCode.PARAM_TEMPLATE_ID_INVALID)) } if (request.templateName.isBlank()) { - return ResponseEntity.ok(ApiResponse.paramError("新模板名称不能为空")) + return ResponseEntity.ok(ApiResponse.error(ErrorCode.PARAM_TEMPLATE_NAME_EMPTY)) } val result = templateService.copyTemplate(request) @@ -126,14 +127,14 @@ class CopyTradingTemplateController( onFailure = { e -> logger.error("复制模板失败: ${e.message}", e) when (e) { - is IllegalArgumentException -> ResponseEntity.ok(ApiResponse.paramError(e.message ?: "参数错误")) - else -> ResponseEntity.ok(ApiResponse.serverError("复制模板失败: ${e.message}")) + is IllegalArgumentException -> ResponseEntity.ok(ApiResponse.error(ErrorCode.PARAM_ERROR, e.message)) + else -> ResponseEntity.ok(ApiResponse.error(ErrorCode.SERVER_TEMPLATE_COPY_FAILED, e.message)) } } ) } catch (e: Exception) { logger.error("复制模板异常: ${e.message}", e) - ResponseEntity.ok(ApiResponse.serverError("复制模板失败: ${e.message}")) + ResponseEntity.ok(ApiResponse.error(ErrorCode.SERVER_TEMPLATE_COPY_FAILED, e.message)) } } @@ -150,12 +151,12 @@ class CopyTradingTemplateController( }, onFailure = { e -> logger.error("查询模板列表失败: ${e.message}", e) - ResponseEntity.ok(ApiResponse.serverError("查询模板列表失败: ${e.message}")) + ResponseEntity.ok(ApiResponse.error(ErrorCode.SERVER_TEMPLATE_LIST_FETCH_FAILED, e.message)) } ) } catch (e: Exception) { logger.error("查询模板列表异常: ${e.message}", e) - ResponseEntity.ok(ApiResponse.serverError("查询模板列表失败: ${e.message}")) + ResponseEntity.ok(ApiResponse.error(ErrorCode.SERVER_TEMPLATE_LIST_FETCH_FAILED, e.message)) } } @@ -166,7 +167,7 @@ class CopyTradingTemplateController( fun getTemplateDetail(@RequestBody request: TemplateDetailRequest): ResponseEntity> { return try { if (request.templateId <= 0) { - return ResponseEntity.ok(ApiResponse.paramError("模板 ID 无效")) + return ResponseEntity.ok(ApiResponse.error(ErrorCode.PARAM_TEMPLATE_ID_INVALID)) } val result = templateService.getTemplateDetail(request.templateId) @@ -177,14 +178,14 @@ class CopyTradingTemplateController( onFailure = { e -> logger.error("查询模板详情失败: ${e.message}", e) when (e) { - is IllegalArgumentException -> ResponseEntity.ok(ApiResponse.paramError(e.message ?: "参数错误")) - else -> ResponseEntity.ok(ApiResponse.serverError("查询模板详情失败: ${e.message}")) + is IllegalArgumentException -> ResponseEntity.ok(ApiResponse.error(ErrorCode.PARAM_ERROR, e.message)) + else -> ResponseEntity.ok(ApiResponse.error(ErrorCode.SERVER_TEMPLATE_DETAIL_FETCH_FAILED, e.message)) } } ) } catch (e: Exception) { logger.error("查询模板详情异常: ${e.message}", e) - ResponseEntity.ok(ApiResponse.serverError("查询模板详情失败: ${e.message}")) + ResponseEntity.ok(ApiResponse.error(ErrorCode.SERVER_TEMPLATE_DETAIL_FETCH_FAILED, e.message)) } } } diff --git a/backend/src/main/kotlin/com/wrbug/polymarketbot/controller/LeaderController.kt b/backend/src/main/kotlin/com/wrbug/polymarketbot/controller/LeaderController.kt index 4695525..ce8605f 100644 --- a/backend/src/main/kotlin/com/wrbug/polymarketbot/controller/LeaderController.kt +++ b/backend/src/main/kotlin/com/wrbug/polymarketbot/controller/LeaderController.kt @@ -1,6 +1,7 @@ package com.wrbug.polymarketbot.controller import com.wrbug.polymarketbot.dto.* +import com.wrbug.polymarketbot.enums.ErrorCode import com.wrbug.polymarketbot.service.LeaderService import org.slf4j.LoggerFactory import org.springframework.http.ResponseEntity @@ -24,7 +25,7 @@ class LeaderController( fun addLeader(@RequestBody request: LeaderAddRequest): ResponseEntity> { return try { if (request.leaderAddress.isBlank()) { - return ResponseEntity.ok(ApiResponse.paramError("Leader 地址不能为空")) + return ResponseEntity.ok(ApiResponse.error(ErrorCode.PARAM_LEADER_ADDRESS_EMPTY)) } val result = leaderService.addLeader(request) @@ -35,15 +36,15 @@ class LeaderController( onFailure = { e -> logger.error("添加 Leader 失败: ${e.message}", e) when (e) { - is IllegalArgumentException -> ResponseEntity.ok(ApiResponse.paramError(e.message ?: "参数错误")) - is IllegalStateException -> ResponseEntity.ok(ApiResponse.businessError(e.message ?: "业务逻辑错误")) - else -> ResponseEntity.ok(ApiResponse.serverError("添加 Leader 失败: ${e.message}")) + is IllegalArgumentException -> ResponseEntity.ok(ApiResponse.error(ErrorCode.PARAM_ERROR, e.message)) + is IllegalStateException -> ResponseEntity.ok(ApiResponse.error(ErrorCode.BUSINESS_ERROR, e.message)) + else -> ResponseEntity.ok(ApiResponse.error(ErrorCode.SERVER_LEADER_ADD_FAILED, e.message)) } } ) } catch (e: Exception) { logger.error("添加 Leader 异常: ${e.message}", e) - ResponseEntity.ok(ApiResponse.serverError("添加 Leader 失败: ${e.message}")) + ResponseEntity.ok(ApiResponse.error(ErrorCode.SERVER_LEADER_ADD_FAILED, e.message)) } } @@ -54,7 +55,7 @@ class LeaderController( fun updateLeader(@RequestBody request: LeaderUpdateRequest): ResponseEntity> { return try { if (request.leaderId <= 0) { - return ResponseEntity.ok(ApiResponse.paramError("Leader ID 无效")) + return ResponseEntity.ok(ApiResponse.error(ErrorCode.PARAM_LEADER_ID_INVALID)) } val result = leaderService.updateLeader(request) @@ -65,14 +66,14 @@ class LeaderController( onFailure = { e -> logger.error("更新 Leader 失败: ${e.message}", e) when (e) { - is IllegalArgumentException -> ResponseEntity.ok(ApiResponse.paramError(e.message ?: "参数错误")) - else -> ResponseEntity.ok(ApiResponse.serverError("更新 Leader 失败: ${e.message}")) + is IllegalArgumentException -> ResponseEntity.ok(ApiResponse.error(ErrorCode.PARAM_ERROR, e.message)) + else -> ResponseEntity.ok(ApiResponse.error(ErrorCode.SERVER_LEADER_UPDATE_FAILED, e.message)) } } ) } catch (e: Exception) { logger.error("更新 Leader 异常: ${e.message}", e) - ResponseEntity.ok(ApiResponse.serverError("更新 Leader 失败: ${e.message}")) + ResponseEntity.ok(ApiResponse.error(ErrorCode.SERVER_LEADER_UPDATE_FAILED, e.message)) } } @@ -83,7 +84,7 @@ class LeaderController( fun deleteLeader(@RequestBody request: LeaderDeleteRequest): ResponseEntity> { return try { if (request.leaderId <= 0) { - return ResponseEntity.ok(ApiResponse.paramError("Leader ID 无效")) + return ResponseEntity.ok(ApiResponse.error(ErrorCode.PARAM_LEADER_ID_INVALID)) } val result = leaderService.deleteLeader(request.leaderId) @@ -94,15 +95,15 @@ class LeaderController( onFailure = { e -> logger.error("删除 Leader 失败: ${e.message}", e) when (e) { - is IllegalArgumentException -> ResponseEntity.ok(ApiResponse.paramError(e.message ?: "参数错误")) - is IllegalStateException -> ResponseEntity.ok(ApiResponse.businessError(e.message ?: "业务逻辑错误")) - else -> ResponseEntity.ok(ApiResponse.serverError("删除 Leader 失败: ${e.message}")) + is IllegalArgumentException -> ResponseEntity.ok(ApiResponse.error(ErrorCode.PARAM_ERROR, e.message)) + is IllegalStateException -> ResponseEntity.ok(ApiResponse.error(ErrorCode.BUSINESS_ERROR, e.message)) + else -> ResponseEntity.ok(ApiResponse.error(ErrorCode.SERVER_LEADER_DELETE_FAILED, e.message)) } } ) } catch (e: Exception) { logger.error("删除 Leader 异常: ${e.message}", e) - ResponseEntity.ok(ApiResponse.serverError("删除 Leader 失败: ${e.message}")) + ResponseEntity.ok(ApiResponse.error(ErrorCode.SERVER_LEADER_DELETE_FAILED, e.message)) } } @@ -119,12 +120,12 @@ class LeaderController( }, onFailure = { e -> logger.error("查询 Leader 列表失败: ${e.message}", e) - ResponseEntity.ok(ApiResponse.serverError("查询 Leader 列表失败: ${e.message}")) + ResponseEntity.ok(ApiResponse.error(ErrorCode.SERVER_LEADER_LIST_FETCH_FAILED, e.message)) } ) } catch (e: Exception) { logger.error("查询 Leader 列表异常: ${e.message}", e) - ResponseEntity.ok(ApiResponse.serverError("查询 Leader 列表失败: ${e.message}")) + ResponseEntity.ok(ApiResponse.error(ErrorCode.SERVER_LEADER_LIST_FETCH_FAILED, e.message)) } } @@ -135,7 +136,7 @@ class LeaderController( fun getLeaderDetail(@RequestBody request: LeaderDetailRequest): ResponseEntity> { return try { if (request.leaderId <= 0) { - return ResponseEntity.ok(ApiResponse.paramError("Leader ID 无效")) + return ResponseEntity.ok(ApiResponse.error(ErrorCode.PARAM_LEADER_ID_INVALID)) } val result = leaderService.getLeaderDetail(request.leaderId) @@ -146,14 +147,14 @@ class LeaderController( onFailure = { e -> logger.error("查询 Leader 详情失败: ${e.message}", e) when (e) { - is IllegalArgumentException -> ResponseEntity.ok(ApiResponse.paramError(e.message ?: "参数错误")) - else -> ResponseEntity.ok(ApiResponse.serverError("查询 Leader 详情失败: ${e.message}")) + is IllegalArgumentException -> ResponseEntity.ok(ApiResponse.error(ErrorCode.PARAM_ERROR, e.message)) + else -> ResponseEntity.ok(ApiResponse.error(ErrorCode.SERVER_LEADER_DETAIL_FETCH_FAILED, e.message)) } } ) } catch (e: Exception) { logger.error("查询 Leader 详情异常: ${e.message}", e) - ResponseEntity.ok(ApiResponse.serverError("查询 Leader 详情失败: ${e.message}")) + ResponseEntity.ok(ApiResponse.error(ErrorCode.SERVER_LEADER_DETAIL_FETCH_FAILED, e.message)) } } } diff --git a/backend/src/main/kotlin/com/wrbug/polymarketbot/controller/MarketController.kt b/backend/src/main/kotlin/com/wrbug/polymarketbot/controller/MarketController.kt index 39ca649..5bcb45a 100644 --- a/backend/src/main/kotlin/com/wrbug/polymarketbot/controller/MarketController.kt +++ b/backend/src/main/kotlin/com/wrbug/polymarketbot/controller/MarketController.kt @@ -2,6 +2,7 @@ package com.wrbug.polymarketbot.controller import com.wrbug.polymarketbot.api.LatestPriceResponse import com.wrbug.polymarketbot.dto.* +import com.wrbug.polymarketbot.enums.ErrorCode import com.wrbug.polymarketbot.service.AccountService import com.wrbug.polymarketbot.service.PolymarketClobService import kotlinx.coroutines.runBlocking @@ -30,7 +31,7 @@ class MarketController( fun getMarketPrice(@RequestBody request: MarketPriceRequest): ResponseEntity> { return try { if (request.marketId.isBlank()) { - return ResponseEntity.ok(ApiResponse.paramError("市场ID不能为空")) + return ResponseEntity.ok(ApiResponse.error(ErrorCode.PARAM_MARKET_ID_EMPTY)) } val result = runBlocking { accountService.getMarketPrice(request.marketId) } @@ -40,12 +41,12 @@ class MarketController( }, onFailure = { e -> logger.error("获取市场价格失败: ${e.message}", e) - ResponseEntity.ok(ApiResponse.serverError("获取市场价格失败: ${e.message}")) + ResponseEntity.ok(ApiResponse.error(ErrorCode.SERVER_MARKET_PRICE_FETCH_FAILED, e.message)) } ) } catch (e: Exception) { logger.error("获取市场价格异常: ${e.message}", e) - ResponseEntity.ok(ApiResponse.serverError("获取市场价格失败: ${e.message}")) + ResponseEntity.ok(ApiResponse.error(ErrorCode.SERVER_MARKET_PRICE_FETCH_FAILED, e.message)) } } @@ -58,7 +59,7 @@ class MarketController( fun getLatestPrice(@RequestBody request: LatestPriceRequest): ResponseEntity> { return try { if (request.tokenId.isBlank()) { - return ResponseEntity.ok(ApiResponse.paramError("tokenId 不能为空")) + return ResponseEntity.ok(ApiResponse.error(ErrorCode.PARAM_TOKEN_ID_EMPTY)) } val result = runBlocking { clobService.getLatestPrice(request.tokenId) } @@ -68,12 +69,12 @@ class MarketController( }, onFailure = { e -> logger.error("获取最新价失败: ${e.message}", e) - ResponseEntity.ok(ApiResponse.serverError("获取最新价失败: ${e.message}")) + ResponseEntity.ok(ApiResponse.error(ErrorCode.SERVER_MARKET_LATEST_PRICE_FETCH_FAILED, e.message)) } ) } catch (e: Exception) { logger.error("获取最新价异常: ${e.message}", e) - ResponseEntity.ok(ApiResponse.serverError("获取最新价失败: ${e.message}")) + ResponseEntity.ok(ApiResponse.error(ErrorCode.SERVER_MARKET_LATEST_PRICE_FETCH_FAILED, e.message)) } } } diff --git a/backend/src/main/kotlin/com/wrbug/polymarketbot/dto/ApiResponse.kt b/backend/src/main/kotlin/com/wrbug/polymarketbot/dto/ApiResponse.kt index a73469c..560f0e0 100644 --- a/backend/src/main/kotlin/com/wrbug/polymarketbot/dto/ApiResponse.kt +++ b/backend/src/main/kotlin/com/wrbug/polymarketbot/dto/ApiResponse.kt @@ -1,5 +1,7 @@ package com.wrbug.polymarketbot.dto +import com.wrbug.polymarketbot.enums.ErrorCode + /** * 统一API响应格式 * @param code 响应码,0表示成功,非0表示失败 @@ -20,45 +22,61 @@ data class ApiResponse( } /** - * 创建失败响应 + * 创建失败响应(使用 ErrorCode 枚举) + */ + fun error(errorCode: ErrorCode, customMsg: String? = null): ApiResponse { + return ApiResponse( + code = errorCode.code, + data = null, + msg = customMsg ?: errorCode.message + ) + } + + /** + * 创建失败响应(使用错误码和自定义消息) */ fun error(code: Int, msg: String): ApiResponse { return ApiResponse(code = code, data = null, msg = msg) } /** - * 创建参数错误响应 + * 创建参数错误响应(兼容旧代码,建议使用 error(ErrorCode)) */ + @Deprecated("使用 error(ErrorCode.PARAM_ERROR, msg) 替代", ReplaceWith("error(ErrorCode.PARAM_ERROR, msg)")) fun paramError(msg: String): ApiResponse { - return ApiResponse(code = 1001, data = null, msg = msg) + return error(ErrorCode.PARAM_ERROR, msg) } /** - * 创建认证错误响应 + * 创建认证错误响应(兼容旧代码,建议使用 error(ErrorCode)) */ + @Deprecated("使用 error(ErrorCode.AUTH_ERROR, msg) 替代", ReplaceWith("error(ErrorCode.AUTH_ERROR, msg)")) fun authError(msg: String): ApiResponse { - return ApiResponse(code = 2001, data = null, msg = msg) + return error(ErrorCode.AUTH_ERROR, msg) } /** - * 创建资源不存在响应 + * 创建资源不存在响应(兼容旧代码,建议使用 error(ErrorCode)) */ + @Deprecated("使用 error(ErrorCode.NOT_FOUND, msg) 替代", ReplaceWith("error(ErrorCode.NOT_FOUND, msg)")) fun notFound(msg: String): ApiResponse { - return ApiResponse(code = 3001, data = null, msg = msg) + return error(ErrorCode.NOT_FOUND, msg) } /** - * 创建业务逻辑错误响应 + * 创建业务逻辑错误响应(兼容旧代码,建议使用 error(ErrorCode)) */ + @Deprecated("使用 error(ErrorCode.BUSINESS_ERROR, msg) 替代", ReplaceWith("error(ErrorCode.BUSINESS_ERROR, msg)")) fun businessError(msg: String): ApiResponse { - return ApiResponse(code = 4001, data = null, msg = msg) + return error(ErrorCode.BUSINESS_ERROR, msg) } /** - * 创建服务器内部错误响应 + * 创建服务器内部错误响应(兼容旧代码,建议使用 error(ErrorCode)) */ + @Deprecated("使用 error(ErrorCode.SERVER_ERROR, msg) 替代", ReplaceWith("error(ErrorCode.SERVER_ERROR, msg)")) fun serverError(msg: String): ApiResponse { - return ApiResponse(code = 5001, data = null, msg = msg) + return error(ErrorCode.SERVER_ERROR, msg) } } } diff --git a/backend/src/main/kotlin/com/wrbug/polymarketbot/enums/ErrorCode.kt b/backend/src/main/kotlin/com/wrbug/polymarketbot/enums/ErrorCode.kt new file mode 100644 index 0000000..28b82b8 --- /dev/null +++ b/backend/src/main/kotlin/com/wrbug/polymarketbot/enums/ErrorCode.kt @@ -0,0 +1,230 @@ +package com.wrbug.polymarketbot.enums + +/** + * 错误码枚举 + * 按业务模块划分错误码范围 + * + * 错误码范围划分: + * - 1001-1999: 参数错误 (Param Error) + * - 2001-2999: 认证/权限错误 (Auth Error) + * - 3001-3999: 资源不存在 (Not Found) + * - 4001-4999: 业务逻辑错误 (Business Error) + * - 4001-4099: Leader 管理 + * - 4101-4199: 模板管理 + * - 4201-4299: 跟单管理 + * - 4301-4399: 订单相关 + * - 4401-4499: 市场相关 + * - 4501-4599: 仓位相关 + * - 5001-5999: 服务器内部错误 (Server Error) + */ +enum class ErrorCode( + val code: Int, + val message: String +) { + // ==================== 参数错误 (1001-1999) ==================== + PARAM_ERROR(1001, "参数错误"), + PARAM_EMPTY(1002, "参数不能为空"), + PARAM_INVALID(1003, "参数无效"), + + // 账户相关参数错误 + PARAM_PRIVATE_KEY_EMPTY(1101, "私钥不能为空"), + PARAM_WALLET_ADDRESS_EMPTY(1102, "钱包地址不能为空"), + PARAM_WALLET_ADDRESS_INVALID(1103, "钱包地址格式无效"), + PARAM_ACCOUNT_ID_INVALID(1104, "账户ID无效"), + PARAM_ACCOUNT_NAME_EMPTY(1105, "账户名称不能为空"), + + // Leader 相关参数错误 + PARAM_LEADER_ADDRESS_EMPTY(1201, "Leader 地址不能为空"), + PARAM_LEADER_ADDRESS_INVALID(1202, "Leader 地址格式无效"), + PARAM_LEADER_ID_INVALID(1203, "Leader ID 无效"), + PARAM_LEADER_NAME_EMPTY(1204, "Leader 名称不能为空"), + PARAM_CATEGORY_INVALID(1205, "分类无效,只支持 sports 或 crypto"), + + // 模板相关参数错误 + PARAM_TEMPLATE_NAME_EMPTY(1301, "模板名称不能为空"), + PARAM_TEMPLATE_ID_INVALID(1302, "模板 ID 无效"), + PARAM_COPY_MODE_INVALID(1303, "copyMode 必须是 RATIO 或 FIXED"), + PARAM_COPY_RATIO_INVALID(1304, "跟单比例无效"), + PARAM_FIXED_AMOUNT_INVALID(1305, "固定金额无效"), + + // 跟单相关参数错误 + PARAM_COPY_TRADING_ID_INVALID(1401, "跟单关系ID无效"), + PARAM_ORDER_TYPE_INVALID(1402, "订单类型无效"), + PARAM_ORDER_TYPE_MUST_BE_MARKET_OR_LIMIT(1403, "订单类型必须是MARKET或LIMIT"), + PARAM_QUANTITY_EMPTY(1404, "数量不能为空"), + PARAM_PRICE_EMPTY(1405, "限价订单必须提供价格"), + PARAM_SIDE_EMPTY(1406, "方向不能为空"), + PARAM_MARKET_ID_EMPTY(1407, "市场ID不能为空"), + PARAM_ORDER_TYPE_EMPTY(1408, "订单类型不能为空"), + + // 市场相关参数错误 + PARAM_TOKEN_ID_EMPTY(1501, "tokenId 不能为空"), + PARAM_CONDITION_ID_EMPTY(1502, "conditionId 不能为空"), + PARAM_REDEEM_POSITIONS_EMPTY(1503, "赎回仓位列表不能为空"), + PARAM_INDEX_SETS_INVALID(1504, "结果索引无效"), + + // 统计相关参数错误 + PARAM_ORDER_TYPE_INVALID_FOR_TRACKING(1601, "订单类型无效,必须是: buy, sell, matched"), + + // ==================== 认证/权限错误 (2001-2999) ==================== + AUTH_ERROR(2001, "认证失败"), + AUTH_TOKEN_INVALID(2002, "认证令牌无效"), + AUTH_TOKEN_EXPIRED(2003, "认证令牌已过期"), + AUTH_PERMISSION_DENIED(2004, "权限不足"), + AUTH_API_KEY_INVALID(2005, "API Key 无效"), + AUTH_API_SECRET_INVALID(2006, "API Secret 无效"), + AUTH_API_PASSPHRASE_INVALID(2007, "API Passphrase 无效"), + AUTH_API_CREDENTIALS_MISSING(2008, "API 凭证未配置"), + + // ==================== 资源不存在 (3001-3999) ==================== + NOT_FOUND(3001, "资源不存在"), + ACCOUNT_NOT_FOUND(3002, "账户不存在"), + LEADER_NOT_FOUND(3003, "Leader 不存在"), + TEMPLATE_NOT_FOUND(3004, "模板不存在"), + COPY_TRADING_NOT_FOUND(3005, "跟单关系不存在"), + MARKET_NOT_FOUND(3006, "市场不存在"), + ORDER_NOT_FOUND(3007, "订单不存在"), + POSITION_NOT_FOUND(3008, "仓位不存在"), + + // ==================== 业务逻辑错误 (4001-4999) ==================== + BUSINESS_ERROR(4001, "业务逻辑错误"), + + // Leader 管理 (4001-4099) + LEADER_ALREADY_EXISTS(4001, "该 Leader 地址已存在"), + LEADER_ADDRESS_SAME_AS_ACCOUNT(4002, "Leader 地址不能与自己的账户地址相同"), + LEADER_HAS_COPY_TRADINGS(4003, "该 Leader 还有跟单关系,请先删除跟单关系"), + + // 模板管理 (4101-4199) + TEMPLATE_NAME_ALREADY_EXISTS(4101, "模板名称已存在"), + TEMPLATE_HAS_COPY_TRADINGS(4102, "该模板还有跟单关系在使用,请先删除跟单关系"), + + // 跟单管理 (4201-4299) + COPY_TRADING_ALREADY_EXISTS(4201, "该跟单关系已存在"), + COPY_TRADING_DISABLED(4202, "跟单关系已禁用"), + COPY_TRADING_ENABLED(4203, "跟单关系已启用"), + NO_ENABLED_COPY_TRADINGS(4204, "没有启用的跟单关系"), + + // 订单相关 (4301-4399) + ORDER_CREATE_FAILED(4301, "创建订单失败"), + ORDER_CANCEL_FAILED(4302, "取消订单失败"), + ORDER_NOT_MATCHED(4303, "订单未匹配"), + ORDER_ALREADY_FILLED(4304, "订单已成交"), + ORDER_INSUFFICIENT_BALANCE(4305, "余额不足"), + ORDER_AMOUNT_TOO_SMALL(4306, "订单金额低于最小限制"), + ORDER_AMOUNT_TOO_LARGE(4307, "订单金额超过最大限制"), + ORDER_PRICE_INVALID(4308, "订单价格无效"), + ORDER_QUANTITY_INVALID(4309, "订单数量无效"), + + // 市场相关 (4401-4499) + MARKET_PRICE_FETCH_FAILED(4401, "获取市场价格失败"), + MARKET_ORDERBOOK_EMPTY(4402, "订单簿为空"), + MARKET_TOKEN_ID_INVALID(4403, "Token ID 无效"), + + // 仓位相关 (4501-4599) + POSITION_REDEEM_FAILED(4501, "赎回仓位失败"), + POSITION_NOT_REDEEMABLE(4502, "仓位不可赎回"), + POSITION_INSUFFICIENT(4503, "仓位不足"), + POSITION_ALREADY_REDEEMED(4504, "仓位已赎回"), + + // 账户相关业务错误 (4601-4699) + ACCOUNT_ALREADY_EXISTS(4601, "账户已存在"), + ACCOUNT_IS_DEFAULT(4602, "账户已是默认账户"), + ACCOUNT_HAS_ACTIVE_ORDERS(4603, "账户有活跃订单"), + ACCOUNT_IS_LAST_ONE(4604, "不能删除最后一个账户"), + ACCOUNT_API_KEY_CREATE_FAILED(4605, "自动获取 API Key 失败"), + ACCOUNT_PROXY_ADDRESS_FETCH_FAILED(4606, "获取代理地址失败"), + ACCOUNT_BALANCE_FETCH_FAILED(4607, "查询账户余额失败"), + ACCOUNT_POSITIONS_FETCH_FAILED(4608, "查询仓位列表失败"), + + // 统计相关 (4701-4799) + STATISTICS_FETCH_FAILED(4701, "获取统计信息失败"), + ORDER_LIST_FETCH_FAILED(4702, "查询订单列表失败"), + + // ==================== 服务器内部错误 (5001-5999) ==================== + SERVER_ERROR(5001, "服务器内部错误"), + SERVER_DATABASE_ERROR(5002, "数据库错误"), + SERVER_NETWORK_ERROR(5003, "网络错误"), + SERVER_TIMEOUT(5004, "请求超时"), + SERVER_EXTERNAL_API_ERROR(5005, "外部API调用失败"), + SERVER_RPC_ERROR(5006, "RPC调用失败"), + SERVER_WEBSOCKET_ERROR(5007, "WebSocket连接错误"), + SERVER_ENCRYPTION_ERROR(5008, "加密/解密错误"), + SERVER_SIGNATURE_ERROR(5009, "签名错误"), + + // 账户服务错误 (5101-5199) + SERVER_ACCOUNT_IMPORT_FAILED(5101, "导入账户失败"), + SERVER_ACCOUNT_UPDATE_FAILED(5102, "更新账户失败"), + SERVER_ACCOUNT_DELETE_FAILED(5103, "删除账户失败"), + SERVER_ACCOUNT_LIST_FETCH_FAILED(5104, "查询账户列表失败"), + SERVER_ACCOUNT_DETAIL_FETCH_FAILED(5105, "查询账户详情失败"), + SERVER_ACCOUNT_BALANCE_FETCH_FAILED(5106, "查询账户余额失败"), + SERVER_ACCOUNT_DEFAULT_SET_FAILED(5107, "设置默认账户失败"), + SERVER_ACCOUNT_POSITIONS_FETCH_FAILED(5108, "查询仓位列表失败"), + SERVER_ACCOUNT_ORDER_CREATE_FAILED(5109, "创建卖出订单失败"), + SERVER_ACCOUNT_REDEEM_POSITIONS_FAILED(5110, "赎回仓位失败"), + + // Leader 服务错误 (5201-5299) + SERVER_LEADER_ADD_FAILED(5201, "添加 Leader 失败"), + SERVER_LEADER_UPDATE_FAILED(5202, "更新 Leader 失败"), + SERVER_LEADER_DELETE_FAILED(5203, "删除 Leader 失败"), + SERVER_LEADER_LIST_FETCH_FAILED(5204, "查询 Leader 列表失败"), + SERVER_LEADER_DETAIL_FETCH_FAILED(5205, "查询 Leader 详情失败"), + + // 模板服务错误 (5301-5399) + SERVER_TEMPLATE_CREATE_FAILED(5301, "创建模板失败"), + SERVER_TEMPLATE_UPDATE_FAILED(5302, "更新模板失败"), + SERVER_TEMPLATE_DELETE_FAILED(5303, "删除模板失败"), + SERVER_TEMPLATE_COPY_FAILED(5304, "复制模板失败"), + SERVER_TEMPLATE_LIST_FETCH_FAILED(5305, "查询模板列表失败"), + SERVER_TEMPLATE_DETAIL_FETCH_FAILED(5306, "查询模板详情失败"), + + // 跟单服务错误 (5401-5499) + SERVER_COPY_TRADING_CREATE_FAILED(5401, "创建跟单失败"), + SERVER_COPY_TRADING_UPDATE_FAILED(5402, "更新跟单失败"), + SERVER_COPY_TRADING_DELETE_FAILED(5403, "删除跟单失败"), + SERVER_COPY_TRADING_LIST_FETCH_FAILED(5404, "查询跟单列表失败"), + SERVER_COPY_TRADING_TEMPLATES_FETCH_FAILED(5405, "查询钱包绑定的模板失败"), + + // 市场服务错误 (5501-5599) + SERVER_MARKET_PRICE_FETCH_FAILED(5501, "获取市场价格失败"), + SERVER_MARKET_LATEST_PRICE_FETCH_FAILED(5502, "获取最新价失败"), + + // 统计服务错误 (5601-5699) + SERVER_STATISTICS_FETCH_FAILED(5601, "获取统计信息失败"), + SERVER_ORDER_TRACKING_LIST_FETCH_FAILED(5602, "查询订单列表失败"), + + // 区块链服务错误 (5701-5799) + SERVER_BLOCKCHAIN_RPC_ERROR(5701, "区块链RPC调用失败"), + SERVER_BLOCKCHAIN_PROXY_ADDRESS_FETCH_FAILED(5702, "获取代理地址失败"), + SERVER_BLOCKCHAIN_BALANCE_FETCH_FAILED(5703, "查询余额失败"), + SERVER_BLOCKCHAIN_POSITIONS_FETCH_FAILED(5704, "查询仓位失败"), + SERVER_BLOCKCHAIN_REDEEM_FAILED(5705, "赎回仓位交易失败"), + + // WebSocket 服务错误 (5801-5899) + SERVER_WEBSOCKET_CONNECTION_FAILED(5801, "WebSocket连接失败"), + SERVER_WEBSOCKET_MESSAGE_SEND_FAILED(5802, "WebSocket消息发送失败"), + SERVER_WEBSOCKET_SUBSCRIBE_FAILED(5803, "WebSocket订阅失败"), + + // 订单跟踪服务错误 (5901-5999) + SERVER_ORDER_TRACKING_PROCESS_FAILED(5901, "处理订单跟踪失败"), + SERVER_ORDER_TRACKING_BUY_FAILED(5902, "处理买入订单失败"), + SERVER_ORDER_TRACKING_SELL_FAILED(5903, "处理卖出订单失败"), + SERVER_ORDER_TRACKING_MATCH_FAILED(5904, "订单匹配失败"); + + companion object { + /** + * 根据错误码查找枚举 + */ + fun fromCode(code: Int): ErrorCode? { + return values().find { it.code == code } + } + + /** + * 根据错误码获取错误消息 + */ + fun getMessage(code: Int): String { + return fromCode(code)?.message ?: "未知错误" + } + } +} +