This is an automated email from the ASF dual-hosted git repository. mintsweet pushed a commit to branch feat-dora-config in repository https://gitbox.apache.org/repos/asf/incubator-devlake.git
commit 8eee9df828c0dc433fb3e9e661ea1eca3cfcc7cd Author: abeizn <zikuan...@merico.dev> AuthorDate: Wed Sep 11 14:00:21 2024 +0800 fix: github dora config api (#8032) --- backend/plugins/github/api/connection_api.go | 121 ++++++++++++++++++++++++ backend/plugins/github/api/scope_config_api.go | 125 ------------------------- backend/plugins/github/impl/impl.go | 8 +- 3 files changed, 125 insertions(+), 129 deletions(-) diff --git a/backend/plugins/github/api/connection_api.go b/backend/plugins/github/api/connection_api.go index a5f0e922d..02c0265de 100644 --- a/backend/plugins/github/api/connection_api.go +++ b/backend/plugins/github/api/connection_api.go @@ -25,6 +25,7 @@ import ( "github.com/mitchellh/mapstructure" + "github.com/apache/incubator-devlake/core/dal" "github.com/apache/incubator-devlake/core/errors" "github.com/apache/incubator-devlake/core/plugin" "github.com/apache/incubator-devlake/helpers/pluginhelper/api" @@ -402,3 +403,123 @@ func TestExistingConnection(input *plugin.ApiResourceInput) (*plugin.ApiResource } return &plugin.ApiResourceOutput{Body: testConnectionResult, Status: http.StatusOK}, nil } + +// GetConnectionDeployments return one connection deployments +// @Summary return one connection deployments +// @Description return one connection deployments +// @Tags plugins/github +// @Param id path int true "id" +// @Param connectionId path int true "connectionId" +// @Success 200 {object} models.GithubScopeConfigDeployment +// @Failure 400 {object} shared.ApiBody "Bad Request" +// @Failure 500 {object} shared.ApiBody "Internal Error" +// @Router /plugins/github/connections/{connectionId}/deployments [GET] +func GetConnectionDeployments(input *plugin.ApiResourceInput) (*plugin.ApiResourceOutput, errors.Error) { + db := basicRes.GetDal() + connectionId := input.Params["connectionId"] + var environments []string + err := db.All(&environments, + dal.From(&models.GithubDeployment{}), + dal.Where("connection_id = ?", connectionId), + dal.Select("DISTINCT environment")) + if err != nil { + return nil, err + } + + return &plugin.ApiResourceOutput{ + Body: environments, + }, nil +} + +// GetConnectionTransformToDeployments return one connection deployments +// @Summary return one connection deployments +// @Description return one connection deployments +// @Tags plugins/github +// @Param id path int true "id" +// @Param connectionId path int true "connectionId" +// @Success 200 {object} models.GithubScopeConfigDeployment +// @Failure 400 {object} shared.ApiBody "Bad Request" +// @Failure 500 {object} shared.ApiBody "Internal Error" +// @Router /plugins/github/connections/{connectionId}/transform-to-deployments [POST] +func GetConnectionTransformToDeployments(input *plugin.ApiResourceInput) (*plugin.ApiResourceOutput, errors.Error) { + db := basicRes.GetDal() + connectionId := input.Params["connectionId"] + deploymentPattern := input.Body["deploymentPattern"] + productionPattern := input.Body["productionPattern"] + page, err := api.ParsePageParam(input.Body, "page", 1) + if err != nil { + return nil, errors.Default.New("invalid page value") + } + pageSize, err := api.ParsePageParam(input.Body, "pageSize", 10) + if err != nil { + return nil, errors.Default.New("invalid pageSize value") + } + + cursor, err := db.RawCursor(` + SELECT DISTINCT r.run_number, r.name, r.head_branch, r.html_url, r.run_started_at + FROM ( + SELECT id, run_number, name, head_branch, html_url, run_started_at + FROM _tool_github_runs + WHERE connection_id = ? AND name REGEXP ? + AND (name REGEXP ? OR head_branch REGEXP ?) + UNION + SELECT r.id, r.run_number, r.name, r.head_branch, r.html_url, r.run_started_at + FROM _tool_github_jobs j + LEFT JOIN _tool_github_runs r ON j.run_id = r.id + WHERE j.connection_id = ? AND j.name REGEXP ? + AND j.name REGEXP ? + ) r + ORDER BY r.run_started_at DESC + `, connectionId, deploymentPattern, productionPattern, productionPattern, connectionId, deploymentPattern, productionPattern) + if err != nil { + return nil, errors.Default.Wrap(err, "error on get") + } + defer cursor.Close() + + type selectFileds struct { + RunNumber int + Name string + HeadBranch string + HTMLURL string + } + type transformedFields struct { + Name string + URL string + } + var allRuns []transformedFields + for cursor.Next() { + sf := &selectFileds{} + err = db.Fetch(cursor, sf) + if err != nil { + return nil, errors.Default.Wrap(err, "error on fetch") + } + // Directly transform and append to allRuns + transformed := transformedFields{ + Name: fmt.Sprintf("#%d - %s", sf.RunNumber, sf.Name), + URL: sf.HTMLURL, + } + allRuns = append(allRuns, transformed) + } + // Calculate total count + totalCount := len(allRuns) + + // Paginate in memory + start := (page - 1) * pageSize + end := start + pageSize + if start > totalCount { + start = totalCount + } + if end > totalCount { + end = totalCount + } + pagedRuns := allRuns[start:end] + + // Return result containing paged runs and total count + result := map[string]interface{}{ + "total": totalCount, + "data": pagedRuns, + } + return &plugin.ApiResourceOutput{ + Body: result, + }, nil +} diff --git a/backend/plugins/github/api/scope_config_api.go b/backend/plugins/github/api/scope_config_api.go index 6d72f6933..b109341e7 100644 --- a/backend/plugins/github/api/scope_config_api.go +++ b/backend/plugins/github/api/scope_config_api.go @@ -18,13 +18,8 @@ limitations under the License. package api import ( - "fmt" - - "github.com/apache/incubator-devlake/core/dal" "github.com/apache/incubator-devlake/core/errors" "github.com/apache/incubator-devlake/core/plugin" - "github.com/apache/incubator-devlake/helpers/pluginhelper/api" - githubModels "github.com/apache/incubator-devlake/plugins/github/models" ) // PostScopeConfig create scope config for Github @@ -114,123 +109,3 @@ func GetProjectsByScopeConfig(input *plugin.ApiResourceInput) (*plugin.ApiResour func DeleteScopeConfig(input *plugin.ApiResourceInput) (*plugin.ApiResourceOutput, errors.Error) { return dsHelper.ScopeConfigApi.Delete(input) } - -// GetScopeConfig return one scope config deployments -// @Summary return one scope config deployments -// @Description return one scope config deployments -// @Tags plugins/github -// @Param id path int true "id" -// @Param connectionId path int true "connectionId" -// @Success 200 {object} models.GithubScopeConfigDeployment -// @Failure 400 {object} shared.ApiBody "Bad Request" -// @Failure 500 {object} shared.ApiBody "Internal Error" -// @Router /plugins/github/connections/{connectionId}/scope-configs/{id}/deployments [GET] -func GetScopeConfigDeployments(input *plugin.ApiResourceInput) (*plugin.ApiResourceOutput, errors.Error) { - db := basicRes.GetDal() - connectionId := input.Params["connectionId"] - var environments []string - err := db.All(&environments, - dal.From(&githubModels.GithubDeployment{}), - dal.Where("connection_id = ?", connectionId), - dal.Select("DISTINCT environment")) - if err != nil { - return nil, err - } - - return &plugin.ApiResourceOutput{ - Body: environments, - }, nil -} - -// GetScopeConfig return one scope config deployments -// @Summary return one scope config deployments -// @Description return one scope config deployments -// @Tags plugins/github -// @Param id path int true "id" -// @Param connectionId path int true "connectionId" -// @Success 200 {object} models.GithubScopeConfigDeployment -// @Failure 400 {object} shared.ApiBody "Bad Request" -// @Failure 500 {object} shared.ApiBody "Internal Error" -// @Router /plugins/github/connections/{connectionId}/scope-configs/{id}/transform-to-deployments [POST] -func GetScopeConfigTransformToDeployments(input *plugin.ApiResourceInput) (*plugin.ApiResourceOutput, errors.Error) { - db := basicRes.GetDal() - connectionId := input.Params["connectionId"] - deploymentPattern := input.Body["deploymentPattern"] - productionPattern := input.Body["productionPattern"] - page, err := api.ParsePageParam(input.Body, "page", 1) - if err != nil { - return nil, errors.Default.New("invalid page value") - } - pageSize, err := api.ParsePageParam(input.Body, "pageSize", 10) - if err != nil { - return nil, errors.Default.New("invalid pageSize value") - } - - cursor, err := db.RawCursor(` - SELECT DISTINCT r.run_number, r.name, r.head_branch, r.html_url, r.run_started_at - FROM ( - SELECT id, run_number, name, head_branch, html_url, run_started_at - FROM _tool_github_runs - WHERE connection_id = ? AND name REGEXP ? - AND (name REGEXP ? OR head_branch REGEXP ?) - UNION - SELECT r.id, r.run_number, r.name, r.head_branch, r.html_url, r.run_started_at - FROM _tool_github_jobs j - LEFT JOIN _tool_github_runs r ON j.run_id = r.id - WHERE j.connection_id = ? AND j.name REGEXP ? - AND j.name REGEXP ? - ) r - ORDER BY r.run_started_at DESC - `, connectionId, deploymentPattern, productionPattern, productionPattern, connectionId, deploymentPattern, productionPattern) - if err != nil { - return nil, errors.Default.Wrap(err, "error on get") - } - defer cursor.Close() - - type selectFileds struct { - RunNumber int - Name string - HeadBranch string - HTMLURL string - } - type transformedFields struct { - Name string - URL string - } - var allRuns []transformedFields - for cursor.Next() { - sf := &selectFileds{} - err = db.Fetch(cursor, sf) - if err != nil { - return nil, errors.Default.Wrap(err, "error on fetch") - } - // Directly transform and append to allRuns - transformed := transformedFields{ - Name: fmt.Sprintf("#%d - %s", sf.RunNumber, sf.Name), - URL: sf.HTMLURL, - } - allRuns = append(allRuns, transformed) - } - // Calculate total count - totalCount := len(allRuns) - - // Paginate in memory - start := (page - 1) * pageSize - end := start + pageSize - if start > totalCount { - start = totalCount - } - if end > totalCount { - end = totalCount - } - pagedRuns := allRuns[start:end] - - // Return result containing paged runs and total count - result := map[string]interface{}{ - "total": totalCount, - "data": pagedRuns, - } - return &plugin.ApiResourceOutput{ - Body: result, - }, nil -} diff --git a/backend/plugins/github/impl/impl.go b/backend/plugins/github/impl/impl.go index ac8f4e829..1c09a7afe 100644 --- a/backend/plugins/github/impl/impl.go +++ b/backend/plugins/github/impl/impl.go @@ -225,11 +225,11 @@ func (p Github) ApiResources() map[string]map[string]plugin.ApiResourceHandler { "GET": api.GetScopeConfig, "DELETE": api.DeleteScopeConfig, }, - "connections/:connectionId/scope-configs/:scopeConfigId/deployments": { - "GET": api.GetScopeConfigDeployments, + "connections/:connectionId/deployments": { + "GET": api.GetConnectionDeployments, }, - "connections/:connectionId/scope-configs/:scopeConfigId/transform-to-deployments": { - "POST": api.GetScopeConfigTransformToDeployments, + "connections/:connectionId/transform-to-deployments": { + "POST": api.GetConnectionTransformToDeployments, }, "connections/:connectionId/remote-scopes": { "GET": api.RemoteScopes,