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"
 )