From 69d948b9343720a0aebefad713ebb1a2d3cd9bef Mon Sep 17 00:00:00 2001 From: dylanyang <yl976931569@163.com> Date: Tue, 21 May 2024 13:29:52 +0800 Subject: [PATCH] optimize API --- common/model/api_request.go | 9 +++---- config/secret_config.go | 4 ++++ docs/docs.go | 9 ++++++- docs/swagger.json | 9 ++++++- docs/swagger.yaml | 7 +++++- rpc_server/api/v1/paymaster.go | 40 +++++++++++++++---------------- rpc_server/routers/routers_map.go | 2 +- 7 files changed, 52 insertions(+), 28 deletions(-) diff --git a/common/model/api_request.go b/common/model/api_request.go index e983d19c..62e16c79 100644 --- a/common/model/api_request.go +++ b/common/model/api_request.go @@ -14,10 +14,11 @@ type UserOpRequest struct { EntryPointVersion global_const.EntrypointVersion `json:"entrypoint_version"` } type JsonRpcRequest struct { - JsonRpc string `json:"jsonrpc"` - Method string `json:"method"` - Params []interface{} `json:"params"` - Id int `json:"id"` + JsonRpc string `json:"jsonrpc"` + Method string `json:"method"` + Params []interface{} `json:"params"` + Id int `json:"id"` + Network global_const.Network `json:"-"` } type ClientCredential struct { ApiKey string `json:"apiKey"` diff --git a/config/secret_config.go b/config/secret_config.go index 22e6c284..98017d11 100644 --- a/config/secret_config.go +++ b/config/secret_config.go @@ -44,6 +44,10 @@ func GetNetworkSecretConfig(network global_const.Network) model.NetWorkSecretCon return secretConfig.NetWorkSecretConfigMap[string(network)] } +func CheckNetworkSupport(network global_const.Network) bool { + _, ok := secretConfig.NetWorkSecretConfigMap[string(network)] + return ok +} func GetPriceOracleApiKey() string { return secretConfig.PriceOracleApiKey } diff --git a/docs/docs.go b/docs/docs.go index ab889b9e..daf5f24b 100644 --- a/docs/docs.go +++ b/docs/docs.go @@ -61,7 +61,7 @@ const docTemplate = `{ } } }, - "/api/v1/paymaster": { + "/api/v1/paymaster{network}": { "post": { "security": [ { @@ -76,6 +76,13 @@ const docTemplate = `{ "Paymaster" ], "parameters": [ + { + "type": "string", + "description": "Network", + "name": "network", + "in": "path", + "required": true + }, { "description": "JsonRpcRequest Model", "name": "rpcRequest", diff --git a/docs/swagger.json b/docs/swagger.json index f813c38c..04257279 100644 --- a/docs/swagger.json +++ b/docs/swagger.json @@ -50,7 +50,7 @@ } } }, - "/api/v1/paymaster": { + "/api/v1/paymaster{network}": { "post": { "security": [ { @@ -65,6 +65,13 @@ "Paymaster" ], "parameters": [ + { + "type": "string", + "description": "Network", + "name": "network", + "in": "path", + "required": true + }, { "description": "JsonRpcRequest Model", "name": "rpcRequest", diff --git a/docs/swagger.yaml b/docs/swagger.yaml index 282e5be6..d3e0676a 100644 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -48,12 +48,17 @@ paths: description: OK tags: - Healthz - /api/v1/paymaster: + /api/v1/paymaster{network}: post: consumes: - application/json description: Paymaster JSON-RPC API parameters: + - description: Network + in: path + name: network + required: true + type: string - description: JsonRpcRequest Model in: body name: rpcRequest diff --git a/rpc_server/api/v1/paymaster.go b/rpc_server/api/v1/paymaster.go index d7a1d86a..e1dbfa42 100644 --- a/rpc_server/api/v1/paymaster.go +++ b/rpc_server/api/v1/paymaster.go @@ -29,8 +29,9 @@ func init() { // @Description Paymaster JSON-RPC API // @Accept json // @Product json +// @param network path string true "Network" // @Param rpcRequest body model.JsonRpcRequest true "JsonRpcRequest Model" -// @Router /api/v1/paymaster [post] +// @Router /api/v1/paymaster{network} [post] // @Success 200 // @Security JWT func Paymaster(ctx *gin.Context) { @@ -46,6 +47,18 @@ func Paymaster(ctx *gin.Context) { } }() + network := ctx.Param("network") + if network == "" { + errStr := fmt.Sprintf("Request Error [network is empty]") + response.SetHttpCode(http.StatusBadRequest).FailCode(ctx, http.StatusBadRequest, errStr) + return + } + if !config.CheckNetworkSupport(global_const.Network(network)) { + errStr := fmt.Sprintf("Request Error [network not support]") + response.SetHttpCode(http.StatusBadRequest).FailCode(ctx, http.StatusBadRequest, errStr) + return + } + jsonRpcRequest.Network = global_const.Network(network) if err := ctx.ShouldBindJSON(&jsonRpcRequest); err != nil { errStr := fmt.Sprintf("Request Error [%v]", err) @@ -79,14 +92,8 @@ func Paymaster(ctx *gin.Context) { func GetSupportPaymaster() MethodFunctionFunc { return func(ctx *gin.Context, jsonRpcRequest model.JsonRpcRequest) (result interface{}, err error) { - if jsonRpcRequest.Params[0] == nil { - return nil, xerrors.Errorf("Request Error [network is empty]") - } - networkStr, ok := jsonRpcRequest.Params[0].(string) - if !ok { - return nil, xerrors.Errorf("Request Error [network is not string]") - } - paymasterSet, err := config.GetSupportPaymaster(global_const.Network(networkStr)) + + paymasterSet, err := config.GetSupportPaymaster(jsonRpcRequest.Network) if err != nil { return nil, err } @@ -96,14 +103,7 @@ func GetSupportPaymaster() MethodFunctionFunc { func GetSupportEntryPointFunc() MethodFunctionFunc { return func(ctx *gin.Context, jsonRpcRequest model.JsonRpcRequest) (result interface{}, err error) { - if jsonRpcRequest.Params[0] == nil { - return nil, xerrors.Errorf("Request Error [network is empty]") - } - networkStr, ok := jsonRpcRequest.Params[0].(string) - if !ok { - return nil, xerrors.Errorf("Request Error [network is not string]") - } - entryPoints, err := config.GetSupportEntryPoints(global_const.Network(networkStr)) + entryPoints, err := config.GetSupportEntryPoints(jsonRpcRequest.Network) if err != nil { return nil, err } @@ -113,6 +113,7 @@ func GetSupportEntryPointFunc() MethodFunctionFunc { func EstimateUserOpGasFunc() MethodFunctionFunc { return func(ctx *gin.Context, jsonRpcRequest model.JsonRpcRequest) (result interface{}, err error) { request, err := parseTryPayUserOperationParams(jsonRpcRequest.Params) + request.Network = jsonRpcRequest.Network if err != nil { return nil, xerrors.Errorf("parseTryPayUserOperationParams ERROR [%v]", err) } @@ -130,6 +131,7 @@ func EstimateUserOpGasFunc() MethodFunctionFunc { func TryPayUserOperationMethod() MethodFunctionFunc { return func(ctx *gin.Context, jsonRpcRequest model.JsonRpcRequest) (result interface{}, err error) { request, err := parseTryPayUserOperationParams(jsonRpcRequest.Params) + request.Network = jsonRpcRequest.Network logrus.Debug("parseTryPayUserOperationParams result: ", request) if err != nil { @@ -167,9 +169,7 @@ func parseTryPayUserOperationParams(params []interface{}) (*model.UserOpRequest, if extra["strategy_code"] != nil { result.StrategyCode = extra["strategy_code"].(string) } - if extra["network"] != nil { - result.Network = extra["network"].(global_const.Network) - } + if extra["token"] != nil { result.UserPayErc20Token = extra["token"].(global_const.TokenType) } diff --git a/rpc_server/routers/routers_map.go b/rpc_server/routers/routers_map.go index 341b397d..dbb65098 100644 --- a/rpc_server/routers/routers_map.go +++ b/rpc_server/routers/routers_map.go @@ -20,5 +20,5 @@ type Path string const ( Auth Path = "api/auth" Healthz Path = "api/healthz" - Paymaster Path = "api/v1/paymaster" + Paymaster Path = "api/v1/paymaster:network" )