fix: cherry pick #5037 (#5049)

* fix: cherry pick #5037

cherry pick #5037

Nddtfjiang <zhicheng.jiang@merico.dev>

* fix: fix parent id error

fix parent id error

Nddtfjiang <zhicheng.jiang@merico.dev>
diff --git a/backend/plugins/gitlab/api/remote.go b/backend/plugins/gitlab/api/remote.go
index 6aa1774..904e41c 100644
--- a/backend/plugins/gitlab/api/remote.go
+++ b/backend/plugins/gitlab/api/remote.go
@@ -109,6 +109,12 @@
 
 	// get gid and pageData
 	gid := groupId[0]
+	rgid := gid
+	if len(rgid) >= 6 {
+		if rgid[:6] == "group:" {
+			rgid = rgid[6:]
+		}
+	}
 	pageData, err := GetPageDataFromPageToken(pageToken[0])
 	if err != nil {
 		return nil, errors.BadInput.New("failed to get paget token")
@@ -134,7 +140,7 @@
 			query.Set("top_level_only", "true")
 			res, err = apiClient.Get("groups", query, nil)
 		} else {
-			res, err = apiClient.Get(fmt.Sprintf("groups/%s/subgroups", gid), query, nil)
+			res, err = apiClient.Get(fmt.Sprintf("groups/%s/subgroups", rgid), query, nil)
 		}
 		if err != nil {
 			return nil, err
@@ -150,7 +156,7 @@
 		for _, group := range resBody {
 			child := RemoteScopesChild{
 				Type: TypeGroup,
-				Id:   strconv.Itoa(group.Id),
+				Id:   "group:" + strconv.Itoa(group.Id),
 				Name: group.Name,
 				// don't need to save group into data
 				Data: nil,
@@ -198,7 +204,7 @@
 			res, err = apiClient.Get(fmt.Sprintf("users/%d/projects", apiClient.GetData(models.GitlabApiClientData_UserId)), query, nil)
 		} else {
 			query.Set("with_shared", "false")
-			res, err = apiClient.Get(fmt.Sprintf("/groups/%s/projects", gid), query, nil)
+			res, err = apiClient.Get(fmt.Sprintf("/groups/%s/projects", rgid), query, nil)
 		}
 		if err != nil {
 			return nil, err