fix(migration): fix rename operations in tapd plugin (#6970) (#6972)

Co-authored-by: Lynwee <linwei.hou@merico.dev>
diff --git a/backend/plugins/tapd/models/migrationscripts/20230411_modify_custom_field_name.go b/backend/plugins/tapd/models/migrationscripts/20230411_modify_custom_field_name.go
index 2e38573..fe37037 100644
--- a/backend/plugins/tapd/models/migrationscripts/20230411_modify_custom_field_name.go
+++ b/backend/plugins/tapd/models/migrationscripts/20230411_modify_custom_field_name.go
@@ -20,6 +20,7 @@
 import (
 	"fmt"
 	"github.com/apache/incubator-devlake/core/context"
+	"github.com/apache/incubator-devlake/core/dal"
 	"github.com/apache/incubator-devlake/core/errors"
 )
 
@@ -27,36 +28,34 @@
 
 func (*modifyCustomFieldName) Up(basicRes context.BasicRes) errors.Error {
 	db := basicRes.GetDal()
-	var err errors.Error
 	issuesNameList := []string{"_tool_tapd_stories", "_tool_tapd_bugs", "_tool_tapd_tasks"}
 	for _, issuesName := range issuesNameList {
 		switch issuesName {
 		case "_tool_tapd_bugs":
 			for i := 6; i < 9; i++ {
-				err = db.RenameColumn(issuesName, fmt.Sprintf("custom_field%d", i), fmt.Sprintf("custom_field_%d", i))
-				if err != nil {
+				oldColumnName := fmt.Sprintf("custom_field%d", i)
+				newColumnName := fmt.Sprintf("custom_field_%d", i)
+				if err := renameColumnSafely(db, issuesName, oldColumnName, newColumnName, dal.Text); err != nil {
 					return err
 				}
 			}
-		case "_tool_tapd_stories":
-			fallthrough
-		case "_tool_tapd_tasks":
-			err = db.RenameColumn(issuesName, `custom_field6`, `custom_field_six`)
-			if err != nil {
-				return err
+		case "_tool_tapd_tasks", "_tool_tapd_stories":
+			tableName := issuesName
+			renameColumnMap := map[string]string{
+				"custom_field6": "custom_field_six",
+				"custom_field7": "custom_field_seven",
+				"custom_field8": "custom_field_eight",
 			}
-			err = db.RenameColumn(issuesName, `custom_field7`, `custom_field_seven`)
-			if err != nil {
-				return err
-			}
-			err = db.RenameColumn(issuesName, `custom_field8`, `custom_field_eight`)
-			if err != nil {
-				return err
+			for oldColumn, newColumn := range renameColumnMap {
+				if err := renameColumnSafely(db, tableName, oldColumn, newColumn, dal.Text); err != nil {
+					return err
+				}
 			}
 		}
 		for i := 9; i <= 50; i++ {
-			err = db.RenameColumn(issuesName, fmt.Sprintf("custom_field%d", i), fmt.Sprintf("custom_field_%d", i))
-			if err != nil {
+			oldColumnName := fmt.Sprintf("custom_field%d", i)
+			newColumnName := fmt.Sprintf("custom_field_%d", i)
+			if err := renameColumnSafely(db, issuesName, oldColumnName, newColumnName, dal.Text); err != nil {
 				return err
 			}
 		}
@@ -71,3 +70,19 @@
 func (*modifyCustomFieldName) Name() string {
 	return "modify tapd custom field name"
 }
+
+func renameColumnSafely(db dal.Dal, table, oldColumn string, newColumn string, newColumnType dal.ColumnType) errors.Error {
+	if table == "" || oldColumn == "" || newColumn == "" {
+		return errors.BadInput.New("empty params")
+	}
+	if db.HasColumn(table, oldColumn) {
+		if !db.HasColumn(table, newColumn) {
+			return db.RenameColumn(table, oldColumn, newColumn)
+		}
+	} else {
+		if !db.HasColumn(table, newColumn) {
+			return db.AddColumn(table, newColumn, newColumnType)
+		}
+	}
+	return nil
+}