func RemoteScopes()

in backend/plugins/gitlab/api/remote.go [45:129]


func RemoteScopes(input *plugin.ApiResourceInput) (*plugin.ApiResourceOutput, errors.Error) {
	return remoteHelper.GetScopesFromRemote(input,
		func(basicRes context2.BasicRes, gid string, queryData *api.RemoteQueryData, connection models.GitlabConnection) ([]models.GroupResponse, errors.Error) {
			apiClient, err := api.NewApiClientFromConnection(context.TODO(), basicRes, &connection)
			if err != nil {
				return nil, errors.BadInput.Wrap(err, "failed to get create apiClient")
			}
			query := initialQuery(queryData)
			var res *http.Response
			if gid == "" {
				query.Set("top_level_only", "true")
				res, err = apiClient.Get("groups", query, nil)
				if err != nil {
					return nil, err
				}
			} else {
				if gid[:6] == "group:" {
					gid = gid[6:]
				}
				res, err = apiClient.Get(fmt.Sprintf("groups/%s/subgroups", gid), query, nil)
				if err != nil {
					return nil, err
				}
			}
			var resBody []models.GroupResponse
			err = api.UnmarshalResponse(res, &resBody)
			if err != nil {
				return nil, err
			}

			return resBody, err
		},
		func(basicRes context2.BasicRes, gid string, queryData *api.RemoteQueryData, connection models.GitlabConnection) ([]models.GitlabApiProject, errors.Error) {
			apiClient, err := api.NewApiClientFromConnection(context.TODO(), basicRes, &connection)
			if err != nil {
				return nil, errors.BadInput.Wrap(err, "failed to get create apiClient")
			}
			query := initialQuery(queryData)
			var res *http.Response
			var resBody []models.GitlabApiProject
			if gid == "" {
				res, err = apiClient.Get(fmt.Sprintf("users/%d/projects", apiClient.GetData("UserId")), query, nil)
				if err != nil {
					return nil, err
				}
				err = api.UnmarshalResponse(res, &resBody)
				if err != nil {
					return nil, err
				}
			} else {
				query.Set("with_shared", "false")
				if gid[:6] == "group:" {
					gid = gid[6:]
				}
				res, err = apiClient.Get(fmt.Sprintf("/groups/%s/projects", gid), query, nil)
				if err != nil {
					return nil, err
				}
				err = api.UnmarshalResponse(res, &resBody)
				if err != nil {
					return nil, err
				}

				filteredProjects := make([]models.GitlabApiProject, 0)
				for _, project := range resBody {
					membersURL := fmt.Sprintf("/projects/%d/members/%d", project.GitlabId, apiClient.GetData("UserId"))
					membersRes, err := apiClient.Get(membersURL, nil, nil)
					if err != nil {
						return nil, err
					}
					var member models.GitlabMember
					err = api.UnmarshalResponse(membersRes, &member)
					if err != nil {
						return nil, err
					}
					// Filter out projects where the user only has Guest permission and archived projects
					if member.AccessLevel != 10 && !project.Archived {
						filteredProjects = append(filteredProjects, project)
					}
				}
				resBody = filteredProjects
			}
			return resBody, err
		})
}