diff --git a/src/model/data/supported_asset_data.go b/src/model/data/supported_asset_data.go index 5738662..e691fba 100644 --- a/src/model/data/supported_asset_data.go +++ b/src/model/data/supported_asset_data.go @@ -21,6 +21,20 @@ func AddSupportedAsset(network, token string, status int64) (*mdb.SupportedAsset if exist.ID > 0 { return nil, constant.SupportedAssetAlreadyExists } + + deleted, err := getSupportedAssetByNetworkAndTokenUnscoped(network, token) + if err != nil { + return nil, err + } + if deleted.ID > 0 && deleted.DeletedAt.Valid { + deleted.Status = status + deleted.DeletedAt.Valid = false + if err := dao.Mdb.Unscoped().Save(deleted).Error; err != nil { + return nil, err + } + return deleted, nil + } + asset := &mdb.SupportedAsset{ Network: network, Token: token, @@ -30,6 +44,16 @@ func AddSupportedAsset(network, token string, status int64) (*mdb.SupportedAsset return asset, err } +func getSupportedAssetByNetworkAndTokenUnscoped(network, token string) (*mdb.SupportedAsset, error) { + network, token = normalizeNetworkToken(network, token) + asset := new(mdb.SupportedAsset) + err := dao.Mdb.Unscoped().Model(asset). + Where("network = ?", network). + Where("token = ?", token). + Limit(1).Find(asset).Error + return asset, err +} + func GetSupportedAssetByNetworkAndToken(network, token string) (*mdb.SupportedAsset, error) { network, token = normalizeNetworkToken(network, token) asset := new(mdb.SupportedAsset) diff --git a/src/route/router_test.go b/src/route/router_test.go index b6ee09c..c6463dc 100644 --- a/src/route/router_test.go +++ b/src/route/router_test.go @@ -322,6 +322,17 @@ func TestSupportedAssetCRUD(t *testing.T) { if resp["status_code"].(float64) != 200 { t.Fatalf("delete supported asset failed: %v", resp) } + + // recreate after delete should restore soft-deleted row, not unique-conflict + rec = doPostWithToken(e, "/payments/gmpay/v1/supported-assets/add", map[string]interface{}{ + "network": "arbitrum", + "token": "usdc", + "status": 1, + }) + resp = parseResp(t, rec) + if resp["status_code"].(float64) != 200 { + t.Fatalf("recreate after delete failed: %v", resp) + } } // TestWalletAddAndList tests adding wallets via API and listing them.