From 8e965fb877601f82d112ea83520698794ab1152a Mon Sep 17 00:00:00 2001 From: Prashant Ghildiyal Date: Wed, 24 Nov 2021 15:59:07 +0530 Subject: [PATCH 1/3] first cut refactoring - WIP --- Wire.go | 9 +- api/restHandler/AppLabelsRestHandler.go | 29 +- api/restHandler/AppListingRestHandler.go | 69 +- .../AppStoreDeploymentRestHandler.go | 103 +- api/restHandler/AppStoreRestHandler.go | 105 +- api/restHandler/AppStoreValuesRestHandler.go | 61 +- api/restHandler/AppWorkflowRestHandler.go | 29 +- ...ndler.go => ArgoApplicationRestHandler.go} | 87 +- api/restHandler/AttributesRestHanlder.go | 47 +- api/restHandler/BatchOperationRestHandler.go | 17 +- api/restHandler/BulkUpdateRestHandler.go | 33 +- api/restHandler/ChartGroupRestHandler.go | 75 +- api/restHandler/ChartRefRestHandler.go | 19 +- api/restHandler/ClusterAccountsRestHandler.go | 33 +- .../ClusterHelmConfigRestHandler.go | 13 +- api/restHandler/ClusterRestHandler.go | 85 +- api/restHandler/CommonRestHanlder.go | 7 +- api/restHandler/ConfigMapRestHandler.go | 187 +- api/restHandler/DeploymentGroupRestHandler.go | 95 +- api/restHandler/DockerRegRestHandler.go | 51 +- api/restHandler/EnvironmentRestHandler.go | 55 +- api/restHandler/ExternalCiRestHandler.go | 13 +- api/restHandler/GitHostRestHandler.go | 53 +- api/restHandler/GitOpsConfigRestHandler.go | 67 +- api/restHandler/GitProviderRestHandler.go | 39 +- api/restHandler/GitWebhookRestHandler.go | 7 +- api/restHandler/ImageScanRestHandler.go | 71 +- api/restHandler/JiraRestHandler.go | 21 +- api/restHandler/MigrateDbRestHandler.go | 41 +- api/restHandler/NotificationRestHandler.go | 127 +- api/restHandler/PipelineConfigRestHandler.go | 3359 ----------------- api/restHandler/PipelineTriggerRestHandler.go | 53 +- api/restHandler/PolicyResthandler.go | 57 +- api/restHandler/PubSubClientRestHandler.go | 11 +- api/restHandler/ReleaseMetricsRestHandler.go | 27 +- api/restHandler/SsoLoginHandler.go | 43 +- api/restHandler/TeamRestHandler.go | 59 +- api/restHandler/TelemetryRestHandler.go | 5 +- api/restHandler/TestSuitRestHandler.go | 45 +- api/restHandler/UserAuthHandler.go | 31 +- api/restHandler/UserRestHandler.go | 137 +- api/restHandler/WebhookDataRestHandler.go | 33 +- api/restHandler/WebhookEventHandler.go | 15 +- api/restHandler/{ => common}/apiError.go | 4 +- .../pipeline/BuildPipelineRestHandler.go | 800 ++++ .../pipeline/DeploymentPipelineRestHandler.go | 1460 +++++++ .../pipeline/PipelineConfigRestHandler.go | 1175 ++++++ api/router/ApplicationRouter.go | 4 +- api/router/PipelineConfigRouter.go | 21 +- api/router/WebhookRouter.go | 9 +- api/router/router.go | 6 +- wire_gen.go | 7 +- 52 files changed, 4565 insertions(+), 4444 deletions(-) rename api/restHandler/{ApplicationRestHandler.go => ArgoApplicationRestHandler.go} (83%) delete mode 100644 api/restHandler/PipelineConfigRestHandler.go rename api/restHandler/{ => common}/apiError.go (98%) create mode 100644 api/restHandler/pipeline/BuildPipelineRestHandler.go create mode 100644 api/restHandler/pipeline/DeploymentPipelineRestHandler.go create mode 100644 api/restHandler/pipeline/PipelineConfigRestHandler.go diff --git a/Wire.go b/Wire.go index 00045a239e..3c68eb3b54 100644 --- a/Wire.go +++ b/Wire.go @@ -23,6 +23,7 @@ package main import ( "github.com/devtron-labs/devtron/api/connector" "github.com/devtron-labs/devtron/api/restHandler" + pipeline2 "github.com/devtron-labs/devtron/api/restHandler/pipeline" "github.com/devtron-labs/devtron/api/router" "github.com/devtron-labs/devtron/api/router/pubsub" "github.com/devtron-labs/devtron/api/sse" @@ -140,8 +141,8 @@ func InitializeApp() (*App, error) { pipeline.NewPipelineBuilderImpl, wire.Bind(new(pipeline.PipelineBuilder), new(*pipeline.PipelineBuilderImpl)), - restHandler.NewPipelineRestHandlerImpl, - wire.Bind(new(restHandler.PipelineConfigRestHandler), new(*restHandler.PipelineConfigRestHandlerImpl)), + pipeline2.NewPipelineRestHandlerImpl, + wire.Bind(new(pipeline2.PipelineConfigRestHandler), new(*pipeline2.PipelineConfigRestHandlerImpl)), router.NewPipelineRouterImpl, wire.Bind(new(router.PipelineConfigRouter), new(*router.PipelineConfigRouterImpl)), pipeline.NewDbPipelineOrchestrator, @@ -276,8 +277,8 @@ func InitializeApp() (*App, error) { repository2.NewServiceClientImpl, wire.Bind(new(repository2.ServiceClient), new(*repository2.ServiceClientImpl)), wire.Bind(new(connector.Pump), new(*connector.PumpImpl)), - restHandler.NewApplicationRestHandlerImpl, - wire.Bind(new(restHandler.ApplicationRestHandler), new(*restHandler.ApplicationRestHandlerImpl)), + restHandler.NewArgoApplicationRestHandlerImpl, + wire.Bind(new(restHandler.ArgoApplicationRestHandler), new(*restHandler.ArgoApplicationRestHandlerImpl)), router.NewApplicationRouterImpl, wire.Bind(new(router.ApplicationRouter), new(*router.ApplicationRouterImpl)), //app.GetConfig, diff --git a/api/restHandler/AppLabelsRestHandler.go b/api/restHandler/AppLabelsRestHandler.go index 4cb4c94f3b..25aa0eba90 100644 --- a/api/restHandler/AppLabelsRestHandler.go +++ b/api/restHandler/AppLabelsRestHandler.go @@ -19,6 +19,7 @@ package restHandler import ( "encoding/json" + "github.com/devtron-labs/devtron/api/restHandler/common" "github.com/devtron-labs/devtron/pkg/app" "github.com/devtron-labs/devtron/pkg/bean" "github.com/devtron-labs/devtron/pkg/user" @@ -62,7 +63,7 @@ func NewAppLabelRestHandlerImpl(logger *zap.SugaredLogger, appLabelService app.A func (handler AppLabelRestHandlerImpl) GetAllLabels(w http.ResponseWriter, r *http.Request) { userId, err := handler.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } token := r.Header.Get("token") @@ -70,7 +71,7 @@ func (handler AppLabelRestHandlerImpl) GetAllLabels(w http.ResponseWriter, r *ht labels, err := handler.appLabelService.FindAll() if err != nil { handler.logger.Errorw("service err, GetAllLabels", "err", err) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } objects := handler.enforcerUtil.GetRbacObjectsForAllApps() @@ -80,20 +81,20 @@ func (handler AppLabelRestHandlerImpl) GetAllLabels(w http.ResponseWriter, r *ht results = append(results, label) } } - writeJsonResp(w, nil, results, http.StatusOK) + common.WriteJsonResp(w, nil, results, http.StatusOK) } func (handler AppLabelRestHandlerImpl) GetAppMetaInfo(w http.ResponseWriter, r *http.Request) { userId, err := handler.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } vars := mux.Vars(r) appId, err := strconv.Atoi(vars["appId"]) if err != nil { handler.logger.Errorw("request err, GetAppMetaInfo", "err", err, "appId", appId) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } @@ -101,7 +102,7 @@ func (handler AppLabelRestHandlerImpl) GetAppMetaInfo(w http.ResponseWriter, r * token := r.Header.Get("token") object := handler.enforcerUtil.GetAppRBACNameByAppId(appId) if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); !ok { - writeJsonResp(w, err, "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden) return } //rback implementation ends here @@ -109,16 +110,16 @@ func (handler AppLabelRestHandlerImpl) GetAppMetaInfo(w http.ResponseWriter, r * res, err := handler.appLabelService.GetAppMetaInfo(appId) if err != nil { handler.logger.Errorw("service err, GetAppMetaInfo", "err", err) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, nil, res, http.StatusOK) + common.WriteJsonResp(w, nil, res, http.StatusOK) } func (handler AppLabelRestHandlerImpl) UpdateLabelsInApp(w http.ResponseWriter, r *http.Request) { userId, err := handler.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } decoder := json.NewDecoder(r.Body) @@ -127,29 +128,29 @@ func (handler AppLabelRestHandlerImpl) UpdateLabelsInApp(w http.ResponseWriter, request.UserId = userId if err != nil { handler.logger.Errorw("request err, UpdateLabelsInApp", "err", err, "request", request) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } handler.logger.Infow("request payload, UpdateLabelsInApp", "request", request) err = handler.validator.Struct(request) if err != nil { handler.logger.Errorw("validation err, UpdateLabelsInApp", "err", err, "request", request) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } //rback implementation starts here token := r.Header.Get("token") object := handler.enforcerUtil.GetAppRBACNameByAppId(request.AppId) if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionUpdate, object); !ok { - writeJsonResp(w, err, "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden) return } //rback implementation ends here res, err := handler.appLabelService.UpdateLabelsInApp(&request) if err != nil { handler.logger.Errorw("service err, UpdateLabelsInApp", "err", err) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, nil, res, http.StatusOK) + common.WriteJsonResp(w, nil, res, http.StatusOK) } diff --git a/api/restHandler/AppListingRestHandler.go b/api/restHandler/AppListingRestHandler.go index 6ed3aafc77..31fa6f21c7 100644 --- a/api/restHandler/AppListingRestHandler.go +++ b/api/restHandler/AppListingRestHandler.go @@ -21,6 +21,7 @@ import ( "context" "encoding/json" "fmt" + "github.com/devtron-labs/devtron/api/restHandler/common" "net/http" "strconv" "strings" @@ -110,12 +111,12 @@ func (handler AppListingRestHandlerImpl) FetchAppsByEnvironment(w http.ResponseW handler.logger.Infow("api response time testing", "time", time.Now().String(), "stage", "1") userId, err := handler.userService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } user, err := handler.userService.GetById(userId) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } userEmailId := strings.ToLower(user.EmailId) @@ -124,7 +125,7 @@ func (handler AppListingRestHandlerImpl) FetchAppsByEnvironment(w http.ResponseW err = decoder.Decode(&fetchAppListingRequest) if err != nil { handler.logger.Errorw("request err, FetchAppsByEnvironment", "err", err, "payload", fetchAppListingRequest) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } @@ -133,14 +134,14 @@ func (handler AppListingRestHandlerImpl) FetchAppsByEnvironment(w http.ResponseW dg, err = handler.deploymentGroupService.FindById(fetchAppListingRequest.DeploymentGroupId) if err != nil { handler.logger.Errorw("service err, FetchAppsByEnvironment", "err", err, "payload", fetchAppListingRequest) - writeJsonResp(w, err, "", http.StatusInternalServerError) + common.WriteJsonResp(w, err, "", http.StatusInternalServerError) } } envContainers, err := handler.appListingService.FetchAppsByEnvironment(fetchAppListingRequest, w, r, token) if err != nil { handler.logger.Errorw("service err, FetchAppsByEnvironment", "err", err, "payload", fetchAppListingRequest) - writeJsonResp(w, err, "", http.StatusInternalServerError) + common.WriteJsonResp(w, err, "", http.StatusInternalServerError) } t2 := time.Now() handler.logger.Infow("api response time testing", "time", time.Now().String(), "time diff", t2.Unix()-t1.Unix(), "stage", "2") @@ -149,7 +150,7 @@ func (handler AppListingRestHandlerImpl) FetchAppsByEnvironment(w http.ResponseW isActionUserSuperAdmin, err := handler.userService.IsSuperAdmin(int(userId)) if err != nil { handler.logger.Errorw("request err, FetchAppsByEnvironment", "err", err, "userId", userId) - writeJsonResp(w, err, "Failed to check is super admin", http.StatusInternalServerError) + common.WriteJsonResp(w, err, "Failed to check is super admin", http.StatusInternalServerError) return } appEnvContainers := make([]*bean.AppEnvironmentContainer, 0) @@ -194,7 +195,7 @@ func (handler AppListingRestHandlerImpl) FetchAppsByEnvironment(w http.ResponseW apps, err := handler.appListingService.BuildAppListingResponse(fetchAppListingRequest, appEnvContainers) if err != nil { handler.logger.Errorw("service err, FetchAppsByEnvironment", "err", err, "payload", fetchAppListingRequest) - writeJsonResp(w, err, "", http.StatusInternalServerError) + common.WriteJsonResp(w, err, "", http.StatusInternalServerError) } // Apply pagination @@ -235,7 +236,7 @@ func (handler AppListingRestHandlerImpl) FetchAppsByEnvironment(w http.ResponseW handler.logger.Infow("api response time testing", "time", time.Now().String(), "time diff", t2.Unix()-t1.Unix(), "stage", "4") t1 = t2 handler.logger.Infow("api response time testing", "total time", time.Now().String(), "total time", t1.Unix()-t0.Unix()) - writeJsonResp(w, err, appContainerResponse, http.StatusOK) + common.WriteJsonResp(w, err, appContainerResponse, http.StatusOK) } func (handler AppListingRestHandlerImpl) FetchAppDetails(w http.ResponseWriter, r *http.Request) { @@ -243,24 +244,24 @@ func (handler AppListingRestHandlerImpl) FetchAppDetails(w http.ResponseWriter, token := r.Header.Get("token") appId, err := strconv.Atoi(vars["app-id"]) if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } envId, err := strconv.Atoi(vars["env-id"]) if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } appDetail, err := handler.appListingService.FetchAppDetails(appId, envId) if err != nil { handler.logger.Errorw("service err, FetchAppDetails", "err", err, "appId", appId, "envId", envId) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } object := handler.enforcerUtil.GetAppRBACNameByAppId(appId) if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), nil, http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), nil, http.StatusForbidden) return } @@ -292,7 +293,7 @@ func (handler AppListingRestHandlerImpl) FetchAppDetails(w http.ResponseWriter, InternalMessage: "app detail fetched, failed to get resource tree from acd", UserMessage: "Error fetching detail, if you have recently created this deployment pipeline please try after sometime.", } - writeJsonResp(w, err, "", http.StatusInternalServerError) + common.WriteJsonResp(w, err, "", http.StatusInternalServerError) return } if resp.Status == v1alpha1.HealthStatusHealthy { @@ -318,7 +319,7 @@ func (handler AppListingRestHandlerImpl) FetchAppDetails(w http.ResponseWriter, } else { handler.logger.Warnw("appName and envName not found - avoiding resource tree call", "app", appDetail.AppName, "env", appDetail.EnvironmentName) } - writeJsonResp(w, err, appDetail, http.StatusOK) + common.WriteJsonResp(w, err, appDetail, http.StatusOK) } func (handler AppListingRestHandlerImpl) FetchAppTriggerView(w http.ResponseWriter, r *http.Request) { @@ -327,7 +328,7 @@ func (handler AppListingRestHandlerImpl) FetchAppTriggerView(w http.ResponseWrit appId, err := strconv.Atoi(vars["app-id"]) if err != nil { handler.logger.Errorw("request err, FetchAppTriggerView", "err", err, "appId", appId) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } handler.logger.Debugw("request payload, FetchAppTriggerView", "appId", appId) @@ -335,7 +336,7 @@ func (handler AppListingRestHandlerImpl) FetchAppTriggerView(w http.ResponseWrit triggerView, err := handler.appListingService.FetchAppTriggerView(appId) if err != nil { handler.logger.Errorw("service err, FetchAppTriggerView", "err", err, "appId", appId) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } @@ -344,7 +345,7 @@ func (handler AppListingRestHandlerImpl) FetchAppTriggerView(w http.ResponseWrit if len(triggerView) > 0 { object := handler.enforcerUtil.GetAppRBACName(triggerView[0].AppName) if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); !ok { - writeJsonResp(w, err, "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden) return } } @@ -442,7 +443,7 @@ func (handler AppListingRestHandlerImpl) FetchAppTriggerView(w http.ResponseWrit triggerView[i].Status = "Not Deployed" } } - writeJsonResp(w, err, triggerView, http.StatusOK) + common.WriteJsonResp(w, err, triggerView, http.StatusOK) } func (handler AppListingRestHandlerImpl) FetchAppStageStatus(w http.ResponseWriter, r *http.Request) { @@ -450,7 +451,7 @@ func (handler AppListingRestHandlerImpl) FetchAppStageStatus(w http.ResponseWrit appId, err := strconv.Atoi(vars["app-id"]) if err != nil { handler.logger.Errorw("request err, FetchAppStageStatus", "err", err, "appId", appId) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } handler.logger.Infow("request payload, FetchAppStageStatus", "appId", appId) @@ -458,14 +459,14 @@ func (handler AppListingRestHandlerImpl) FetchAppStageStatus(w http.ResponseWrit app, err := handler.pipeline.GetApp(appId) if err != nil { handler.logger.Errorw("service err, FetchAppStageStatus", "err", err, "appId", appId) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } // RBAC enforcer applying object := handler.enforcerUtil.GetAppRBACName(app.AppName) if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) return } //RBAC enforcer Ends @@ -473,10 +474,10 @@ func (handler AppListingRestHandlerImpl) FetchAppStageStatus(w http.ResponseWrit triggerView, err := handler.appListingService.FetchAppStageStatus(appId) if err != nil { handler.logger.Errorw("service err, FetchAppStageStatus", "err", err, "appId", appId) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, triggerView, http.StatusOK) + common.WriteJsonResp(w, err, triggerView, http.StatusOK) } func (handler AppListingRestHandlerImpl) FetchOtherEnvironment(w http.ResponseWriter, r *http.Request) { @@ -484,21 +485,21 @@ func (handler AppListingRestHandlerImpl) FetchOtherEnvironment(w http.ResponseWr appId, err := strconv.Atoi(vars["app-id"]) if err != nil { handler.logger.Errorw("request err, FetchOtherEnvironment", "err", err, "appId", appId) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } token := r.Header.Get("token") app, err := handler.pipeline.GetApp(appId) if err != nil { handler.logger.Errorw("service err, FetchOtherEnvironment", "err", err, "appId", appId) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } // RBAC enforcer applying object := handler.enforcerUtil.GetAppRBACName(app.AppName) if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); !ok { - writeJsonResp(w, err, "unauthorized user", http.StatusForbidden) + common.WriteJsonResp(w, err, "unauthorized user", http.StatusForbidden) return } //RBAC enforcer Ends @@ -506,13 +507,13 @@ func (handler AppListingRestHandlerImpl) FetchOtherEnvironment(w http.ResponseWr otherEnvironment, err := handler.appListingService.FetchOtherEnvironment(appId) if err != nil { handler.logger.Errorw("service err, FetchOtherEnvironment", "err", err, "appId", appId) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } //TODO - rbac env level - writeJsonResp(w, err, otherEnvironment, http.StatusOK) + common.WriteJsonResp(w, err, otherEnvironment, http.StatusOK) } func (handler AppListingRestHandlerImpl) RedirectToLinkouts(w http.ResponseWriter, r *http.Request) { @@ -521,19 +522,19 @@ func (handler AppListingRestHandlerImpl) RedirectToLinkouts(w http.ResponseWrite Id, err := strconv.Atoi(vars["Id"]) if err != nil { handler.logger.Errorw("request err, RedirectToLinkouts", "err", err, "id", Id) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } appId, err := strconv.Atoi(vars["appId"]) if err != nil { handler.logger.Errorw("request err, RedirectToLinkouts", "err", err, "appId", appId) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } envId, err := strconv.Atoi(vars["envId"]) if err != nil { handler.logger.Errorw("request err, RedirectToLinkouts", "err", err, "envId", envId) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } podName := vars["podName"] @@ -541,14 +542,14 @@ func (handler AppListingRestHandlerImpl) RedirectToLinkouts(w http.ResponseWrite app, err := handler.pipeline.GetApp(appId) if err != nil { handler.logger.Errorw("bad request", "err", err) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } // RBAC enforcer applying object := handler.enforcerUtil.GetAppRBACName(app.AppName) if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); !ok { - writeJsonResp(w, err, "unauthorized user", http.StatusForbidden) + common.WriteJsonResp(w, err, "unauthorized user", http.StatusForbidden) return } //RBAC enforcer Ends @@ -556,7 +557,7 @@ func (handler AppListingRestHandlerImpl) RedirectToLinkouts(w http.ResponseWrite link, err := handler.appListingService.RedirectToLinkouts(Id, appId, envId, podName, containerName) if err != nil || len(link) == 0 { handler.logger.Errorw("service err, RedirectToLinkouts", "err", err, "appId", appId) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } http.Redirect(w, r, link, http.StatusOK) diff --git a/api/restHandler/AppStoreDeploymentRestHandler.go b/api/restHandler/AppStoreDeploymentRestHandler.go index 74dc744a5a..43c465cd4f 100644 --- a/api/restHandler/AppStoreDeploymentRestHandler.go +++ b/api/restHandler/AppStoreDeploymentRestHandler.go @@ -22,6 +22,7 @@ import ( "encoding/json" "errors" "fmt" + "github.com/devtron-labs/devtron/api/restHandler/common" appstore2 "github.com/devtron-labs/devtron/internal/sql/repository/appstore" "github.com/devtron-labs/devtron/internal/sql/repository/pipelineConfig" "github.com/devtron-labs/devtron/internal/util" @@ -89,7 +90,7 @@ func (handler InstalledAppRestHandlerImpl) CreateInstalledApp(w http.ResponseWri decoder := json.NewDecoder(r.Body) userId, err := handler.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } var request appstore.InstallAppVersionDTO @@ -97,13 +98,13 @@ func (handler InstalledAppRestHandlerImpl) CreateInstalledApp(w http.ResponseWri err = decoder.Decode(&request) if err != nil { handler.Logger.Errorw("request err, CreateInstalledApp", "err", err, "payload", request) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } err = handler.validator.Struct(request) if err != nil { handler.Logger.Errorw("validation err, CreateInstalledApp", "err", err, "payload", request) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } token := r.Header.Get("token") @@ -111,17 +112,17 @@ func (handler InstalledAppRestHandlerImpl) CreateInstalledApp(w http.ResponseWri team, err := handler.teamService.FetchOne(request.TeamId) if err != nil { handler.Logger.Errorw("service err, CreateInstalledApp", "err", err, "payload", request) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } teamRbac := team.Name + "/" + request.AppName if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionCreate, teamRbac); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), nil, http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), nil, http.StatusForbidden) return } object := handler.enforcerUtil.GetAppRBACByAppNameAndEnvId(request.AppName, request.EnvironmentId) if ok := handler.enforcer.Enforce(token, rbac.ResourceEnvironment, rbac.ActionCreate, object); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), nil, http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), nil, http.StatusForbidden) return } //rback block ends here @@ -129,11 +130,11 @@ func (handler InstalledAppRestHandlerImpl) CreateInstalledApp(w http.ResponseWri isChartRepoActive, err := handler.installedAppService.IsChartRepoActive(request.AppStoreVersion) if err != nil { handler.Logger.Errorw("service err, CreateInstalledApp", "err", err, "payload", request) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } if !isChartRepoActive { - writeJsonResp(w, fmt.Errorf("chart repo is disabled"), nil, http.StatusNotAcceptable) + common.WriteJsonResp(w, fmt.Errorf("chart repo is disabled"), nil, http.StatusNotAcceptable) return } @@ -157,30 +158,30 @@ func (handler InstalledAppRestHandlerImpl) CreateInstalledApp(w http.ResponseWri err = &util.ApiError{Code: "400", HttpStatusCode: 400, UserMessage: "application spec is invalid, please check provided chart values"} } handler.Logger.Errorw("service err, CreateInstalledApp", "err", err, "payload", request) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } func (handler InstalledAppRestHandlerImpl) UpdateInstalledApp(w http.ResponseWriter, r *http.Request) { decoder := json.NewDecoder(r.Body) userId, err := handler.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } var request appstore.InstallAppVersionDTO err = decoder.Decode(&request) if err != nil { handler.Logger.Errorw("request err, UpdateInstalledApp", "err", err, "payload", request) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } err = handler.validator.Struct(request) if err != nil { handler.Logger.Errorw("validation err, UpdateInstalledApp", "err", err, "payload", request) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } token := r.Header.Get("token") @@ -188,18 +189,18 @@ func (handler InstalledAppRestHandlerImpl) UpdateInstalledApp(w http.ResponseWri installedApp, err := handler.installedAppService.GetInstalledApp(request.InstalledAppId) if err != nil { handler.Logger.Errorw("service err, UpdateInstalledApp", "err", err, "payload", request) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } //rbac block starts from here object := handler.enforcerUtil.GetAppRBACNameByAppId(installedApp.AppId) if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionUpdate, object); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), nil, http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), nil, http.StatusForbidden) return } object = handler.enforcerUtil.GetEnvRBACNameByAppId(installedApp.AppId, installedApp.EnvironmentId) if ok := handler.enforcer.Enforce(token, rbac.ResourceEnvironment, rbac.ActionUpdate, object); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), nil, http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), nil, http.StatusForbidden) return } //rback block ends here @@ -222,16 +223,16 @@ func (handler InstalledAppRestHandlerImpl) UpdateInstalledApp(w http.ResponseWri err = &util.ApiError{Code: "400", HttpStatusCode: 400, UserMessage: "application spec is invalid, please check provided chart values"} } handler.Logger.Errorw("service err, UpdateInstalledApp", "err", err, "payload", request) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } func (handler InstalledAppRestHandlerImpl) GetAllInstalledApp(w http.ResponseWriter, r *http.Request) { userId, err := handler.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } v := r.URL.Query() @@ -291,7 +292,7 @@ func (handler InstalledAppRestHandlerImpl) GetAllInstalledApp(w http.ResponseWri res, err := handler.installedAppService.GetAll(filter) if err != nil { handler.Logger.Errorw("service err, GetAllInstalledApp", "err", err, "envsQueryParam", envsQueryParam) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } @@ -310,13 +311,13 @@ func (handler InstalledAppRestHandlerImpl) GetAllInstalledApp(w http.ResponseWri installedAppsResponse = append(installedAppsResponse, app) } - writeJsonResp(w, err, installedAppsResponse, http.StatusOK) + common.WriteJsonResp(w, err, installedAppsResponse, http.StatusOK) } func (handler InstalledAppRestHandlerImpl) GetInstalledAppsByAppStoreId(w http.ResponseWriter, r *http.Request) { userId, err := handler.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } @@ -324,7 +325,7 @@ func (handler InstalledAppRestHandlerImpl) GetInstalledAppsByAppStoreId(w http.R appStoreId, err := strconv.Atoi(vars["appStoreId"]) if err != nil { handler.Logger.Errorw("request err, GetInstalledAppsByAppStoreId", "err", err, "appStoreId", appStoreId) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } token := r.Header.Get("token") @@ -332,7 +333,7 @@ func (handler InstalledAppRestHandlerImpl) GetInstalledAppsByAppStoreId(w http.R res, err := handler.installedAppService.GetAllInstalledAppsByAppStoreId(w, r, token, appStoreId) if err != nil { handler.Logger.Errorw("service err, GetInstalledAppsByAppStoreId", "err", err, "appStoreId", appStoreId) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } @@ -351,20 +352,20 @@ func (handler InstalledAppRestHandlerImpl) GetInstalledAppsByAppStoreId(w http.R installedAppsResponse = append(installedAppsResponse, app) } - writeJsonResp(w, err, installedAppsResponse, http.StatusOK) + common.WriteJsonResp(w, err, installedAppsResponse, http.StatusOK) } func (handler InstalledAppRestHandlerImpl) GetInstalledAppVersion(w http.ResponseWriter, r *http.Request) { userId, err := handler.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } vars := mux.Vars(r) installedAppId, err := strconv.Atoi(vars["installedAppVersionId"]) if err != nil { handler.Logger.Errorw("request err, GetInstalledAppVersion", "err", err, "installedAppVersionId", installedAppId) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } token := r.Header.Get("token") @@ -372,37 +373,37 @@ func (handler InstalledAppRestHandlerImpl) GetInstalledAppVersion(w http.Respons dto, err := handler.installedAppService.GetInstalledAppVersion(installedAppId) if err != nil { handler.Logger.Errorw("service err, GetInstalledAppVersion", "err", err, "installedAppVersionId", installedAppId) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } //rbac block starts from here object := handler.enforcerUtil.GetAppRBACName(dto.AppName) if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), nil, http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), nil, http.StatusForbidden) return } object = handler.enforcerUtil.GetAppRBACByAppNameAndEnvId(dto.AppName, dto.EnvironmentId) if ok := handler.enforcer.Enforce(token, rbac.ResourceEnvironment, rbac.ActionGet, object); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), nil, http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), nil, http.StatusForbidden) return } //rback block ends here - writeJsonResp(w, err, dto, http.StatusOK) + common.WriteJsonResp(w, err, dto, http.StatusOK) } func (handler InstalledAppRestHandlerImpl) DeleteInstalledApp(w http.ResponseWriter, r *http.Request) { userId, err := handler.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } vars := mux.Vars(r) installAppId, err := strconv.Atoi(vars["id"]) if err != nil { handler.Logger.Errorw("request err, DeleteInstalledApp", "err", err, "installAppId", installAppId) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } @@ -413,7 +414,7 @@ func (handler InstalledAppRestHandlerImpl) DeleteInstalledApp(w http.ResponseWri forceDelete, err = strconv.ParseBool(force) if err != nil { handler.Logger.Errorw("request err, DeleteInstalledApp", "err", err, "installAppId", installAppId) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } } @@ -423,17 +424,17 @@ func (handler InstalledAppRestHandlerImpl) DeleteInstalledApp(w http.ResponseWri installedApp, err := handler.installedAppService.GetInstalledApp(installAppId) if err != nil { handler.Logger.Error(err) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } object := handler.enforcerUtil.GetAppRBACNameByAppId(installedApp.AppId) if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionDelete, object); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), nil, http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), nil, http.StatusForbidden) return } object = handler.enforcerUtil.GetAppRBACByAppNameAndEnvId(installedApp.AppName, installedApp.EnvironmentId) if ok := handler.enforcer.Enforce(token, rbac.ResourceEnvironment, rbac.ActionDelete, object); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), nil, http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), nil, http.StatusForbidden) return } //rback block ends here @@ -457,16 +458,16 @@ func (handler InstalledAppRestHandlerImpl) DeleteInstalledApp(w http.ResponseWri res, err := handler.installedAppService.DeleteInstalledApp(ctx, &request) if err != nil { handler.Logger.Errorw("service err, DeleteInstalledApp", "err", err, "installAppId", installAppId) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } func (handler *InstalledAppRestHandlerImpl) DeployBulk(w http.ResponseWriter, r *http.Request) { userId, err := handler.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } decoder := json.NewDecoder(r.Body) @@ -474,13 +475,13 @@ func (handler *InstalledAppRestHandlerImpl) DeployBulk(w http.ResponseWriter, r err = decoder.Decode(&request) if err != nil { handler.Logger.Errorw("request err, DeployBulk", "err", err, "payload", request) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } err = handler.validator.Struct(request) if err != nil { handler.Logger.Errorw("validation err, DeployBulk", "err", err, "payload", request) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } request.UserId = userId @@ -489,7 +490,7 @@ func (handler *InstalledAppRestHandlerImpl) DeployBulk(w http.ResponseWriter, r token := r.Header.Get("token") rbacObject := "" if ok := handler.enforcer.Enforce(token, rbac.ResourceChartGroup, rbac.ActionUpdate, rbacObject); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), nil, http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), nil, http.StatusForbidden) return } //RBAC block ends here @@ -498,27 +499,27 @@ func (handler *InstalledAppRestHandlerImpl) DeployBulk(w http.ResponseWriter, r isChartRepoActive, err := handler.installedAppService.IsChartRepoActive(item.AppStoreVersion) if err != nil { handler.Logger.Errorw("service err, CreateInstalledApp", "err", err, "payload", request) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } if !isChartRepoActive { - writeJsonResp(w, fmt.Errorf("chart repo is disabled"), nil, http.StatusNotAcceptable) + common.WriteJsonResp(w, fmt.Errorf("chart repo is disabled"), nil, http.StatusNotAcceptable) return } } res, err := handler.installedAppService.DeployBulk(&request) if err != nil { handler.Logger.Errorw("service err, DeployBulk", "err", err, "payload", request) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } func (handler *InstalledAppRestHandlerImpl) CheckAppExists(w http.ResponseWriter, r *http.Request) { userId, err := handler.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } decoder := json.NewDecoder(r.Body) @@ -526,15 +527,15 @@ func (handler *InstalledAppRestHandlerImpl) CheckAppExists(w http.ResponseWriter err = decoder.Decode(&request) if err != nil { handler.Logger.Errorw("request err, CheckAppExists", "err", err, "payload", request) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } handler.Logger.Infow("request payload, CheckAppExists", "payload", request) res, err := handler.installedAppService.CheckAppExists(request) if err != nil { handler.Logger.Errorw("service err, CheckAppExists", "err", err, "payload", request) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } diff --git a/api/restHandler/AppStoreRestHandler.go b/api/restHandler/AppStoreRestHandler.go index 3c1604ef63..fa488df036 100644 --- a/api/restHandler/AppStoreRestHandler.go +++ b/api/restHandler/AppStoreRestHandler.go @@ -23,6 +23,7 @@ import ( "errors" "fmt" application2 "github.com/argoproj/argo-cd/pkg/apiclient/application" + "github.com/devtron-labs/devtron/api/restHandler/common" "github.com/devtron-labs/devtron/client/argocdServer/application" "github.com/devtron-labs/devtron/internal/constants" appstore2 "github.com/devtron-labs/devtron/internal/sql/repository/appstore" @@ -86,7 +87,7 @@ func NewAppStoreRestHandlerImpl(Logger *zap.SugaredLogger, userAuthService user. func (handler *AppStoreRestHandlerImpl) FindAllApps(w http.ResponseWriter, r *http.Request) { userId, err := handler.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, nil, http.StatusUnauthorized) + common.WriteJsonResp(w, err, nil, http.StatusUnauthorized) return } @@ -132,39 +133,39 @@ func (handler *AppStoreRestHandlerImpl) FindAllApps(w http.ResponseWriter, r *ht res, err := handler.appStoreService.FindAllApps(filter) if err != nil { handler.Logger.Errorw("service err, FindAllApps, app store", "err", err, "userId", userId) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } func (handler *AppStoreRestHandlerImpl) GetChartDetailsForVersion(w http.ResponseWriter, r *http.Request) { userId, err := handler.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, nil, http.StatusUnauthorized) + common.WriteJsonResp(w, err, nil, http.StatusUnauthorized) return } vars := mux.Vars(r) id, err := strconv.Atoi(vars["id"]) if err != nil { handler.Logger.Errorw("request err, GetChartDetailsForVersion", "err", err, "appStoreApplicationVersionId", id) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } handler.Logger.Infow("request payload, GetChartDetailsForVersion, app store", "appStoreApplicationVersionId", id) res, err := handler.appStoreService.FindChartDetailsById(id) if err != nil { handler.Logger.Errorw("service err, GetChartDetailsForVersion, app store", "err", err, "appStoreApplicationVersionId", id) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } func (handler *AppStoreRestHandlerImpl) GetChartVersions(w http.ResponseWriter, r *http.Request) { userId, err := handler.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, nil, http.StatusUnauthorized) + common.WriteJsonResp(w, err, nil, http.StatusUnauthorized) return } @@ -172,23 +173,23 @@ func (handler *AppStoreRestHandlerImpl) GetChartVersions(w http.ResponseWriter, id, err := strconv.Atoi(vars["appStoreId"]) if err != nil { handler.Logger.Errorw("request err, GetChartVersions", "err", err, "appStoreId", id) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } handler.Logger.Infow("request payload, GetChartVersions, app store", "appStoreId", id) res, err := handler.appStoreService.FindChartVersionsByAppStoreId(id) if err != nil { handler.Logger.Errorw("service err, GetChartVersions, app store", "err", err, "appStoreId", id) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } func (handler *AppStoreRestHandlerImpl) FetchAppDetailsForInstalledApp(w http.ResponseWriter, r *http.Request) { userId, err := handler.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, nil, http.StatusUnauthorized) + common.WriteJsonResp(w, err, nil, http.StatusUnauthorized) return } @@ -196,14 +197,14 @@ func (handler *AppStoreRestHandlerImpl) FetchAppDetailsForInstalledApp(w http.Re installedAppId, err := strconv.Atoi(vars["installed-app-id"]) if err != nil { handler.Logger.Errorw("request err, FetchAppDetailsForInstalledApp", "err", err, "installedAppId", installedAppId) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } token := r.Header.Get("token") envId, err := strconv.Atoi(vars["env-id"]) if err != nil { handler.Logger.Errorw("request err, FetchAppDetailsForInstalledApp", "err", err, "installedAppId", installedAppId, "envId", envId) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } handler.Logger.Infow("request payload, FetchAppDetailsForInstalledApp, app store", "installedAppId", installedAppId, "envId", envId) @@ -211,19 +212,19 @@ func (handler *AppStoreRestHandlerImpl) FetchAppDetailsForInstalledApp(w http.Re appDetail, err := handler.appStoreService.FindAppDetailsForAppstoreApplication(installedAppId, envId) if err != nil { handler.Logger.Errorw("service err, FetchAppDetailsForInstalledApp, app store", "err", err, "installedAppId", installedAppId, "envId", envId) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } //rbac block starts from here object := handler.enforcerUtil.GetAppRBACName(appDetail.AppName) if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), nil, http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), nil, http.StatusForbidden) return } object = handler.enforcerUtil.GetAppRBACByAppNameAndEnvId(appDetail.AppName, appDetail.EnvironmentId) if ok := handler.enforcer.Enforce(token, rbac.ResourceEnvironment, rbac.ActionGet, object); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), nil, http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), nil, http.StatusForbidden) return } //rback block ends here @@ -257,7 +258,7 @@ func (handler *AppStoreRestHandlerImpl) FetchAppDetailsForInstalledApp(w http.Re UserMessage: "app detail fetched, failed to get resource tree from acd", } appDetail.ResourceTree = &application.ResourceTreeResponse{} - writeJsonResp(w, nil, appDetail, http.StatusOK) + common.WriteJsonResp(w, nil, appDetail, http.StatusOK) return } appDetail.ResourceTree = resp @@ -265,13 +266,13 @@ func (handler *AppStoreRestHandlerImpl) FetchAppDetailsForInstalledApp(w http.Re } else { handler.Logger.Infow("appName and envName not found - avoiding resource tree call", "app", appDetail.AppName, "env", appDetail.EnvironmentName) } - writeJsonResp(w, err, appDetail, http.StatusOK) + common.WriteJsonResp(w, err, appDetail, http.StatusOK) } func (handler *AppStoreRestHandlerImpl) GetReadme(w http.ResponseWriter, r *http.Request) { userId, err := handler.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, nil, http.StatusUnauthorized) + common.WriteJsonResp(w, err, nil, http.StatusUnauthorized) return } @@ -279,23 +280,23 @@ func (handler *AppStoreRestHandlerImpl) GetReadme(w http.ResponseWriter, r *http id, err := strconv.Atoi(vars["appStoreApplicationVersionId"]) if err != nil { handler.Logger.Errorw("request err, GetReadme", "err", err, "appStoreApplicationVersionId", id) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } handler.Logger.Infow("request payload, GetReadme, app store", "appStoreApplicationVersionId", id) res, err := handler.appStoreService.GetReadMeByAppStoreApplicationVersionId(id) if err != nil { handler.Logger.Errorw("service err, GetReadme, fetching resource tree", "err", err, "appStoreApplicationVersionId", id) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } func (handler *AppStoreRestHandlerImpl) SearchAppStoreChartByName(w http.ResponseWriter, r *http.Request) { userId, err := handler.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, nil, http.StatusUnauthorized) + common.WriteJsonResp(w, err, nil, http.StatusUnauthorized) return } vars := mux.Vars(r) @@ -304,76 +305,76 @@ func (handler *AppStoreRestHandlerImpl) SearchAppStoreChartByName(w http.Respons res, err := handler.appStoreService.SearchAppStoreChartByName(chartName) if err != nil { handler.Logger.Errorw("service err, SearchAppStoreChartByName, app store", "err", err, "userId", userId) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } func (handler *AppStoreRestHandlerImpl) GetChartRepoById(w http.ResponseWriter, r *http.Request) { userId, err := handler.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, nil, http.StatusUnauthorized) + common.WriteJsonResp(w, err, nil, http.StatusUnauthorized) return } vars := mux.Vars(r) id, err := strconv.Atoi(vars["id"]) if err != nil { handler.Logger.Errorw("request err, GetChartRepoById", "err", err, "chart repo id", id) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } handler.Logger.Infow("request payload, GetChartRepoById, app store", "chart repo id", id) res, err := handler.appStoreService.GetChartRepoById(id) if err != nil { handler.Logger.Errorw("service err, GetChartRepoById, app store", "err", err, "userId", userId) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } func (handler *AppStoreRestHandlerImpl) GetChartRepoList(w http.ResponseWriter, r *http.Request) { userId, err := handler.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, nil, http.StatusUnauthorized) + common.WriteJsonResp(w, err, nil, http.StatusUnauthorized) return } handler.Logger.Infow("request payload, GetChartRepoList, app store") res, err := handler.appStoreService.GetChartRepoList() if err != nil { handler.Logger.Errorw("service err, GetChartRepoList, app store", "err", err, "userId", userId) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } func (handler *AppStoreRestHandlerImpl) CreateChartRepo(w http.ResponseWriter, r *http.Request) { decoder := json.NewDecoder(r.Body) userId, err := handler.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } var request *appstore.ChartRepoDto err = decoder.Decode(&request) if err != nil { handler.Logger.Errorw("request err, CreateChartRepo", "err", err, "payload", request) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } err = handler.validator.Struct(request) if err != nil { handler.Logger.Errorw("validation err, CreateChartRepo", "err", err, "payload", request) err = &util.ApiError{Code: "400", HttpStatusCode: 400, UserMessage: "data validation error", InternalMessage: err.Error()} - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } token := r.Header.Get("token") if ok := handler.enforcer.Enforce(token, rbac.ResourceGlobal, rbac.ActionCreate, "*"); !ok { - writeJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) + common.WriteJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) return } @@ -382,42 +383,42 @@ func (handler *AppStoreRestHandlerImpl) CreateChartRepo(w http.ResponseWriter, r handler.Logger.Infow("request payload, CreateChartRepo", "payload", request) res, err, validationResult := handler.appStoreService.ValidateAndCreateChartRepo(request) if validationResult.CustomErrMsg != appstore.ValidationSuccessMsg { - writeJsonResp(w, nil, validationResult, http.StatusOK) + common.WriteJsonResp(w, nil, validationResult, http.StatusOK) return } if err != nil { handler.Logger.Errorw("service err, CreateChartRepo", "err", err, "payload", request) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } func (handler *AppStoreRestHandlerImpl) UpdateChartRepo(w http.ResponseWriter, r *http.Request) { decoder := json.NewDecoder(r.Body) userId, err := handler.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } var request *appstore.ChartRepoDto err = decoder.Decode(&request) if err != nil { handler.Logger.Errorw("request err, UpdateChartRepo", "err", err, "payload", request) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } err = handler.validator.Struct(request) if err != nil { handler.Logger.Errorw("validation err, UpdateChartRepo", "err", err, "payload", request) err = &util.ApiError{Code: "400", HttpStatusCode: 400, UserMessage: "data validation error", InternalMessage: err.Error()} - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } token := r.Header.Get("token") if ok := handler.enforcer.Enforce(token, rbac.ResourceGlobal, rbac.ActionUpdate, "*"); !ok { - writeJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) + common.WriteJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) return } @@ -426,45 +427,45 @@ func (handler *AppStoreRestHandlerImpl) UpdateChartRepo(w http.ResponseWriter, r handler.Logger.Infow("request payload, UpdateChartRepo", "payload", request) res, err, validationResult := handler.appStoreService.ValidateAndUpdateChartRepo(request) if validationResult.CustomErrMsg != appstore.ValidationSuccessMsg { - writeJsonResp(w, nil, validationResult, http.StatusOK) + common.WriteJsonResp(w, nil, validationResult, http.StatusOK) return } if err != nil { handler.Logger.Errorw("service err, UpdateChartRepo", "err", err, "payload", request) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } func (handler *AppStoreRestHandlerImpl) ValidateChartRepo(w http.ResponseWriter, r *http.Request) { decoder := json.NewDecoder(r.Body) userId, err := handler.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } var request *appstore.ChartRepoDto err = decoder.Decode(&request) if err != nil { handler.Logger.Errorw("request err, ValidateChartRepo", "err", err, "payload", request) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } err = handler.validator.Struct(request) if err != nil { handler.Logger.Errorw("validation err, ValidateChartRepo", "err", err, "payload", request) err = &util.ApiError{Code: "400", HttpStatusCode: 400, UserMessage: "data validation error", InternalMessage: err.Error()} - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } token := r.Header.Get("token") if ok := handler.enforcer.Enforce(token, rbac.ResourceGlobal, rbac.ActionUpdate, "*"); !ok { - writeJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) + common.WriteJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) return } request.UserId = userId handler.Logger.Infow("request payload, ValidateChartRepo", "payload", request) validationResult := handler.appStoreService.ValidateChartRepo(request) - writeJsonResp(w, nil, validationResult, http.StatusOK) + common.WriteJsonResp(w, nil, validationResult, http.StatusOK) } diff --git a/api/restHandler/AppStoreValuesRestHandler.go b/api/restHandler/AppStoreValuesRestHandler.go index 6f5effb94d..e15f772f9f 100644 --- a/api/restHandler/AppStoreValuesRestHandler.go +++ b/api/restHandler/AppStoreValuesRestHandler.go @@ -19,6 +19,7 @@ package restHandler import ( "encoding/json" + "github.com/devtron-labs/devtron/api/restHandler/common" "github.com/devtron-labs/devtron/internal/sql/repository/pipelineConfig" "github.com/devtron-labs/devtron/pkg/appstore" "github.com/devtron-labs/devtron/pkg/pipeline" @@ -80,14 +81,14 @@ func (handler AppStoreValuesRestHandlerImpl) CreateAppStoreVersionValues(w http. decoder := json.NewDecoder(r.Body) userId, err := handler.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } var request appstore.AppStoreVersionValuesDTO err = decoder.Decode(&request) if err != nil { handler.Logger.Errorw("request err, CreateAppStoreVersionValues", "err", err, "payload", request) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } request.UserId = userId @@ -95,76 +96,76 @@ func (handler AppStoreValuesRestHandlerImpl) CreateAppStoreVersionValues(w http. res, err := handler.appStoreValuesService.CreateAppStoreVersionValues(&request) if err != nil { handler.Logger.Errorw("service err, CreateAppStoreVersionValues", "err", err, "payload", request) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } func (handler AppStoreValuesRestHandlerImpl) UpdateAppStoreVersionValues(w http.ResponseWriter, r *http.Request) { decoder := json.NewDecoder(r.Body) userId, err := handler.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } var request appstore.AppStoreVersionValuesDTO err = decoder.Decode(&request) if err != nil { handler.Logger.Errorw("request err, UpdateAppStoreVersionValues", "err", err, "payload", request) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } handler.Logger.Infow("request payload, UpdateAppStoreVersionValues", "payload", request) res, err := handler.appStoreValuesService.UpdateAppStoreVersionValues(&request) if err != nil { handler.Logger.Errorw("service err, UpdateAppStoreVersionValues", "err", err, "payload", request) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } func (handler AppStoreValuesRestHandlerImpl) FindValuesById(w http.ResponseWriter, r *http.Request) { userId, err := handler.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } vars := mux.Vars(r) referenceId, err := strconv.Atoi(vars["referenceId"]) if err != nil || referenceId == 0 { handler.Logger.Errorw("request err, FindValuesById", "err", err, "referenceId", referenceId) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } kind := vars["kind"] if len(kind) == 0 || (kind != appstore.REFERENCE_TYPE_DEPLOYED && kind != appstore.REFERENCE_TYPE_DEFAULT && kind != appstore.REFERENCE_TYPE_TEMPLATE && kind != appstore.REFERENCE_TYPE_EXISTING) { handler.Logger.Error(err) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } handler.Logger.Infow("request payload, FindValuesById", "referenceId", referenceId, "kind", kind) res, err := handler.appStoreValuesService.FindValuesByIdAndKind(referenceId, kind) if err != nil { handler.Logger.Errorw("service err, FindValuesById", "err", err, "payload", referenceId, "kind", kind) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } func (handler AppStoreValuesRestHandlerImpl) DeleteAppStoreVersionValues(w http.ResponseWriter, r *http.Request) { userId, err := handler.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, nil, http.StatusUnauthorized) + common.WriteJsonResp(w, err, nil, http.StatusUnauthorized) return } vars := mux.Vars(r) appStoreValueId, err := strconv.Atoi(vars["appStoreValueId"]) if err != nil { handler.Logger.Errorw("request err, DeleteAppStoreVersionValues", "err", err, "appStoreValueId", appStoreValueId) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } handler.Logger.Infow("request payload, DeleteAppStoreVersionValues", "appStoreValueId", appStoreValueId) @@ -172,16 +173,16 @@ func (handler AppStoreValuesRestHandlerImpl) DeleteAppStoreVersionValues(w http. res, err := handler.appStoreValuesService.DeleteAppStoreVersionValues(appStoreValueId) if err != nil { handler.Logger.Errorw("service err, DeleteAppStoreVersionValues", "err", err, "appStoreValueId", appStoreValueId) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } func (handler AppStoreValuesRestHandlerImpl) FindValuesByAppStoreIdAndReferenceType(w http.ResponseWriter, r *http.Request) { userId, err := handler.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } @@ -189,30 +190,30 @@ func (handler AppStoreValuesRestHandlerImpl) FindValuesByAppStoreIdAndReferenceT appStoreVersionId, err := strconv.Atoi(vars["appStoreId"]) if err != nil { handler.Logger.Errorw("request err, FindValuesByAppStoreIdAndReferenceType", "err", err, "appStoreVersionId", appStoreVersionId) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } handler.Logger.Infow("request payload, FindValuesByAppStoreIdAndReferenceType", "appStoreVersionId", appStoreVersionId) res, err := handler.appStoreValuesService.FindValuesByAppStoreIdAndReferenceType(appStoreVersionId, appstore.REFERENCE_TYPE_TEMPLATE) if err != nil { handler.Logger.Errorw("service err, FindValuesByAppStoreIdAndReferenceType", "err", err, "appStoreVersionId", appStoreVersionId) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } func (handler AppStoreValuesRestHandlerImpl) FetchTemplateValuesByAppStoreId(w http.ResponseWriter, r *http.Request) { userId, err := handler.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } vars := mux.Vars(r) appStoreId, err := strconv.Atoi(vars["appStoreId"]) if err != nil { handler.Logger.Errorw("request err, FetchTemplateValuesByAppStoreId", "err", err, "appStoreId", appStoreId) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } @@ -223,7 +224,7 @@ func (handler AppStoreValuesRestHandlerImpl) FetchTemplateValuesByAppStoreId(w h installedAppVersionId, err = strconv.Atoi(installedAppVersionIds) if err != nil { handler.Logger.Errorw("request err, FetchTemplateValuesByAppStoreId", "err", err, "installedAppVersionIds", installedAppVersionIds) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } } @@ -232,16 +233,16 @@ func (handler AppStoreValuesRestHandlerImpl) FetchTemplateValuesByAppStoreId(w h res, err := handler.appStoreValuesService.FindValuesByAppStoreId(appStoreId, installedAppVersionId) if err != nil { handler.Logger.Errorw("service err, FetchTemplateValuesByAppStoreId", "err", err, "appStoreId", appStoreId) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } func (handler AppStoreValuesRestHandlerImpl) GetSelectedChartMetadata(w http.ResponseWriter, r *http.Request) { userId, err := handler.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } decoder := json.NewDecoder(r.Body) @@ -249,15 +250,15 @@ func (handler AppStoreValuesRestHandlerImpl) GetSelectedChartMetadata(w http.Res err = decoder.Decode(&request) if err != nil { handler.Logger.Errorw("request err, GetSelectedChartMetadata", "err", err, "request", request) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } handler.Logger.Infow("request payload, GetSelectedChartMetadata", "request", request) res, err := handler.appStoreValuesService.GetSelectedChartMetaData(&request) if err != nil { handler.Logger.Errorw("service err, GetSelectedChartMetadata", "err", err, "request", request) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } diff --git a/api/restHandler/AppWorkflowRestHandler.go b/api/restHandler/AppWorkflowRestHandler.go index 669b543aa3..de46ae984d 100644 --- a/api/restHandler/AppWorkflowRestHandler.go +++ b/api/restHandler/AppWorkflowRestHandler.go @@ -19,6 +19,7 @@ package restHandler import ( "encoding/json" + "github.com/devtron-labs/devtron/api/restHandler/common" "github.com/devtron-labs/devtron/internal/sql/repository/pipelineConfig" "github.com/devtron-labs/devtron/internal/util" "github.com/devtron-labs/devtron/pkg/appWorkflow" @@ -76,7 +77,7 @@ func (handler AppWorkflowRestHandlerImpl) CreateAppWorkflow(w http.ResponseWrite err = decoder.Decode(&request) if err != nil { handler.Logger.Errorw("decode err", "err", err) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } @@ -84,7 +85,7 @@ func (handler AppWorkflowRestHandlerImpl) CreateAppWorkflow(w http.ResponseWrite //rbac block starts from here resourceName := handler.enforcerUtil.GetAppRBACNameByAppId(request.AppId) if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionCreate, resourceName); !ok { - writeJsonResp(w, err, "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden) return } //rback block ends here @@ -93,10 +94,10 @@ func (handler AppWorkflowRestHandlerImpl) CreateAppWorkflow(w http.ResponseWrite res, err := handler.appWorkflowService.CreateAppWorkflow(request) if err != nil { handler.Logger.Errorw("error on creating", "err", err) - writeJsonResp(w, err, []byte("Creation Failed"), http.StatusInternalServerError) + common.WriteJsonResp(w, err, []byte("Creation Failed"), http.StatusInternalServerError) return } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } func (handler AppWorkflowRestHandlerImpl) DeleteAppWorkflow(w http.ResponseWriter, r *http.Request) { @@ -109,14 +110,14 @@ func (handler AppWorkflowRestHandlerImpl) DeleteAppWorkflow(w http.ResponseWrite appId, err := strconv.Atoi(vars["app-id"]) if err != nil { handler.Logger.Errorw("bad request", "err", err) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } appWorkflowId, err := strconv.Atoi(vars["app-wf-id"]) if err != nil { handler.Logger.Errorw("bad request", "err", err) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } @@ -124,7 +125,7 @@ func (handler AppWorkflowRestHandlerImpl) DeleteAppWorkflow(w http.ResponseWrite //rbac block starts from here resourceName := handler.enforcerUtil.GetAppRBACNameByAppId(appId) if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionDelete, resourceName); !ok { - writeJsonResp(w, err, "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden) return } //rback block ends here @@ -136,10 +137,10 @@ func (handler AppWorkflowRestHandlerImpl) DeleteAppWorkflow(w http.ResponseWrite } else { handler.Logger.Errorw("error on deleting", "err", err) } - writeJsonResp(w, err, []byte("Creation Failed"), http.StatusInternalServerError) + common.WriteJsonResp(w, err, []byte("Creation Failed"), http.StatusInternalServerError) return } - writeJsonResp(w, err, nil, http.StatusOK) + common.WriteJsonResp(w, err, nil, http.StatusOK) } func (impl AppWorkflowRestHandlerImpl) FindAppWorkflow(w http.ResponseWriter, r *http.Request) { @@ -147,14 +148,14 @@ func (impl AppWorkflowRestHandlerImpl) FindAppWorkflow(w http.ResponseWriter, r appId, err := strconv.Atoi(vars["app-id"]) if err != nil { impl.Logger.Errorw("bad request", "err", err) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } token := r.Header.Get("token") app, err := impl.pipelineBuilder.GetApp(appId) if err != nil { impl.Logger.Errorw("bad request", "err", err) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } @@ -162,7 +163,7 @@ func (impl AppWorkflowRestHandlerImpl) FindAppWorkflow(w http.ResponseWriter, r object := impl.enforcerUtil.GetAppRBACName(app.AppName) impl.Logger.Debugw("rbac object for other environment list", "object", object) if ok := impl.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); !ok { - writeJsonResp(w, err, "unauthorized user", http.StatusForbidden) + common.WriteJsonResp(w, err, "unauthorized user", http.StatusForbidden) return } //RBAC enforcer Ends @@ -170,7 +171,7 @@ func (impl AppWorkflowRestHandlerImpl) FindAppWorkflow(w http.ResponseWriter, r workflowsList, err := impl.appWorkflowService.FindAppWorkflows(appId) if err != nil { impl.Logger.Errorw("error in fetching workflows for app", "err", err) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } workflows["appId"] = app.Id @@ -180,5 +181,5 @@ func (impl AppWorkflowRestHandlerImpl) FindAppWorkflow(w http.ResponseWriter, r } else { workflows["workflows"] = []appWorkflow.AppWorkflowDto{} } - writeJsonResp(w, err, workflows, http.StatusOK) + common.WriteJsonResp(w, err, workflows, http.StatusOK) } diff --git a/api/restHandler/ApplicationRestHandler.go b/api/restHandler/ArgoApplicationRestHandler.go similarity index 83% rename from api/restHandler/ApplicationRestHandler.go rename to api/restHandler/ArgoApplicationRestHandler.go index 1403c33528..24edb261e6 100644 --- a/api/restHandler/ApplicationRestHandler.go +++ b/api/restHandler/ArgoApplicationRestHandler.go @@ -23,6 +23,7 @@ import ( "fmt" application2 "github.com/argoproj/argo-cd/pkg/apiclient/application" "github.com/devtron-labs/devtron/api/connector" + "github.com/devtron-labs/devtron/api/restHandler/common" "github.com/devtron-labs/devtron/client/argocdServer/application" "github.com/devtron-labs/devtron/pkg/cluster" "github.com/devtron-labs/devtron/pkg/team" @@ -39,7 +40,7 @@ import ( "strings" ) -type ApplicationRestHandler interface { +type ArgoApplicationRestHandler interface { GetPodLogs(w http.ResponseWriter, r *http.Request) GetResourceTree(w http.ResponseWriter, r *http.Request) ListResourceEvents(w http.ResponseWriter, r *http.Request) @@ -60,7 +61,7 @@ type ApplicationRestHandler interface { GetTerminalSession(w http.ResponseWriter, r *http.Request) } -type ApplicationRestHandlerImpl struct { +type ArgoApplicationRestHandlerImpl struct { client application.ServiceClient logger *zap.SugaredLogger pump connector.Pump @@ -71,15 +72,15 @@ type ApplicationRestHandlerImpl struct { terminalSessionHandler terminal.TerminalSessionHandler } -func NewApplicationRestHandlerImpl(client application.ServiceClient, +func NewArgoApplicationRestHandlerImpl(client application.ServiceClient, pump connector.Pump, enforcer rbac.Enforcer, teamService team.TeamService, environmentService cluster.EnvironmentService, logger *zap.SugaredLogger, enforcerUtil rbac.EnforcerUtil, - terminalSessionHandler terminal.TerminalSessionHandler) *ApplicationRestHandlerImpl { - return &ApplicationRestHandlerImpl{ + terminalSessionHandler terminal.TerminalSessionHandler) *ArgoApplicationRestHandlerImpl { + return &ArgoApplicationRestHandlerImpl{ client: client, logger: logger, pump: pump, @@ -91,7 +92,7 @@ func NewApplicationRestHandlerImpl(client application.ServiceClient, } } -func (impl ApplicationRestHandlerImpl) GetTerminalSession(w http.ResponseWriter, r *http.Request) { +func (impl ArgoApplicationRestHandlerImpl) GetTerminalSession(w http.ResponseWriter, r *http.Request) { token := r.Header.Get("token") request := &terminal.TerminalSessionRequest{} vars := mux.Vars(r) @@ -104,41 +105,41 @@ func (impl ApplicationRestHandlerImpl) GetTerminalSession(w http.ResponseWriter, //---------auth id, err := strconv.Atoi(appId) if err != nil { - writeJsonResp(w, fmt.Errorf("appId is not integer"), nil, http.StatusBadRequest) + common.WriteJsonResp(w, fmt.Errorf("appId is not integer"), nil, http.StatusBadRequest) return } eId, err := strconv.Atoi(envId) if err != nil { - writeJsonResp(w, fmt.Errorf("envId is not integer"), nil, http.StatusBadRequest) + common.WriteJsonResp(w, fmt.Errorf("envId is not integer"), nil, http.StatusBadRequest) return } request.AppId = id appRbacObject := impl.enforcerUtil.GetAppRBACNameByAppId(id) if appRbacObject == "" { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) return } envRbacObject := impl.enforcerUtil.GetEnvRBACNameByAppId(id, eId) if envRbacObject == "" { - writeJsonResp(w, fmt.Errorf("unauthorized user"), nil, http.StatusBadRequest) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), nil, http.StatusBadRequest) return } request.EnvironmentId = eId if ok := impl.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionCreate, appRbacObject); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) return } if ok := impl.enforcer.Enforce(token, rbac.ResourceEnvironment, rbac.ActionCreate, envRbacObject); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) return } //---------auth end //TODO apply validation status, message, err := impl.terminalSessionHandler.GetTerminalSession(request) - writeJsonResp(w, err, message, status) + common.WriteJsonResp(w, err, message, status) } -func (impl ApplicationRestHandlerImpl) Watch(w http.ResponseWriter, r *http.Request) { +func (impl ArgoApplicationRestHandlerImpl) Watch(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) name := vars["name"] token := r.Header.Get("token") @@ -160,7 +161,7 @@ func (impl ApplicationRestHandlerImpl) Watch(w http.ResponseWriter, r *http.Requ impl.pump.StartStream(w, func() (proto.Message, error) { return app.Recv() }, err) } -func (impl ApplicationRestHandlerImpl) GetPodLogs(w http.ResponseWriter, r *http.Request) { +func (impl ArgoApplicationRestHandlerImpl) GetPodLogs(w http.ResponseWriter, r *http.Request) { v := r.URL.Query() vars := mux.Vars(r) name := vars["name"] @@ -194,7 +195,7 @@ func (impl ApplicationRestHandlerImpl) GetPodLogs(w http.ResponseWriter, r *http if len(lastEventId) > 0 { lastSeenMsgId, err := strconv.ParseInt(lastEventId, 10, 64) if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } lastSeenMsgId = lastSeenMsgId + 1 //increased by one ns to avoid duplicate //FIXME still not fixed @@ -220,7 +221,7 @@ func (impl ApplicationRestHandlerImpl) GetPodLogs(w http.ResponseWriter, r *http impl.pump.StartStreamWithHeartBeat(w, isReconnect, func() (*application2.LogEntry, error) { return logs.Recv() }, err) } -func (impl ApplicationRestHandlerImpl) GetResourceTree(w http.ResponseWriter, r *http.Request) { +func (impl ArgoApplicationRestHandlerImpl) GetResourceTree(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) name := vars["name"] token := r.Header.Get("token") @@ -243,7 +244,7 @@ func (impl ApplicationRestHandlerImpl) GetResourceTree(w http.ResponseWriter, r impl.pump.StartMessage(w, recv, err) } -func (impl ApplicationRestHandlerImpl) ListResourceEvents(w http.ResponseWriter, r *http.Request) { +func (impl ArgoApplicationRestHandlerImpl) ListResourceEvents(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) name := vars["name"] v := r.URL.Query() @@ -273,7 +274,7 @@ func (impl ApplicationRestHandlerImpl) ListResourceEvents(w http.ResponseWriter, impl.pump.StartMessage(w, recv, err) } -func (impl ApplicationRestHandlerImpl) GetResource(w http.ResponseWriter, r *http.Request) { +func (impl ArgoApplicationRestHandlerImpl) GetResource(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) name := vars["name"] v := r.URL.Query() @@ -307,7 +308,7 @@ func (impl ApplicationRestHandlerImpl) GetResource(w http.ResponseWriter, r *htt impl.pump.StartMessage(w, recv, err) } -func (impl ApplicationRestHandlerImpl) List(w http.ResponseWriter, r *http.Request) { +func (impl ArgoApplicationRestHandlerImpl) List(w http.ResponseWriter, r *http.Request) { v := r.URL.Query() name := v.Get("name") refresh := v.Get("refresh") @@ -338,7 +339,7 @@ func (impl ApplicationRestHandlerImpl) List(w http.ResponseWriter, r *http.Reque impl.pump.StartMessage(w, recv, err) } -func (impl ApplicationRestHandlerImpl) ManagedResources(w http.ResponseWriter, r *http.Request) { +func (impl ArgoApplicationRestHandlerImpl) ManagedResources(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) applicationName := vars["applicationName"] query := &application2.ResourcesQuery{ @@ -361,7 +362,7 @@ func (impl ApplicationRestHandlerImpl) ManagedResources(w http.ResponseWriter, r impl.pump.StartMessage(w, recv, err) } -func (impl ApplicationRestHandlerImpl) Rollback(w http.ResponseWriter, r *http.Request) { +func (impl ArgoApplicationRestHandlerImpl) Rollback(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) name := vars["name"] decoder := json.NewDecoder(r.Body) @@ -369,7 +370,7 @@ func (impl ApplicationRestHandlerImpl) Rollback(w http.ResponseWriter, r *http.R err := decoder.Decode(query) if err != nil { impl.logger.Error(err) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } query.Name = &name @@ -390,7 +391,7 @@ func (impl ApplicationRestHandlerImpl) Rollback(w http.ResponseWriter, r *http.R impl.pump.StartMessage(w, recv, err) } -func (impl ApplicationRestHandlerImpl) GetManifests(w http.ResponseWriter, r *http.Request) { +func (impl ArgoApplicationRestHandlerImpl) GetManifests(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) name := vars["name"] v := r.URL.Query() @@ -416,7 +417,7 @@ func (impl ApplicationRestHandlerImpl) GetManifests(w http.ResponseWriter, r *ht impl.pump.StartMessage(w, recv, err) } -func (impl ApplicationRestHandlerImpl) Get(w http.ResponseWriter, r *http.Request) { +func (impl ArgoApplicationRestHandlerImpl) Get(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) name := vars["name"] v := r.URL.Query() @@ -448,7 +449,7 @@ func (impl ApplicationRestHandlerImpl) Get(w http.ResponseWriter, r *http.Reques impl.pump.StartMessage(w, recv, err) } -func (impl ApplicationRestHandlerImpl) Sync(w http.ResponseWriter, r *http.Request) { +func (impl ArgoApplicationRestHandlerImpl) Sync(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) name := vars["name"] decoder := json.NewDecoder(r.Body) @@ -457,7 +458,7 @@ func (impl ApplicationRestHandlerImpl) Sync(w http.ResponseWriter, r *http.Reque query.Name = &name if err != nil { impl.logger.Error(err) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } token := r.Header.Get("token") @@ -477,7 +478,7 @@ func (impl ApplicationRestHandlerImpl) Sync(w http.ResponseWriter, r *http.Reque impl.pump.StartMessage(w, recv, err) } -func (impl ApplicationRestHandlerImpl) TerminateOperation(w http.ResponseWriter, r *http.Request) { +func (impl ArgoApplicationRestHandlerImpl) TerminateOperation(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) name := vars["name"] query := application2.OperationTerminateRequest{ @@ -500,23 +501,23 @@ func (impl ApplicationRestHandlerImpl) TerminateOperation(w http.ResponseWriter, impl.pump.StartMessage(w, recv, err) } -func (impl ApplicationRestHandlerImpl) PatchResource(w http.ResponseWriter, r *http.Request) { +func (impl ArgoApplicationRestHandlerImpl) PatchResource(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) name := vars["name"] token := r.Header.Get("token") appId := vars["appId"] id, err := strconv.Atoi(appId) if err != nil { - writeJsonResp(w, fmt.Errorf("appId is not integer"), nil, http.StatusBadRequest) + common.WriteJsonResp(w, fmt.Errorf("appId is not integer"), nil, http.StatusBadRequest) return } app := impl.enforcerUtil.GetAppRBACNameByAppId(id) if app == "" { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) return } if ok := impl.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionTrigger, app); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) return } decoder := json.NewDecoder(r.Body) @@ -524,7 +525,7 @@ func (impl ApplicationRestHandlerImpl) PatchResource(w http.ResponseWriter, r *h err = decoder.Decode(query.Patch) if err != nil { impl.logger.Error(err) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } query.Name = &name @@ -544,7 +545,7 @@ func (impl ApplicationRestHandlerImpl) PatchResource(w http.ResponseWriter, r *h impl.pump.StartMessage(w, recv, err) } -func (impl ApplicationRestHandlerImpl) DeleteResource(w http.ResponseWriter, r *http.Request) { +func (impl ArgoApplicationRestHandlerImpl) DeleteResource(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) appNameACD := vars["appNameACD"] name := vars["name"] @@ -558,7 +559,7 @@ func (impl ApplicationRestHandlerImpl) DeleteResource(w http.ResponseWriter, r * force = false } if name == "" || namespace == "" || resourceName == "" || version == "" || kind == "" { - writeJsonResp(w, fmt.Errorf("missing mandatory field (name | namespace | resourceName | kind)"), nil, http.StatusBadRequest) + common.WriteJsonResp(w, fmt.Errorf("missing mandatory field (name | namespace | resourceName | kind)"), nil, http.StatusBadRequest) } query := new(application2.ApplicationResourceDeleteRequest) query.Name = &appNameACD @@ -573,30 +574,30 @@ func (impl ApplicationRestHandlerImpl) DeleteResource(w http.ResponseWriter, r * envId := vars["envId"] id, err := strconv.Atoi(appId) if err != nil { - writeJsonResp(w, fmt.Errorf("appId is not integer"), nil, http.StatusBadRequest) + common.WriteJsonResp(w, fmt.Errorf("appId is not integer"), nil, http.StatusBadRequest) return } eId, err := strconv.Atoi(envId) if err != nil { - writeJsonResp(w, fmt.Errorf("envId is not integer"), nil, http.StatusBadRequest) + common.WriteJsonResp(w, fmt.Errorf("envId is not integer"), nil, http.StatusBadRequest) return } appRbacObject := impl.enforcerUtil.GetAppRBACNameByAppId(id) if appRbacObject == "" { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) return } envRbacObject := impl.enforcerUtil.GetEnvRBACNameByAppId(id, eId) if envRbacObject == "" { - writeJsonResp(w, fmt.Errorf("envId is incorrect"), nil, http.StatusBadRequest) + common.WriteJsonResp(w, fmt.Errorf("envId is incorrect"), nil, http.StatusBadRequest) return } if ok := impl.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionTrigger, appRbacObject); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) return } if ok := impl.enforcer.Enforce(token, rbac.ResourceEnvironment, rbac.ActionTrigger, envRbacObject); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) return } ctx, cancel := context.WithCancel(r.Context()) @@ -615,7 +616,7 @@ func (impl ApplicationRestHandlerImpl) DeleteResource(w http.ResponseWriter, r * impl.pump.StartMessage(w, recv, err) } -func (impl ApplicationRestHandlerImpl) GetServiceLink(w http.ResponseWriter, r *http.Request) { +func (impl ArgoApplicationRestHandlerImpl) GetServiceLink(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) name := vars["name"] v := r.URL.Query() @@ -706,5 +707,5 @@ func (impl ApplicationRestHandlerImpl) GetServiceLink(w http.ResponseWriter, r * } } } - writeJsonResp(w, err, serviceLink, 200) + common.WriteJsonResp(w, err, serviceLink, 200) } diff --git a/api/restHandler/AttributesRestHanlder.go b/api/restHandler/AttributesRestHanlder.go index 3bfa8017f5..89b9b111dc 100644 --- a/api/restHandler/AttributesRestHanlder.go +++ b/api/restHandler/AttributesRestHanlder.go @@ -20,6 +20,7 @@ package restHandler import ( "encoding/json" "errors" + "github.com/devtron-labs/devtron/api/restHandler/common" "github.com/devtron-labs/devtron/pkg/attributes" "github.com/devtron-labs/devtron/pkg/user" "github.com/devtron-labs/devtron/util/rbac" @@ -57,7 +58,7 @@ func NewAttributesRestHandlerImpl(logger *zap.SugaredLogger, enforcer rbac.Enfor func (handler AttributesRestHandlerImpl) AddAttributes(w http.ResponseWriter, r *http.Request) { userId, err := handler.userService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } decoder := json.NewDecoder(r.Body) @@ -65,13 +66,13 @@ func (handler AttributesRestHandlerImpl) AddAttributes(w http.ResponseWriter, r err = decoder.Decode(&dto) if err != nil { handler.logger.Errorw("request err, AddAttributes", "err", err, "payload", dto) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } token := r.Header.Get("token") if ok := handler.enforcer.Enforce(token, rbac.ResourceGlobal, rbac.ActionCreate, "*"); !ok { - writeJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) + common.WriteJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) return } @@ -79,16 +80,16 @@ func (handler AttributesRestHandlerImpl) AddAttributes(w http.ResponseWriter, r resp, err := handler.attributesService.AddAttributes(&dto) if err != nil { handler.logger.Errorw("service err, AddAttributes", "err", err, "payload", dto) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, nil, resp, http.StatusOK) + common.WriteJsonResp(w, nil, resp, http.StatusOK) } func (handler AttributesRestHandlerImpl) UpdateAttributes(w http.ResponseWriter, r *http.Request) { userId, err := handler.userService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } @@ -97,13 +98,13 @@ func (handler AttributesRestHandlerImpl) UpdateAttributes(w http.ResponseWriter, err = decoder.Decode(&dto) if err != nil { handler.logger.Errorw("request err, UpdateAttributes", "err", err, "payload", dto) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } token := r.Header.Get("token") if ok := handler.enforcer.Enforce(token, rbac.ResourceGlobal, rbac.ActionUpdate, "*"); !ok { - writeJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) + common.WriteJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) return } @@ -111,72 +112,72 @@ func (handler AttributesRestHandlerImpl) UpdateAttributes(w http.ResponseWriter, resp, err := handler.attributesService.UpdateAttributes(&dto) if err != nil { handler.logger.Errorw("service err, UpdateAttributes", "err", err, "payload", dto) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, nil, resp, http.StatusOK) + common.WriteJsonResp(w, nil, resp, http.StatusOK) } func (handler AttributesRestHandlerImpl) GetAttributesById(w http.ResponseWriter, r *http.Request) { userId, err := handler.userService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } token := r.Header.Get("token") if ok := handler.enforcer.Enforce(token, rbac.ResourceGlobal, rbac.ActionGet, "*"); !ok { - writeJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) + common.WriteJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) return } vars := mux.Vars(r) id, err := strconv.Atoi(vars["id"]) if err != nil { - writeJsonResp(w, err, "", http.StatusBadRequest) + common.WriteJsonResp(w, err, "", http.StatusBadRequest) return } res, err := handler.attributesService.GetById(id) if err != nil { handler.logger.Errorw("service err, GetAttributesById", "err", err) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, nil, res, http.StatusOK) + common.WriteJsonResp(w, nil, res, http.StatusOK) } func (handler AttributesRestHandlerImpl) GetAttributesActiveList(w http.ResponseWriter, r *http.Request) { userId, err := handler.userService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } token := r.Header.Get("token") if ok := handler.enforcer.Enforce(token, rbac.ResourceGlobal, rbac.ActionGet, "*"); !ok { - writeJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) + common.WriteJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) return } res, err := handler.attributesService.GetActiveList() if err != nil { handler.logger.Errorw("service err, GetHostUrlActive", "err", err) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, nil, res, http.StatusOK) + common.WriteJsonResp(w, nil, res, http.StatusOK) } func (handler AttributesRestHandlerImpl) GetAttributesByKey(w http.ResponseWriter, r *http.Request) { userId, err := handler.userService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } /*token := r.Header.Get("token") if ok := handler.enforcer.Enforce(token, rbac.ResourceGlobal, rbac.ActionGet, "*"); !ok { - writeJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) + WriteJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) return }*/ @@ -185,8 +186,8 @@ func (handler AttributesRestHandlerImpl) GetAttributesByKey(w http.ResponseWrite res, err := handler.attributesService.GetByKey(key) if err != nil { handler.logger.Errorw("service err, GetAttributesById", "err", err) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, nil, res, http.StatusOK) + common.WriteJsonResp(w, nil, res, http.StatusOK) } diff --git a/api/restHandler/BatchOperationRestHandler.go b/api/restHandler/BatchOperationRestHandler.go index 36416e4d6e..abe2f116a4 100644 --- a/api/restHandler/BatchOperationRestHandler.go +++ b/api/restHandler/BatchOperationRestHandler.go @@ -22,6 +22,7 @@ import ( "encoding/json" "errors" "fmt" + "github.com/devtron-labs/devtron/api/restHandler/common" "github.com/devtron-labs/devtron/pkg/apis/devtron/v1" "github.com/devtron-labs/devtron/pkg/apis/devtron/v1/validation" "github.com/devtron-labs/devtron/pkg/appClone/batch" @@ -61,14 +62,14 @@ func (handler BatchOperationRestHandlerImpl) Operate(w http.ResponseWriter, r *h decoder := json.NewDecoder(r.Body) userId, err := handler.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } var data map[string]interface{} err = decoder.Decode(&data) if err != nil { handler.logger.Errorw("request err, Operate", "err", err, "payload", data) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } @@ -80,24 +81,24 @@ func (handler BatchOperationRestHandlerImpl) Operate(w http.ResponseWriter, r *h wfd, err := json.Marshal(wf) if err != nil { handler.logger.Errorw("marshaling err, Operate", "err", err, "wf", wf) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } err = json.Unmarshal(wfd, &workflow) if err != nil { handler.logger.Errorw("marshaling err, Operate", "err", err, "workflow", workflow) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } if workflow.Destination.App == nil || len(*workflow.Destination.App) == 0 { - writeJsonResp(w, errors.New("app name cannot be empty"), nil, http.StatusBadRequest) + common.WriteJsonResp(w, errors.New("app name cannot be empty"), nil, http.StatusBadRequest) } team, err := handler.teamService.FindActiveTeamByAppName(*workflow.Destination.App) if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionCreate, fmt.Sprintf("%s/%s", strings.ToLower(team.Name), "*")); !ok { - writeJsonResp(w, err, "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden) return } @@ -116,12 +117,12 @@ func (handler BatchOperationRestHandlerImpl) Operate(w http.ResponseWriter, r *h err = handler.workflowAction.Execute(&workflow, emptyProps, ctx) if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } } - writeJsonResp(w, nil, `{"result": "ok"}`, http.StatusOK) + common.WriteJsonResp(w, nil, `{"result": "ok"}`, http.StatusOK) //panic("implement me") } diff --git a/api/restHandler/BulkUpdateRestHandler.go b/api/restHandler/BulkUpdateRestHandler.go index 37e72b53fb..8ce0c6ae24 100644 --- a/api/restHandler/BulkUpdateRestHandler.go +++ b/api/restHandler/BulkUpdateRestHandler.go @@ -3,6 +3,7 @@ package restHandler import ( "encoding/json" "fmt" + "github.com/devtron-labs/devtron/api/restHandler/common" "github.com/devtron-labs/devtron/client/argocdServer/application" "github.com/devtron-labs/devtron/client/gitSensor" "github.com/devtron-labs/devtron/internal/sql/repository/pipelineConfig" @@ -111,13 +112,13 @@ func (handler BulkUpdateRestHandlerImpl) FindBulkUpdateReadme(w http.ResponseWri operation = fmt.Sprintf("%s/%s", apiVersion, kind) response, err := handler.bulkUpdateService.FindBulkUpdateReadme(operation) if err != nil { - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } //auth free, only login required var responseArr []*pipeline.BulkUpdateSeeExampleResponse responseArr = append(responseArr, response) - writeJsonResp(w, nil, responseArr, http.StatusOK) + common.WriteJsonResp(w, nil, responseArr, http.StatusOK) } func (handler BulkUpdateRestHandlerImpl) CheckAuthForImpactedObjects(AppId int, EnvId int, appResourceObjects map[int]string, envResourceObjects map[string]string, token string) bool { @@ -140,41 +141,41 @@ func (handler BulkUpdateRestHandlerImpl) GetImpactedAppsName(w http.ResponseWrit var script pipeline.BulkUpdateScript err := decoder.Decode(&script) if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } err = handler.validator.Struct(script) if err != nil { handler.logger.Errorw("validation err, Script", "err", err, "BulkUpdateScript", script) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } token := r.Header.Get("token") impactedApps, err := handler.bulkUpdateService.GetBulkAppName(script.Spec) if err != nil { - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } appResourceObjects, envResourceObjects := handler.enforcerUtil.GetRbacObjectsForAllAppsAndEnvironments() for _, deploymentTemplateImpactedApp := range impactedApps.DeploymentTemplate { ok := handler.CheckAuthForImpactedObjects(deploymentTemplateImpactedApp.AppId, deploymentTemplateImpactedApp.EnvId, appResourceObjects, envResourceObjects, token) if !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) } } for _, configMapImpactedApp := range impactedApps.ConfigMap { ok := handler.CheckAuthForImpactedObjects(configMapImpactedApp.AppId, configMapImpactedApp.EnvId, appResourceObjects, envResourceObjects, token) if !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) } } for _, secretImpactedApp := range impactedApps.Secret { ok := handler.CheckAuthForImpactedObjects(secretImpactedApp.AppId, secretImpactedApp.EnvId, appResourceObjects, envResourceObjects, token) if !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) } } - writeJsonResp(w, err, impactedApps, http.StatusOK) + common.WriteJsonResp(w, err, impactedApps, http.StatusOK) } func (handler BulkUpdateRestHandlerImpl) CheckAuthForBulkUpdate(AppId int, EnvId int, AppName string, rbacObjects map[int]string, token string) bool { resourceName := rbacObjects[AppId] @@ -195,41 +196,41 @@ func (handler BulkUpdateRestHandlerImpl) BulkUpdate(w http.ResponseWriter, r *ht var script pipeline.BulkUpdateScript err := decoder.Decode(&script) if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } err = handler.validator.Struct(script) if err != nil { handler.logger.Errorw("validation err, Script", "err", err, "BulkUpdateScript", script) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } token := r.Header.Get("token") impactedApps, err := handler.bulkUpdateService.GetBulkAppName(script.Spec) if err != nil { - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } rbacObjects := handler.enforcerUtil.GetRbacObjectsForAllApps() for _, deploymentTemplateImpactedApp := range impactedApps.DeploymentTemplate { ok := handler.CheckAuthForBulkUpdate(deploymentTemplateImpactedApp.AppId, deploymentTemplateImpactedApp.EnvId, deploymentTemplateImpactedApp.AppName, rbacObjects, token) if !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) } } for _, configMapImpactedApp := range impactedApps.ConfigMap { ok := handler.CheckAuthForBulkUpdate(configMapImpactedApp.AppId, configMapImpactedApp.EnvId, configMapImpactedApp.AppName, rbacObjects, token) if !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) } } for _, secretImpactedApp := range impactedApps.Secret { ok := handler.CheckAuthForBulkUpdate(secretImpactedApp.AppId, secretImpactedApp.EnvId, secretImpactedApp.AppName, rbacObjects, token) if !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) } } response := handler.bulkUpdateService.BulkUpdate(script.Spec) - writeJsonResp(w, nil, response, http.StatusOK) + common.WriteJsonResp(w, nil, response, http.StatusOK) } diff --git a/api/restHandler/ChartGroupRestHandler.go b/api/restHandler/ChartGroupRestHandler.go index c686f54624..bbb40afd90 100644 --- a/api/restHandler/ChartGroupRestHandler.go +++ b/api/restHandler/ChartGroupRestHandler.go @@ -20,6 +20,7 @@ package restHandler import ( "encoding/json" "fmt" + "github.com/devtron-labs/devtron/api/restHandler/common" "github.com/devtron-labs/devtron/pkg/appstore" "github.com/devtron-labs/devtron/pkg/user" "github.com/devtron-labs/devtron/util/rbac" @@ -65,7 +66,7 @@ type ChartGroupRestHandler interface { func (impl *ChartGroupRestHandlerImpl) CreateChartGroup(w http.ResponseWriter, r *http.Request) { userId, err := impl.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } decoder := json.NewDecoder(r.Body) @@ -73,13 +74,13 @@ func (impl *ChartGroupRestHandlerImpl) CreateChartGroup(w http.ResponseWriter, r err = decoder.Decode(&request) if err != nil { impl.Logger.Errorw("request err, CreateChartGroup", "err", err, "payload", request) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } err = impl.validator.Struct(request) if err != nil { impl.Logger.Errorw("validate err, CreateChartGroup", "err", err, "payload", request) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } request.UserId = userId @@ -89,7 +90,7 @@ func (impl *ChartGroupRestHandlerImpl) CreateChartGroup(w http.ResponseWriter, r token := r.Header.Get("token") rbacObject := request.Name if ok := impl.enforcer.Enforce(token, rbac.ResourceChartGroup, rbac.ActionCreate, rbacObject); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) return } //RBAC block ends here @@ -97,16 +98,16 @@ func (impl *ChartGroupRestHandlerImpl) CreateChartGroup(w http.ResponseWriter, r res, err := impl.ChartGroupService.CreateChartGroup(&request) if err != nil { impl.Logger.Errorw("service err, CreateChartGroup", "err", err, "payload", request) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } func (impl *ChartGroupRestHandlerImpl) UpdateChartGroup(w http.ResponseWriter, r *http.Request) { userId, err := impl.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } decoder := json.NewDecoder(r.Body) @@ -114,13 +115,13 @@ func (impl *ChartGroupRestHandlerImpl) UpdateChartGroup(w http.ResponseWriter, r err = decoder.Decode(&request) if err != nil { impl.Logger.Errorw("request err, UpdateChartGroup", "err", err, "payload", request) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } err = impl.validator.Struct(request) if err != nil { impl.Logger.Errorw("validate err, UpdateChartGroup", "err", err, "payload", request) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } request.UserId = userId @@ -130,7 +131,7 @@ func (impl *ChartGroupRestHandlerImpl) UpdateChartGroup(w http.ResponseWriter, r token := r.Header.Get("token") rbacObject := request.Name if ok := impl.enforcer.Enforce(token, rbac.ResourceChartGroup, rbac.ActionUpdate, rbacObject); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) return } //RBAC block ends here @@ -138,16 +139,16 @@ func (impl *ChartGroupRestHandlerImpl) UpdateChartGroup(w http.ResponseWriter, r res, err := impl.ChartGroupService.UpdateChartGroup(&request) if err != nil { impl.Logger.Errorw("service err, UpdateChartGroup", "err", err, "payload", request) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } func (impl *ChartGroupRestHandlerImpl) SaveChartGroupEntries(w http.ResponseWriter, r *http.Request) { userId, err := impl.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } decoder := json.NewDecoder(r.Body) @@ -155,7 +156,7 @@ func (impl *ChartGroupRestHandlerImpl) SaveChartGroupEntries(w http.ResponseWrit err = decoder.Decode(&request) if err != nil { impl.Logger.Errorw("request err, SaveChartGroupEntries", "err", err, "payload", request) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } request.UserId = userId @@ -163,30 +164,30 @@ func (impl *ChartGroupRestHandlerImpl) SaveChartGroupEntries(w http.ResponseWrit token := r.Header.Get("token") rbacObject := request.Name if ok := impl.enforcer.Enforce(token, rbac.ResourceChartGroup, rbac.ActionCreate, rbacObject); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) return } //RBAC block ends here res, err := impl.ChartGroupService.SaveChartGroupEntries(&request) if err != nil { impl.Logger.Errorw("service err, SaveChartGroupEntries", "err", err, "payload", request) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } func (impl *ChartGroupRestHandlerImpl) GetChartGroupWithChartMetaData(w http.ResponseWriter, r *http.Request) { userId, err := impl.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } vars := mux.Vars(r) chartGroupId, err := strconv.Atoi(vars["chartGroupId"]) if err != nil { impl.Logger.Errorw("request err, GetChartGroupWithChartMetaData", "err", err, "chartGroupId", chartGroupId) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } @@ -194,7 +195,7 @@ func (impl *ChartGroupRestHandlerImpl) GetChartGroupWithChartMetaData(w http.Res token := r.Header.Get("token") rbacObject := "" if ok := impl.enforcer.Enforce(token, rbac.ResourceChartGroup, rbac.ActionGet, rbacObject); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) return } //RBAC block ends here @@ -202,23 +203,23 @@ func (impl *ChartGroupRestHandlerImpl) GetChartGroupWithChartMetaData(w http.Res res, err := impl.ChartGroupService.GetChartGroupWithChartMetaData(chartGroupId) if err != nil { impl.Logger.Errorw("service err, GetChartGroupWithChartMetaData", "err", err, "chartGroupId", chartGroupId) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } func (impl *ChartGroupRestHandlerImpl) GetChartGroupInstallationDetail(w http.ResponseWriter, r *http.Request) { userId, err := impl.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } vars := mux.Vars(r) chartGroupId, err := strconv.Atoi(vars["chartGroupId"]) if err != nil { impl.Logger.Errorw("request err, GetChartGroupInstallationDetail", "err", err, "chartGroupId", chartGroupId) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } @@ -226,7 +227,7 @@ func (impl *ChartGroupRestHandlerImpl) GetChartGroupInstallationDetail(w http.Re token := r.Header.Get("token") rbacObject := "" if ok := impl.enforcer.Enforce(token, rbac.ResourceChartGroup, rbac.ActionGet, rbacObject); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) return } //RBAC block ends here @@ -234,16 +235,16 @@ func (impl *ChartGroupRestHandlerImpl) GetChartGroupInstallationDetail(w http.Re res, err := impl.ChartGroupService.GetChartGroupWithInstallationDetail(chartGroupId) if err != nil { impl.Logger.Errorw("service err, GetChartGroupInstallationDetail", "err", err, "chartGroupId", chartGroupId) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } func (impl *ChartGroupRestHandlerImpl) GetChartGroupList(w http.ResponseWriter, r *http.Request) { userId, err := impl.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } @@ -251,7 +252,7 @@ func (impl *ChartGroupRestHandlerImpl) GetChartGroupList(w http.ResponseWriter, token := r.Header.Get("token") rbacObject := "" if ok := impl.enforcer.Enforce(token, rbac.ResourceChartGroup, rbac.ActionGet, rbacObject); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) return } //RBAC block ends here @@ -262,23 +263,23 @@ func (impl *ChartGroupRestHandlerImpl) GetChartGroupList(w http.ResponseWriter, maxCount, err = strconv.Atoi(max) if err != nil { impl.Logger.Errorw("request err, GetChartGroupList", "err", err, "max", max) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } } res, err := impl.ChartGroupService.ChartGroupList(maxCount) if err != nil { impl.Logger.Errorw("service err, GetChartGroupList", "err", err, "max", max) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } func (impl *ChartGroupRestHandlerImpl) GetChartGroupListMin(w http.ResponseWriter, r *http.Request) { userId, err := impl.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } @@ -286,7 +287,7 @@ func (impl *ChartGroupRestHandlerImpl) GetChartGroupListMin(w http.ResponseWrite token := r.Header.Get("token") rbacObject := "" if ok := impl.enforcer.Enforce(token, rbac.ResourceChartGroup, rbac.ActionGet, rbacObject); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) return } //RBAC block ends here @@ -297,15 +298,15 @@ func (impl *ChartGroupRestHandlerImpl) GetChartGroupListMin(w http.ResponseWrite maxCount, err = strconv.Atoi(max) if err != nil { impl.Logger.Errorw("request err, GetChartGroupListMin", "err", err, "max", max) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } } res, err := impl.ChartGroupService.ChartGroupListMin(maxCount) if err != nil { impl.Logger.Errorw("service err, GetChartGroupListMin", "err", err, "max", max) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } diff --git a/api/restHandler/ChartRefRestHandler.go b/api/restHandler/ChartRefRestHandler.go index 98b896cc59..a2f13a6e44 100644 --- a/api/restHandler/ChartRefRestHandler.go +++ b/api/restHandler/ChartRefRestHandler.go @@ -18,6 +18,7 @@ package restHandler import ( + "github.com/devtron-labs/devtron/api/restHandler/common" "github.com/devtron-labs/devtron/pkg/pipeline" "github.com/gorilla/mux" "go.uber.org/zap" @@ -45,11 +46,11 @@ func (handler ChartRefRestHandlerImpl) ChartRefAutocomplete(w http.ResponseWrite result, err := handler.chartService.ChartRefAutocomplete() if err != nil { handler.logger.Errorw("service err, ChartRefAutocomplete", "err", err) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, result, http.StatusOK) + common.WriteJsonResp(w, err, result, http.StatusOK) } func (handler ChartRefRestHandlerImpl) ChartRefAutocompleteForApp(w http.ResponseWriter, r *http.Request) { @@ -57,17 +58,17 @@ func (handler ChartRefRestHandlerImpl) ChartRefAutocompleteForApp(w http.Respons appId, err := strconv.Atoi(vars["appId"]) if err != nil { handler.logger.Errorw("request err, ChartRefAutocompleteForApp", "err", err, "appId", appId) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } result, err := handler.chartService.ChartRefAutocompleteForAppOrEnv(appId, 0) if err != nil { handler.logger.Errorw("service err, ChartRefAutocompleteForApp", "err", err, "appId", appId) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, result, http.StatusOK) + common.WriteJsonResp(w, err, result, http.StatusOK) } func (handler ChartRefRestHandlerImpl) ChartRefAutocompleteForEnv(w http.ResponseWriter, r *http.Request) { @@ -75,21 +76,21 @@ func (handler ChartRefRestHandlerImpl) ChartRefAutocompleteForEnv(w http.Respons appId, err := strconv.Atoi(vars["appId"]) if err != nil { handler.logger.Errorw("request err, ChartRefAutocompleteForEnv", "err", err, "appId", appId) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } environmentId, err := strconv.Atoi(vars["environmentId"]) if err != nil { handler.logger.Errorw("request err, ChartRefAutocompleteForEnv", "err", err, "appId", appId, "environmentId", environmentId) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } result, err := handler.chartService.ChartRefAutocompleteForAppOrEnv(appId, environmentId) if err != nil { handler.logger.Errorw("service err, ChartRefAutocompleteForEnv", "err", err, "appId", appId, "environmentId", environmentId) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, result, http.StatusOK) + common.WriteJsonResp(w, err, result, http.StatusOK) } diff --git a/api/restHandler/ClusterAccountsRestHandler.go b/api/restHandler/ClusterAccountsRestHandler.go index f21da3edf8..cb0fa847a0 100644 --- a/api/restHandler/ClusterAccountsRestHandler.go +++ b/api/restHandler/ClusterAccountsRestHandler.go @@ -19,6 +19,7 @@ package restHandler import ( "encoding/json" + "github.com/devtron-labs/devtron/api/restHandler/common" request "github.com/devtron-labs/devtron/pkg/cluster" "github.com/devtron-labs/devtron/pkg/user" "github.com/gorilla/mux" @@ -58,23 +59,23 @@ func (impl ClusterAccountsRestHandlerImpl) Save(w http.ResponseWriter, r *http.R userId, err := impl.userService.GetLoggedInUser(r) impl.logger.Debugf("request by user %s \n", userId) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } var bean request.ClusterAccountsBean err = decoder.Decode(&bean) if err != nil { impl.logger.Error(err) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } err = impl.clusterAccountsService.Save(&bean, userId) if err != nil { impl.logger.Errorw("error in saving cluster account details", "err", err) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, nil, http.StatusCreated) + common.WriteJsonResp(w, err, nil, http.StatusCreated) } func (impl ClusterAccountsRestHandlerImpl) Get(w http.ResponseWriter, r *http.Request) { @@ -82,10 +83,10 @@ func (impl ClusterAccountsRestHandlerImpl) Get(w http.ResponseWriter, r *http.Re clusterName := vars["clusterName"] bean, err := impl.clusterAccountsService.FindOne(clusterName) if err != nil { - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, bean, http.StatusOK) + common.WriteJsonResp(w, err, bean, http.StatusOK) } func (impl ClusterAccountsRestHandlerImpl) GetByEnvironment(w http.ResponseWriter, r *http.Request) { @@ -93,10 +94,10 @@ func (impl ClusterAccountsRestHandlerImpl) GetByEnvironment(w http.ResponseWrite environment := vars["environment"] bean, err := impl.clusterAccountsService.FindOneByEnvironment(environment) if err != nil { - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, bean, http.StatusOK) + common.WriteJsonResp(w, err, bean, http.StatusOK) } func (impl ClusterAccountsRestHandlerImpl) Update(w http.ResponseWriter, r *http.Request) { @@ -105,23 +106,23 @@ func (impl ClusterAccountsRestHandlerImpl) Update(w http.ResponseWriter, r *http userId, err := impl.userService.GetLoggedInUser(r) impl.logger.Debugf("request by user %s \n", userId) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } var bean request.ClusterAccountsBean err = decoder.Decode(&bean) if err != nil { impl.logger.Error(err) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } err = impl.clusterAccountsService.Update(&bean, userId) if err != nil { impl.logger.Errorw("error in updating cluster account details", "err", err) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, nil, http.StatusCreated) + common.WriteJsonResp(w, err, nil, http.StatusCreated) } func (impl ClusterAccountsRestHandlerImpl) FindById(w http.ResponseWriter, r *http.Request) { @@ -129,17 +130,17 @@ func (impl ClusterAccountsRestHandlerImpl) FindById(w http.ResponseWriter, r *ht id, _ := strconv.Atoi(vars["id"]) bean, err := impl.clusterAccountsService.FindById(id) if err != nil { - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, bean, http.StatusOK) + common.WriteJsonResp(w, err, bean, http.StatusOK) } func (impl ClusterAccountsRestHandlerImpl) FindAll(w http.ResponseWriter, r *http.Request) { beans, err := impl.clusterAccountsService.FindAll() if err != nil { - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, beans, http.StatusOK) + common.WriteJsonResp(w, err, beans, http.StatusOK) } diff --git a/api/restHandler/ClusterHelmConfigRestHandler.go b/api/restHandler/ClusterHelmConfigRestHandler.go index 8b593f9cd9..154b1729b0 100644 --- a/api/restHandler/ClusterHelmConfigRestHandler.go +++ b/api/restHandler/ClusterHelmConfigRestHandler.go @@ -19,6 +19,7 @@ package restHandler import ( "encoding/json" + "github.com/devtron-labs/devtron/api/restHandler/common" "github.com/devtron-labs/devtron/pkg/cluster" "github.com/devtron-labs/devtron/pkg/user" "github.com/gorilla/mux" @@ -49,24 +50,24 @@ func (impl ClusterHelmConfigRestHandlerImpl) Save(w http.ResponseWriter, r *http decoder := json.NewDecoder(r.Body) userId, err := impl.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } var bean cluster.ClusterHelmConfigBean err = decoder.Decode(&bean) if err != nil { impl.logger.Errorw("request err, Save", "err", err, "payload", bean) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } impl.logger.Errorw("request payload, Save", "err", err, "payload", bean) err = impl.clusterHelmConfigService.Save(&bean, userId) if err != nil { impl.logger.Errorw("service err, Save", "err", err, "payload", bean) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, nil, http.StatusCreated) + common.WriteJsonResp(w, err, nil, http.StatusCreated) } func (impl ClusterHelmConfigRestHandlerImpl) GetByEnvironment(w http.ResponseWriter, r *http.Request) { @@ -75,8 +76,8 @@ func (impl ClusterHelmConfigRestHandlerImpl) GetByEnvironment(w http.ResponseWri bean, err := impl.clusterHelmConfigService.FindOneByEnvironment(environment) if err != nil { impl.logger.Errorw("service err, GetByEnvironment", "err", err, "environment", environment) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, bean, http.StatusOK) + common.WriteJsonResp(w, err, bean, http.StatusOK) } diff --git a/api/restHandler/ClusterRestHandler.go b/api/restHandler/ClusterRestHandler.go index a489343bd4..e1235da46c 100644 --- a/api/restHandler/ClusterRestHandler.go +++ b/api/restHandler/ClusterRestHandler.go @@ -22,6 +22,7 @@ import ( "encoding/json" "errors" "fmt" + "github.com/devtron-labs/devtron/api/restHandler/common" "net/http" "strconv" "strings" @@ -94,27 +95,27 @@ func (impl ClusterRestHandlerImpl) Save(w http.ResponseWriter, r *http.Request) decoder := json.NewDecoder(r.Body) userId, err := impl.userService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } bean := new(cluster.ClusterBean) err = decoder.Decode(bean) if err != nil { impl.logger.Errorw("request err, Save", "error", err, "payload", bean) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } impl.logger.Errorw("request payload, Save", "payload", bean) err = impl.validator.Struct(bean) if err != nil { impl.logger.Errorw("validation err, Save", "err", err, "payload", bean) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } // RBAC enforcer applying if ok := impl.enforcer.Enforce(token, rbac.ResourceCluster, rbac.ActionCreate, "*"); !ok { - writeJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) + common.WriteJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) return } //RBAC enforcer Ends @@ -122,7 +123,7 @@ func (impl ClusterRestHandlerImpl) Save(w http.ResponseWriter, r *http.Request) bean, err = impl.clusterService.Save(bean, userId) if err != nil { impl.logger.Errorw("service err, Save", "err", err, "payload", bean) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } @@ -168,7 +169,7 @@ func (impl ClusterRestHandlerImpl) Save(w http.ResponseWriter, r *http.Request) InternalMessage: err.Error(), UserMessage: "failed to rollback cluster from db as it has failed in registering on ACD", } - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } err = &util.ApiError{ @@ -176,7 +177,7 @@ func (impl ClusterRestHandlerImpl) Save(w http.ResponseWriter, r *http.Request) InternalMessage: err.Error(), UserMessage: "failed to register on ACD, rollback completed from db", } - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } @@ -189,7 +190,7 @@ func (impl ClusterRestHandlerImpl) Save(w http.ResponseWriter, r *http.Request) } else { bean.AgentInstallationStage = 0 } - writeJsonResp(w, err, bean, http.StatusOK) + common.WriteJsonResp(w, err, bean, http.StatusOK) } func (impl ClusterRestHandlerImpl) FindOne(w http.ResponseWriter, r *http.Request) { @@ -198,7 +199,7 @@ func (impl ClusterRestHandlerImpl) FindOne(w http.ResponseWriter, r *http.Reques // RBAC enforcer applying token := r.Header.Get("token") if ok := impl.enforcer.Enforce(token, rbac.ResourceCluster, rbac.ActionGet, strings.ToLower(cName)); !ok { - writeJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) + common.WriteJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) return } //RBAC enforcer Ends @@ -206,10 +207,10 @@ func (impl ClusterRestHandlerImpl) FindOne(w http.ResponseWriter, r *http.Reques envBean, err := impl.clusterService.FindOne(cName) if err != nil { impl.logger.Errorw("service err, FindOne", "error", err, "cluster name", cName) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, envBean, http.StatusOK) + common.WriteJsonResp(w, err, envBean, http.StatusOK) } func (impl ClusterRestHandlerImpl) FindAll(w http.ResponseWriter, r *http.Request) { @@ -217,7 +218,7 @@ func (impl ClusterRestHandlerImpl) FindAll(w http.ResponseWriter, r *http.Reques clusterList, err := impl.clusterService.FindAll() if err != nil { impl.logger.Errorw("service err, FindAll", "err", err) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } @@ -230,7 +231,7 @@ func (impl ClusterRestHandlerImpl) FindAll(w http.ResponseWriter, r *http.Reques } //RBAC enforcer Ends - writeJsonResp(w, err, result, http.StatusOK) + common.WriteJsonResp(w, err, result, http.StatusOK) } func (impl ClusterRestHandlerImpl) FindById(w http.ResponseWriter, r *http.Request) { @@ -239,25 +240,25 @@ func (impl ClusterRestHandlerImpl) FindById(w http.ResponseWriter, r *http.Reque i, err := strconv.Atoi(id) if err != nil { impl.logger.Errorw("request err, FindById", "error", err, "clusterId", id) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } bean, err := impl.clusterService.FindById(i) if err != nil { impl.logger.Errorw("service err, FindById", "err", err, "clusterId", id) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } // RBAC enforcer applying token := r.Header.Get("token") if ok := impl.enforcer.Enforce(token, rbac.ResourceCluster, rbac.ActionGet, strings.ToLower(bean.ClusterName)); !ok { - writeJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) + common.WriteJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) return } //RBAC enforcer Ends - writeJsonResp(w, err, bean, http.StatusOK) + common.WriteJsonResp(w, err, bean, http.StatusOK) } func (impl ClusterRestHandlerImpl) FindByEnvId(w http.ResponseWriter, r *http.Request) { @@ -266,24 +267,24 @@ func (impl ClusterRestHandlerImpl) FindByEnvId(w http.ResponseWriter, r *http.Re idi, err := strconv.Atoi(id) if err != nil { impl.logger.Errorw("request err, FindByEnvId", "error", err, "clusterId", id) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } envBean, err := impl.envService.FindClusterByEnvId(idi) if err != nil { impl.logger.Errorw("service err, FindByEnvId", "error", err, "clusterId", id) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } // RBAC enforcer applying token := r.Header.Get("token") if ok := impl.enforcer.Enforce(token, rbac.ResourceCluster, rbac.ActionGet, strings.ToLower(envBean.ClusterName)); !ok { - writeJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) + common.WriteJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) return } // RBAC enforcer ends - writeJsonResp(w, err, envBean, http.StatusOK) + common.WriteJsonResp(w, err, envBean, http.StatusOK) } func (impl ClusterRestHandlerImpl) Update(w http.ResponseWriter, r *http.Request) { @@ -292,27 +293,27 @@ func (impl ClusterRestHandlerImpl) Update(w http.ResponseWriter, r *http.Request userId, err := impl.userService.GetLoggedInUser(r) if userId == 0 || err != nil { impl.logger.Errorw("service err, Update", "error", err, "userId", userId) - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } var bean cluster.ClusterBean err = decoder.Decode(&bean) if err != nil { impl.logger.Errorw("request err, Update", "error", err, "payload", bean) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } impl.logger.Errorw("request payload, Update", "payload", bean) err = impl.validator.Struct(bean) if err != nil { impl.logger.Errorw("validate err, Update", "error", err, "payload", bean) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } // RBAC enforcer applying if ok := impl.enforcer.Enforce(token, rbac.ResourceCluster, rbac.ActionUpdate, strings.ToLower(bean.ClusterName)); !ok { - writeJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) + common.WriteJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) return } // RBAC enforcer ends @@ -320,7 +321,7 @@ func (impl ClusterRestHandlerImpl) Update(w http.ResponseWriter, r *http.Request _, err = impl.clusterService.Update(&bean, userId) if err != nil { impl.logger.Errorw("service err, Update", "error", err, "payload", bean) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } @@ -368,10 +369,10 @@ func (impl ClusterRestHandlerImpl) Update(w http.ResponseWriter, r *http.Request InternalMessage: err.Error(), UserMessage: userMsg, } - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, bean, http.StatusOK) + common.WriteJsonResp(w, err, bean, http.StatusOK) } func (impl ClusterRestHandlerImpl) ClusterListFromACD(w http.ResponseWriter, r *http.Request) { @@ -390,12 +391,12 @@ func (impl ClusterRestHandlerImpl) ClusterListFromACD(w http.ResponseWriter, r * cList, err := impl.clusterServiceCD.List(ctx, &cluster3.ClusterQuery{}) if err != nil { impl.logger.Errorw("service err, ClusterListFromACD", "error", err) - writeJsonResp(w, err, "failed to fetch list from ACD:", http.StatusInternalServerError) + common.WriteJsonResp(w, err, "failed to fetch list from ACD:", http.StatusInternalServerError) return } // RBAC enforcer applying if ok := impl.enforcer.Enforce(token, rbac.ResourceCluster, rbac.ActionGet, "*"); !ok { - writeJsonResp(w, err, "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden) return } // RBAC enforcer ends @@ -427,13 +428,13 @@ func (impl ClusterRestHandlerImpl) DeleteClusterFromACD(w http.ResponseWriter, r res, err := impl.clusterServiceCD.Delete(ctx, &cluster3.ClusterQuery{Server: serverUrl}) if err != nil { impl.logger.Errorw("service err, DeleteClusterFromACD", "error", err) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } // RBAC enforcer applying if ok := impl.enforcer.Enforce(token, rbac.ResourceCluster, rbac.ActionDelete, "*"); !ok { - writeJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) + common.WriteJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) return } // RBAC enforcer ends @@ -464,13 +465,13 @@ func (impl ClusterRestHandlerImpl) GetClusterFromACD(w http.ResponseWriter, r *h res, err := impl.clusterServiceCD.Get(ctx, &cluster3.ClusterQuery{Server: serverUrl}) if err != nil { impl.logger.Errorw("service err, GetClusterFromACD", "error", err, "serverUrl", serverUrl) - writeJsonResp(w, err, "failed to fetch from ACD:", http.StatusInternalServerError) + common.WriteJsonResp(w, err, "failed to fetch from ACD:", http.StatusInternalServerError) return } // RBAC enforcer applying if ok := impl.enforcer.Enforce(token, rbac.ResourceCluster, rbac.ActionGet, "*"); !ok { - writeJsonResp(w, err, "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden) return } // RBAC enforcer ends @@ -486,7 +487,7 @@ func (impl ClusterRestHandlerImpl) FindAllForAutoComplete(w http.ResponseWriter, clusterList, err := impl.clusterService.FindAllForAutoComplete() if err != nil { impl.logger.Errorw("service err, FindAllForAutoComplete", "error", err) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } var result []cluster.ClusterBean @@ -518,7 +519,7 @@ func (impl ClusterRestHandlerImpl) FindAllForAutoComplete(w http.ResponseWriter, if len(result) == 0 { result = make([]cluster.ClusterBean, 0) } - writeJsonResp(w, err, result, http.StatusOK) + common.WriteJsonResp(w, err, result, http.StatusOK) } func (impl ClusterRestHandlerImpl) DefaultComponentInstallation(w http.ResponseWriter, r *http.Request) { @@ -526,35 +527,35 @@ func (impl ClusterRestHandlerImpl) DefaultComponentInstallation(w http.ResponseW userId, err := impl.userService.GetLoggedInUser(r) if userId == 0 || err != nil { impl.logger.Errorw("service err, DefaultComponentInstallation", "error", err, "userId", userId) - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } vars := mux.Vars(r) clusterId, err := strconv.Atoi(vars["clusterId"]) if err != nil { impl.logger.Errorw("request err, DefaultComponentInstallation", "error", err, "clusterId", clusterId) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } impl.logger.Errorw("request payload, DefaultComponentInstallation", "clusterId", clusterId) cluster, err := impl.clusterService.FindById(clusterId) if err != nil { impl.logger.Errorw("service err, DefaultComponentInstallation", "error", err, "clusterId", clusterId) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } // RBAC enforcer applying if ok := impl.enforcer.Enforce(token, rbac.ResourceCluster, rbac.ActionUpdate, strings.ToLower(cluster.ClusterName)); !ok { - writeJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) + common.WriteJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) return } // RBAC enforcer ends isTriggered, err := impl.installedAppService.DeployDefaultChartOnCluster(cluster, userId) if err != nil { impl.logger.Errorw("service err, DefaultComponentInstallation", "error", err, "cluster", cluster) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, isTriggered, http.StatusOK) + common.WriteJsonResp(w, err, isTriggered, http.StatusOK) } diff --git a/api/restHandler/CommonRestHanlder.go b/api/restHandler/CommonRestHanlder.go index 4a17909868..6145ebfef1 100644 --- a/api/restHandler/CommonRestHanlder.go +++ b/api/restHandler/CommonRestHanlder.go @@ -18,6 +18,7 @@ package restHandler import ( + "github.com/devtron-labs/devtron/api/restHandler/common" "github.com/devtron-labs/devtron/pkg/commonService" "github.com/devtron-labs/devtron/pkg/gitops" "github.com/devtron-labs/devtron/pkg/user" @@ -57,15 +58,15 @@ func NewCommonRestHanlderImpl( func (impl CommonRestHanlderImpl) GlobalChecklist(w http.ResponseWriter, r *http.Request) { userId, err := impl.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } res, err := impl.commonService.GlobalChecklist() if err != nil { impl.logger.Errorw("service err, GlobalChecklist", "err", err) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } diff --git a/api/restHandler/ConfigMapRestHandler.go b/api/restHandler/ConfigMapRestHandler.go index a7d38f42dc..049ecdbb60 100644 --- a/api/restHandler/ConfigMapRestHandler.go +++ b/api/restHandler/ConfigMapRestHandler.go @@ -21,6 +21,7 @@ import ( "encoding/json" "fmt" "github.com/devtron-labs/devtron/api/bean" + "github.com/devtron-labs/devtron/api/restHandler/common" "github.com/devtron-labs/devtron/internal/sql/repository/pipelineConfig" "github.com/devtron-labs/devtron/pkg/pipeline" "github.com/devtron-labs/devtron/pkg/team" @@ -86,7 +87,7 @@ func (handler ConfigMapRestHandlerImpl) CMGlobalAddUpdate(w http.ResponseWriter, decoder := json.NewDecoder(r.Body) userId, err := handler.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } var configMapRequest pipeline.ConfigDataRequest @@ -94,7 +95,7 @@ func (handler ConfigMapRestHandlerImpl) CMGlobalAddUpdate(w http.ResponseWriter, err = decoder.Decode(&configMapRequest) if err != nil { handler.Logger.Errorw("request err, CMGlobalAddUpdate", "err", err, "payload", configMapRequest) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } configMapRequest.UserId = userId @@ -104,7 +105,7 @@ func (handler ConfigMapRestHandlerImpl) CMGlobalAddUpdate(w http.ResponseWriter, token := r.Header.Get("token") object := handler.enforcerUtil.GetAppRBACNameByAppId(configMapRequest.AppId) if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionCreate, object); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) return } //RBAC END @@ -112,24 +113,24 @@ func (handler ConfigMapRestHandlerImpl) CMGlobalAddUpdate(w http.ResponseWriter, res, err := handler.configMapService.CMGlobalAddUpdate(&configMapRequest) if err != nil { handler.Logger.Errorw("service err, CMGlobalAddUpdate", "err", err, "payload", configMapRequest) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } func (handler ConfigMapRestHandlerImpl) CMEnvironmentAddUpdate(w http.ResponseWriter, r *http.Request) { decoder := json.NewDecoder(r.Body) userId, err := handler.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } var configMapRequest pipeline.ConfigDataRequest err = decoder.Decode(&configMapRequest) if err != nil { handler.Logger.Errorw("request err, CMEnvironmentAddUpdate", "err", err, "payload", configMapRequest) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } configMapRequest.UserId = userId @@ -139,12 +140,12 @@ func (handler ConfigMapRestHandlerImpl) CMEnvironmentAddUpdate(w http.ResponseWr token := r.Header.Get("token") object := handler.enforcerUtil.GetAppRBACNameByAppId(configMapRequest.AppId) if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionCreate, object); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) return } object = handler.enforcerUtil.GetEnvRBACNameByAppId(configMapRequest.AppId, configMapRequest.EnvironmentId) if ok := handler.enforcer.Enforce(token, rbac.ResourceEnvironment, rbac.ActionCreate, object); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) return } //RBAC END @@ -152,23 +153,23 @@ func (handler ConfigMapRestHandlerImpl) CMEnvironmentAddUpdate(w http.ResponseWr res, err := handler.configMapService.CMEnvironmentAddUpdate(&configMapRequest) if err != nil { handler.Logger.Errorw("service err, CMEnvironmentAddUpdate", "err", err, "payload", configMapRequest) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } func (handler ConfigMapRestHandlerImpl) CMGlobalFetch(w http.ResponseWriter, r *http.Request) { userId, err := handler.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } vars := mux.Vars(r) appId, err := strconv.Atoi(vars["appId"]) if err != nil { handler.Logger.Errorw("request err, CMGlobalFetch", "err", err, "appId", appId) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } @@ -176,7 +177,7 @@ func (handler ConfigMapRestHandlerImpl) CMGlobalFetch(w http.ResponseWriter, r * token := r.Header.Get("token") object := handler.enforcerUtil.GetAppRBACNameByAppId(appId) if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) return } //RBAC END @@ -184,29 +185,29 @@ func (handler ConfigMapRestHandlerImpl) CMGlobalFetch(w http.ResponseWriter, r * res, err := handler.configMapService.CMGlobalFetch(appId) if err != nil { handler.Logger.Errorw("service err, CMGlobalFetch", "err", err, "appId", appId) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } func (handler ConfigMapRestHandlerImpl) CMEnvironmentFetch(w http.ResponseWriter, r *http.Request) { userId, err := handler.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } vars := mux.Vars(r) appId, err := strconv.Atoi(vars["appId"]) if err != nil { handler.Logger.Errorw("request err, CMEnvironmentFetch", "err", err, "appId", appId) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } envId, err := strconv.Atoi(vars["envId"]) if err != nil { handler.Logger.Errorw("request err, CMEnvironmentFetch", "err", err, "appId", appId) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } @@ -214,7 +215,7 @@ func (handler ConfigMapRestHandlerImpl) CMEnvironmentFetch(w http.ResponseWriter token := r.Header.Get("token") object := handler.enforcerUtil.GetAppRBACNameByAppId(appId) if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) return } //RBAC END @@ -222,17 +223,17 @@ func (handler ConfigMapRestHandlerImpl) CMEnvironmentFetch(w http.ResponseWriter res, err := handler.configMapService.CMEnvironmentFetch(appId, envId) if err != nil { handler.Logger.Errorw("service err, CMEnvironmentFetch", "err", err, "appId", appId) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } func (handler ConfigMapRestHandlerImpl) CSGlobalAddUpdate(w http.ResponseWriter, r *http.Request) { decoder := json.NewDecoder(r.Body) userId, err := handler.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } var configMapRequest pipeline.ConfigDataRequest @@ -240,7 +241,7 @@ func (handler ConfigMapRestHandlerImpl) CSGlobalAddUpdate(w http.ResponseWriter, err = decoder.Decode(&configMapRequest) if err != nil { handler.Logger.Errorw("request err, CSGlobalAddUpdate", "err", err, "payload", configMapRequest) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } configMapRequest.UserId = userId @@ -250,7 +251,7 @@ func (handler ConfigMapRestHandlerImpl) CSGlobalAddUpdate(w http.ResponseWriter, token := r.Header.Get("token") object := handler.enforcerUtil.GetAppRBACNameByAppId(configMapRequest.AppId) if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionCreate, object); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) return } //RBAC END @@ -258,17 +259,17 @@ func (handler ConfigMapRestHandlerImpl) CSGlobalAddUpdate(w http.ResponseWriter, res, err := handler.configMapService.CSGlobalAddUpdate(&configMapRequest) if err != nil { handler.Logger.Errorw("service err, CSGlobalAddUpdate", "err", err, "payload", configMapRequest) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } func (handler ConfigMapRestHandlerImpl) CSEnvironmentAddUpdate(w http.ResponseWriter, r *http.Request) { decoder := json.NewDecoder(r.Body) userId, err := handler.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } var configMapRequest pipeline.ConfigDataRequest @@ -276,7 +277,7 @@ func (handler ConfigMapRestHandlerImpl) CSEnvironmentAddUpdate(w http.ResponseWr err = decoder.Decode(&configMapRequest) if err != nil { handler.Logger.Errorw("request err, CSEnvironmentAddUpdate", "err", err, "payload", configMapRequest) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } configMapRequest.UserId = userId @@ -286,12 +287,12 @@ func (handler ConfigMapRestHandlerImpl) CSEnvironmentAddUpdate(w http.ResponseWr token := r.Header.Get("token") object := handler.enforcerUtil.GetAppRBACNameByAppId(configMapRequest.AppId) if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionCreate, object); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) return } object = handler.enforcerUtil.GetEnvRBACNameByAppId(configMapRequest.AppId, configMapRequest.EnvironmentId) if ok := handler.enforcer.Enforce(token, rbac.ResourceEnvironment, rbac.ActionCreate, object); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) return } //RBAC END @@ -299,23 +300,23 @@ func (handler ConfigMapRestHandlerImpl) CSEnvironmentAddUpdate(w http.ResponseWr res, err := handler.configMapService.CSEnvironmentAddUpdate(&configMapRequest) if err != nil { handler.Logger.Errorw("service err, CSEnvironmentAddUpdate", "err", err, "payload", configMapRequest) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } func (handler ConfigMapRestHandlerImpl) CSGlobalFetch(w http.ResponseWriter, r *http.Request) { userId, err := handler.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } vars := mux.Vars(r) appId, err := strconv.Atoi(vars["appId"]) if err != nil { handler.Logger.Errorw("request err, CSGlobalFetch", "err", err, "appId", appId) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } @@ -323,7 +324,7 @@ func (handler ConfigMapRestHandlerImpl) CSGlobalFetch(w http.ResponseWriter, r * token := r.Header.Get("token") object := handler.enforcerUtil.GetAppRBACNameByAppId(appId) if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), nil, http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), nil, http.StatusForbidden) return } //RBAC END @@ -331,29 +332,29 @@ func (handler ConfigMapRestHandlerImpl) CSGlobalFetch(w http.ResponseWriter, r * res, err := handler.configMapService.CSGlobalFetch(appId) if err != nil { handler.Logger.Errorw("service err, CSGlobalFetch", "err", err, "appId", appId) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } func (handler ConfigMapRestHandlerImpl) CSEnvironmentFetch(w http.ResponseWriter, r *http.Request) { userId, err := handler.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } vars := mux.Vars(r) appId, err := strconv.Atoi(vars["appId"]) if err != nil { handler.Logger.Errorw("request err, CSEnvironmentFetch", "err", err, "appId", appId) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } envId, err := strconv.Atoi(vars["envId"]) if err != nil { handler.Logger.Errorw("bad request", "err", err) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } @@ -361,7 +362,7 @@ func (handler ConfigMapRestHandlerImpl) CSEnvironmentFetch(w http.ResponseWriter token := r.Header.Get("token") object := handler.enforcerUtil.GetAppRBACNameByAppId(appId) if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), nil, http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), nil, http.StatusForbidden) return } //RBAC END @@ -369,29 +370,29 @@ func (handler ConfigMapRestHandlerImpl) CSEnvironmentFetch(w http.ResponseWriter res, err := handler.configMapService.CSEnvironmentFetch(appId, envId) if err != nil { handler.Logger.Errorw("service err, CSEnvironmentFetch", "err", err, "appId", appId) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } func (handler ConfigMapRestHandlerImpl) CMGlobalDelete(w http.ResponseWriter, r *http.Request) { userId, err := handler.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } vars := mux.Vars(r) appId, err := strconv.Atoi(vars["appId"]) if err != nil { handler.Logger.Errorw("request err, CMGlobalDelete", "err", err, "appId", appId) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } id, err := strconv.Atoi(vars["id"]) if err != nil { handler.Logger.Errorw("request err, CMGlobalDelete", "err", err, "id", id) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } name := vars["name"] @@ -401,7 +402,7 @@ func (handler ConfigMapRestHandlerImpl) CMGlobalDelete(w http.ResponseWriter, r token := r.Header.Get("token") object := handler.enforcerUtil.GetAppRBACNameByAppId(appId) if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionDelete, object); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), nil, http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), nil, http.StatusForbidden) return } //RBAC END @@ -409,35 +410,35 @@ func (handler ConfigMapRestHandlerImpl) CMGlobalDelete(w http.ResponseWriter, r res, err := handler.configMapService.CMGlobalDelete(name, id, userId) if err != nil { handler.Logger.Errorw("service err, CMGlobalDelete", "err", err, "appId", appId, "id", id, "name", name) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } func (handler ConfigMapRestHandlerImpl) CMEnvironmentDelete(w http.ResponseWriter, r *http.Request) { userId, err := handler.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } vars := mux.Vars(r) appId, err := strconv.Atoi(vars["appId"]) if err != nil { handler.Logger.Errorw("request err, CMEnvironmentDelete", "err", err, "appId", appId) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } envId, err := strconv.Atoi(vars["envId"]) if err != nil { handler.Logger.Errorw("request err, CMEnvironmentDelete", "err", err, "envId", envId) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } id, err := strconv.Atoi(vars["id"]) if err != nil { handler.Logger.Errorw("request err, CMEnvironmentDelete", "err", err, "id", id) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } name := vars["name"] @@ -447,12 +448,12 @@ func (handler ConfigMapRestHandlerImpl) CMEnvironmentDelete(w http.ResponseWrite token := r.Header.Get("token") object := handler.enforcerUtil.GetAppRBACNameByAppId(appId) if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionDelete, object); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), nil, http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), nil, http.StatusForbidden) return } object = handler.enforcerUtil.GetEnvRBACNameByAppId(appId, envId) if ok := handler.enforcer.Enforce(token, rbac.ResourceEnvironment, rbac.ActionDelete, object); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), nil, http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), nil, http.StatusForbidden) return } //RBAC END @@ -460,29 +461,29 @@ func (handler ConfigMapRestHandlerImpl) CMEnvironmentDelete(w http.ResponseWrite res, err := handler.configMapService.CMEnvironmentDelete(name, id, userId) if err != nil { handler.Logger.Errorw("service err, CMEnvironmentDelete", "err", err, "appId", appId, "envId", envId, "id", id) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } func (handler ConfigMapRestHandlerImpl) CSGlobalDelete(w http.ResponseWriter, r *http.Request) { userId, err := handler.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } vars := mux.Vars(r) appId, err := strconv.Atoi(vars["appId"]) if err != nil { handler.Logger.Errorw("request err, CSGlobalDelete", "err", err, "appId", appId) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } id, err := strconv.Atoi(vars["id"]) if err != nil { handler.Logger.Errorw("request err, CSGlobalDelete", "err", err, "id", id) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } name := vars["name"] @@ -492,7 +493,7 @@ func (handler ConfigMapRestHandlerImpl) CSGlobalDelete(w http.ResponseWriter, r token := r.Header.Get("token") object := handler.enforcerUtil.GetAppRBACNameByAppId(appId) if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionDelete, object); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), nil, http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), nil, http.StatusForbidden) return } //RBAC END @@ -500,35 +501,35 @@ func (handler ConfigMapRestHandlerImpl) CSGlobalDelete(w http.ResponseWriter, r res, err := handler.configMapService.CSGlobalDelete(name, id, userId) if err != nil { handler.Logger.Errorw("service err, CSGlobalDelete", "err", err, "appId", appId, "id", id, "name", name) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } func (handler ConfigMapRestHandlerImpl) CSEnvironmentDelete(w http.ResponseWriter, r *http.Request) { userId, err := handler.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } vars := mux.Vars(r) appId, err := strconv.Atoi(vars["appId"]) if err != nil { handler.Logger.Errorw("request err, CSEnvironmentDelete", "err", err, "appId", appId) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } envId, err := strconv.Atoi(vars["envId"]) if err != nil { handler.Logger.Errorw("request err, CSEnvironmentDelete", "err", err, "envId", envId) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } id, err := strconv.Atoi(vars["id"]) if err != nil { handler.Logger.Errorw("request err, CSEnvironmentDelete", "err", err, "id", id) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } name := vars["name"] @@ -538,12 +539,12 @@ func (handler ConfigMapRestHandlerImpl) CSEnvironmentDelete(w http.ResponseWrite token := r.Header.Get("token") object := handler.enforcerUtil.GetAppRBACNameByAppId(appId) if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionDelete, object); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), nil, http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), nil, http.StatusForbidden) return } object = handler.enforcerUtil.GetEnvRBACNameByAppId(appId, envId) if ok := handler.enforcer.Enforce(token, rbac.ResourceEnvironment, rbac.ActionDelete, object); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), nil, http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), nil, http.StatusForbidden) return } //RBAC END @@ -551,29 +552,29 @@ func (handler ConfigMapRestHandlerImpl) CSEnvironmentDelete(w http.ResponseWrite res, err := handler.configMapService.CSEnvironmentDelete(name, id, userId) if err != nil { handler.Logger.Errorw("service err, CSEnvironmentDelete", "err", err, "appId", appId, "envId", envId, "id", id) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } func (handler ConfigMapRestHandlerImpl) CSGlobalFetchForEdit(w http.ResponseWriter, r *http.Request) { userId, err := handler.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } vars := mux.Vars(r) appId, err := strconv.Atoi(vars["appId"]) if err != nil { handler.Logger.Errorw("request err, CSGlobalFetchForEdit", "err", err, "appId", appId) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } id, err := strconv.Atoi(vars["id"]) if err != nil { handler.Logger.Errorw("request err, CSGlobalFetchForEdit", "err", err, "id", id) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } name := vars["name"] @@ -583,7 +584,7 @@ func (handler ConfigMapRestHandlerImpl) CSGlobalFetchForEdit(w http.ResponseWrit token := r.Header.Get("token") object := handler.enforcerUtil.GetAppRBACNameByAppId(appId) if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionUpdate, object); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), nil, http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), nil, http.StatusForbidden) return } //RBAC END @@ -591,35 +592,35 @@ func (handler ConfigMapRestHandlerImpl) CSGlobalFetchForEdit(w http.ResponseWrit res, err := handler.configMapService.CSGlobalFetchForEdit(name, id, userId) if err != nil { handler.Logger.Errorw("service err, CSGlobalFetchForEdit", "err", err, "appId", appId, "id", id, "name", name) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } func (handler ConfigMapRestHandlerImpl) CSEnvironmentFetchForEdit(w http.ResponseWriter, r *http.Request) { userId, err := handler.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } vars := mux.Vars(r) appId, err := strconv.Atoi(vars["appId"]) if err != nil { handler.Logger.Errorw("request err, CSEnvironmentFetchForEdit", "err", err, "appId", appId) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } envId, err := strconv.Atoi(vars["envId"]) if err != nil { handler.Logger.Errorw("request err, CSEnvironmentFetchForEdit", "err", err, "envId", envId) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } id, err := strconv.Atoi(vars["id"]) if err != nil { handler.Logger.Errorw("request err, CSEnvironmentFetchForEdit", "err", err, "id", id) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } name := vars["name"] @@ -629,12 +630,12 @@ func (handler ConfigMapRestHandlerImpl) CSEnvironmentFetchForEdit(w http.Respons token := r.Header.Get("token") object := handler.enforcerUtil.GetAppRBACNameByAppId(appId) if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionUpdate, object); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), nil, http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), nil, http.StatusForbidden) return } object = handler.enforcerUtil.GetEnvRBACNameByAppId(appId, envId) if ok := handler.enforcer.Enforce(token, rbac.ResourceEnvironment, rbac.ActionUpdate, object); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), nil, http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), nil, http.StatusForbidden) return } //RBAC END @@ -642,24 +643,24 @@ func (handler ConfigMapRestHandlerImpl) CSEnvironmentFetchForEdit(w http.Respons res, err := handler.configMapService.CSEnvironmentFetchForEdit(name, id, appId, envId, userId) if err != nil { handler.Logger.Errorw("service err, CSEnvironmentFetchForEdit", "err", err, "appId", appId, "envId", envId, "id", id) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } func (handler ConfigMapRestHandlerImpl) ConfigSecretBulkPatch(w http.ResponseWriter, r *http.Request) { decoder := json.NewDecoder(r.Body) userId, err := handler.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } //AUTH - check from casbin db roles, err := handler.userAuthService.CheckUserRoles(userId) if err != nil { - writeJsonResp(w, err, []byte("Failed to get user by id"), http.StatusInternalServerError) + common.WriteJsonResp(w, err, []byte("Failed to get user by id"), http.StatusInternalServerError) return } superAdmin := false @@ -669,7 +670,7 @@ func (handler ConfigMapRestHandlerImpl) ConfigSecretBulkPatch(w http.ResponseWri } } if superAdmin == false { - writeJsonResp(w, fmt.Errorf("unauthorized user"), nil, http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), nil, http.StatusForbidden) return } //AUTH @@ -678,7 +679,7 @@ func (handler ConfigMapRestHandlerImpl) ConfigSecretBulkPatch(w http.ResponseWri err = decoder.Decode(&bulkPatchRequest) if err != nil { handler.Logger.Errorw("request err, ConfigSecretBulkPatch", "err", err, "payload", bulkPatchRequest) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } handler.Logger.Infow("request payload, ConfigSecretBulkPatch", "payload", bulkPatchRequest) @@ -687,16 +688,16 @@ func (handler ConfigMapRestHandlerImpl) ConfigSecretBulkPatch(w http.ResponseWri _, err := handler.configMapService.ConfigSecretGlobalBulkPatch(&bulkPatchRequest) if err != nil { handler.Logger.Errorw("service err, ConfigSecretBulkPatch", "err", err, "payload", bulkPatchRequest) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } } else { _, err := handler.configMapService.ConfigSecretEnvironmentBulkPatch(&bulkPatchRequest) if err != nil { handler.Logger.Errorw("service err, ConfigSecretBulkPatch", "err", err, "payload", bulkPatchRequest) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } } - writeJsonResp(w, err, true, http.StatusOK) + common.WriteJsonResp(w, err, true, http.StatusOK) } diff --git a/api/restHandler/DeploymentGroupRestHandler.go b/api/restHandler/DeploymentGroupRestHandler.go index 5ed9981ec9..b2dd87306f 100644 --- a/api/restHandler/DeploymentGroupRestHandler.go +++ b/api/restHandler/DeploymentGroupRestHandler.go @@ -20,6 +20,7 @@ package restHandler import ( "encoding/json" "fmt" + "github.com/devtron-labs/devtron/api/restHandler/common" "github.com/devtron-labs/devtron/pkg/deploymentGroup" "github.com/devtron-labs/devtron/pkg/team" "github.com/devtron-labs/devtron/pkg/user" @@ -64,7 +65,7 @@ func (impl *DeploymentGroupRestHandlerImpl) CreateDeploymentGroup(w http.Respons decoder := json.NewDecoder(r.Body) userId, err := impl.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } var bean deploymentGroup.DeploymentGroupRequest @@ -72,7 +73,7 @@ func (impl *DeploymentGroupRestHandlerImpl) CreateDeploymentGroup(w http.Respons err = decoder.Decode(&bean) if err != nil { impl.logger.Errorw("request err, CreateDeploymentGroup", "err", err, "payload", bean) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } bean.UserId = userId @@ -81,7 +82,7 @@ func (impl *DeploymentGroupRestHandlerImpl) CreateDeploymentGroup(w http.Respons err = impl.validator.Struct(bean) if err != nil { impl.logger.Errorw("validation err, CreateDeploymentGroup", "err", err, "payload", bean) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } @@ -90,7 +91,7 @@ func (impl *DeploymentGroupRestHandlerImpl) CreateDeploymentGroup(w http.Respons for _, item := range bean.AppIds { resourceName := impl.enforcerUtil.GetAppRBACNameByAppId(item) if ok := impl.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionCreate, resourceName); !ok { - writeJsonResp(w, err, "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden) return } } @@ -99,16 +100,16 @@ func (impl *DeploymentGroupRestHandlerImpl) CreateDeploymentGroup(w http.Respons res, err := impl.deploymentGroupService.CreateDeploymentGroup(&bean) if err != nil { impl.logger.Errorw("service err, CreateDeploymentGroup", "err", err, "payload", bean) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } func (impl *DeploymentGroupRestHandlerImpl) FetchParentCiForDG(w http.ResponseWriter, r *http.Request) { userId, err := impl.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } @@ -117,14 +118,14 @@ func (impl *DeploymentGroupRestHandlerImpl) FetchParentCiForDG(w http.ResponseWr deploymentGroupId, err := strconv.Atoi(vars["deploymentGroupId"]) if err != nil { impl.logger.Errorw("request err, FetchParentCiForDG", "err", err, "deploymentGroupId", deploymentGroupId) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } resp, err := impl.deploymentGroupService.FetchParentCiForDG(deploymentGroupId) if err != nil { impl.logger.Errorw("service err, FetchParentCiForDG", "err", err, "deploymentGroupId", deploymentGroupId) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } @@ -138,13 +139,13 @@ func (impl *DeploymentGroupRestHandlerImpl) FetchParentCiForDG(w http.ResponseWr } // RBAC filter CI List Ends - writeJsonResp(w, err, finalResp, http.StatusOK) + common.WriteJsonResp(w, err, finalResp, http.StatusOK) } func (impl *DeploymentGroupRestHandlerImpl) FetchEnvApplicationsForDG(w http.ResponseWriter, r *http.Request) { userId, err := impl.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } @@ -152,7 +153,7 @@ func (impl *DeploymentGroupRestHandlerImpl) FetchEnvApplicationsForDG(w http.Res ciPipelineId, err := strconv.Atoi(vars["ciPipelineId"]) if err != nil { impl.logger.Errorw("request err, FetchEnvApplicationsForDG", "err", err, "ciPipelineId", ciPipelineId) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } @@ -160,14 +161,14 @@ func (impl *DeploymentGroupRestHandlerImpl) FetchEnvApplicationsForDG(w http.Res token := r.Header.Get("token") resourceName := impl.enforcerUtil.GetTeamRBACByCiPipelineId(ciPipelineId) if ok := impl.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, resourceName); !ok { - writeJsonResp(w, err, "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden) return } //RBAC enforcer Ends result, err := impl.deploymentGroupService.FetchEnvApplicationsForDG(ciPipelineId) if err != nil { impl.logger.Errorw("service err, FetchEnvApplicationsForDG", "err", err, "ciPipelineId", ciPipelineId) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } finalResp := make([]*deploymentGroup.EnvironmentAppListForDG, 0) @@ -188,21 +189,21 @@ func (impl *DeploymentGroupRestHandlerImpl) FetchEnvApplicationsForDG(w http.Res //RBAC enforcer Ends } - writeJsonResp(w, err, finalResp, http.StatusOK) + common.WriteJsonResp(w, err, finalResp, http.StatusOK) } func (impl *DeploymentGroupRestHandlerImpl) FetchAllDeploymentGroups(w http.ResponseWriter, r *http.Request) { userId, err := impl.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } token := r.Header.Get("token") resp, err := impl.deploymentGroupService.FetchAllDeploymentGroups() if err != nil { impl.logger.Errorw("request err, FetchAllDeploymentGroups", "err", err) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } // RBAC filter CI List @@ -223,13 +224,13 @@ func (impl *DeploymentGroupRestHandlerImpl) FetchAllDeploymentGroups(w http.Resp } // RBAC filter CI List Ends - writeJsonResp(w, err, finalResp, http.StatusOK) + common.WriteJsonResp(w, err, finalResp, http.StatusOK) } func (impl *DeploymentGroupRestHandlerImpl) DeleteDeploymentGroup(w http.ResponseWriter, r *http.Request) { userId, err := impl.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } vars := mux.Vars(r) @@ -237,7 +238,7 @@ func (impl *DeploymentGroupRestHandlerImpl) DeleteDeploymentGroup(w http.Respons deploymentGroupId, err := strconv.Atoi(vars["id"]) if err != nil { impl.logger.Errorw("service err, DeleteDeploymentGroup", "err", err, "deploymentGroupId", deploymentGroupId) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } impl.logger.Infow("request payload, DeleteDeploymentGroup", "deploymentGroupId", deploymentGroupId) @@ -245,14 +246,14 @@ func (impl *DeploymentGroupRestHandlerImpl) DeleteDeploymentGroup(w http.Respons dg, err := impl.deploymentGroupService.FindById(deploymentGroupId) if err != nil { impl.logger.Errorw("service err, DeleteDeploymentGroup", "err", err, "deploymentGroupId", deploymentGroupId) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } // RBAC enforcer applying resourceName := impl.enforcerUtil.GetTeamRBACByCiPipelineId(dg.CiPipelineId) if ok := impl.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionDelete, resourceName); !ok { - writeJsonResp(w, err, "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden) return } // RBAC enforcer Ends @@ -260,16 +261,16 @@ func (impl *DeploymentGroupRestHandlerImpl) DeleteDeploymentGroup(w http.Respons res, err := impl.deploymentGroupService.DeleteDeploymentGroup(deploymentGroupId) if err != nil { impl.logger.Errorw("service err, DeleteDeploymentGroup", "err", err, "deploymentGroupId", deploymentGroupId) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } func (impl *DeploymentGroupRestHandlerImpl) TriggerReleaseForDeploymentGroup(w http.ResponseWriter, r *http.Request) { userId, err := impl.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } var bean *deploymentGroup.DeploymentGroupTriggerRequest @@ -277,7 +278,7 @@ func (impl *DeploymentGroupRestHandlerImpl) TriggerReleaseForDeploymentGroup(w h err = decoder.Decode(&bean) if err != nil { impl.logger.Errorw("request err, TriggerReleaseForDeploymentGroup", "err", err, "payload", bean) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } bean.UserId = userId @@ -286,7 +287,7 @@ func (impl *DeploymentGroupRestHandlerImpl) TriggerReleaseForDeploymentGroup(w h dg, err := impl.deploymentGroupService.GetDeploymentGroupById(bean.DeploymentGroupId) if err != nil { impl.logger.Errorw("service err, TriggerReleaseForDeploymentGroup", "err", err, "payload", bean) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } @@ -294,12 +295,12 @@ func (impl *DeploymentGroupRestHandlerImpl) TriggerReleaseForDeploymentGroup(w h // RBAC enforcer applying object := impl.enforcerUtil.GetTeamRBACByCiPipelineId(dg.CiPipelineId) if ok := impl.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionTrigger, object); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) return } object = impl.enforcerUtil.GetEnvRBACNameByCiPipelineIdAndEnvId(dg.CiPipelineId, dg.EnvironmentId) if ok := impl.enforcer.Enforce(token, rbac.ResourceEnvironment, rbac.ActionTrigger, object); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) return } // RBAC enforcer Ends @@ -307,24 +308,24 @@ func (impl *DeploymentGroupRestHandlerImpl) TriggerReleaseForDeploymentGroup(w h res, err := impl.deploymentGroupService.TriggerReleaseForDeploymentGroup(bean) if err != nil { impl.logger.Errorw("service err, TriggerReleaseForDeploymentGroup", "err", err, "payload", bean) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } func (impl *DeploymentGroupRestHandlerImpl) UpdateDeploymentGroup(w http.ResponseWriter, r *http.Request) { decoder := json.NewDecoder(r.Body) userId, err := impl.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } var bean deploymentGroup.DeploymentGroupRequest err = decoder.Decode(&bean) if err != nil { impl.logger.Errorw("request err, UpdateDeploymentGroup", "payload", bean) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } bean.UserId = userId @@ -332,7 +333,7 @@ func (impl *DeploymentGroupRestHandlerImpl) UpdateDeploymentGroup(w http.Respons err = impl.validator.Struct(bean) if err != nil { impl.logger.Errorw("validation err, UpdateDeploymentGroup", "payload", bean) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } @@ -340,7 +341,7 @@ func (impl *DeploymentGroupRestHandlerImpl) UpdateDeploymentGroup(w http.Respons token := r.Header.Get("token") resourceName := impl.enforcerUtil.GetTeamRBACByCiPipelineId(bean.CiPipelineId) if ok := impl.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionUpdate, resourceName); !ok { - writeJsonResp(w, err, "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden) return } // RBAC enforcer Ends @@ -348,10 +349,10 @@ func (impl *DeploymentGroupRestHandlerImpl) UpdateDeploymentGroup(w http.Respons res, err := impl.deploymentGroupService.UpdateDeploymentGroup(&bean) if err != nil { impl.logger.Errorw("service err, UpdateDeploymentGroup", "err", err, "payload", bean) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } func (impl *DeploymentGroupRestHandlerImpl) GetArtifactsByCiPipeline(w http.ResponseWriter, r *http.Request) { @@ -359,21 +360,21 @@ func (impl *DeploymentGroupRestHandlerImpl) GetArtifactsByCiPipeline(w http.Resp deploymentGroupId, err := strconv.Atoi(vars["deploymentGroupId"]) if err != nil { impl.logger.Error(err) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } dg, err := impl.deploymentGroupService.FindById(deploymentGroupId) if err != nil { impl.logger.Errorw("request err, GetArtifactsByCiPipeline", "deploymentGroupId", deploymentGroupId) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } // RBAC enforcer applying token := r.Header.Get("token") resourceName := impl.enforcerUtil.GetTeamRBACByCiPipelineId(dg.CiPipelineId) if ok := impl.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, resourceName); !ok { - writeJsonResp(w, err, "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden) return } //RBAC enforcer Ends @@ -381,10 +382,10 @@ func (impl *DeploymentGroupRestHandlerImpl) GetArtifactsByCiPipeline(w http.Resp ciArtifactResponse, err := impl.deploymentGroupService.GetArtifactsByCiPipeline(dg.CiPipelineId) if err != nil { impl.logger.Errorw("service err, GetArtifactsByCiPipeline", "err", err, "deploymentGroupId", deploymentGroupId) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, ciArtifactResponse, http.StatusOK) + common.WriteJsonResp(w, err, ciArtifactResponse, http.StatusOK) } func (impl *DeploymentGroupRestHandlerImpl) GetDeploymentGroupById(w http.ResponseWriter, r *http.Request) { @@ -392,21 +393,21 @@ func (impl *DeploymentGroupRestHandlerImpl) GetDeploymentGroupById(w http.Respon deploymentGroupId, err := strconv.Atoi(vars["deploymentGroupId"]) if err != nil { impl.logger.Errorw("request err, GetDeploymentGroupById", "deploymentGroupId", deploymentGroupId) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } dg, err := impl.deploymentGroupService.FindById(deploymentGroupId) if err != nil { impl.logger.Errorw("service err, GetDeploymentGroupById", "err", err, "deploymentGroupId", deploymentGroupId) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } // RBAC enforcer applying token := r.Header.Get("token") resourceName := impl.enforcerUtil.GetTeamRBACByCiPipelineId(dg.CiPipelineId) if ok := impl.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, resourceName); !ok { - writeJsonResp(w, err, "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden) return } //RBAC enforcer Ends @@ -414,8 +415,8 @@ func (impl *DeploymentGroupRestHandlerImpl) GetDeploymentGroupById(w http.Respon deploymentGroup, err := impl.deploymentGroupService.GetDeploymentGroupById(deploymentGroupId) if err != nil { impl.logger.Errorw("service err, GetDeploymentGroupById", "err", err, "deploymentGroupId", deploymentGroupId) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, deploymentGroup, http.StatusOK) + common.WriteJsonResp(w, err, deploymentGroup, http.StatusOK) } diff --git a/api/restHandler/DockerRegRestHandler.go b/api/restHandler/DockerRegRestHandler.go index 88d46c58d3..af6c612845 100644 --- a/api/restHandler/DockerRegRestHandler.go +++ b/api/restHandler/DockerRegRestHandler.go @@ -19,6 +19,7 @@ package restHandler import ( "encoding/json" + "github.com/devtron-labs/devtron/api/restHandler/common" "net/http" "strings" @@ -75,33 +76,33 @@ func (impl DockerRegRestHandlerImpl) SaveDockerRegistryConfig(w http.ResponseWri decoder := json.NewDecoder(r.Body) userId, err := impl.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } var bean pipeline.DockerArtifactStoreBean err = decoder.Decode(&bean) if err != nil { impl.logger.Errorw("request err, SaveDockerRegistryConfig", "err", err, "payload", bean) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } bean.User = userId if (bean.Connection == secureWithCert && bean.Cert == "") || (bean.Connection != secureWithCert && bean.Cert != "") { - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } else { impl.logger.Infow("request payload, SaveDockerRegistryConfig", "payload", bean) err = impl.validator.Struct(bean) if err != nil { impl.logger.Errorw("validation err, SaveDockerRegistryConfig", "err", err, "payload", bean) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } // RBAC enforcer applying token := r.Header.Get("token") if ok := impl.enforcer.Enforce(token, rbac.ResourceDocker, rbac.ActionCreate, "*"); !ok { - writeJsonResp(w, err, "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden) return } //RBAC enforcer Ends @@ -109,11 +110,11 @@ func (impl DockerRegRestHandlerImpl) SaveDockerRegistryConfig(w http.ResponseWri res, err := impl.dockerRegistryConfig.Create(&bean) if err != nil { impl.logger.Errorw("service err, SaveDockerRegistryConfig", "err", err, "payload", bean) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } } @@ -122,7 +123,7 @@ func (impl DockerRegRestHandlerImpl) GetDockerArtifactStore(w http.ResponseWrite res, err := impl.dockerRegistryConfig.ListAllActive() if err != nil { impl.logger.Errorw("service err, GetDockerArtifactStore", "err", err) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } @@ -136,14 +137,14 @@ func (impl DockerRegRestHandlerImpl) GetDockerArtifactStore(w http.ResponseWrite } //RBAC enforcer Ends - writeJsonResp(w, err, result, http.StatusOK) + common.WriteJsonResp(w, err, result, http.StatusOK) } func (impl DockerRegRestHandlerImpl) FetchAllDockerAccounts(w http.ResponseWriter, r *http.Request) { res, err := impl.dockerRegistryConfig.FetchAllDockerAccounts() if err != nil { impl.logger.Errorw("service err, FetchAllDockerAccounts", "err", err) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } @@ -157,7 +158,7 @@ func (impl DockerRegRestHandlerImpl) FetchAllDockerAccounts(w http.ResponseWrite } //RBAC enforcer Ends - writeJsonResp(w, err, result, http.StatusOK) + common.WriteJsonResp(w, err, result, http.StatusOK) } func (impl DockerRegRestHandlerImpl) FetchOneDockerAccounts(w http.ResponseWriter, r *http.Request) { @@ -166,38 +167,38 @@ func (impl DockerRegRestHandlerImpl) FetchOneDockerAccounts(w http.ResponseWrite res, err := impl.dockerRegistryConfig.FetchOneDockerAccount(id) if err != nil { impl.logger.Errorw("service err, FetchOneDockerAccounts", "err", err, "id", id) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } // RBAC enforcer applying token := r.Header.Get("token") if ok := impl.enforcer.Enforce(token, rbac.ResourceDocker, rbac.ActionGet, strings.ToLower(res.Id)); !ok { - writeJsonResp(w, err, "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden) return } //RBAC enforcer Ends - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } func (impl DockerRegRestHandlerImpl) UpdateDockerRegistryConfig(w http.ResponseWriter, r *http.Request) { decoder := json.NewDecoder(r.Body) userId, err := impl.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } var bean pipeline.DockerArtifactStoreBean err = decoder.Decode(&bean) if err != nil { impl.logger.Errorw("request err, UpdateDockerRegistryConfig", "err", err, "payload", bean) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } bean.User = userId if (bean.Connection == secureWithCert && bean.Cert == "") || (bean.Connection != secureWithCert && bean.Cert != "") { - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } else { impl.logger.Infow("request payload, UpdateDockerRegistryConfig", "err", err, "payload", bean) @@ -205,14 +206,14 @@ func (impl DockerRegRestHandlerImpl) UpdateDockerRegistryConfig(w http.ResponseW err = impl.validator.Struct(bean) if err != nil { impl.logger.Errorw("validation err, UpdateDockerRegistryConfig", "err", err, "payload", bean) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } // RBAC enforcer applying token := r.Header.Get("token") if ok := impl.enforcer.Enforce(token, rbac.ResourceDocker, rbac.ActionUpdate, strings.ToLower(bean.Id)); !ok { - writeJsonResp(w, err, "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden) return } //RBAC enforcer Ends @@ -220,11 +221,11 @@ func (impl DockerRegRestHandlerImpl) UpdateDockerRegistryConfig(w http.ResponseW res, err := impl.dockerRegistryConfig.Update(&bean) if err != nil { impl.logger.Errorw("service err, UpdateDockerRegistryConfig", "err", err, "payload", bean) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } } @@ -233,11 +234,11 @@ func (impl DockerRegRestHandlerImpl) FetchAllDockerRegistryForAutocomplete(w htt res, err := impl.dockerRegistryConfig.ListAllActive() if err != nil { impl.logger.Errorw("service err, FetchAllDockerRegistryForAutocomplete", "err", err) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } func (impl DockerRegRestHandlerImpl) IsDockerRegConfigured(w http.ResponseWriter, r *http.Request) { @@ -245,12 +246,12 @@ func (impl DockerRegRestHandlerImpl) IsDockerRegConfigured(w http.ResponseWriter res, err := impl.dockerRegistryConfig.ListAllActive() if err != nil && err != pg.ErrNoRows { impl.logger.Errorw("service err, IsDockerRegConfigured", "err", err) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } if len(res) > 0 { isConfigured = true } - writeJsonResp(w, err, isConfigured, http.StatusOK) + common.WriteJsonResp(w, err, isConfigured, http.StatusOK) } diff --git a/api/restHandler/EnvironmentRestHandler.go b/api/restHandler/EnvironmentRestHandler.go index ed38d4e091..53a929f335 100644 --- a/api/restHandler/EnvironmentRestHandler.go +++ b/api/restHandler/EnvironmentRestHandler.go @@ -19,6 +19,7 @@ package restHandler import ( "encoding/json" + "github.com/devtron-labs/devtron/api/restHandler/common" request "github.com/devtron-labs/devtron/pkg/cluster" "github.com/devtron-labs/devtron/pkg/user" "github.com/devtron-labs/devtron/util/rbac" @@ -75,14 +76,14 @@ func (impl EnvironmentRestHandlerImpl) Create(w http.ResponseWriter, r *http.Req decoder := json.NewDecoder(r.Body) userId, err := impl.userService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } var bean request.EnvironmentBean err = decoder.Decode(&bean) if err != nil { impl.logger.Errorw("request err, Create", "err", err, "payload", bean) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } impl.logger.Errorw("request payload, Create", "payload", bean) @@ -90,19 +91,19 @@ func (impl EnvironmentRestHandlerImpl) Create(w http.ResponseWriter, r *http.Req err = impl.validator.Struct(bean) if err != nil { impl.logger.Errorw("validation err, Create", "err", err, "payload", bean) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } if !impl.validateNamespace(bean.Namespace) { impl.logger.Errorw("validation err, Create", "err", err, "namespace", bean.Namespace) - writeJsonResp(w, errors.New("invalid ns"), nil, http.StatusBadRequest) + common.WriteJsonResp(w, errors.New("invalid ns"), nil, http.StatusBadRequest) return } // RBAC enforcer applying token := r.Header.Get("token") if ok := impl.enforcer.Enforce(token, rbac.ResourceGlobalEnvironment, rbac.ActionCreate, "*"); !ok { - writeJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) + common.WriteJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) return } //RBAC enforcer Ends @@ -110,10 +111,10 @@ func (impl EnvironmentRestHandlerImpl) Create(w http.ResponseWriter, r *http.Req res, err := impl.environmentClusterMappingsService.Create(&bean, userId) if err != nil { impl.logger.Errorw("service err, Create", "err", err, "payload", bean) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } func (impl EnvironmentRestHandlerImpl) Get(w http.ResponseWriter, r *http.Request) { @@ -123,26 +124,26 @@ func (impl EnvironmentRestHandlerImpl) Get(w http.ResponseWriter, r *http.Reques bean, err := impl.environmentClusterMappingsService.FindOne(environment) if err != nil { impl.logger.Errorw("service err, Get", "err", err, "payload", bean) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } // RBAC enforcer applying token := r.Header.Get("token") if ok := impl.enforcer.Enforce(token, rbac.ResourceGlobalEnvironment, rbac.ActionGet, strings.ToLower(bean.Environment)); !ok { - writeJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) + common.WriteJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) return } //RBAC enforcer Ends - writeJsonResp(w, err, bean, http.StatusOK) + common.WriteJsonResp(w, err, bean, http.StatusOK) } func (impl EnvironmentRestHandlerImpl) GetAll(w http.ResponseWriter, r *http.Request) { bean, err := impl.environmentClusterMappingsService.GetAll() if err != nil { impl.logger.Errorw("service err, GetAll", "err", err) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } @@ -156,14 +157,14 @@ func (impl EnvironmentRestHandlerImpl) GetAll(w http.ResponseWriter, r *http.Req //RBAC enforcer Ends } - writeJsonResp(w, err, result, http.StatusOK) + common.WriteJsonResp(w, err, result, http.StatusOK) } func (impl EnvironmentRestHandlerImpl) GetAllActive(w http.ResponseWriter, r *http.Request) { bean, err := impl.environmentClusterMappingsService.GetAllActive() if err != nil { impl.logger.Errorw("service err, GetAllActive", "err", err) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } @@ -177,14 +178,14 @@ func (impl EnvironmentRestHandlerImpl) GetAllActive(w http.ResponseWriter, r *ht //RBAC enforcer Ends } - writeJsonResp(w, err, result, http.StatusOK) + common.WriteJsonResp(w, err, result, http.StatusOK) } func (impl EnvironmentRestHandlerImpl) Update(w http.ResponseWriter, r *http.Request) { decoder := json.NewDecoder(r.Body) userId, err := impl.userService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } @@ -192,21 +193,21 @@ func (impl EnvironmentRestHandlerImpl) Update(w http.ResponseWriter, r *http.Req err = decoder.Decode(&bean) if err != nil { impl.logger.Errorw("service err, Update", "err", err, "payload", bean) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } impl.logger.Infow("request payload, Update", "payload", bean) err = impl.validator.Struct(bean) if err != nil { impl.logger.Errorw("validation err, Update", "err", err, "payload", bean) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } // RBAC enforcer applying token := r.Header.Get("token") if ok := impl.enforcer.Enforce(token, rbac.ResourceGlobalEnvironment, rbac.ActionUpdate, strings.ToLower(bean.Environment)); !ok { - writeJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) + common.WriteJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) return } //RBAC enforcer Ends @@ -214,47 +215,47 @@ func (impl EnvironmentRestHandlerImpl) Update(w http.ResponseWriter, r *http.Req res, err := impl.environmentClusterMappingsService.Update(&bean, userId) if err != nil { impl.logger.Errorw("service err, Update", "err", err, "payload", bean) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } func (impl EnvironmentRestHandlerImpl) FindById(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) envId, err := strconv.Atoi(vars["id"]) if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } bean, err := impl.environmentClusterMappingsService.FindById(envId) if err != nil { impl.logger.Errorw("service err, FindById", "err", err, "envId", envId) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } // RBAC enforcer applying token := r.Header.Get("token") if ok := impl.enforcer.Enforce(token, rbac.ResourceGlobalEnvironment, rbac.ActionGet, strings.ToLower(bean.Environment)); !ok { - writeJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) + common.WriteJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) return } //RBAC enforcer Ends - writeJsonResp(w, err, bean, http.StatusOK) + common.WriteJsonResp(w, err, bean, http.StatusOK) } func (impl EnvironmentRestHandlerImpl) GetEnvironmentListForAutocomplete(w http.ResponseWriter, r *http.Request) { userId, err := impl.userService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } environments, err := impl.environmentClusterMappingsService.GetEnvironmentListForAutocomplete() if err != nil { impl.logger.Errorw("service err, GetEnvironmentListForAutocomplete", "err", err) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } @@ -285,5 +286,5 @@ func (impl EnvironmentRestHandlerImpl) GetEnvironmentListForAutocomplete(w http. if len(grantedEnvironment) == 0 { grantedEnvironment = make([]request.EnvironmentBean, 0) } - writeJsonResp(w, err, grantedEnvironment, http.StatusOK) + common.WriteJsonResp(w, err, grantedEnvironment, http.StatusOK) } diff --git a/api/restHandler/ExternalCiRestHandler.go b/api/restHandler/ExternalCiRestHandler.go index b82a460c04..ae761a6324 100644 --- a/api/restHandler/ExternalCiRestHandler.go +++ b/api/restHandler/ExternalCiRestHandler.go @@ -19,6 +19,7 @@ package restHandler import ( "encoding/json" + "github.com/devtron-labs/devtron/api/restHandler/common" "github.com/devtron-labs/devtron/api/router/pubsub" "github.com/devtron-labs/devtron/pkg/pipeline" "github.com/gorilla/mux" @@ -52,7 +53,7 @@ func (impl ExternalCiRestHandlerImpl) HandleExternalCiWebhook(w http.ResponseWri apiKey := vars["api-key"] if apiKey == "" { impl.logger.Errorw("request err, HandleExternalCiWebhook", "apiKey", apiKey) - writeJsonResp(w, errors.New("invalid api-key"), nil, http.StatusBadRequest) + common.WriteJsonResp(w, errors.New("invalid api-key"), nil, http.StatusBadRequest) return } @@ -60,7 +61,7 @@ func (impl ExternalCiRestHandlerImpl) HandleExternalCiWebhook(w http.ResponseWri err := decoder.Decode(&req) if err != nil { impl.logger.Errorw("request err, HandleExternalCiWebhook", "err", err, "payload", req) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } impl.logger.Infow("request payload, HandleExternalCiWebhook", "payload", req) @@ -68,23 +69,23 @@ func (impl ExternalCiRestHandlerImpl) HandleExternalCiWebhook(w http.ResponseWri ciPipelineId, err := impl.webhookService.AuthenticateExternalCiWebhook(apiKey) if err != nil { impl.logger.Errorw("auth error", "err", err, "apiKey", apiKey, "payload", req) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } ciArtifactReq, err := impl.ciEventHandler.BuildCiArtifactRequest(req) if err != nil { impl.logger.Errorw("service err, HandleExternalCiWebhook", "err", err, "payload", req) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } _, err = impl.webhookService.SaveCiArtifactWebhook(ciPipelineId, ciArtifactReq) if err != nil { impl.logger.Errorw("service err, HandleExternalCiWebhook", "err", err, "payload", req) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, nil, http.StatusOK) + common.WriteJsonResp(w, err, nil, http.StatusOK) } diff --git a/api/restHandler/GitHostRestHandler.go b/api/restHandler/GitHostRestHandler.go index 352ea1fb6a..92533dd44e 100644 --- a/api/restHandler/GitHostRestHandler.go +++ b/api/restHandler/GitHostRestHandler.go @@ -19,6 +19,7 @@ package restHandler import ( "encoding/json" + "github.com/devtron-labs/devtron/api/restHandler/common" "github.com/devtron-labs/devtron/client/gitSensor" "github.com/devtron-labs/devtron/pkg/pipeline" "github.com/devtron-labs/devtron/pkg/user" @@ -69,14 +70,14 @@ func (impl GitHostRestHandlerImpl) GetGitHosts(w http.ResponseWriter, r *http.Re // check if user is logged in or not userId, err := impl.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } res, err := impl.gitHostConfig.GetAll() if err != nil { impl.logger.Errorw("service err, GetGitHosts", "err", err) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } @@ -90,7 +91,7 @@ func (impl GitHostRestHandlerImpl) GetGitHosts(w http.ResponseWriter, r *http.Re } //RBAC enforcer Ends - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } // Need to make this call RBAC free as this API is called from the create app flow (configuring ci) @@ -99,7 +100,7 @@ func (impl GitHostRestHandlerImpl) GetGitHostById(w http.ResponseWriter, r *http // check if user is logged in or not userId, err := impl.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } @@ -108,7 +109,7 @@ func (impl GitHostRestHandlerImpl) GetGitHostById(w http.ResponseWriter, r *http if err != nil { impl.logger.Errorw("service err in parsing Id , GetGitHostById", "err", err) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } @@ -116,11 +117,11 @@ func (impl GitHostRestHandlerImpl) GetGitHostById(w http.ResponseWriter, r *http if err != nil { impl.logger.Errorw("service err, GetGitHostById", "err", err) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } func (impl GitHostRestHandlerImpl) CreateGitHost(w http.ResponseWriter, r *http.Request) { @@ -128,7 +129,7 @@ func (impl GitHostRestHandlerImpl) CreateGitHost(w http.ResponseWriter, r *http. // check if user is logged in or not userId, err := impl.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } @@ -138,7 +139,7 @@ func (impl GitHostRestHandlerImpl) CreateGitHost(w http.ResponseWriter, r *http. err = decoder.Decode(&bean) if err != nil { impl.logger.Errorw("request err, CreateGitHost", "err", err, "payload", bean) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } @@ -147,14 +148,14 @@ func (impl GitHostRestHandlerImpl) CreateGitHost(w http.ResponseWriter, r *http. err = impl.validator.Struct(bean) if err != nil { impl.logger.Errorw("validation err, CreateGitHost", "err", err, "payload", bean) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } // RBAC enforcer applying token := r.Header.Get("token") if ok := impl.enforcer.Enforce(token, rbac.ResourceGit, rbac.ActionCreate, strings.ToLower(bean.Name)); !ok { - writeJsonResp(w, err, "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden) return } //RBAC enforcer Ends @@ -162,10 +163,10 @@ func (impl GitHostRestHandlerImpl) CreateGitHost(w http.ResponseWriter, r *http. res, err := impl.gitHostConfig.Create(&bean) if err != nil { impl.logger.Errorw("service err, CreateGitHost", "err", err, "payload", bean) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } // Need to make this call RBAC free as this API is called from the create app flow (configuring ci) @@ -174,7 +175,7 @@ func (impl GitHostRestHandlerImpl) GetAllWebhookEventConfig(w http.ResponseWrite // check if user is logged in or not userId, err := impl.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } @@ -183,7 +184,7 @@ func (impl GitHostRestHandlerImpl) GetAllWebhookEventConfig(w http.ResponseWrite if err != nil { impl.logger.Errorw("service err in parsing Id , GetAllWebhookEventConfig", "err", err) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } @@ -195,11 +196,11 @@ func (impl GitHostRestHandlerImpl) GetAllWebhookEventConfig(w http.ResponseWrite if err != nil { impl.logger.Errorw("service err, GetAllWebhookEventConfig", "err", err) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } // Need to make this call RBAC free as this API is called from the create app flow (configuring ci) @@ -208,7 +209,7 @@ func (impl GitHostRestHandlerImpl) GetWebhookEventConfig(w http.ResponseWriter, // check if user is logged in or not userId, err := impl.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } @@ -217,7 +218,7 @@ func (impl GitHostRestHandlerImpl) GetWebhookEventConfig(w http.ResponseWriter, if err != nil { impl.logger.Errorw("service err in parsing eventId , GetWebhookEventConfig", "err", err) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } @@ -229,11 +230,11 @@ func (impl GitHostRestHandlerImpl) GetWebhookEventConfig(w http.ResponseWriter, if err != nil { impl.logger.Errorw("service err, GetWebhookEventConfig", "err", err) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } // Need to make this call RBAC free as this API is called from the create app flow (configuring ci) @@ -242,7 +243,7 @@ func (impl GitHostRestHandlerImpl) GetWebhookDataMetaConfig(w http.ResponseWrite // check if user is logged in or not userId, err := impl.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } @@ -253,7 +254,7 @@ func (impl GitHostRestHandlerImpl) GetWebhookDataMetaConfig(w http.ResponseWrite if err != nil { impl.logger.Errorw("service err FetchOneGitProvider, GetWebhookDataMetaConfig", "err", err) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } @@ -267,7 +268,7 @@ func (impl GitHostRestHandlerImpl) GetWebhookDataMetaConfig(w http.ResponseWrite gitHost, err := impl.gitHostConfig.GetById(gitHostId) if err != nil { impl.logger.Errorw("service err, GetGitHostById", "err", err) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } webhookDataMetaConfigResponse.GitHost = gitHost @@ -278,13 +279,13 @@ func (impl GitHostRestHandlerImpl) GetWebhookDataMetaConfig(w http.ResponseWrite webhookEvents, err := impl.gitSensorClient.GetAllWebhookEventConfigForHost(webhookEventRequest) if err != nil { impl.logger.Errorw("service err, GetAllWebhookEventConfig", "err", err) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } webhookDataMetaConfigResponse.WebhookEvents = webhookEvents } - writeJsonResp(w, err, webhookDataMetaConfigResponse, http.StatusOK) + common.WriteJsonResp(w, err, webhookDataMetaConfigResponse, http.StatusOK) } type WebhookDataMetaConfigResponse struct { diff --git a/api/restHandler/GitOpsConfigRestHandler.go b/api/restHandler/GitOpsConfigRestHandler.go index 8011e88c19..5711ee9fe9 100644 --- a/api/restHandler/GitOpsConfigRestHandler.go +++ b/api/restHandler/GitOpsConfigRestHandler.go @@ -21,6 +21,7 @@ import ( "encoding/json" "errors" bean2 "github.com/devtron-labs/devtron/api/bean" + "github.com/devtron-labs/devtron/api/restHandler/common" "github.com/devtron-labs/devtron/internal/sql/repository" "github.com/devtron-labs/devtron/pkg/gitops" "github.com/devtron-labs/devtron/pkg/team" @@ -72,13 +73,13 @@ func (impl GitOpsConfigRestHandlerImpl) CreateGitOpsConfig(w http.ResponseWriter decoder := json.NewDecoder(r.Body) userId, err := impl.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } // RBAC enforcer applying token := r.Header.Get("token") if ok := impl.enforcer.Enforce(token, rbac.ResourceGlobal, rbac.ActionCreate, "*"); !ok { - writeJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) + common.WriteJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) return } //RBAC enforcer Ends @@ -86,7 +87,7 @@ func (impl GitOpsConfigRestHandlerImpl) CreateGitOpsConfig(w http.ResponseWriter err = decoder.Decode(&bean) if err != nil { impl.logger.Errorw("request err, CreateGitOpsConfig", "err", err, "payload", bean) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } bean.UserId = userId @@ -94,15 +95,15 @@ func (impl GitOpsConfigRestHandlerImpl) CreateGitOpsConfig(w http.ResponseWriter err = impl.validator.Struct(bean) if err != nil { impl.logger.Errorw("validation err, CreateGitOpsConfig", "err", err, "payload", bean) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } detailedErrorGitOpsConfigResponse, err := impl.gitOpsConfigService.ValidateAndCreateGitOpsConfig(&bean) if err != nil { impl.logger.Errorw("service err, SaveGitRepoConfig", "err", err, "payload", bean) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) } - writeJsonResp(w, nil, detailedErrorGitOpsConfigResponse, http.StatusOK) + common.WriteJsonResp(w, nil, detailedErrorGitOpsConfigResponse, http.StatusOK) } @@ -110,13 +111,13 @@ func (impl GitOpsConfigRestHandlerImpl) UpdateGitOpsConfig(w http.ResponseWriter decoder := json.NewDecoder(r.Body) userId, err := impl.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } // RBAC enforcer applying token := r.Header.Get("token") if ok := impl.enforcer.Enforce(token, rbac.ResourceGlobal, rbac.ActionUpdate, "*"); !ok { - writeJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) + common.WriteJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) return } //RBAC enforcer Ends @@ -124,7 +125,7 @@ func (impl GitOpsConfigRestHandlerImpl) UpdateGitOpsConfig(w http.ResponseWriter err = decoder.Decode(&bean) if err != nil { impl.logger.Errorw("request err, UpdateGitOpsConfig", "err", err, "payload", bean) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } bean.UserId = userId @@ -132,15 +133,15 @@ func (impl GitOpsConfigRestHandlerImpl) UpdateGitOpsConfig(w http.ResponseWriter err = impl.validator.Struct(bean) if err != nil { impl.logger.Errorw("validation err, UpdateGitOpsConfig", "err", err, "payload", bean) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } detailedErrorGitOpsConfigResponse, err := impl.gitOpsConfigService.ValidateAndUpdateGitOpsConfig(&bean) if err != nil { impl.logger.Errorw("service err, UpdateGitOpsConfig", "err", err, "payload", bean) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) } - writeJsonResp(w, nil, detailedErrorGitOpsConfigResponse, http.StatusOK) + common.WriteJsonResp(w, nil, detailedErrorGitOpsConfigResponse, http.StatusOK) } @@ -148,43 +149,43 @@ func (impl GitOpsConfigRestHandlerImpl) GetGitOpsConfigById(w http.ResponseWrite vars := mux.Vars(r) userId, err := impl.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } id, err := strconv.Atoi(vars["id"]) if err != nil { impl.logger.Errorw("request err, GetGitOpsConfigById", "err", err, "chart repo id", id) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } res, err := impl.gitOpsConfigService.GetGitOpsConfigById(id) if err != nil { impl.logger.Errorw("service err, GetGitOpsConfigById", "err", err, "id", id) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } // RBAC enforcer applying token := r.Header.Get("token") if ok := impl.enforcer.Enforce(token, rbac.ResourceGlobal, rbac.ActionGet, "*"); !ok { - writeJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) + common.WriteJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) return } // RBAC enforcer Ends - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } func (impl GitOpsConfigRestHandlerImpl) GitOpsConfigured(w http.ResponseWriter, r *http.Request) { userId, err := impl.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } result, err := impl.gitOpsConfigService.GetAllGitOpsConfig() if err != nil { impl.logger.Errorw("service err, GetAllGitOpsConfig", "err", err) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } gitopsConfigured := false @@ -197,37 +198,37 @@ func (impl GitOpsConfigRestHandlerImpl) GitOpsConfigured(w http.ResponseWriter, } res := make(map[string]bool) res["exists"] = gitopsConfigured - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } func (impl GitOpsConfigRestHandlerImpl) GetAllGitOpsConfig(w http.ResponseWriter, r *http.Request) { userId, err := impl.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } result, err := impl.gitOpsConfigService.GetAllGitOpsConfig() if err != nil { impl.logger.Errorw("service err, GetAllGitOpsConfig", "err", err) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } // RBAC enforcer applying token := r.Header.Get("token") if ok := impl.enforcer.Enforce(token, rbac.ResourceGlobal, rbac.ActionGet, "*"); !ok { - writeJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) + common.WriteJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) return } //RBAC enforcer Ends - writeJsonResp(w, err, result, http.StatusOK) + common.WriteJsonResp(w, err, result, http.StatusOK) } func (impl GitOpsConfigRestHandlerImpl) GetGitOpsConfigByProvider(w http.ResponseWriter, r *http.Request) { userId, err := impl.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } vars := mux.Vars(r) @@ -235,7 +236,7 @@ func (impl GitOpsConfigRestHandlerImpl) GetGitOpsConfigByProvider(w http.Respons res, err := impl.gitOpsConfigService.GetGitOpsConfigByProvider(provider) if err != nil { impl.logger.Errorw("service err, GetGitOpsConfigByProvider", "err", err, "provider", provider) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } @@ -243,24 +244,24 @@ func (impl GitOpsConfigRestHandlerImpl) GetGitOpsConfigByProvider(w http.Respons token := r.Header.Get("token") if ok := impl.enforcer.Enforce(token, rbac.ResourceGlobal, rbac.ActionGet, "*"); !ok { - writeJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) + common.WriteJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) return } // RBAC enforcer Ends - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } func (impl GitOpsConfigRestHandlerImpl) GitOpsValidator(w http.ResponseWriter, r *http.Request) { decoder := json.NewDecoder(r.Body) userId, err := impl.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } // RBAC enforcer applying token := r.Header.Get("token") if ok := impl.enforcer.Enforce(token, rbac.ResourceGlobal, rbac.ActionCreate, "*"); !ok { - writeJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) + common.WriteJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) return } //RBAC enforcer Ends @@ -268,7 +269,7 @@ func (impl GitOpsConfigRestHandlerImpl) GitOpsValidator(w http.ResponseWriter, r err = decoder.Decode(&bean) if err != nil { impl.logger.Errorw("request err, ValidateGitOpsConfig", "err", err, "payload", bean) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } bean.UserId = userId @@ -276,9 +277,9 @@ func (impl GitOpsConfigRestHandlerImpl) GitOpsValidator(w http.ResponseWriter, r err = impl.validator.Struct(bean) if err != nil { impl.logger.Errorw("validation err, ValidateGitOpsConfig", "err", err, "payload", bean) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } detailedErrorGitOpsConfigResponse := impl.gitOpsConfigService.GitOpsValidateDryRun(&bean) - writeJsonResp(w, nil, detailedErrorGitOpsConfigResponse, http.StatusOK) + common.WriteJsonResp(w, nil, detailedErrorGitOpsConfigResponse, http.StatusOK) } diff --git a/api/restHandler/GitProviderRestHandler.go b/api/restHandler/GitProviderRestHandler.go index e934727b46..529282d4c4 100644 --- a/api/restHandler/GitProviderRestHandler.go +++ b/api/restHandler/GitProviderRestHandler.go @@ -19,6 +19,7 @@ package restHandler import ( "encoding/json" + "github.com/devtron-labs/devtron/api/restHandler/common" "github.com/devtron-labs/devtron/pkg/pipeline" "github.com/devtron-labs/devtron/pkg/team" "github.com/devtron-labs/devtron/pkg/user" @@ -70,14 +71,14 @@ func (impl GitProviderRestHandlerImpl) SaveGitRepoConfig(w http.ResponseWriter, decoder := json.NewDecoder(r.Body) userId, err := impl.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } var bean pipeline.GitRegistry err = decoder.Decode(&bean) if err != nil { impl.logger.Errorw("request err, SaveGitRepoConfig", "err", err, "payload", bean) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } bean.UserId = userId @@ -85,14 +86,14 @@ func (impl GitProviderRestHandlerImpl) SaveGitRepoConfig(w http.ResponseWriter, err = impl.validator.Struct(bean) if err != nil { impl.logger.Errorw("validation err, SaveGitRepoConfig", "err", err, "payload", bean) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } // RBAC enforcer applying token := r.Header.Get("token") if ok := impl.enforcer.Enforce(token, rbac.ResourceGit, rbac.ActionCreate, strings.ToLower(bean.Name)); !ok { - writeJsonResp(w, err, "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden) return } //RBAC enforcer Ends @@ -100,28 +101,28 @@ func (impl GitProviderRestHandlerImpl) SaveGitRepoConfig(w http.ResponseWriter, res, err := impl.gitRegistryConfig.Create(&bean) if err != nil { impl.logger.Errorw("service err, SaveGitRepoConfig", "err", err, "payload", bean) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } func (impl GitProviderRestHandlerImpl) GetGitProviders(w http.ResponseWriter, r *http.Request) { res, err := impl.gitRegistryConfig.GetAll() if err != nil { impl.logger.Errorw("service err, GetGitProviders", "err", err) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } func (impl GitProviderRestHandlerImpl) FetchAllGitProviders(w http.ResponseWriter, r *http.Request) { res, err := impl.gitRegistryConfig.FetchAllGitProviders() if err != nil { impl.logger.Errorw("service err, FetchAllGitProviders", "err", err) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } @@ -135,7 +136,7 @@ func (impl GitProviderRestHandlerImpl) FetchAllGitProviders(w http.ResponseWrite } //RBAC enforcer Ends - writeJsonResp(w, err, result, http.StatusOK) + common.WriteJsonResp(w, err, result, http.StatusOK) } func (impl GitProviderRestHandlerImpl) FetchOneGitProviders(w http.ResponseWriter, r *http.Request) { @@ -144,33 +145,33 @@ func (impl GitProviderRestHandlerImpl) FetchOneGitProviders(w http.ResponseWrite res, err := impl.gitRegistryConfig.FetchOneGitProvider(id) if err != nil { impl.logger.Errorw("service err, FetchOneGitProviders", "err", err, "id", id) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } // RBAC enforcer applying token := r.Header.Get("token") if ok := impl.enforcer.Enforce(token, rbac.ResourceGit, rbac.ActionGet, strings.ToLower(res.Name)); !ok { - writeJsonResp(w, err, "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden) return } //RBAC enforcer Ends - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } func (impl GitProviderRestHandlerImpl) UpdateGitRepoConfig(w http.ResponseWriter, r *http.Request) { decoder := json.NewDecoder(r.Body) userId, err := impl.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } var bean pipeline.GitRegistry err = decoder.Decode(&bean) if err != nil { impl.logger.Errorw("request err, UpdateGitRepoConfig", "err", err, "payload", bean) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } bean.UserId = userId @@ -178,13 +179,13 @@ func (impl GitProviderRestHandlerImpl) UpdateGitRepoConfig(w http.ResponseWriter err = impl.validator.Struct(bean) if err != nil { impl.logger.Errorw("validation err, UpdateGitRepoConfig", "err", err, "payload", bean) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } // RBAC enforcer applying token := r.Header.Get("token") if ok := impl.enforcer.Enforce(token, rbac.ResourceGit, rbac.ActionUpdate, strings.ToLower(bean.Name)); !ok { - writeJsonResp(w, err, "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden) return } //RBAC enforcer Ends @@ -192,8 +193,8 @@ func (impl GitProviderRestHandlerImpl) UpdateGitRepoConfig(w http.ResponseWriter res, err := impl.gitRegistryConfig.Update(&bean) if err != nil { impl.logger.Errorw("service err, UpdateGitRepoConfig", "err", err, "payload", bean) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } diff --git a/api/restHandler/GitWebhookRestHandler.go b/api/restHandler/GitWebhookRestHandler.go index 59d0f1471d..20a130be4f 100644 --- a/api/restHandler/GitWebhookRestHandler.go +++ b/api/restHandler/GitWebhookRestHandler.go @@ -19,6 +19,7 @@ package restHandler import ( "encoding/json" + "github.com/devtron-labs/devtron/api/restHandler/common" "github.com/devtron-labs/devtron/client/gitSensor" "github.com/devtron-labs/devtron/pkg/git" "go.uber.org/zap" @@ -47,16 +48,16 @@ func (impl GitWebhookRestHandlerImpl) HandleGitWebhook(w http.ResponseWriter, r err := decoder.Decode(&bean) if err != nil { impl.logger.Errorw("request err, HandleGitWebhook", "err", err, "payload", bean) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } impl.logger.Infow("request payload, HandleGitWebhook", "payload", bean) resp, err := impl.gitWebhookService.HandleGitWebhook(bean) if err != nil { impl.logger.Errorw("service err, HandleGitWebhook", "err", err, "payload", bean) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } res := map[string]int{"id": resp} - writeJsonResp(w, err, res, http.StatusCreated) + common.WriteJsonResp(w, err, res, http.StatusCreated) } diff --git a/api/restHandler/ImageScanRestHandler.go b/api/restHandler/ImageScanRestHandler.go index be7271900e..47e925a1a1 100644 --- a/api/restHandler/ImageScanRestHandler.go +++ b/api/restHandler/ImageScanRestHandler.go @@ -20,6 +20,7 @@ package restHandler import ( "encoding/json" "fmt" + "github.com/devtron-labs/devtron/api/restHandler/common" security2 "github.com/devtron-labs/devtron/internal/sql/repository/security" "github.com/devtron-labs/devtron/internal/util" "github.com/devtron-labs/devtron/pkg/cluster" @@ -63,7 +64,7 @@ func NewImageScanRestHandlerImpl(logger *zap.SugaredLogger, func (impl ImageScanRestHandlerImpl) ScanExecutionList(w http.ResponseWriter, r *http.Request) { userId, err := impl.userService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } @@ -72,7 +73,7 @@ func (impl ImageScanRestHandlerImpl) ScanExecutionList(w http.ResponseWriter, r err = decoder.Decode(&request) if err != nil { impl.logger.Errorw("request err, ScanExecutionList", "err", err, "payload", request) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } @@ -81,9 +82,9 @@ func (impl ImageScanRestHandlerImpl) ScanExecutionList(w http.ResponseWriter, r impl.logger.Errorw("service err, ScanExecutionList", "err", err, "payload", request) if util.IsErrNoRows(err) { responseList := make([]*security.ImageScanHistoryResponse, 0) - writeJsonResp(w, nil, &security.ImageScanHistoryListingResponse{ImageScanHistoryResponse: responseList}, http.StatusOK) + common.WriteJsonResp(w, nil, &security.ImageScanHistoryListingResponse{ImageScanHistoryResponse: responseList}, http.StatusOK) } else { - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) } return } @@ -93,7 +94,7 @@ func (impl ImageScanRestHandlerImpl) ScanExecutionList(w http.ResponseWriter, r if item.ScanObjectMetaId > 0 && (item.ObjectType == "app" || item.ObjectType == "chart") { object := impl.enforcerUtil.GetAppRBACNameByAppId(item.ScanObjectMetaId) if ok := impl.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) return } object = impl.enforcerUtil.GetEnvRBACNameByAppId(item.ScanObjectMetaId, item.EnvId) @@ -103,7 +104,7 @@ func (impl ImageScanRestHandlerImpl) ScanExecutionList(w http.ResponseWriter, r } else if item.ScanObjectMetaId > 0 && (item.ObjectType == "pod") { environments, err := impl.environmentService.GetByClusterId(item.ClusterId) if err != nil { - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } pass := false @@ -125,19 +126,19 @@ func (impl ImageScanRestHandlerImpl) ScanExecutionList(w http.ResponseWriter, r impl.logger.Errorw("service err, ScanExecutionList", "err", err, "payload", request) if util.IsErrNoRows(err) { responseList := make([]*security.ImageScanHistoryResponse, 0) - writeJsonResp(w, nil, &security.ImageScanHistoryListingResponse{ImageScanHistoryResponse: responseList}, http.StatusOK) + common.WriteJsonResp(w, nil, &security.ImageScanHistoryListingResponse{ImageScanHistoryResponse: responseList}, http.StatusOK) } else { - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) } return } - writeJsonResp(w, err, results, http.StatusOK) + common.WriteJsonResp(w, err, results, http.StatusOK) } func (impl ImageScanRestHandlerImpl) FetchExecutionDetail(w http.ResponseWriter, r *http.Request) { userId, err := impl.userService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } v := r.URL.Query() @@ -147,7 +148,7 @@ func (impl ImageScanRestHandlerImpl) FetchExecutionDetail(w http.ResponseWriter, imageScanDeployInfoId, err = strconv.Atoi(imageScanDeployInfoIdS) if err != nil { impl.logger.Errorw("request err, FetchExecutionDetail", "err", err, "imageScanDeployInfoIdS", imageScanDeployInfoIdS) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) } } artifactIdS := v.Get("artifactId") @@ -155,7 +156,7 @@ func (impl ImageScanRestHandlerImpl) FetchExecutionDetail(w http.ResponseWriter, artifactId, err = strconv.Atoi(artifactIdS) if err != nil { impl.logger.Errorw("request err, FetchExecutionDetail", "err", err, "artifactIdS", artifactIdS) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) } } appIds := v.Get("appId") @@ -163,7 +164,7 @@ func (impl ImageScanRestHandlerImpl) FetchExecutionDetail(w http.ResponseWriter, appId, err = strconv.Atoi(appIds) if err != nil { impl.logger.Errorw("request err, FetchExecutionDetail", "err", err, "appIds", appIds) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) } } envIds := v.Get("envId") @@ -171,7 +172,7 @@ func (impl ImageScanRestHandlerImpl) FetchExecutionDetail(w http.ResponseWriter, envId, err = strconv.Atoi(envIds) if err != nil { impl.logger.Errorw("request err, FetchExecutionDetail", "err", err, "envIds", envIds) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) } } image := v.Get("image") @@ -187,9 +188,9 @@ func (impl ImageScanRestHandlerImpl) FetchExecutionDetail(w http.ResponseWriter, if err != nil { impl.logger.Errorw("service err, FetchExecutionDetail", "err", err, "payload", request) if util.IsErrNoRows(err) { - writeJsonResp(w, nil, &security.ImageScanExecutionDetail{}, http.StatusOK) + common.WriteJsonResp(w, nil, &security.ImageScanExecutionDetail{}, http.StatusOK) } else { - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) } return } @@ -198,32 +199,32 @@ func (impl ImageScanRestHandlerImpl) FetchExecutionDetail(w http.ResponseWriter, if executionDetail.AppId > 0 && executionDetail.EnvId > 0 { object := impl.enforcerUtil.GetAppRBACNameByAppId(appId) if ok := impl.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) return } object = impl.enforcerUtil.GetEnvRBACNameByAppId(appId, envId) if ok := impl.enforcer.Enforce(token, rbac.ResourceEnvironment, rbac.ActionGet, object); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) return } } else if executionDetail.AppId > 0 { object := impl.enforcerUtil.GetAppRBACNameByAppId(appId) if ok := impl.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) return } } else { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) } //RBAC - writeJsonResp(w, err, executionDetail, http.StatusOK) + common.WriteJsonResp(w, err, executionDetail, http.StatusOK) } func (impl ImageScanRestHandlerImpl) FetchMinScanResultByAppIdAndEnvId(w http.ResponseWriter, r *http.Request) { userId, err := impl.userService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } v := r.URL.Query() @@ -233,7 +234,7 @@ func (impl ImageScanRestHandlerImpl) FetchMinScanResultByAppIdAndEnvId(w http.Re appId, err = strconv.Atoi(appIds) if err != nil { impl.logger.Errorw("request err, FetchMinScanResultByAppIdAndEnvId", "err", err, "appIds", appIds) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) } } envIds := v.Get("envId") @@ -241,7 +242,7 @@ func (impl ImageScanRestHandlerImpl) FetchMinScanResultByAppIdAndEnvId(w http.Re envId, err = strconv.Atoi(envIds) if err != nil { impl.logger.Errorw("request err, FetchMinScanResultByAppIdAndEnvId", "err", err, "envIds", envIds) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) } } request := &security.ImageScanRequest{ @@ -254,12 +255,12 @@ func (impl ImageScanRestHandlerImpl) FetchMinScanResultByAppIdAndEnvId(w http.Re if appId > 0 && envId > 0 { object := impl.enforcerUtil.GetAppRBACNameByAppId(appId) if ok := impl.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) return } object = impl.enforcerUtil.GetEnvRBACNameByAppId(appId, envId) if ok := impl.enforcer.Enforce(token, rbac.ResourceEnvironment, rbac.ActionGet, object); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) return } } @@ -270,19 +271,19 @@ func (impl ImageScanRestHandlerImpl) FetchMinScanResultByAppIdAndEnvId(w http.Re impl.logger.Errorw("service err, FetchMinScanResultByAppIdAndEnvId", "err", err, "payload", request) if util.IsErrNoRows(err) { err = &util.ApiError{InternalMessage: err.Error(), UserMessage: "no data found"} - writeJsonResp(w, err, nil, http.StatusOK) + common.WriteJsonResp(w, err, nil, http.StatusOK) } else { - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) } return } - writeJsonResp(w, err, result, http.StatusOK) + common.WriteJsonResp(w, err, result, http.StatusOK) } func (impl ImageScanRestHandlerImpl) VulnerabilityExposure(w http.ResponseWriter, r *http.Request) { userId, err := impl.userService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } @@ -291,7 +292,7 @@ func (impl ImageScanRestHandlerImpl) VulnerabilityExposure(w http.ResponseWriter err = decoder.Decode(&request) if err != nil { impl.logger.Errorw("request err, VulnerabilityExposure", "err", err, "payload", request) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } results, err := impl.imageScanService.VulnerabilityExposure(request) @@ -299,9 +300,9 @@ func (impl ImageScanRestHandlerImpl) VulnerabilityExposure(w http.ResponseWriter impl.logger.Errorw("service err, VulnerabilityExposure", "err", err, "payload", request) if util.IsErrNoRows(err) { responseList := make([]*security.ImageScanHistoryResponse, 0) - writeJsonResp(w, nil, &security.ImageScanHistoryListingResponse{ImageScanHistoryResponse: responseList}, http.StatusOK) + common.WriteJsonResp(w, nil, &security.ImageScanHistoryListingResponse{ImageScanHistoryResponse: responseList}, http.StatusOK) } else { - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) } return } @@ -312,7 +313,7 @@ func (impl ImageScanRestHandlerImpl) VulnerabilityExposure(w http.ResponseWriter for _, item := range results.VulnerabilityExposure { object := impl.enforcerUtil.GetAppRBACNameByAppId(item.AppId) if ok := impl.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) return } object = impl.enforcerUtil.GetEnvRBACNameByAppId(item.AppId, item.EnvId) @@ -322,5 +323,5 @@ func (impl ImageScanRestHandlerImpl) VulnerabilityExposure(w http.ResponseWriter } //RBAC results.VulnerabilityExposure = vulnerabilityExposure - writeJsonResp(w, err, results, http.StatusOK) + common.WriteJsonResp(w, err, results, http.StatusOK) } diff --git a/api/restHandler/JiraRestHandler.go b/api/restHandler/JiraRestHandler.go index 98f0023419..3f6efa1a2f 100644 --- a/api/restHandler/JiraRestHandler.go +++ b/api/restHandler/JiraRestHandler.go @@ -19,6 +19,7 @@ package restHandler import ( "encoding/json" + "github.com/devtron-labs/devtron/api/restHandler/common" "github.com/devtron-labs/devtron/pkg/jira" "github.com/devtron-labs/devtron/pkg/user" "go.uber.org/zap" @@ -51,59 +52,59 @@ func (impl JiraRestHandlerImpl) SaveAccountConfig(w http.ResponseWriter, r *http decoder := json.NewDecoder(r.Body) userId, err := impl.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } var jiraConfigBean jira.ConfigBean err = decoder.Decode(&jiraConfigBean) if err != nil { impl.logger.Errorw("request err, SaveAccountConfig", "err", err, "payload", jiraConfigBean) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } impl.logger.Infow("request payload, SaveAccountConfig", "err", err, "payload", jiraConfigBean) err = impl.validator.Struct(jiraConfigBean) if err != nil { impl.logger.Errorw("validation err, SaveAccountConfig", "err", err, "payload", jiraConfigBean) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } account, err := impl.jiraService.SaveAccountDetails(&jiraConfigBean, userId) if err != nil { impl.logger.Errorw("service err, SaveAccountConfig", "err", err, "payload", jiraConfigBean) - writeJsonResp(w, err, "error in saving jira config", http.StatusInternalServerError) + common.WriteJsonResp(w, err, "error in saving jira config", http.StatusInternalServerError) return } - writeJsonResp(w, err, account.Id, http.StatusOK) + common.WriteJsonResp(w, err, account.Id, http.StatusOK) } func (impl JiraRestHandlerImpl) UpdateIssueStatus(w http.ResponseWriter, r *http.Request) { userId, err := impl.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } var updateBean jira.UpdateIssueBean err = json.NewDecoder(r.Body).Decode(&updateBean) if err != nil { impl.logger.Errorw("request err, UpdateIssueStatus", "err", err, "payload", updateBean) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } impl.logger.Infow("request payload, UpdateIssueStatus", "err", err, "payload", updateBean) err = impl.validator.Struct(updateBean) if err != nil { impl.logger.Errorw("validation err, UpdateIssueStatus", "err", err, "payload", updateBean) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } res, err := impl.jiraService.UpdateJiraStatus(&updateBean, userId) if err != nil { impl.logger.Errorw("service err, UpdateIssueStatus", "err", err, "payload", updateBean) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } w.Header().Set("Content-Type", "application/json") - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } diff --git a/api/restHandler/MigrateDbRestHandler.go b/api/restHandler/MigrateDbRestHandler.go index 387afb877e..230ba78f01 100644 --- a/api/restHandler/MigrateDbRestHandler.go +++ b/api/restHandler/MigrateDbRestHandler.go @@ -19,6 +19,7 @@ package restHandler import ( "encoding/json" + "github.com/devtron-labs/devtron/api/restHandler/common" "github.com/devtron-labs/devtron/pkg/pipeline" "github.com/devtron-labs/devtron/pkg/user" "github.com/devtron-labs/devtron/util/rbac" @@ -69,14 +70,14 @@ func (impl MigrateDbRestHandlerImpl) SaveDbConfig(w http.ResponseWriter, r *http decoder := json.NewDecoder(r.Body) userId, err := impl.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } var bean pipeline.DbConfigBean err = decoder.Decode(&bean) if err != nil { impl.logger.Errorw("request err, SaveDbConfig", "err", err, "payload", bean) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } bean.UserId = userId @@ -84,14 +85,14 @@ func (impl MigrateDbRestHandlerImpl) SaveDbConfig(w http.ResponseWriter, r *http err = impl.validator.Struct(bean) if err != nil { impl.logger.Errorw("validation err, SaveDbConfig", "err", err, "payload", bean) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } // RBAC enforcer applying token := r.Header.Get("token") if ok := impl.enforcer.Enforce(token, rbac.ResourceMigrate, rbac.ActionCreate, strings.ToLower(bean.Name)); !ok { - writeJsonResp(w, err, "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden) return } //RBAC enforcer Ends @@ -99,17 +100,17 @@ func (impl MigrateDbRestHandlerImpl) SaveDbConfig(w http.ResponseWriter, r *http res, err := impl.dbConfigService.Save(&bean) if err != nil { impl.logger.Errorw("service err, SaveDbConfig", "err", err, "payload", bean) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } func (impl MigrateDbRestHandlerImpl) FetchAllDbConfig(w http.ResponseWriter, r *http.Request) { res, err := impl.dbConfigService.GetAll() if err != nil { impl.logger.Errorw("service err, FetchAllDbConfig", "err", err) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } @@ -123,7 +124,7 @@ func (impl MigrateDbRestHandlerImpl) FetchAllDbConfig(w http.ResponseWriter, r * } //RBAC enforcer Ends - writeJsonResp(w, err, result, http.StatusOK) + common.WriteJsonResp(w, err, result, http.StatusOK) } func (impl MigrateDbRestHandlerImpl) FetchOneDbConfig(w http.ResponseWriter, r *http.Request) { @@ -131,32 +132,32 @@ func (impl MigrateDbRestHandlerImpl) FetchOneDbConfig(w http.ResponseWriter, r * id, err := strconv.Atoi(params["id"]) if err != nil { impl.logger.Errorw("request err, FetchOneDbConfig", "err", err, "id", id) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } res, err := impl.dbConfigService.GetById(id) if err != nil { impl.logger.Errorw("service err, FetchOneDbConfig", "err", err, "id", id) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } // RBAC enforcer applying token := r.Header.Get("token") if ok := impl.enforcer.Enforce(token, rbac.ResourceMigrate, rbac.ActionGet, strings.ToLower(res.Name)); !ok { - writeJsonResp(w, err, "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden) return } //RBAC enforcer Ends - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } func (impl MigrateDbRestHandlerImpl) UpdateDbConfig(w http.ResponseWriter, r *http.Request) { decoder := json.NewDecoder(r.Body) userId, err := impl.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } var bean pipeline.DbConfigBean @@ -164,7 +165,7 @@ func (impl MigrateDbRestHandlerImpl) UpdateDbConfig(w http.ResponseWriter, r *ht err = decoder.Decode(&bean) if err != nil { impl.logger.Errorw("request err, UpdateDbConfig", "err", err, "payload", bean) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } bean.UserId = userId @@ -172,14 +173,14 @@ func (impl MigrateDbRestHandlerImpl) UpdateDbConfig(w http.ResponseWriter, r *ht err = impl.validator.Struct(bean) if err != nil { impl.logger.Errorw("service err, UpdateDbConfig", "err", err, "payload", bean) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } // RBAC enforcer applying token := r.Header.Get("token") if ok := impl.enforcer.Enforce(token, rbac.ResourceMigrate, rbac.ActionUpdate, strings.ToLower(bean.Name)); !ok { - writeJsonResp(w, err, "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden) return } //RBAC enforcer Ends @@ -187,17 +188,17 @@ func (impl MigrateDbRestHandlerImpl) UpdateDbConfig(w http.ResponseWriter, r *ht res, err := impl.dbConfigService.Update(&bean) if err != nil { impl.logger.Errorw("service err, UpdateDbConfig", "err", err, "payload", bean) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } func (impl MigrateDbRestHandlerImpl) FetchDbConfigForAutoComp(w http.ResponseWriter, r *http.Request) { res, err := impl.dbConfigService.GetForAutocomplete() if err != nil { impl.logger.Errorw("service err, FetchDbConfigForAutoComp", "err", err) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } @@ -211,5 +212,5 @@ func (impl MigrateDbRestHandlerImpl) FetchDbConfigForAutoComp(w http.ResponseWri } //RBAC enforcer Ends - writeJsonResp(w, err, result, http.StatusOK) + common.WriteJsonResp(w, err, result, http.StatusOK) } diff --git a/api/restHandler/NotificationRestHandler.go b/api/restHandler/NotificationRestHandler.go index a8609512ca..482b8ad4ab 100644 --- a/api/restHandler/NotificationRestHandler.go +++ b/api/restHandler/NotificationRestHandler.go @@ -22,6 +22,7 @@ import ( "encoding/json" "errors" "fmt" + "github.com/devtron-labs/devtron/api/restHandler/common" "io/ioutil" "net/http" "strconv" @@ -106,21 +107,21 @@ func NewNotificationRestHandlerImpl(dockerRegistryConfig pipeline.DockerRegistry func (impl NotificationRestHandlerImpl) SaveNotificationSettings(w http.ResponseWriter, r *http.Request) { userId, err := impl.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } var notificationSetting notifier.NotificationRequest err = json.NewDecoder(r.Body).Decode(¬ificationSetting) if err != nil { impl.logger.Errorw("request err, SaveNotificationSettings", "err", err, "payload", notificationSetting) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } impl.logger.Infow("request payload, SaveNotificationSettings", "err", err, "payload", notificationSetting) err = impl.validator.Struct(notificationSetting) if err != nil { impl.logger.Errorw("validation err, SaveNotificationSettings", "err", err, "payload", notificationSetting) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } @@ -130,13 +131,13 @@ func (impl NotificationRestHandlerImpl) SaveNotificationSettings(w http.Response teamRbac, envRbac := impl.buildRbacObjectsForNotificationSettings(item.TeamId, item.EnvId, item.AppId, item.PipelineId, item.PipelineType) for _, object := range teamRbac { if ok := impl.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionCreate, object); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) return } } for _, object := range envRbac { if ok := impl.enforcer.Enforce(token, rbac.ResourceEnvironment, rbac.ActionCreate, object); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) return } } @@ -146,11 +147,11 @@ func (impl NotificationRestHandlerImpl) SaveNotificationSettings(w http.Response res, err := impl.notificationService.CreateOrUpdateNotificationSettings(¬ificationSetting, userId) if err != nil { impl.logger.Errorw("service err, SaveNotificationSettings", "err", err, "payload", notificationSetting) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } w.Header().Set("Content-Type", "application/json") - writeJsonResp(w, nil, res, http.StatusOK) + common.WriteJsonResp(w, nil, res, http.StatusOK) } func (impl NotificationRestHandlerImpl) buildRbacObjectsForNotificationSettings(teamIds []*int, envIds []*int, appIds []*int, pipelineId *int, pipelineType util.PipelineType) ([]string, []string) { @@ -248,21 +249,21 @@ func (impl NotificationRestHandlerImpl) buildRbacObjectsForNotificationSettings( func (impl NotificationRestHandlerImpl) UpdateNotificationSettings(w http.ResponseWriter, r *http.Request) { userId, err := impl.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } var notificationSetting notifier.NotificationUpdateRequest err = json.NewDecoder(r.Body).Decode(¬ificationSetting) if err != nil { impl.logger.Errorw("request err, UpdateNotificationSettings", "err", err, "payload", notificationSetting) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } impl.logger.Infow("request payload, UpdateNotificationSettings", "err", err, "payload", notificationSetting) err = impl.validator.Struct(notificationSetting) if err != nil { impl.logger.Errorw("validation err, UpdateNotificationSettings", "err", err, "payload", notificationSetting) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } @@ -275,20 +276,20 @@ func (impl NotificationRestHandlerImpl) UpdateNotificationSettings(w http.Respon nsViews, err := impl.notificationService.FetchNSViewByIds(ids) if err != nil { impl.logger.Errorw("service err, UpdateNotificationSettings", "err", err, "payload", notificationSetting) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } for _, item := range nsViews { teamRbac, envRbac := impl.buildRbacObjectsForNotificationSettings(item.TeamId, item.EnvId, item.AppId, item.PipelineId, item.PipelineType) for _, object := range teamRbac { if ok := impl.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionUpdate, object); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) return } } for _, object := range envRbac { if ok := impl.enforcer.Enforce(token, rbac.ResourceEnvironment, rbac.ActionUpdate, object); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) return } } @@ -298,11 +299,11 @@ func (impl NotificationRestHandlerImpl) UpdateNotificationSettings(w http.Respon res, err := impl.notificationService.UpdateNotificationSettings(¬ificationSetting, userId) if err != nil { impl.logger.Errorw("service err, UpdateNotificationSettings", "err", err, "payload", notificationSetting) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } w.Header().Set("Content-Type", "application/json") - writeJsonResp(w, nil, res, http.StatusOK) + common.WriteJsonResp(w, nil, res, http.StatusOK) } func (impl NotificationRestHandlerImpl) DeleteNotificationSettings(w http.ResponseWriter, r *http.Request) { @@ -310,7 +311,7 @@ func (impl NotificationRestHandlerImpl) DeleteNotificationSettings(w http.Respon err := json.NewDecoder(r.Body).Decode(&request) if err != nil { impl.logger.Errorw("request err, DeleteNotificationSettings", "err", err, "payload", request) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } impl.logger.Infow("request payload, DeleteNotificationSettings", "err", err, "payload", request) @@ -319,20 +320,20 @@ func (impl NotificationRestHandlerImpl) DeleteNotificationSettings(w http.Respon nsViews, err := impl.notificationService.FetchNSViewByIds(request.Id) if err != nil { impl.logger.Errorw("service err, DeleteNotificationSettings", "err", err, "payload", request) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } for _, item := range nsViews { teamRbac, envRbac := impl.buildRbacObjectsForNotificationSettings(item.TeamId, item.EnvId, item.AppId, item.PipelineId, item.PipelineType) for _, object := range teamRbac { if ok := impl.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionDelete, object); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) return } } for _, object := range envRbac { if ok := impl.enforcer.Enforce(token, rbac.ResourceEnvironment, rbac.ActionDelete, object); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) return } } @@ -342,7 +343,7 @@ func (impl NotificationRestHandlerImpl) DeleteNotificationSettings(w http.Respon if err != nil { impl.logger.Errorw("service err, DeleteNotificationSettings", "err", err, "payload", request) } - writeJsonResp(w, err, nil, http.StatusOK) + common.WriteJsonResp(w, err, nil, http.StatusOK) } func (impl NotificationRestHandlerImpl) GetAllNotificationSettings(w http.ResponseWriter, r *http.Request) { @@ -350,13 +351,13 @@ func (impl NotificationRestHandlerImpl) GetAllNotificationSettings(w http.Respon size, err := strconv.Atoi(vars["size"]) if err != nil { impl.logger.Errorw("request err, GetAllNotificationSettings", "err", err, "payload", size) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } offset, err := strconv.Atoi(vars["offset"]) if err != nil { impl.logger.Errorw("request err, GetAllNotificationSettings", "err", err, "payload", offset) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } @@ -364,7 +365,7 @@ func (impl NotificationRestHandlerImpl) GetAllNotificationSettings(w http.Respon notificationSettingsViews, totalCount, err := impl.notificationService.FindAll(offset, size) if err != nil && err != pg.ErrNoRows { impl.logger.Errorw("service err, GetAllNotificationSettings", "err", err) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } var filteredSettingViews []*repository.NotificationSettingsViewWithAppEnv @@ -373,7 +374,7 @@ func (impl NotificationRestHandlerImpl) GetAllNotificationSettings(w http.Respon err = json.Unmarshal([]byte(ns.Config), nsConfig) if err != nil { impl.logger.Errorw("service err, GetAllNotificationSettings", "err", err) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } teamRbac, envRbac := impl.buildRbacObjectsForNotificationSettings(nsConfig.TeamId, nsConfig.EnvId, nsConfig.AppId, nsConfig.PipelineId, nsConfig.PipelineType) @@ -401,7 +402,7 @@ func (impl NotificationRestHandlerImpl) GetAllNotificationSettings(w http.Respon results, deletedItemCount, err := impl.notificationService.BuildNotificationSettingsResponse(filteredSettingViews) if err != nil { impl.logger.Errorw("service err, GetAllNotificationSettings", "err", err) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } totalCount = totalCount - deletedItemCount @@ -413,13 +414,13 @@ func (impl NotificationRestHandlerImpl) GetAllNotificationSettings(w http.Respon NotificationSettingsResponse: results, } - writeJsonResp(w, err, nsvResponse, http.StatusOK) + common.WriteJsonResp(w, err, nsvResponse, http.StatusOK) } func (impl NotificationRestHandlerImpl) SaveNotificationChannelConfig(w http.ResponseWriter, r *http.Request) { userId, err := impl.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } @@ -428,7 +429,7 @@ func (impl NotificationRestHandlerImpl) SaveNotificationChannelConfig(w http.Res err = json.NewDecoder(ioutil.NopCloser(bytes.NewBuffer(data))).Decode(&channelReq) if err != nil { impl.logger.Errorw("request err, SaveNotificationChannelConfig", "err", err, "payload", channelReq) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } impl.logger.Infow("request payload, SaveNotificationChannelConfig", "err", err, "payload", channelReq) @@ -438,14 +439,14 @@ func (impl NotificationRestHandlerImpl) SaveNotificationChannelConfig(w http.Res err = json.NewDecoder(ioutil.NopCloser(bytes.NewBuffer(data))).Decode(&slackReq) if err != nil { impl.logger.Errorw("request err, SaveNotificationChannelConfig", "err", err, "slackReq", slackReq) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } err = impl.validator.Struct(slackReq) if err != nil { impl.logger.Errorw("validation err, SaveNotificationChannelConfig", "err", err, "slackReq", slackReq) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } @@ -456,12 +457,12 @@ func (impl NotificationRestHandlerImpl) SaveNotificationChannelConfig(w http.Res } teams, err := impl.teamService.FindByIds(teamIds) if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } for _, item := range teams { if ok := impl.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionCreate, fmt.Sprintf("%s/*", strings.ToLower(item.Name))); !ok { - writeJsonResp(w, err, "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden) return } } @@ -470,24 +471,24 @@ func (impl NotificationRestHandlerImpl) SaveNotificationChannelConfig(w http.Res res, cErr := impl.slackService.SaveOrEditNotificationConfig(slackReq.SlackConfigDtos, userId) if cErr != nil { impl.logger.Errorw("service err, SaveNotificationChannelConfig", "err", err, "slackReq", slackReq) - writeJsonResp(w, cErr, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, cErr, nil, http.StatusInternalServerError) return } w.Header().Set("Content-Type", "application/json") - writeJsonResp(w, nil, res, http.StatusOK) + common.WriteJsonResp(w, nil, res, http.StatusOK) } else if util.SES == channelReq.Channel { var sesReq *notifier.SESChannelConfig err = json.NewDecoder(ioutil.NopCloser(bytes.NewBuffer(data))).Decode(&sesReq) if err != nil { impl.logger.Errorw("request err, SaveNotificationChannelConfig", "err", err, "sesReq", sesReq) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } err = impl.validator.Struct(sesReq) if err != nil { impl.logger.Errorw("validation err, SaveNotificationChannelConfig", "err", err, "sesReq", sesReq) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } @@ -502,11 +503,11 @@ func (impl NotificationRestHandlerImpl) SaveNotificationChannelConfig(w http.Res res, cErr := impl.sesService.SaveOrEditNotificationConfig(sesReq.SESConfigDtos, userId) if cErr != nil { impl.logger.Errorw("service err, SaveNotificationChannelConfig", "err", err, "sesReq", sesReq) - writeJsonResp(w, cErr, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, cErr, nil, http.StatusInternalServerError) return } w.Header().Set("Content-Type", "application/json") - writeJsonResp(w, nil, res, http.StatusOK) + common.WriteJsonResp(w, nil, res, http.StatusOK) } } @@ -518,7 +519,7 @@ type ChannelResponseDTO struct { func (impl NotificationRestHandlerImpl) FindAllNotificationConfig(w http.ResponseWriter, r *http.Request) { userId, err := impl.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } @@ -527,7 +528,7 @@ func (impl NotificationRestHandlerImpl) FindAllNotificationConfig(w http.Respons slackConfigs, fErr := impl.slackService.FetchAllSlackNotificationConfig() if fErr != nil && fErr != pg.ErrNoRows { impl.logger.Errorw("service err, FindAllNotificationConfig", "err", err) - writeJsonResp(w, fErr, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, fErr, nil, http.StatusInternalServerError) return } @@ -540,7 +541,7 @@ func (impl NotificationRestHandlerImpl) FindAllNotificationConfig(w http.Respons } teams, err := impl.teamService.FindByIds(teamIds) if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } for _, item := range teams { @@ -564,7 +565,7 @@ func (impl NotificationRestHandlerImpl) FindAllNotificationConfig(w http.Respons sesConfigs, fErr := impl.sesService.FetchAllSESNotificationConfig() if fErr != nil && fErr != pg.ErrNoRows { impl.logger.Errorw("service err, FindAllNotificationConfig", "err", err) - writeJsonResp(w, fErr, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, fErr, nil, http.StatusInternalServerError) return } if sesConfigs == nil { @@ -574,20 +575,20 @@ func (impl NotificationRestHandlerImpl) FindAllNotificationConfig(w http.Respons channelsResponse.SESConfigs = sesConfigs } w.Header().Set("Content-Type", "application/json") - writeJsonResp(w, fErr, channelsResponse, http.StatusOK) + common.WriteJsonResp(w, fErr, channelsResponse, http.StatusOK) } func (impl NotificationRestHandlerImpl) FindSESConfig(w http.ResponseWriter, r *http.Request) { userId, err := impl.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } vars := mux.Vars(r) id, err := strconv.Atoi(vars["id"]) if err != nil { impl.logger.Errorw("request err, FindSESConfig", "err", err) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } token := r.Header.Get("token") @@ -598,43 +599,43 @@ func (impl NotificationRestHandlerImpl) FindSESConfig(w http.ResponseWriter, r * sesConfig, fErr := impl.sesService.FetchSESNotificationConfigById(id) if fErr != nil && fErr != pg.ErrNoRows { impl.logger.Errorw("service err, FindSESConfig", "err", err) - writeJsonResp(w, fErr, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, fErr, nil, http.StatusInternalServerError) return } w.Header().Set("Content-Type", "application/json") - writeJsonResp(w, fErr, sesConfig, http.StatusOK) + common.WriteJsonResp(w, fErr, sesConfig, http.StatusOK) } func (impl NotificationRestHandlerImpl) FindSlackConfig(w http.ResponseWriter, r *http.Request) { userId, err := impl.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } vars := mux.Vars(r) id, err := strconv.Atoi(vars["id"]) if err != nil { impl.logger.Errorw("request err, FindSlackConfig", "err", err, "id", id) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } sesConfig, fErr := impl.slackService.FetchSlackNotificationConfigById(id) if fErr != nil && fErr != pg.ErrNoRows { impl.logger.Errorw("service err, FindSlackConfig, cannot find slack config", "err", fErr, "id", id) - writeJsonResp(w, fErr, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, fErr, nil, http.StatusInternalServerError) return } w.Header().Set("Content-Type", "application/json") - writeJsonResp(w, fErr, sesConfig, http.StatusOK) + common.WriteJsonResp(w, fErr, sesConfig, http.StatusOK) } func (impl NotificationRestHandlerImpl) RecipientListingSuggestion(w http.ResponseWriter, r *http.Request) { userId, err := impl.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } vars := mux.Vars(r) @@ -644,7 +645,7 @@ func (impl NotificationRestHandlerImpl) RecipientListingSuggestion(w http.Respon channelsResponse, err = impl.slackService.RecipientListingSuggestion(value) if err != nil { impl.logger.Errorw("service err, RecipientListingSuggestion", "err", err, "value", value) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } @@ -653,13 +654,13 @@ func (impl NotificationRestHandlerImpl) RecipientListingSuggestion(w http.Respon } w.Header().Set("Content-Type", "application/json") - writeJsonResp(w, nil, channelsResponse, http.StatusOK) + common.WriteJsonResp(w, nil, channelsResponse, http.StatusOK) } func (impl NotificationRestHandlerImpl) FindAllNotificationConfigAutocomplete(w http.ResponseWriter, r *http.Request) { userId, err := impl.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } @@ -677,13 +678,13 @@ func (impl NotificationRestHandlerImpl) FindAllNotificationConfigAutocomplete(w channelsResponseAll, err := impl.slackService.FetchAllSlackNotificationConfigAutocomplete() if err != nil && err != pg.ErrNoRows { impl.logger.Errorw("service err, FindAllNotificationConfigAutocomplete", "err", err) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } for _, item := range channelsResponseAll { team, err := impl.teamService.FetchOne(item.TeamId) if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } if ok := impl.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, fmt.Sprintf("%s/*", strings.ToLower(team.Name))); ok { @@ -699,7 +700,7 @@ func (impl NotificationRestHandlerImpl) FindAllNotificationConfigAutocomplete(w channelsResponse, err = impl.sesService.FetchAllSESNotificationConfigAutocomplete() if err != nil && err != pg.ErrNoRows { impl.logger.Errorw("service err, FindAllNotificationConfigAutocomplete", "err", err) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } } @@ -708,21 +709,21 @@ func (impl NotificationRestHandlerImpl) FindAllNotificationConfigAutocomplete(w } w.Header().Set("Content-Type", "application/json") - writeJsonResp(w, nil, channelsResponse, http.StatusOK) + common.WriteJsonResp(w, nil, channelsResponse, http.StatusOK) } func (impl NotificationRestHandlerImpl) GetOptionsForNotificationSettings(w http.ResponseWriter, r *http.Request) { decoder := json.NewDecoder(r.Body) userId, err := impl.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } var request repository.SearchRequest err = decoder.Decode(&request) if err != nil { impl.logger.Errorw("request err, GetOptionsForNotificationSettings", "err", err, "request", request) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } request.UserId = userId @@ -730,7 +731,7 @@ func (impl NotificationRestHandlerImpl) GetOptionsForNotificationSettings(w http notificationSettingsOptions, err := impl.notificationService.FindNotificationSettingOptions(&request) if err != nil && err != pg.ErrNoRows { impl.logger.Errorw("service err, GetOptionsForNotificationSettings", "err", err) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } @@ -776,5 +777,5 @@ func (impl NotificationRestHandlerImpl) GetOptionsForNotificationSettings(w http if filteredSettingViews == nil { filteredSettingViews = make([]*notifier.SearchFilterResponse, 0) } - writeJsonResp(w, err, filteredSettingViews, http.StatusOK) + common.WriteJsonResp(w, err, filteredSettingViews, http.StatusOK) } diff --git a/api/restHandler/PipelineConfigRestHandler.go b/api/restHandler/PipelineConfigRestHandler.go deleted file mode 100644 index 1a6164bed2..0000000000 --- a/api/restHandler/PipelineConfigRestHandler.go +++ /dev/null @@ -1,3359 +0,0 @@ -/* - * Copyright (c) 2020 Devtron Labs - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package restHandler - -import ( - "bufio" - "context" - "encoding/json" - "errors" - "fmt" - "io" - "net/http" - "strconv" - "strings" - - "github.com/argoproj/argo/pkg/apis/workflow/v1alpha1" - bean2 "github.com/devtron-labs/devtron/api/bean" - "github.com/devtron-labs/devtron/client/argocdServer/application" - "github.com/devtron-labs/devtron/client/gitSensor" - "github.com/devtron-labs/devtron/internal/sql/repository" - "github.com/devtron-labs/devtron/internal/sql/repository/pipelineConfig" - "github.com/devtron-labs/devtron/internal/sql/repository/security" - "github.com/devtron-labs/devtron/internal/util" - "github.com/devtron-labs/devtron/pkg/appClone" - "github.com/devtron-labs/devtron/pkg/appWorkflow" - "github.com/devtron-labs/devtron/pkg/bean" - request "github.com/devtron-labs/devtron/pkg/cluster" - "github.com/devtron-labs/devtron/pkg/pipeline" - security2 "github.com/devtron-labs/devtron/pkg/security" - "github.com/devtron-labs/devtron/pkg/team" - "github.com/devtron-labs/devtron/pkg/user" - util2 "github.com/devtron-labs/devtron/util" - "github.com/devtron-labs/devtron/util/rbac" - "github.com/go-pg/pg" - "github.com/gorilla/mux" - "github.com/grpc-ecosystem/grpc-gateway/runtime" - "go.uber.org/zap" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/status" - "gopkg.in/go-playground/validator.v9" -) - -type PipelineConfigRestHandler interface { - CreateCiConfig(w http.ResponseWriter, r *http.Request) - ConfigureDeploymentTemplateForApp(w http.ResponseWriter, r *http.Request) - CreateApp(w http.ResponseWriter, r *http.Request) - DeleteApp(w http.ResponseWriter, r *http.Request) - CreateMaterial(w http.ResponseWriter, r *http.Request) - UpdateMaterial(w http.ResponseWriter, r *http.Request) - CreateCdPipeline(w http.ResponseWriter, r *http.Request) - EnvConfigOverrideCreate(w http.ResponseWriter, r *http.Request) - EnvConfigOverrideUpdate(w http.ResponseWriter, r *http.Request) - GetEnvConfOverride(w http.ResponseWriter, r *http.Request) - GetCiPipeline(w http.ResponseWriter, r *http.Request) - UpdateCiTemplate(w http.ResponseWriter, r *http.Request) - PatchCiPipelines(w http.ResponseWriter, r *http.Request) - GetDeploymentTemplate(w http.ResponseWriter, r *http.Request) - GetApp(w http.ResponseWriter, r *http.Request) - PatchCdPipeline(w http.ResponseWriter, r *http.Request) - GetCdPipelines(w http.ResponseWriter, r *http.Request) - GetCdPipelinesForAppAndEnv(w http.ResponseWriter, r *http.Request) - GetArtifactsByCDPipeline(w http.ResponseWriter, r *http.Request) - FetchArtifactForRollback(w http.ResponseWriter, r *http.Request) - GetAppOverrideForDefaultTemplate(w http.ResponseWriter, r *http.Request) - UpdateAppOverride(w http.ResponseWriter, r *http.Request) - - GetMigrationConfig(w http.ResponseWriter, r *http.Request) - CreateMigrationConfig(w http.ResponseWriter, r *http.Request) - UpdateMigrationConfig(w http.ResponseWriter, r *http.Request) - - FindAppsByTeamId(w http.ResponseWriter, r *http.Request) - FindAppsByTeamName(w http.ResponseWriter, r *http.Request) - - TriggerCiPipeline(w http.ResponseWriter, r *http.Request) - FetchMaterials(w http.ResponseWriter, r *http.Request) - FetchWorkflowDetails(w http.ResponseWriter, r *http.Request) - GetCiPipelineMin(w http.ResponseWriter, r *http.Request) - - FetchChanges(w http.ResponseWriter, r *http.Request) - GetHistoricBuildLogs(w http.ResponseWriter, r *http.Request) - GetBuildLogs(w http.ResponseWriter, r *http.Request) - GetBuildHistory(w http.ResponseWriter, r *http.Request) - HandleWorkflowWebhook(w http.ResponseWriter, r *http.Request) - CancelWorkflow(w http.ResponseWriter, r *http.Request) - CancelStage(w http.ResponseWriter, r *http.Request) - DownloadCiWorkflowArtifacts(w http.ResponseWriter, r *http.Request) - - GetAppListForAutocomplete(w http.ResponseWriter, r *http.Request) - GetAppListByTeamIds(w http.ResponseWriter, r *http.Request) - EnvironmentListAutocomplete(w http.ResponseWriter, r *http.Request) - GitListAutocomplete(w http.ResponseWriter, r *http.Request) - DockerListAutocomplete(w http.ResponseWriter, r *http.Request) - TeamListAutocomplete(w http.ResponseWriter, r *http.Request) - - IsReadyToTrigger(w http.ResponseWriter, r *http.Request) - FetchCDPipelineStrategy(w http.ResponseWriter, r *http.Request) - - UpgradeForAllApps(w http.ResponseWriter, r *http.Request) - EnvConfigOverrideReset(w http.ResponseWriter, r *http.Request) - EnvConfigOverrideCreateNamespace(w http.ResponseWriter, r *http.Request) - - AppMetricsEnableDisable(w http.ResponseWriter, r *http.Request) - EnvMetricsEnableDisable(w http.ResponseWriter, r *http.Request) - - GetCdBuildHistory(w http.ResponseWriter, r *http.Request) - GetCdBuildLogs(w http.ResponseWriter, r *http.Request) - FetchCdWorkflowDetails(w http.ResponseWriter, r *http.Request) - DownloadCdWorkflowArtifacts(w http.ResponseWriter, r *http.Request) - FetchCdPrePostStageStatus(w http.ResponseWriter, r *http.Request) - - GetCdPipelineById(w http.ResponseWriter, r *http.Request) - FetchConfigmapSecretsForCdStages(w http.ResponseWriter, r *http.Request) - - FetchAppWorkflowStatusForTriggerView(w http.ResponseWriter, r *http.Request) - - RefreshMaterials(w http.ResponseWriter, r *http.Request) - FetchMaterialInfo(w http.ResponseWriter, r *http.Request) - GetCIPipelineById(w http.ResponseWriter, r *http.Request) - PipelineNameSuggestion(w http.ResponseWriter, r *http.Request) -} - -type PipelineConfigRestHandlerImpl struct { - pipelineBuilder pipeline.PipelineBuilder - ciPipelineRepository pipelineConfig.CiPipelineRepository - ciHandler pipeline.CiHandler - Logger *zap.SugaredLogger - chartService pipeline.ChartService - propertiesConfigService pipeline.PropertiesConfigService - dbMigrationService pipeline.DbMigrationService - application application.ServiceClient - userAuthService user.UserService - validator *validator.Validate - teamService team.TeamService - enforcer rbac.Enforcer - gitSensorClient gitSensor.GitSensorClient - pipelineRepository pipelineConfig.PipelineRepository - appWorkflowService appWorkflow.AppWorkflowService - enforcerUtil rbac.EnforcerUtil - envService request.EnvironmentService - gitRegistryConfig pipeline.GitRegistryConfig - dockerRegistryConfig pipeline.DockerRegistryConfig - cdHandelr pipeline.CdHandler - appCloneService appClone.AppCloneService - materialRepository pipelineConfig.MaterialRepository - policyService security2.PolicyService - scanResultRepository security.ImageScanResultRepository - gitProviderRepo repository.GitProviderRepository -} - -func NewPipelineRestHandlerImpl(pipelineBuilder pipeline.PipelineBuilder, Logger *zap.SugaredLogger, - chartService pipeline.ChartService, - propertiesConfigService pipeline.PropertiesConfigService, - dbMigrationService pipeline.DbMigrationService, - application application.ServiceClient, - userAuthService user.UserService, - teamService team.TeamService, - enforcer rbac.Enforcer, - ciHandler pipeline.CiHandler, - validator *validator.Validate, - gitSensorClient gitSensor.GitSensorClient, - ciPipelineRepository pipelineConfig.CiPipelineRepository, pipelineRepository pipelineConfig.PipelineRepository, - enforcerUtil rbac.EnforcerUtil, envService request.EnvironmentService, - gitRegistryConfig pipeline.GitRegistryConfig, dockerRegistryConfig pipeline.DockerRegistryConfig, - cdHandelr pipeline.CdHandler, - appCloneService appClone.AppCloneService, - appWorkflowService appWorkflow.AppWorkflowService, - materialRepository pipelineConfig.MaterialRepository, policyService security2.PolicyService, - scanResultRepository security.ImageScanResultRepository, gitProviderRepo repository.GitProviderRepository) *PipelineConfigRestHandlerImpl { - return &PipelineConfigRestHandlerImpl{ - pipelineBuilder: pipelineBuilder, - Logger: Logger, - chartService: chartService, - propertiesConfigService: propertiesConfigService, - dbMigrationService: dbMigrationService, - application: application, - userAuthService: userAuthService, - validator: validator, - teamService: teamService, - enforcer: enforcer, - ciHandler: ciHandler, - gitSensorClient: gitSensorClient, - ciPipelineRepository: ciPipelineRepository, - pipelineRepository: pipelineRepository, - enforcerUtil: enforcerUtil, - envService: envService, - gitRegistryConfig: gitRegistryConfig, - dockerRegistryConfig: dockerRegistryConfig, - cdHandelr: cdHandelr, - appCloneService: appCloneService, - appWorkflowService: appWorkflowService, - materialRepository: materialRepository, - policyService: policyService, - scanResultRepository: scanResultRepository, - gitProviderRepo: gitProviderRepo, - } -} - -const ( - devtron = "DEVTRON" - SSH_URL_PREFIX = "git@" - HTTPS_URL_PREFIX = "https://" -) - -func (handler PipelineConfigRestHandlerImpl) DeleteApp(w http.ResponseWriter, r *http.Request) { - token := r.Header.Get("token") - userId, err := handler.userAuthService.GetLoggedInUser(r) - if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) - return - } - vars := mux.Vars(r) - appId, err := strconv.Atoi(vars["appId"]) - if err != nil { - handler.Logger.Errorw("request err, delete app", "err", err, "appId", appId) - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - handler.Logger.Infow("request payload, delete app", "appId", appId) - wfs, err := handler.appWorkflowService.FindAppWorkflows(appId) - if err != nil { - handler.Logger.Errorw("could not fetch wfs", "err", err, "appId", appId) - writeJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - if len(wfs) != 0 { - handler.Logger.Info("cannot delete app with workflow's") - err = &util.ApiError{Code: "400", HttpStatusCode: 400, UserMessage: "cannot delete app having workflow's"} - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - - resourceObject := handler.enforcerUtil.GetAppRBACNameByAppId(appId) - if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionDelete, resourceObject); !ok { - writeJsonResp(w, err, "Unauthorized User", http.StatusForbidden) - return - } - - err = handler.pipelineBuilder.DeleteApp(appId, userId) - if err != nil { - handler.Logger.Errorw("service error, delete app", "err", err, "appId", appId) - writeJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - writeJsonResp(w, err, nil, http.StatusOK) -} - -func (handler PipelineConfigRestHandlerImpl) CreateApp(w http.ResponseWriter, r *http.Request) { - token := r.Header.Get("token") - decoder := json.NewDecoder(r.Body) - userId, err := handler.userAuthService.GetLoggedInUser(r) - if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) - return - } - var createRequest bean.CreateAppDTO - err = decoder.Decode(&createRequest) - createRequest.UserId = userId - if err != nil { - handler.Logger.Errorw("request err, CreateApp", "err", err, "CreateApp", createRequest) - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - - handler.Logger.Infow("request payload, CreateApp", "CreateApp", createRequest) - err = handler.validator.Struct(createRequest) - if err != nil { - handler.Logger.Errorw("validation err, CreateApp", "err", err, "CreateApp", createRequest) - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - - team, err := handler.teamService.FetchOne(createRequest.TeamId) - if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - // with admin roles, you have to access for all the apps of the project to create new app. (admin or manager with specific app permission can't create app.) - if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionCreate, fmt.Sprintf("%s/%s", strings.ToLower(team.Name), "*")); !ok { - writeJsonResp(w, err, "Unauthorized User", http.StatusForbidden) - return - } - var createResp *bean.CreateAppDTO - err = nil - if createRequest.TemplateId == 0 { - createResp, err = handler.pipelineBuilder.CreateApp(&createRequest) - } else { - ctx, cancel := context.WithCancel(r.Context()) - if cn, ok := w.(http.CloseNotifier); ok { - go func(done <-chan struct{}, closed <-chan bool) { - select { - case <-done: - case <-closed: - cancel() - } - }(ctx.Done(), cn.CloseNotify()) - } - ctx = context.WithValue(r.Context(), "token", token) - createResp, err = handler.appCloneService.CloneApp(&createRequest, ctx) - } - if err != nil { - handler.Logger.Errorw("service err, CreateApp", "err", err, "CreateApp", createRequest) - writeJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - writeJsonResp(w, err, createResp, http.StatusOK) -} - -func (handler PipelineConfigRestHandlerImpl) ValidateGitMaterialUrl(gitProviderId int, url string) (bool, error) { - gitProvider, err := handler.gitProviderRepo.FindOne(strconv.Itoa(gitProviderId)) - if err != nil { - return false, err - } - if gitProvider.AuthMode == repository.AUTH_MODE_SSH { - hasPrefixResult := strings.HasPrefix(url, SSH_URL_PREFIX) - return hasPrefixResult, nil - } - hasPrefixResult := strings.HasPrefix(url, HTTPS_URL_PREFIX) - return hasPrefixResult, nil -} - -func (handler PipelineConfigRestHandlerImpl) CreateMaterial(w http.ResponseWriter, r *http.Request) { - token := r.Header.Get("token") - decoder := json.NewDecoder(r.Body) - userId, err := handler.userAuthService.GetLoggedInUser(r) - if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) - return - } - var createMaterialDto bean.CreateMaterialDTO - err = decoder.Decode(&createMaterialDto) - createMaterialDto.UserId = userId - if err != nil { - handler.Logger.Errorw("request err, CreateMaterial", "err", err, "CreateMaterial", createMaterialDto) - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - handler.Logger.Infow("request payload, CreateMaterial", "CreateMaterial", createMaterialDto) - err = handler.validator.Struct(createMaterialDto) - if err != nil { - handler.Logger.Errorw("validation err, CreateMaterial", "err", err, "CreateMaterial", createMaterialDto) - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - for _, gitMaterial := range createMaterialDto.Material { - validationResult, err := handler.ValidateGitMaterialUrl(gitMaterial.GitProviderId, gitMaterial.Url) - if err != nil { - handler.Logger.Errorw("service err, CreateMaterial", "err", err, "CreateMaterial", createMaterialDto) - writeJsonResp(w, err, nil, http.StatusInternalServerError) - return - } else { - if !validationResult { - handler.Logger.Errorw("validation err, CreateMaterial : invalid git material url", "err", err, "gitMaterialUrl", gitMaterial.Url, "CreateMaterial", createMaterialDto) - writeJsonResp(w, fmt.Errorf("validation for url failed"), nil, http.StatusBadRequest) - return - } - } - } - resourceObject := handler.enforcerUtil.GetAppRBACNameByAppId(createMaterialDto.AppId) - if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionCreate, resourceObject); !ok { - writeJsonResp(w, err, "Unauthorized User", http.StatusForbidden) - return - } - - createResp, err := handler.pipelineBuilder.CreateMaterialsForApp(&createMaterialDto) - if err != nil { - handler.Logger.Errorw("service err, CreateMaterial", "err", err, "CreateMaterial", createMaterialDto) - writeJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - writeJsonResp(w, err, createResp, http.StatusOK) -} - -func (handler PipelineConfigRestHandlerImpl) UpdateMaterial(w http.ResponseWriter, r *http.Request) { - token := r.Header.Get("token") - decoder := json.NewDecoder(r.Body) - userId, err := handler.userAuthService.GetLoggedInUser(r) - if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) - return - } - var updateMaterialDto bean.UpdateMaterialDTO - err = decoder.Decode(&updateMaterialDto) - updateMaterialDto.UserId = userId - if err != nil { - handler.Logger.Errorw("request err, UpdateMaterial", "err", err, "UpdateMaterial", updateMaterialDto) - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - handler.Logger.Infow("request payload, UpdateMaterial", "UpdateMaterial", updateMaterialDto) - err = handler.validator.Struct(updateMaterialDto) - if err != nil { - handler.Logger.Errorw("validation err, UpdateMaterial", "err", err, "UpdateMaterial", updateMaterialDto) - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - validationResult, err := handler.ValidateGitMaterialUrl(updateMaterialDto.Material.GitProviderId, updateMaterialDto.Material.Url) - if err != nil { - handler.Logger.Errorw("service err, UpdateMaterial", "err", err, "UpdateMaterial", updateMaterialDto) - writeJsonResp(w, err, nil, http.StatusInternalServerError) - return - } else { - if !validationResult { - handler.Logger.Errorw("validation err, UpdateMaterial : invalid git material url", "err", err, "gitMaterialUrl", updateMaterialDto.Material.Url, "UpdateMaterial", updateMaterialDto) - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - } - resourceObject := handler.enforcerUtil.GetAppRBACNameByAppId(updateMaterialDto.AppId) - if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionCreate, resourceObject); !ok { - writeJsonResp(w, err, "Unauthorized User", http.StatusForbidden) - return - } - - createResp, err := handler.pipelineBuilder.UpdateMaterialsForApp(&updateMaterialDto) - if err != nil { - handler.Logger.Errorw("service err, UpdateMaterial", "err", err, "UpdateMaterial", updateMaterialDto) - writeJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - writeJsonResp(w, err, createResp, http.StatusOK) -} - -func (handler PipelineConfigRestHandlerImpl) GetApp(w http.ResponseWriter, r *http.Request) { - token := r.Header.Get("token") - vars := mux.Vars(r) - appId, err := strconv.Atoi(vars["appId"]) - if err != nil { - handler.Logger.Errorw("request err, get app", "err", err, "appId", appId) - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - handler.Logger.Infow("request payload, get app", "appId", appId) - ciConf, err := handler.pipelineBuilder.GetApp(appId) - if err != nil { - handler.Logger.Errorw("service err, get app", "err", err, "appId", appId) - writeJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - - //rback implementation starts here - object := handler.enforcerUtil.GetAppRBACNameByAppId(appId) - if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); !ok { - writeJsonResp(w, err, "Unauthorized User", http.StatusForbidden) - return - } - //rback implementation ends here - - writeJsonResp(w, err, ciConf, http.StatusOK) -} - -func (handler PipelineConfigRestHandlerImpl) CreateCiConfig(w http.ResponseWriter, r *http.Request) { - decoder := json.NewDecoder(r.Body) - userId, err := handler.userAuthService.GetLoggedInUser(r) - if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) - return - } - var createRequest bean.CiConfigRequest - err = decoder.Decode(&createRequest) - createRequest.UserId = userId - if err != nil { - handler.Logger.Errorw("request err, create ci config", "err", err, "create request", createRequest) - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - handler.Logger.Infow("request payload, create ci config", "create request", createRequest) - err = handler.validator.Struct(createRequest) - if err != nil { - handler.Logger.Errorw("validation err, create ci config", "err", err, "create request", createRequest) - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - token := r.Header.Get("token") - app, err := handler.pipelineBuilder.GetApp(createRequest.AppId) - if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - resourceName := handler.enforcerUtil.GetAppRBACName(app.AppName) - if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionCreate, resourceName); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) - return - } - createResp, err := handler.pipelineBuilder.CreateCiPipeline(&createRequest) - if err != nil { - handler.Logger.Errorw("service err, create", "err", err, "create request", createRequest) - writeJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - writeJsonResp(w, err, createResp, http.StatusOK) -} - -func (handler PipelineConfigRestHandlerImpl) UpdateCiTemplate(w http.ResponseWriter, r *http.Request) { - decoder := json.NewDecoder(r.Body) - userId, err := handler.userAuthService.GetLoggedInUser(r) - if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) - return - } - var configRequest bean.CiConfigRequest - err = decoder.Decode(&configRequest) - configRequest.UserId = userId - if err != nil { - handler.Logger.Errorw("request err, UpdateCiTemplate", "err", err, "UpdateCiTemplate", configRequest) - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - handler.Logger.Infow("request payload, update ci template", "UpdateCiTemplate", configRequest) - err = handler.validator.Struct(configRequest) - if err != nil { - handler.Logger.Errorw("validation err, UpdateCiTemplate", "err", err, "UpdateCiTemplate", configRequest) - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - token := r.Header.Get("token") - app, err := handler.pipelineBuilder.GetApp(configRequest.AppId) - if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - resourceName := handler.enforcerUtil.GetAppRBACName(app.AppName) - if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionCreate, resourceName); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) - return - } - createResp, err := handler.pipelineBuilder.UpdateCiTemplate(&configRequest) - if err != nil { - handler.Logger.Errorw("service err, UpdateCiTemplate", "err", err, "UpdateCiTemplate", configRequest) - writeJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - writeJsonResp(w, err, createResp, http.StatusOK) -} - -func (handler PipelineConfigRestHandlerImpl) PatchCiPipelines(w http.ResponseWriter, r *http.Request) { - decoder := json.NewDecoder(r.Body) - userId, err := handler.userAuthService.GetLoggedInUser(r) - if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) - return - } - var patchRequest bean.CiPatchRequest - err = decoder.Decode(&patchRequest) - patchRequest.UserId = userId - if err != nil { - handler.Logger.Errorw("request err, PatchCiPipelines", "err", err, "PatchCiPipelines", patchRequest) - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - handler.Logger.Infow("request payload, PatchCiPipelines", "PatchCiPipelines", patchRequest) - err = handler.validator.Struct(patchRequest) - if err != nil { - handler.Logger.Errorw("validation err", "err", err) - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - handler.Logger.Debugw("update request ", "req", patchRequest) - token := r.Header.Get("token") - app, err := handler.pipelineBuilder.GetApp(patchRequest.AppId) - if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - resourceName := handler.enforcerUtil.GetAppRBACName(app.AppName) - if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionCreate, resourceName); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) - return - } - createResp, err := handler.pipelineBuilder.PatchCiPipeline(&patchRequest) - if err != nil { - handler.Logger.Errorw("service err, PatchCiPipelines", "err", err, "PatchCiPipelines", patchRequest) - writeJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - writeJsonResp(w, err, createResp, http.StatusOK) -} - -func (handler PipelineConfigRestHandlerImpl) ConfigureDeploymentTemplateForApp(w http.ResponseWriter, r *http.Request) { - decoder := json.NewDecoder(r.Body) - userId, err := handler.userAuthService.GetLoggedInUser(r) - if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) - return - } - var templateRequest pipeline.TemplateRequest - err = decoder.Decode(&templateRequest) - templateRequest.UserId = userId - if err != nil { - handler.Logger.Errorw("request err, ConfigureDeploymentTemplateForApp", "err", err, "payload", templateRequest) - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - chartRefId := templateRequest.ChartRefId - validate, error := handler.chartService.DeploymentTemplateValidate(templateRequest.ValuesOverride, chartRefId) - if !validate { - writeJsonResp(w, error, nil, http.StatusBadRequest) - - return - } - handler.Logger.Infow("request payload, ConfigureDeploymentTemplateForApp", "payload", templateRequest) - err = handler.validator.Struct(templateRequest) - if err != nil { - handler.Logger.Errorw("validation err, ConfigureDeploymentTemplateForApp", "err", err, "payload", templateRequest) - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - token := r.Header.Get("token") - app, err := handler.pipelineBuilder.GetApp(templateRequest.AppId) - if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - resourceName := handler.enforcerUtil.GetAppRBACName(app.AppName) - if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionCreate, resourceName); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) - return - } - ctx, cancel := context.WithCancel(r.Context()) - if cn, ok := w.(http.CloseNotifier); ok { - go func(done <-chan struct{}, closed <-chan bool) { - select { - case <-done: - case <-closed: - cancel() - } - }(ctx.Done(), cn.CloseNotify()) - } - ctx = context.WithValue(r.Context(), "token", token) - createResp, err := handler.chartService.Create(templateRequest, ctx) - if err != nil { - handler.Logger.Errorw("service err, ConfigureDeploymentTemplateForApp", "err", err, "payload", templateRequest) - writeJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - writeJsonResp(w, err, createResp, http.StatusOK) -} - -func (handler PipelineConfigRestHandlerImpl) CreateCdPipeline(w http.ResponseWriter, r *http.Request) { - decoder := json.NewDecoder(r.Body) - userId, err := handler.userAuthService.GetLoggedInUser(r) - if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) - return - } - var cdPipeline bean.CdPipelines - err = decoder.Decode(&cdPipeline) - cdPipeline.UserId = userId - if err != nil { - handler.Logger.Errorw("request err, CreateCdPipeline", "err", err, "payload", cdPipeline) - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - handler.Logger.Infow("request payload, CreateCdPipeline", "payload", cdPipeline) - err = handler.validator.Struct(cdPipeline) - if err != nil { - handler.Logger.Errorw("validation err, CreateCdPipeline", "err", err, "payload", cdPipeline) - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - handler.Logger.Debugw("pipeline create request ", "req", cdPipeline) - token := r.Header.Get("token") - app, err := handler.pipelineBuilder.GetApp(cdPipeline.AppId) - if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - - //RBAC - resourceName := handler.enforcerUtil.GetAppRBACName(app.AppName) - if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionCreate, resourceName); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) - return - } - for _, pline := range cdPipeline.Pipelines { - object := handler.enforcerUtil.GetAppRBACByAppNameAndEnvId(app.AppName, pline.EnvironmentId) - handler.Logger.Debugw("Triggered Request By:", "object", object) - if ok := handler.enforcer.Enforce(token, rbac.ResourceEnvironment, rbac.ActionCreate, object); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) - return - } - } - //RBAC - - ctx := context.WithValue(r.Context(), "token", token) - createResp, err := handler.pipelineBuilder.CreateCdPipelines(&cdPipeline, ctx) - if err != nil { - handler.Logger.Errorw("service err, CreateCdPipeline", "err", err, "payload", cdPipeline) - writeJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - writeJsonResp(w, err, createResp, http.StatusOK) -} - -func (handler PipelineConfigRestHandlerImpl) PatchCdPipeline(w http.ResponseWriter, r *http.Request) { - decoder := json.NewDecoder(r.Body) - userId, err := handler.userAuthService.GetLoggedInUser(r) - if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) - return - } - var cdPipeline bean.CDPatchRequest - err = decoder.Decode(&cdPipeline) - cdPipeline.UserId = userId - if err != nil { - handler.Logger.Errorw("request err, PatchCdPipeline", "err", err, "payload", cdPipeline) - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - - v := r.URL.Query() - forceDelete := false - force := v.Get("force") - if len(force) > 0 { - forceDelete, err = strconv.ParseBool(force) - if err != nil { - handler.Logger.Errorw("request err, PatchCdPipeline", "err", err, "payload", cdPipeline) - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - } - cdPipeline.ForceDelete = forceDelete - handler.Logger.Infow("request payload, PatchCdPipeline", "payload", cdPipeline) - err = handler.validator.StructPartial(cdPipeline, "AppId", "Action") - if err == nil { - if cdPipeline.Action == bean.CdPatchAction(bean.CD_CREATE) { - err = handler.validator.Struct(cdPipeline.Pipeline) - } else if cdPipeline.Action == bean.CdPatchAction(bean.CD_DELETE) { - err = handler.validator.Var(cdPipeline.Pipeline.Id, "gt=0") - } - } - if err != nil { - handler.Logger.Errorw("validation err, PatchCdPipeline", "err", err, "payload", cdPipeline) - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - token := r.Header.Get("token") - app, err := handler.pipelineBuilder.GetApp(cdPipeline.AppId) - if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - resourceName := handler.enforcerUtil.GetAppRBACName(app.AppName) - if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionUpdate, resourceName); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) - return - } - - object := handler.enforcerUtil.GetAppRBACByAppIdAndPipelineId(cdPipeline.AppId, cdPipeline.Pipeline.Id) - if ok := handler.enforcer.Enforce(token, rbac.ResourceEnvironment, rbac.ActionUpdate, object); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) - return - } - - ctx := context.WithValue(r.Context(), "token", token) - createResp, err := handler.pipelineBuilder.PatchCdPipelines(&cdPipeline, ctx) - if err != nil { - handler.Logger.Errorw("service err, PatchCdPipeline", "err", err, "payload", cdPipeline) - writeJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - writeJsonResp(w, err, createResp, http.StatusOK) -} - -func (handler PipelineConfigRestHandlerImpl) EnvConfigOverrideCreate(w http.ResponseWriter, r *http.Request) { - userId, err := handler.userAuthService.GetLoggedInUser(r) - if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) - return - } - decoder := json.NewDecoder(r.Body) - var envConfigProperties pipeline.EnvironmentProperties - err = decoder.Decode(&envConfigProperties) - if err != nil { - handler.Logger.Errorw("request err, EnvConfigOverrideCreate", "err", err, "payload", envConfigProperties) - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - token := r.Header.Get("token") - vars := mux.Vars(r) - appId, err := strconv.Atoi(vars["appId"]) - if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - environmentId, err := strconv.Atoi(vars["environmentId"]) - if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - envConfigProperties.UserId = userId - envConfigProperties.EnvironmentId = environmentId - handler.Logger.Infow("request payload, EnvConfigOverrideCreate", "payload", envConfigProperties) - - resourceName := handler.enforcerUtil.GetAppRBACNameByAppId(appId) - if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionCreate, resourceName); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) - return - } - object := handler.enforcerUtil.GetEnvRBACNameByAppId(appId, environmentId) - if ok := handler.enforcer.Enforce(token, rbac.ResourceEnvironment, rbac.ActionUpdate, object); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) - return - } - chartRefId := envConfigProperties.ChartRefId - validate, error := handler.chartService.DeploymentTemplateValidate(envConfigProperties.EnvOverrideValues, chartRefId) - if !validate { - handler.Logger.Errorw("validation err, UpdateAppOverride", "err", error, "payload", envConfigProperties) - writeJsonResp(w, error, nil, http.StatusBadRequest) - return - } - createResp, err := handler.propertiesConfigService.CreateEnvironmentProperties(appId, &envConfigProperties) - if err != nil { - if err.Error() == bean2.NOCHARTEXIST { - ctx, cancel := context.WithCancel(r.Context()) - if cn, ok := w.(http.CloseNotifier); ok { - go func(done <-chan struct{}, closed <-chan bool) { - select { - case <-done: - case <-closed: - cancel() - } - }(ctx.Done(), cn.CloseNotify()) - } - ctx = context.WithValue(r.Context(), "token", token) - templateRequest := pipeline.TemplateRequest{ - AppId: appId, - ChartRefId: envConfigProperties.ChartRefId, - ValuesOverride: []byte("{}"), - UserId: userId, - } - - _, err = handler.chartService.CreateChartFromEnvOverride(templateRequest, ctx) - if err != nil { - handler.Logger.Errorw("service err, EnvConfigOverrideCreate", "err", err, "payload", envConfigProperties) - writeJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - createResp, err = handler.propertiesConfigService.CreateEnvironmentProperties(appId, &envConfigProperties) - if err != nil { - handler.Logger.Errorw("service err, EnvConfigOverrideCreate", "err", err, "payload", envConfigProperties) - writeJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - } else { - handler.Logger.Errorw("service err, EnvConfigOverrideCreate", "err", err, "payload", envConfigProperties) - writeJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - } - writeJsonResp(w, err, createResp, http.StatusOK) -} - -func (handler PipelineConfigRestHandlerImpl) EnvConfigOverrideUpdate(w http.ResponseWriter, r *http.Request) { - decoder := json.NewDecoder(r.Body) - //userId := getLoggedInUser(r) - userId, err := handler.userAuthService.GetLoggedInUser(r) - if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) - return - } - var envConfigProperties pipeline.EnvironmentProperties - err = decoder.Decode(&envConfigProperties) - envConfigProperties.UserId = userId - if err != nil { - handler.Logger.Errorw("request err, EnvConfigOverrideUpdate", "err", err, "payload", envConfigProperties) - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - handler.Logger.Infow("request payload, EnvConfigOverrideUpdate", "payload", envConfigProperties) - err = handler.validator.Struct(envConfigProperties) - if err != nil { - handler.Logger.Errorw("validation err, EnvConfigOverrideUpdate", "err", err, "payload", envConfigProperties) - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - token := r.Header.Get("token") - envConfigOverride, err := handler.propertiesConfigService.GetAppIdByChartEnvId(envConfigProperties.Id) - if err != nil { - handler.Logger.Errorw("service err, EnvConfigOverrideUpdate", "err", err, "payload", envConfigProperties) - writeJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - appId := envConfigOverride.Chart.AppId - envId := envConfigOverride.TargetEnvironment - resourceName := handler.enforcerUtil.GetAppRBACNameByAppId(appId) - if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionUpdate, resourceName); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) - return - } - object := handler.enforcerUtil.GetEnvRBACNameByAppId(appId, envId) - if ok := handler.enforcer.Enforce(token, rbac.ResourceEnvironment, rbac.ActionUpdate, object); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) - return - } - chartRefId := envConfigProperties.ChartRefId - validate, error := handler.chartService.DeploymentTemplateValidate(envConfigProperties.EnvOverrideValues, chartRefId) - if !validate { - handler.Logger.Errorw("validation err, UpdateAppOverride", "err", error, "payload", envConfigProperties) - writeJsonResp(w, error, nil, http.StatusBadRequest) - return - } - createResp, err := handler.propertiesConfigService.UpdateEnvironmentProperties(appId, &envConfigProperties, userId) - if err != nil { - handler.Logger.Errorw("service err, EnvConfigOverrideUpdate", "err", err, "payload", envConfigProperties) - writeJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - writeJsonResp(w, err, createResp, http.StatusOK) -} - -func (handler PipelineConfigRestHandlerImpl) GetEnvConfOverride(w http.ResponseWriter, r *http.Request) { - vars := mux.Vars(r) - environmentId, err := strconv.Atoi(vars["environmentId"]) - if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - appId, err := strconv.Atoi(vars["appId"]) - if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - chartRefId, err := strconv.Atoi(vars["chartRefId"]) - if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - token := r.Header.Get("token") - app, err := handler.pipelineBuilder.GetApp(appId) - if err != nil { - handler.Logger.Errorw("service err, GetEnvConfOverride", "err", err, "payload", appId, environmentId, chartRefId) - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - handler.Logger.Infow("request payload, GetEnvConfOverride", "payload", appId, environmentId, chartRefId) - resourceName := handler.enforcerUtil.GetAppRBACName(app.AppName) - if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, resourceName); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) - return - } - env, err := handler.propertiesConfigService.GetEnvironmentProperties(appId, environmentId, chartRefId) - if err != nil { - handler.Logger.Errorw("service err, GetEnvConfOverride", "err", err, "payload", appId, environmentId, chartRefId) - writeJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - writeJsonResp(w, err, env, http.StatusOK) -} - -func (handler PipelineConfigRestHandlerImpl) GetCiPipeline(w http.ResponseWriter, r *http.Request) { - vars := mux.Vars(r) - appId, err := strconv.Atoi(vars["appId"]) - if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - token := r.Header.Get("token") - app, err := handler.pipelineBuilder.GetApp(appId) - if err != nil { - handler.Logger.Errorw("service err, GetCiPipeline", "err", err, "appId", appId) - writeJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - resourceName := handler.enforcerUtil.GetAppRBACName(app.AppName) - if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, resourceName); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) - return - } - ciConf, err := handler.pipelineBuilder.GetCiPipeline(appId) - if err != nil { - handler.Logger.Errorw("service err, GetCiPipeline", "err", err, "appId", appId) - writeJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - if ciConf == nil || ciConf.Id == 0 { - err = &util.ApiError{Code: "404", HttpStatusCode: 200, UserMessage: "no data found"} - } - writeJsonResp(w, err, ciConf, http.StatusOK) -} - -func (handler PipelineConfigRestHandlerImpl) GetDeploymentTemplate(w http.ResponseWriter, r *http.Request) { - vars := mux.Vars(r) - appId, err := strconv.Atoi(vars["appId"]) - if err != nil { - handler.Logger.Error(err) - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - chartRefId, err := strconv.Atoi(vars["chartRefId"]) - if err != nil { - handler.Logger.Error(err) - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - handler.Logger.Infow("request payload, GetDeploymentTemplate", "appId", appId, "chartRefId", chartRefId) - token := r.Header.Get("token") - app, err := handler.pipelineBuilder.GetApp(appId) - if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - resourceName := handler.enforcerUtil.GetAppRBACName(app.AppName) - if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, resourceName); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) - return - } - - appConfigResponse := map[string]json.RawMessage{} - appConfigResponse["globalConfig"] = nil - - template, err := handler.chartService.FindLatestChartForAppByAppId(appId) - if err != nil && pg.ErrNoRows != err { - handler.Logger.Errorw("service err, GetDeploymentTemplate", "err", err, "appId", appId, "chartRefId", chartRefId) - writeJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - - if pg.ErrNoRows == err { - appOverride, err := handler.chartService.GetAppOverrideForDefaultTemplate(chartRefId) - if err != nil { - handler.Logger.Errorw("service err, GetDeploymentTemplate", "err", err, "appId", appId, "chartRefId", chartRefId) - writeJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - mapB, _ := json.Marshal(appOverride) - if err != nil { - handler.Logger.Errorw("marshal err, GetDeploymentTemplate", "err", err, "appId", appId, "chartRefId", chartRefId) - return - } - appConfigResponse["globalConfig"] = mapB - } else { - if template.ChartRefId != chartRefId { - templateRequested, err := handler.chartService.GetByAppIdAndChartRefId(appId, chartRefId) - if err != nil && err != pg.ErrNoRows { - handler.Logger.Errorw("service err, GetDeploymentTemplate", "err", err, "appId", appId, "chartRefId", chartRefId) - writeJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - - if pg.ErrNoRows == err { - template.ChartRefId = chartRefId - template.Id = 0 - template.Latest = false - } else { - template.ChartRefId = templateRequested.ChartRefId - template.Id = templateRequested.Id - template.ChartRepositoryId = templateRequested.ChartRepositoryId - template.RefChartTemplate = templateRequested.RefChartTemplate - template.RefChartTemplateVersion = templateRequested.RefChartTemplateVersion - template.Latest = templateRequested.Latest - } - } - - bytes, err := json.Marshal(template) - if err != nil { - handler.Logger.Errorw("marshal err, GetDeploymentTemplate", "err", err, "appId", appId, "chartRefId", chartRefId) - return - } - appOverride := json.RawMessage(bytes) - appConfigResponse["globalConfig"] = appOverride - } - - writeJsonResp(w, nil, appConfigResponse, http.StatusOK) -} - -func (handler PipelineConfigRestHandlerImpl) GetCdPipelines(w http.ResponseWriter, r *http.Request) { - vars := mux.Vars(r) - appId, err := strconv.Atoi(vars["appId"]) - if err != nil { - handler.Logger.Errorw("request err, GetCdPipelines", "err", err, "appId", appId) - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - handler.Logger.Infow("request payload, GetCdPipelines", "appId", appId) - token := r.Header.Get("token") - app, err := handler.pipelineBuilder.GetApp(appId) - if err != nil { - handler.Logger.Errorw("service err, GetCdPipelines", "err", err, "appId", appId) - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - resourceName := handler.enforcerUtil.GetAppRBACName(app.AppName) - if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, resourceName); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) - return - } - - ciConf, err := handler.pipelineBuilder.GetCdPipelinesForApp(appId) - if err != nil { - handler.Logger.Errorw("service err, GetCdPipelines", "err", err, "appId", appId) - writeJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - - writeJsonResp(w, err, ciConf, http.StatusOK) -} - -func (handler PipelineConfigRestHandlerImpl) GetCdPipelinesForAppAndEnv(w http.ResponseWriter, r *http.Request) { - vars := mux.Vars(r) - appId, err := strconv.Atoi(vars["appId"]) - if err != nil { - handler.Logger.Errorw("request err, GetCdPipelinesForAppAndEnv", "err", err, "appId", appId) - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - - envId, err := strconv.Atoi(vars["envId"]) - if err != nil { - handler.Logger.Errorw("request err, GetCdPipelinesForAppAndEnv", "err", err, "envId", envId) - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - handler.Logger.Infow("request payload, GetCdPipelinesForAppAndEnv", "appId", appId, "envId", envId) - token := r.Header.Get("token") - app, err := handler.pipelineBuilder.GetApp(appId) - if err != nil { - handler.Logger.Errorw("service err, GetCdPipelinesForAppAndEnv", "err", err, "appId", appId, "envId", envId) - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - //rbac - resourceName := handler.enforcerUtil.GetAppRBACName(app.AppName) - if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, resourceName); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) - return - } - object := handler.enforcerUtil.GetEnvRBACNameByAppId(appId, envId) - if ok := handler.enforcer.Enforce(token, rbac.ResourceEnvironment, rbac.ActionGet, object); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) - return - } - //rbac - - cdPipelines, err := handler.pipelineBuilder.GetCdPipelinesForAppAndEnv(appId, envId) - if err != nil { - handler.Logger.Errorw("service err, GetCdPipelinesForAppAndEnv", "err", err, "appId", appId, "envId", envId) - writeJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - writeJsonResp(w, err, cdPipelines, http.StatusOK) -} - -func (handler PipelineConfigRestHandlerImpl) GetArtifactsByCDPipeline(w http.ResponseWriter, r *http.Request) { - token := r.Header.Get("token") - vars := mux.Vars(r) - cdPipelineId, err := strconv.Atoi(vars["cd_pipeline_id"]) - if err != nil { - handler.Logger.Errorw("request err, GetArtifactsByCDPipeline", "err", err, "cdPipelineId", cdPipelineId) - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - stage := r.URL.Query().Get("stage") - if len(stage) == 0 { - stage = "PRE" - } - handler.Logger.Infow("request payload, GetArtifactsByCDPipeline", "cdPipelineId", cdPipelineId, "stage", stage) - pipeline, err := handler.pipelineBuilder.FindPipelineById(cdPipelineId) - if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - app, err := handler.pipelineBuilder.GetApp(pipeline.AppId) - if err != nil { - handler.Logger.Errorw("service err, GetArtifactsByCDPipeline", "err", err, "cdPipelineId", cdPipelineId, "stage", stage) - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - - //rbac block starts from here - object := handler.enforcerUtil.GetAppRBACName(app.AppName) - if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) - return - } - - object = handler.enforcerUtil.GetAppRBACByAppNameAndEnvId(app.AppName, pipeline.EnvironmentId) - if ok := handler.enforcer.Enforce(token, rbac.ResourceEnvironment, rbac.ActionGet, object); !ok { - writeJsonResp(w, err, "Unauthorized User", http.StatusForbidden) - return - } - //rback block ends here - - ciArtifactResponse, err := handler.pipelineBuilder.GetArtifactsByCDPipeline(cdPipelineId, bean2.CdWorkflowType(stage)) - if err != nil { - handler.Logger.Errorw("service err, GetArtifactsByCDPipeline", "err", err, "cdPipelineId", cdPipelineId, "stage", stage) - writeJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - - var digests []string - for _, item := range ciArtifactResponse.CiArtifacts { - digests = append(digests, item.ImageDigest) - } - - pipelineModel, err := handler.pipelineRepository.FindById(cdPipelineId) - if err != nil { - handler.Logger.Errorw("service err, GetArtifactsByCDPipeline", "err", err, "cdPipelineId", cdPipelineId, "stage", stage) - writeJsonResp(w, err, nil, http.StatusInternalServerError) - } - if len(digests) > 0 { - vulnerableMap := make(map[string]bool) - for _, digest := range digests { - if len(digest) > 0 { - var cveStores []*security.CveStore - imageScanResult, err := handler.scanResultRepository.FindByImageDigest(digest) - if err != nil && err != pg.ErrNoRows { - handler.Logger.Errorw("service err, GetArtifactsByCDPipeline", "err", err, "cdPipelineId", cdPipelineId, "stage", stage) - continue //skip for other artifact to complete - } - for _, item := range imageScanResult { - cveStores = append(cveStores, &item.CveStore) - } - blockCveList, err := handler.policyService.GetBlockedCVEList(cveStores, pipelineModel.Environment.ClusterId, pipelineModel.EnvironmentId, pipelineModel.AppId, pipelineModel.App.AppStore) - if err != nil { - handler.Logger.Errorw("service err, GetArtifactsByCDPipeline", "err", err, "cdPipelineId", cdPipelineId, "stage", stage) - } - if len(blockCveList) > 0 { - vulnerableMap[digest] = true - } - } - } - var ciArtifactsFinal []bean.CiArtifactBean - for _, item := range ciArtifactResponse.CiArtifacts { - if item.ScanEnabled { // skip setting for artifacts which have marked scan disabled, but here deal with same digest - if _, ok := vulnerableMap[item.ImageDigest]; ok { - item.IsVulnerable = true - } - } - ciArtifactsFinal = append(ciArtifactsFinal, item) - } - ciArtifactResponse.CiArtifacts = ciArtifactsFinal - } - - writeJsonResp(w, err, ciArtifactResponse, http.StatusOK) -} - -func (handler PipelineConfigRestHandlerImpl) GetAppOverrideForDefaultTemplate(w http.ResponseWriter, r *http.Request) { - token := r.Header.Get("token") - vars := mux.Vars(r) - appId, err := strconv.Atoi(vars["appId"]) - if err != nil { - handler.Logger.Errorw("request err, GetAppOverrideForDefaultTemplate", "err", err, "appId", appId) - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - chartRefId, err := strconv.Atoi(vars["chartRefId"]) - if err != nil { - handler.Logger.Errorw("request err, GetAppOverrideForDefaultTemplate", "err", err, "chartRefId", chartRefId) - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - - //RBAC - object := handler.enforcerUtil.GetAppRBACNameByAppId(appId) - if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); !ok { - writeJsonResp(w, err, "Unauthorized User", http.StatusForbidden) - return - } - //RBAC - - appOverride, err := handler.chartService.GetAppOverrideForDefaultTemplate(chartRefId) - if err != nil { - handler.Logger.Errorw("service err, UpdateCiTemplate", "err", err, "appId", appId, "chartRefId", chartRefId) - writeJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - writeJsonResp(w, err, appOverride, http.StatusOK) -} - -func (handler PipelineConfigRestHandlerImpl) UpdateAppOverride(w http.ResponseWriter, r *http.Request) { - decoder := json.NewDecoder(r.Body) - userId, err := handler.userAuthService.GetLoggedInUser(r) - if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) - return - } - - var templateRequest pipeline.TemplateRequest - err = decoder.Decode(&templateRequest) - templateRequest.UserId = userId - if err != nil { - handler.Logger.Errorw("request err, UpdateAppOverride", "err", err, "payload", templateRequest) - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - - err = handler.validator.Struct(templateRequest) - if err != nil { - handler.Logger.Errorw("validation err, UpdateAppOverride", "err", err, "payload", templateRequest) - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - handler.Logger.Infow("request payload, UpdateAppOverride", "payload", templateRequest) - - token := r.Header.Get("token") - app, err := handler.pipelineBuilder.GetApp(templateRequest.AppId) - if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - - resourceName := handler.enforcerUtil.GetAppRBACName(app.AppName) - if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionCreate, resourceName); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) - return - } - chartRefId := templateRequest.ChartRefId - validate, error := handler.chartService.DeploymentTemplateValidate(templateRequest.ValuesOverride, chartRefId) - if !validate { - handler.Logger.Errorw("validation err, UpdateAppOverride", "err", error, "payload", templateRequest) - writeJsonResp(w, error, nil, http.StatusBadRequest) - return - } - createResp, err := handler.chartService.UpdateAppOverride(&templateRequest) - if err != nil { - handler.Logger.Errorw("service err, UpdateAppOverride", "err", err, "payload", templateRequest) - writeJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - writeJsonResp(w, err, createResp, http.StatusOK) - -} -func (handler PipelineConfigRestHandlerImpl) FetchArtifactForRollback(w http.ResponseWriter, r *http.Request) { - vars := mux.Vars(r) - cdPipelineId, err := strconv.Atoi(vars["cd_pipeline_id"]) - if err != nil { - handler.Logger.Errorw("request err, FetchArtifactForRollback", "err", err, "cdPipelineId", cdPipelineId) - writeJsonResp(w, err, "invalid request", http.StatusBadRequest) - return - } - handler.Logger.Infow("request payload, FetchArtifactForRollback", "cdPipelineId", cdPipelineId) - token := r.Header.Get("token") - pipeline, err := handler.pipelineBuilder.FindPipelineById(cdPipelineId) - if err != nil { - handler.Logger.Errorw("service err, FetchArtifactForRollback", "err", err, "cdPipelineId", cdPipelineId) - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - app, err := handler.pipelineBuilder.GetApp(pipeline.AppId) - if err != nil { - handler.Logger.Errorw("service err, FetchArtifactForRollback", "err", err, "cdPipelineId", cdPipelineId) - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - - //rbac block starts from here - object := handler.enforcerUtil.GetAppRBACName(app.AppName) - if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) - return - } - object = handler.enforcerUtil.GetAppRBACByAppNameAndEnvId(app.AppName, pipeline.EnvironmentId) - if ok := handler.enforcer.Enforce(token, rbac.ResourceEnvironment, rbac.ActionGet, object); !ok { - writeJsonResp(w, err, "Unauthorized User", http.StatusForbidden) - return - } - //rback block ends here - - ciArtifactResponse, err := handler.pipelineBuilder.FetchArtifactForRollback(cdPipelineId) - if err != nil { - handler.Logger.Errorw("service err, FetchArtifactForRollback", "err", err, "cdPipelineId", cdPipelineId) - writeJsonResp(w, err, "unable to fetch artifacts", http.StatusInternalServerError) - return - } - writeJsonResp(w, err, ciArtifactResponse, http.StatusOK) -} - -func (handler PipelineConfigRestHandlerImpl) GetMigrationConfig(w http.ResponseWriter, r *http.Request) { - vars := mux.Vars(r) - pipelineId, err := strconv.Atoi(vars["pipelineId"]) - if err != nil { - handler.Logger.Errorw("request err, GetMigrationConfig", "err", err, "pipelineId", pipelineId) - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - handler.Logger.Infow("request payload, GetMigrationConfig", "pipelineId", pipelineId) - token := r.Header.Get("token") - pipeline, err := handler.pipelineBuilder.FindPipelineById(pipelineId) - if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - app, err := handler.pipelineBuilder.GetApp(pipeline.AppId) - if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - resourceName := handler.enforcerUtil.GetAppRBACName(app.AppName) - if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, resourceName); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) - return - } - ciConf, err := handler.dbMigrationService.GetByPipelineId(pipelineId) - if err != nil { - handler.Logger.Errorw("service err, GetMigrationConfig", "err", err, "pipelineId", pipelineId) - writeJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - writeJsonResp(w, err, ciConf, http.StatusOK) -} - -func (handler PipelineConfigRestHandlerImpl) CreateMigrationConfig(w http.ResponseWriter, r *http.Request) { - decoder := json.NewDecoder(r.Body) - userId, err := handler.userAuthService.GetLoggedInUser(r) - if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) - return - } - var dbMigrationConfigBean pipeline.DbMigrationConfigBean - err = decoder.Decode(&dbMigrationConfigBean) - - dbMigrationConfigBean.UserId = userId - if err != nil { - handler.Logger.Errorw("request err, CreateMigrationConfig", "err", err, "payload", dbMigrationConfigBean) - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - err = handler.validator.Struct(dbMigrationConfigBean) - if err != nil { - handler.Logger.Errorw("validation err, CreateMigrationConfig", "err", err, "payload", dbMigrationConfigBean) - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - handler.Logger.Infow("request payload, CreateMigrationConfig", "payload", dbMigrationConfigBean) - token := r.Header.Get("token") - pipeline, err := handler.pipelineBuilder.FindPipelineById(dbMigrationConfigBean.PipelineId) - if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - app, err := handler.pipelineBuilder.GetApp(pipeline.AppId) - if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) - } - resourceName := handler.enforcerUtil.GetAppRBACName(app.AppName) - if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionCreate, resourceName); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) - return - } - createResp, err := handler.dbMigrationService.Save(&dbMigrationConfigBean) - if err != nil { - handler.Logger.Errorw("service err, CreateMigrationConfig", "err", err, "payload", dbMigrationConfigBean) - writeJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - writeJsonResp(w, err, createResp, http.StatusOK) -} -func (handler PipelineConfigRestHandlerImpl) UpdateMigrationConfig(w http.ResponseWriter, r *http.Request) { - decoder := json.NewDecoder(r.Body) - userId, err := handler.userAuthService.GetLoggedInUser(r) - if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) - return - } - var dbMigrationConfigBean pipeline.DbMigrationConfigBean - err = decoder.Decode(&dbMigrationConfigBean) - dbMigrationConfigBean.UserId = userId - if err != nil { - handler.Logger.Errorw("request err, UpdateMigrationConfig", "err", err, "payload", dbMigrationConfigBean) - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - err = handler.validator.Struct(dbMigrationConfigBean) - if err != nil { - handler.Logger.Errorw("validation err, UpdateMigrationConfig", "err", err, "payload", dbMigrationConfigBean) - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - handler.Logger.Infow("request payload, UpdateMigrationConfig", "payload", dbMigrationConfigBean) - token := r.Header.Get("token") - pipeline, err := handler.pipelineBuilder.FindPipelineById(dbMigrationConfigBean.PipelineId) - if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - app, err := handler.pipelineBuilder.GetApp(pipeline.AppId) - if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - resourceName := handler.enforcerUtil.GetAppRBACName(app.AppName) - if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionCreate, resourceName); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) - return - } - createResp, err := handler.dbMigrationService.Update(&dbMigrationConfigBean) - if err != nil { - handler.Logger.Errorw("service err, UpdateMigrationConfig", "err", err, "payload", dbMigrationConfigBean) - writeJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - writeJsonResp(w, err, createResp, http.StatusOK) -} - -func (handler PipelineConfigRestHandlerImpl) FindAppsByTeamId(w http.ResponseWriter, r *http.Request) { - vars := mux.Vars(r) - teamId, err := strconv.Atoi(vars["teamId"]) - if err != nil { - handler.Logger.Errorw("request err, FindAppsByTeamId", "err", err, "teamId", teamId) - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - handler.Logger.Infow("request payload, FindAppsByTeamId", "teamId", teamId) - team, err := handler.pipelineBuilder.FindAppsByTeamId(teamId) - if err != nil { - handler.Logger.Errorw("service err, FindAppsByTeamId", "err", err, "teamId", teamId) - writeJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - writeJsonResp(w, err, team, http.StatusOK) -} - -func (handler PipelineConfigRestHandlerImpl) FindAppsByTeamName(w http.ResponseWriter, r *http.Request) { - vars := mux.Vars(r) - teamName := vars["teamName"] - handler.Logger.Infow("request payload, FindAppsByTeamName", "teamName", teamName) - team, err := handler.pipelineBuilder.FindAppsByTeamName(teamName) - if err != nil { - handler.Logger.Errorw("service err, FindAppsByTeamName", "err", err, "teamName", teamName) - writeJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - writeJsonResp(w, err, team, http.StatusOK) -} - -func (handler PipelineConfigRestHandlerImpl) TriggerCiPipeline(w http.ResponseWriter, r *http.Request) { - userId, err := handler.userAuthService.GetLoggedInUser(r) - if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) - return - } - decoder := json.NewDecoder(r.Body) - var ciTriggerRequest bean.CiTriggerRequest - err = decoder.Decode(&ciTriggerRequest) - if err != nil { - handler.Logger.Errorw("request err, TriggerCiPipeline", "err", err, "payload", ciTriggerRequest) - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - if !handler.validForMultiMaterial(ciTriggerRequest) { - handler.Logger.Errorw("invalid req, commit hash not present for multi-git", "payload", ciTriggerRequest) - writeJsonResp(w, errors.New("invalid req, commit hash not present for multi-git"), - nil, http.StatusBadRequest) - } - ciTriggerRequest.TriggeredBy = userId - handler.Logger.Infow("request payload, TriggerCiPipeline", "payload", ciTriggerRequest) - - //RBAC CHECK CD PIPELINE - FOR USER - pipelines, err := handler.pipelineRepository.FindAutomaticByCiPipelineId(ciTriggerRequest.PipelineId) - var authorizedPipelines []pipelineConfig.Pipeline - var unauthorizedPipelines []pipelineConfig.Pipeline - //fetching user only for getting token - user, err := handler.userAuthService.GetById(ciTriggerRequest.TriggeredBy) - if err != nil { - handler.Logger.Errorw("service err, TriggerCiPipeline", "err", err, "payload", ciTriggerRequest) - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - token := user.AccessToken - for _, p := range pipelines { - pass := 0 - object := handler.enforcerUtil.GetAppRBACNameByAppId(p.AppId) - if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionTrigger, object); !ok { - handler.Logger.Debug(fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) - } else { - pass = 1 - } - object = handler.enforcerUtil.GetAppRBACByAppIdAndPipelineId(p.AppId, p.Id) - if ok := handler.enforcer.Enforce(token, rbac.ResourceEnvironment, rbac.ActionTrigger, object); !ok { - handler.Logger.Debug(fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) - } else { - pass = 2 - } - if pass == 2 { - authorizedPipelines = append(authorizedPipelines, *p) - } else { - unauthorizedPipelines = append(unauthorizedPipelines, *p) - } - } - resMessage := "allowed for all pipelines" - response := make(map[string]string) - if len(unauthorizedPipelines) > 0 { - resMessage = "not authorized for few pipelines, will not effected" - } - //RBAC CHECK CD PIPELINE - FOR USER - - resp, err := handler.ciHandler.HandleCIManual(ciTriggerRequest) - if err != nil { - handler.Logger.Errorw("service err, TriggerCiPipeline", "err", err, "payload", ciTriggerRequest) - writeJsonResp(w, err, response, http.StatusInternalServerError) - } - response["apiResponse"] = strconv.Itoa(resp) - response["authStatus"] = resMessage - - writeJsonResp(w, err, response, http.StatusOK) -} - -func (handler PipelineConfigRestHandlerImpl) FetchMaterials(w http.ResponseWriter, r *http.Request) { - userId, err := handler.userAuthService.GetLoggedInUser(r) - if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) - return - } - vars := mux.Vars(r) - pipelineId, err := strconv.Atoi(vars["pipelineId"]) - if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - handler.Logger.Infow("request payload, FetchMaterials", "pipelineId", pipelineId) - ciPipeline, err := handler.ciPipelineRepository.FindById(pipelineId) - if err != nil { - handler.Logger.Errorw("service err, UpdateCiTemplate", "err", err, "pipelineId", pipelineId) - writeJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - //RBAC - token := r.Header.Get("token") - object := handler.enforcerUtil.GetAppRBACNameByAppId(ciPipeline.AppId) - if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); !ok { - writeJsonResp(w, err, "Unauthorized User", http.StatusForbidden) - return - } - //RBAC - resp, err := handler.ciHandler.FetchMaterialsByPipelineId(pipelineId) - if err != nil { - handler.Logger.Errorw("service err, FetchMaterials", "err", err, "pipelineId", pipelineId) - writeJsonResp(w, err, resp, http.StatusInternalServerError) - return - } - writeJsonResp(w, err, resp, http.StatusOK) -} - -func (handler PipelineConfigRestHandlerImpl) RefreshMaterials(w http.ResponseWriter, r *http.Request) { - userId, err := handler.userAuthService.GetLoggedInUser(r) - if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) - return - } - vars := mux.Vars(r) - gitMaterialId, err := strconv.Atoi(vars["gitMaterialId"]) - if err != nil { - handler.Logger.Error(err) - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - handler.Logger.Infow("request payload, RefreshMaterials", "gitMaterialId", gitMaterialId) - material, err := handler.materialRepository.FindById(gitMaterialId) - if err != nil { - handler.Logger.Errorw("service err, RefreshMaterials", "err", err, "gitMaterialId", gitMaterialId) - writeJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - //RBAC - token := r.Header.Get("token") - object := handler.enforcerUtil.GetAppRBACNameByAppId(material.AppId) - if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); !ok { - writeJsonResp(w, err, "Unauthorized User", http.StatusForbidden) - return - } - //RBAC - - resp, err := handler.ciHandler.RefreshMaterialByCiPipelineMaterialId(material.Id) - if err != nil { - handler.Logger.Errorw("service err, RefreshMaterials", "err", err, "gitMaterialId", gitMaterialId) - writeJsonResp(w, err, resp, http.StatusInternalServerError) - return - } - writeJsonResp(w, err, resp, http.StatusOK) -} - -func (handler PipelineConfigRestHandlerImpl) GetCiPipelineMin(w http.ResponseWriter, r *http.Request) { - userId, err := handler.userAuthService.GetLoggedInUser(r) - if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) - return - } - vars := mux.Vars(r) - appId, err := strconv.Atoi(vars["appId"]) - if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - //RBAC - handler.Logger.Infow("request payload, GetCiPipelineMin", "appId", appId) - token := r.Header.Get("token") - object := handler.enforcerUtil.GetAppRBACNameByAppId(appId) - if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); !ok { - writeJsonResp(w, err, "Unauthorized User", http.StatusForbidden) - return - } - //RBAC - ciPipelines, err := handler.pipelineBuilder.GetCiPipelineMin(appId) - if err != nil { - handler.Logger.Errorw("service err, GetCiPipelineMin", "err", err, "appId", appId) - if util.IsErrNoRows(err) { - err = &util.ApiError{Code: "404", HttpStatusCode: http.StatusNotFound, UserMessage: "no data found"} - writeJsonResp(w, err, nil, http.StatusOK) - } else { - writeJsonResp(w, err, nil, http.StatusInternalServerError) - } - return - } - writeJsonResp(w, err, ciPipelines, http.StatusOK) -} - -func (handler PipelineConfigRestHandlerImpl) FetchWorkflowDetails(w http.ResponseWriter, r *http.Request) { - userId, err := handler.userAuthService.GetLoggedInUser(r) - if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) - return - } - vars := mux.Vars(r) - appId, err := strconv.Atoi(vars["appId"]) - if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - pipelineId, err := strconv.Atoi(vars["pipelineId"]) - if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - buildId, err := strconv.Atoi(vars["workflowId"]) - if err != nil || buildId == 0 { - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - handler.Logger.Infow("request payload, FetchWorkflowDetails", "appId", appId, "pipelineId", pipelineId, "buildId", buildId, "buildId", buildId) - ciPipeline, err := handler.ciPipelineRepository.FindById(pipelineId) - if err != nil { - writeJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - //RBAC - token := r.Header.Get("token") - object := handler.enforcerUtil.GetAppRBACNameByAppId(ciPipeline.AppId) - if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); !ok { - writeJsonResp(w, err, "Unauthorized User", http.StatusForbidden) - return - } - //RBAC - resp, err := handler.ciHandler.FetchWorkflowDetails(appId, pipelineId, buildId) - if err != nil { - handler.Logger.Errorw("service err, FetchWorkflowDetails", "err", err, "appId", appId, "pipelineId", pipelineId, "buildId", buildId, "buildId", buildId) - if util.IsErrNoRows(err) { - err = &util.ApiError{Code: "404", HttpStatusCode: http.StatusNotFound, UserMessage: "no workflow found"} - writeJsonResp(w, err, nil, http.StatusOK) - } else { - writeJsonResp(w, err, nil, http.StatusInternalServerError) - } - return - } - writeJsonResp(w, err, resp, http.StatusOK) -} - -func (handler PipelineConfigRestHandlerImpl) DownloadCiWorkflowArtifacts(w http.ResponseWriter, r *http.Request) { - userId, err := handler.userAuthService.GetLoggedInUser(r) - if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) - return - } - vars := mux.Vars(r) - pipelineId, err := strconv.Atoi(vars["pipelineId"]) - if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - buildId, err := strconv.Atoi(vars["workflowId"]) - if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - handler.Logger.Infow("request payload, DownloadCiWorkflowArtifacts", "pipelineId", pipelineId, "buildId", buildId) - ciPipeline, err := handler.ciPipelineRepository.FindById(pipelineId) - if err != nil { - handler.Logger.Error(err) - writeJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - //RBAC - token := r.Header.Get("token") - object := handler.enforcerUtil.GetAppRBACNameByAppId(ciPipeline.AppId) - if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); !ok { - writeJsonResp(w, err, "Unauthorized User", http.StatusForbidden) - return - } - //RBAC - - file, err := handler.ciHandler.DownloadCiWorkflowArtifacts(pipelineId, buildId) - defer file.Close() - if err != nil { - handler.Logger.Errorw("service err, DownloadCiWorkflowArtifacts", "err", err, "pipelineId", pipelineId, "buildId", buildId) - if util.IsErrNoRows(err) { - err = &util.ApiError{Code: "404", HttpStatusCode: 200, UserMessage: "no workflow found"} - writeJsonResp(w, err, nil, http.StatusOK) - } else { - writeJsonResp(w, err, nil, http.StatusInternalServerError) - } - return - } - w.Header().Set("Content-Disposition", "attachment; filename="+strconv.Itoa(buildId)+".zip") - w.Header().Set("Content-Type", "application/octet-stream") - w.Header().Set("Content-Length", r.Header.Get("Content-Length")) - _, err = io.Copy(w, file) - if err != nil { - handler.Logger.Errorw("service err, DownloadCiWorkflowArtifacts", "err", err, "pipelineId", pipelineId, "buildId", buildId) - } -} - -func (handler PipelineConfigRestHandlerImpl) CancelStage(w http.ResponseWriter, r *http.Request) { - userId, err := handler.userAuthService.GetLoggedInUser(r) - if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) - return - } - vars := mux.Vars(r) - pipelineId, err := strconv.Atoi(vars["pipelineId"]) - if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - workflowRunnerId, err := strconv.Atoi(vars["workflowRunnerId"]) - if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - cdPipeline, err := handler.pipelineRepository.FindById(pipelineId) - if err != nil { - writeJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - handler.Logger.Infow("request payload, CancelStage", "pipelineId", pipelineId, "workflowRunnerId", workflowRunnerId) - - //RBAC - token := r.Header.Get("token") - object := handler.enforcerUtil.GetAppRBACNameByAppId(cdPipeline.AppId) - if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionTrigger, object); !ok { - writeJsonResp(w, err, "Unauthorized User", http.StatusForbidden) - return - } - //RBAC - - resp, err := handler.cdHandelr.CancelStage(workflowRunnerId) - if err != nil { - handler.Logger.Errorw("service err, CancelStage", "err", err, "pipelineId", pipelineId, "workflowRunnerId", workflowRunnerId) - if util.IsErrNoRows(err) { - writeJsonResp(w, err, nil, http.StatusNotFound) - } else { - writeJsonResp(w, err, nil, http.StatusInternalServerError) - } - return - } - writeJsonResp(w, err, resp, http.StatusOK) -} - -func (handler PipelineConfigRestHandlerImpl) CancelWorkflow(w http.ResponseWriter, r *http.Request) { - userId, err := handler.userAuthService.GetLoggedInUser(r) - if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) - return - } - vars := mux.Vars(r) - workflowId, err := strconv.Atoi(vars["workflowId"]) - if err != nil { - handler.Logger.Errorw("request err, CancelWorkflow", "err", err, "workflowId", workflowId) - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - pipelineId, err := strconv.Atoi(vars["pipelineId"]) - if err != nil { - handler.Logger.Errorw("request err, CancelWorkflow", "err", err, "pipelineId", pipelineId) - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - handler.Logger.Infow("request payload, CancelWorkflow", "workflowId", workflowId, "pipelineId", pipelineId) - - ciPipeline, err := handler.ciPipelineRepository.FindById(pipelineId) - if err != nil { - handler.Logger.Errorw("service err, CancelWorkflow", "err", err, "workflowId", workflowId, "pipelineId", pipelineId) - writeJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - //RBAC - token := r.Header.Get("token") - object := handler.enforcerUtil.GetAppRBACNameByAppId(ciPipeline.AppId) - if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionTrigger, object); !ok { - writeJsonResp(w, err, "Unauthorized User", http.StatusForbidden) - return - } - //RBAC - - resp, err := handler.ciHandler.CancelBuild(workflowId) - if err != nil { - handler.Logger.Errorw("service err, CancelWorkflow", "err", err, "workflowId", workflowId, "pipelineId", pipelineId) - if util.IsErrNoRows(err) { - writeJsonResp(w, err, nil, http.StatusNotFound) - } else { - writeJsonResp(w, err, nil, http.StatusInternalServerError) - } - return - } - writeJsonResp(w, err, resp, http.StatusOK) -} - -//FIXME check if deprecated -func (handler PipelineConfigRestHandlerImpl) FetchChanges(w http.ResponseWriter, r *http.Request) { - userId, err := handler.userAuthService.GetLoggedInUser(r) - if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) - return - } - vars := mux.Vars(r) - ciMaterialId, err := strconv.Atoi(vars["ciMaterialId"]) - if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - - pipelineId, err := strconv.Atoi(vars["pipelineId"]) - if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - handler.Logger.Infow("request payload, FetchChanges", "ciMaterialId", ciMaterialId, "pipelineId", pipelineId) - ciPipeline, err := handler.ciPipelineRepository.FindById(pipelineId) - if err != nil { - handler.Logger.Errorw("request err, FetchChanges", "err", err, "ciMaterialId", ciMaterialId, "pipelineId", pipelineId) - writeJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - //RBAC - token := r.Header.Get("token") - object := handler.enforcerUtil.GetAppRBACNameByAppId(ciPipeline.AppId) - if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); !ok { - writeJsonResp(w, err, "Unauthorized User", http.StatusForbidden) - return - } - //RBAC - - changeRequest := &gitSensor.FetchScmChangesRequest{ - PipelineMaterialId: ciMaterialId, - } - changes, err := handler.gitSensorClient.FetchChanges(changeRequest) - if err != nil { - handler.Logger.Errorw("service err, FetchChanges", "err", err, "ciMaterialId", ciMaterialId, "pipelineId", pipelineId) - writeJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - writeJsonResp(w, err, changes.Commits, http.StatusCreated) -} - -func (handler PipelineConfigRestHandlerImpl) GetHistoricBuildLogs(w http.ResponseWriter, r *http.Request) { - userId, err := handler.userAuthService.GetLoggedInUser(r) - if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) - return - } - vars := mux.Vars(r) - pipelineId, err := strconv.Atoi(vars["pipelineId"]) - if err != nil { - handler.Logger.Error(err) - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - workflowId, err := strconv.Atoi(vars["workflowId"]) - if err != nil { - handler.Logger.Error(err) - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - handler.Logger.Infow("request payload, GetHistoricBuildLogs", "pipelineId", pipelineId, "workflowId", workflowId) - ciPipeline, err := handler.ciPipelineRepository.FindById(pipelineId) - if err != nil { - handler.Logger.Errorw("service err, GetHistoricBuildLogs", "err", err, "pipelineId", pipelineId, "workflowId", workflowId) - writeJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - //RBAC - token := r.Header.Get("token") - object := handler.enforcerUtil.GetAppRBACNameByAppId(ciPipeline.AppId) - if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); !ok { - writeJsonResp(w, err, "Unauthorized User", http.StatusForbidden) - return - } - //RBAC - resp, err := handler.ciHandler.GetHistoricBuildLogs(pipelineId, workflowId, nil) - if err != nil { - handler.Logger.Errorw("service err, GetHistoricBuildLogs", "err", err, "pipelineId", pipelineId, "workflowId", workflowId) - writeJsonResp(w, err, resp, http.StatusInternalServerError) - return - } - writeJsonResp(w, err, resp, http.StatusOK) -} - -func (handler *PipelineConfigRestHandlerImpl) GetBuildHistory(w http.ResponseWriter, r *http.Request) { - userId, err := handler.userAuthService.GetLoggedInUser(r) - if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) - return - } - vars := mux.Vars(r) - pipelineId, err := strconv.Atoi(vars["pipelineId"]) - if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - offsetQueryParam := r.URL.Query().Get("offset") - offset, err := strconv.Atoi(offsetQueryParam) - if offsetQueryParam == "" || err != nil { - writeJsonResp(w, err, "invalid offset", http.StatusBadRequest) - return - } - sizeQueryParam := r.URL.Query().Get("size") - limit, err := strconv.Atoi(sizeQueryParam) - if sizeQueryParam == "" || err != nil { - writeJsonResp(w, err, "invalid size", http.StatusBadRequest) - return - } - handler.Logger.Infow("request payload, GetBuildHistory", "pipelineId", pipelineId, "offset", offset) - ciPipeline, err := handler.ciPipelineRepository.FindById(pipelineId) - if err != nil { - handler.Logger.Errorw("service err, GetBuildHistory", "err", err, "pipelineId", pipelineId, "offset", offset) - writeJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - //RBAC - token := r.Header.Get("token") - object := handler.enforcerUtil.GetAppRBACNameByAppId(ciPipeline.AppId) - if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); !ok { - writeJsonResp(w, err, "Unauthorized User", http.StatusForbidden) - return - } - //RBAC - - resp, err := handler.ciHandler.GetBuildHistory(pipelineId, offset, limit) - if err != nil { - handler.Logger.Errorw("service err, GetBuildHistory", "err", err, "pipelineId", pipelineId, "offset", offset) - writeJsonResp(w, err, resp, http.StatusInternalServerError) - return - } - writeJsonResp(w, err, resp, http.StatusOK) -} - -func (handler PipelineConfigRestHandlerImpl) HandleWorkflowWebhook(w http.ResponseWriter, r *http.Request) { - decoder := json.NewDecoder(r.Body) - var wfUpdateReq v1alpha1.WorkflowStatus - err := decoder.Decode(&wfUpdateReq) - if err != nil { - handler.Logger.Errorw("request err, HandleWorkflowWebhook", "err", err, "payload", wfUpdateReq) - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - handler.Logger.Infow("request payload, HandleWorkflowWebhook", "payload", wfUpdateReq) - resp, err := handler.ciHandler.UpdateWorkflow(wfUpdateReq) - if err != nil { - handler.Logger.Errorw("service err, HandleWorkflowWebhook", "err", err, "payload", wfUpdateReq) - writeJsonResp(w, err, resp, http.StatusInternalServerError) - return - } - writeJsonResp(w, err, resp, http.StatusOK) -} - -func (handler *PipelineConfigRestHandlerImpl) GetBuildLogs(w http.ResponseWriter, r *http.Request) { - userId, err := handler.userAuthService.GetLoggedInUser(r) - if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) - return - } - vars := mux.Vars(r) - pipelineId, err := strconv.Atoi(vars["pipelineId"]) - if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - - workflowId, err := strconv.Atoi(vars["workflowId"]) - if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - handler.Logger.Infow("request payload, GetBuildLogs", "pipelineId", pipelineId, "workflowId", workflowId) - ciPipeline, err := handler.ciPipelineRepository.FindById(pipelineId) - if err != nil { - writeJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - //RBAC - token := r.Header.Get("token") - object := handler.enforcerUtil.GetAppRBACNameByAppId(ciPipeline.AppId) - if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); !ok { - writeJsonResp(w, err, "Unauthorized User", http.StatusForbidden) - return - } - //RBAC - lastSeenMsgId := -1 - lastEventId := r.Header.Get("Last-Event-ID") - if len(lastEventId) > 0 { - lastSeenMsgId, err = strconv.Atoi(lastEventId) - if err != nil { - handler.Logger.Errorw("request err, GetBuildLogs", "err", err, "pipelineId", pipelineId, "workflowId", workflowId, "lastEventId", lastEventId) - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - } - logsReader, cleanUp, err := handler.ciHandler.GetRunningWorkflowLogs(pipelineId, workflowId) - if err != nil { - handler.Logger.Errorw("service err, GetBuildLogs", "err", err, "pipelineId", pipelineId, "workflowId", workflowId, "lastEventId", lastEventId) - writeJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - - ctx, cancel := context.WithCancel(r.Context()) - if cn, ok := w.(http.CloseNotifier); ok { - go func(done <-chan struct{}, closed <-chan bool) { - select { - case <-done: - case <-closed: - cancel() - } - }(ctx.Done(), cn.CloseNotify()) - } - defer cancel() - defer cleanUp() - handler.streamOutput(w, logsReader, lastSeenMsgId) -} - -func (handler *PipelineConfigRestHandlerImpl) streamOutput(w http.ResponseWriter, reader *bufio.Reader, lastSeenMsgId int) { - f, ok := w.(http.Flusher) - if !ok { - http.Error(w, "unexpected server doesnt support streaming", http.StatusInternalServerError) - } - - // Important to make it work in browsers - w.Header().Set("Connection", "keep-alive") - w.Header().Set("Cache-Control", "no-cache") - w.Header().Set("Transfer-Encoding", "chunked") - w.Header().Set("Content-Type", "text/event-stream") - w.Header().Set("X-Accel-Buffering", "no") - w.Header().Set("X-Content-Type-Options", "nosniff") - - //var wroteHeader bool - startOfStream := []byte("START_OF_STREAM") - endOfStreamEvent := []byte("END_OF_STREAM") - reconnectEvent := []byte("RECONNECT_STREAM") - unexpectedEndOfStreamEvent := []byte("UNEXPECTED_END_OF_STREAM") - streamStarted := false - msgCounter := 0 - if lastSeenMsgId == -1 { - handler.sendData(startOfStream, w, msgCounter) - handler.sendEvent(startOfStream, w) - f.Flush() - } else { - handler.sendEvent(reconnectEvent, w) - f.Flush() - } - - for { - data, err := reader.ReadBytes('\n') - if err == io.EOF { - if streamStarted { - handler.sendData(endOfStreamEvent, w, msgCounter) - handler.sendEvent(endOfStreamEvent, w) - f.Flush() - return - } - return - } - if err != nil { - //TODO handle error - handler.sendData(unexpectedEndOfStreamEvent, w, msgCounter) - handler.sendEvent(unexpectedEndOfStreamEvent, w) - f.Flush() - return - } - msgCounter = msgCounter + 1 - //skip for seen msg - if msgCounter <= lastSeenMsgId { - continue - } - if strings.Contains(string(data), devtron) { - continue - } - - var res []byte - res = append(res, "id:"...) - res = append(res, fmt.Sprintf("%d\n", msgCounter)...) - res = append(res, "data:"...) - res = append(res, data...) - res = append(res, '\n') - - if _, err = w.Write(res); err != nil { - //TODO handle error - handler.Logger.Errorw("Failed to send response chunk, streamOutput", "err", err) - handler.sendData(unexpectedEndOfStreamEvent, w, msgCounter) - handler.sendEvent(unexpectedEndOfStreamEvent, w) - f.Flush() - return - } - streamStarted = true - f.Flush() - } -} - -func (handler *PipelineConfigRestHandlerImpl) sendEvent(event []byte, w http.ResponseWriter) { - var res []byte - res = append(res, "event:"...) - res = append(res, event...) - res = append(res, '\n') - res = append(res, "data:"...) - res = append(res, '\n', '\n') - - if _, err := w.Write(res); err != nil { - handler.Logger.Debugf("Failed to send response chunk: %v", err) - return - } - -} -func (handler *PipelineConfigRestHandlerImpl) sendData(event []byte, w http.ResponseWriter, msgId int) { - var res []byte - res = append(res, "id:"...) - res = append(res, fmt.Sprintf("%d\n", msgId)...) - res = append(res, "data:"...) - res = append(res, event...) - res = append(res, '\n', '\n') - if _, err := w.Write(res); err != nil { - handler.Logger.Errorw("Failed to send response chunk, sendData", "err", err) - return - } -} - -func (handler *PipelineConfigRestHandlerImpl) handleForwardResponseStreamError(wroteHeader bool, w http.ResponseWriter, err error) { - code := "000" - if !wroteHeader { - s, ok := status.FromError(err) - if !ok { - s = status.New(codes.Unknown, err.Error()) - } - w.WriteHeader(runtime.HTTPStatusFromCode(s.Code())) - code = fmt.Sprint(s.Code()) - } - response := bean2.Response{} - apiErr := bean2.ApiError{} - apiErr.Code = code // 000=unknown - apiErr.InternalMessage = err.Error() - response.Errors = []bean2.ApiError{apiErr} - buf, merr := json.Marshal(response) - if merr != nil { - handler.Logger.Errorw("marshal err, handleForwardResponseStreamError", "err", merr, "response", response) - } - if _, werr := w.Write(buf); werr != nil { - handler.Logger.Errorw("Failed to notify error to client, handleForwardResponseStreamError", "err", werr, "response", response) - return - } -} - -func (handler PipelineConfigRestHandlerImpl) GetAppListForAutocomplete(w http.ResponseWriter, r *http.Request) { - userId, err := handler.userAuthService.GetLoggedInUser(r) - if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) - return - } - v := r.URL.Query() - teamId := v.Get("teamId") - handler.Logger.Infow("request payload, GetAppListForAutocomplete", "teamId", teamId) - var apps []pipeline.AppBean - if len(teamId) == 0 { - apps, err = handler.pipelineBuilder.GetAppList() - if err != nil { - handler.Logger.Errorw("service err, GetAppListForAutocomplete", "err", err, "teamId", teamId) - writeJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - } else { - teamId, err := strconv.Atoi(teamId) - if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } else { - apps, err = handler.pipelineBuilder.FindAppsByTeamId(teamId) - if err != nil { - handler.Logger.Errorw("service err, GetAppListForAutocomplete", "err", err, "teamId", teamId) - writeJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - } - } - - token := r.Header.Get("token") - var accessedApps []pipeline.AppBean - // RBAC - objects := handler.enforcerUtil.GetRbacObjectsForAllApps() - for _, app := range apps { - object := objects[app.Id] - if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); ok { - accessedApps = append(accessedApps, app) - } - } - // RBAC - if len(accessedApps) == 0 { - accessedApps = make([]pipeline.AppBean, 0) - } - writeJsonResp(w, err, accessedApps, http.StatusOK) -} - -func (handler PipelineConfigRestHandlerImpl) GetAppListByTeamIds(w http.ResponseWriter, r *http.Request) { - userId, err := handler.userAuthService.GetLoggedInUser(r) - if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) - return - } - //vars := mux.Vars(r) - v := r.URL.Query() - params := v.Get("teamIds") - if len(params) == 0 { - writeJsonResp(w, err, "StatusBadRequest", http.StatusBadRequest) - return - } - handler.Logger.Infow("request payload, GetAppListByTeamIds", "payload", params) - var teamIds []int - teamIdList := strings.Split(params, ",") - for _, item := range teamIdList { - teamId, err := strconv.Atoi(item) - if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - teamIds = append(teamIds, teamId) - } - projectWiseApps, err := handler.pipelineBuilder.GetAppListByTeamIds(teamIds) - if err != nil { - handler.Logger.Errorw("service err, GetAppListByTeamIds", "err", err, "payload", params) - writeJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - - token := r.Header.Get("token") - // RBAC - for _, project := range projectWiseApps { - var accessedApps []*pipeline.AppBean - for _, app := range project.AppList { - object := fmt.Sprintf("%s/%s", project.ProjectName, app.Name) - if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); ok { - accessedApps = append(accessedApps, app) - } - } - if len(accessedApps) == 0 { - accessedApps = make([]*pipeline.AppBean, 0) - } - project.AppList = accessedApps - } - // RBAC - writeJsonResp(w, err, projectWiseApps, http.StatusOK) -} - -func (handler PipelineConfigRestHandlerImpl) validForMultiMaterial(ciTriggerRequest bean.CiTriggerRequest) bool { - if len(ciTriggerRequest.CiPipelineMaterial) > 1 { - for _, m := range ciTriggerRequest.CiPipelineMaterial { - if m.GitCommit.Commit == "" { - return false - } - } - } - return true -} - -func (handler PipelineConfigRestHandlerImpl) EnvironmentListAutocomplete(w http.ResponseWriter, r *http.Request) { - token := r.Header.Get("token") - vars := mux.Vars(r) - appId, err := strconv.Atoi(vars["appId"]) - if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - handler.Logger.Infow("request payload, EnvironmentListAutocomplete", "appId", appId) - //RBAC - object := handler.enforcerUtil.GetAppRBACNameByAppId(appId) - if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); !ok { - writeJsonResp(w, err, "Unauthorized User", http.StatusForbidden) - return - } - //RBAC - result, err := handler.envService.GetEnvironmentListForAutocomplete() - if err != nil { - handler.Logger.Errorw("service err, EnvironmentListAutocomplete", "err", err, "appId", appId) - writeJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - writeJsonResp(w, err, result, http.StatusOK) -} - -func (handler PipelineConfigRestHandlerImpl) GitListAutocomplete(w http.ResponseWriter, r *http.Request) { - token := r.Header.Get("token") - vars := mux.Vars(r) - appId, err := strconv.Atoi(vars["appId"]) - if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - handler.Logger.Infow("request payload, GitListAutocomplete", "appId", appId) - //RBAC - object := handler.enforcerUtil.GetAppRBACNameByAppId(appId) - if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); !ok { - writeJsonResp(w, err, "Unauthorized User", http.StatusForbidden) - return - } - //RBAC - res, err := handler.gitRegistryConfig.GetAll() - if err != nil { - handler.Logger.Errorw("service err, GitListAutocomplete", "err", err, "appId", appId) - writeJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - - writeJsonResp(w, err, res, http.StatusOK) -} - -func (handler PipelineConfigRestHandlerImpl) DockerListAutocomplete(w http.ResponseWriter, r *http.Request) { - token := r.Header.Get("token") - vars := mux.Vars(r) - appId, err := strconv.Atoi(vars["appId"]) - if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - handler.Logger.Infow("request payload, DockerListAutocomplete", "appId", appId) - //RBAC - object := handler.enforcerUtil.GetAppRBACNameByAppId(appId) - if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); !ok { - writeJsonResp(w, err, "Unauthorized User", http.StatusForbidden) - return - } - //RBAC - res, err := handler.dockerRegistryConfig.ListAllActive() - if err != nil { - handler.Logger.Errorw("service err, DockerListAutocomplete", "err", err, "appId", appId) - writeJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - - writeJsonResp(w, err, res, http.StatusOK) -} - -func (handler PipelineConfigRestHandlerImpl) TeamListAutocomplete(w http.ResponseWriter, r *http.Request) { - token := r.Header.Get("token") - vars := mux.Vars(r) - appId, err := strconv.Atoi(vars["appId"]) - if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - handler.Logger.Infow("request payload, TeamListAutocomplete", "appId", appId) - //RBAC - object := handler.enforcerUtil.GetAppRBACNameByAppId(appId) - if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); !ok { - writeJsonResp(w, err, "Unauthorized User", http.StatusForbidden) - return - } - //RBAC - result, err := handler.teamService.FetchForAutocomplete() - if err != nil { - handler.Logger.Errorw("service err, TeamListAutocomplete", "err", err, "appId", appId) - writeJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - - writeJsonResp(w, err, result, http.StatusOK) -} - -func (handler PipelineConfigRestHandlerImpl) IsReadyToTrigger(w http.ResponseWriter, r *http.Request) { - token := r.Header.Get("token") - vars := mux.Vars(r) - appId, err := strconv.Atoi(vars["appId"]) - if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - envId, err := strconv.Atoi(vars["envId"]) - if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - pipelineId, err := strconv.Atoi(vars["pipelineId"]) - if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - handler.Logger.Infow("request payload, IsReadyToTrigger", "appId", appId, "envId", envId, "pipelineId", pipelineId) - //RBAC - object := handler.enforcerUtil.GetAppRBACNameByAppId(appId) - if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); !ok { - writeJsonResp(w, err, "Unauthorized User", http.StatusForbidden) - return - } - object = handler.enforcerUtil.GetEnvRBACNameByAppId(appId, envId) - if ok := handler.enforcer.Enforce(token, rbac.ResourceEnvironment, rbac.ActionGet, strings.ToLower(object)); !ok { - writeJsonResp(w, err, "Unauthorized User", http.StatusForbidden) - return - } - //RBAC - - result, err := handler.chartService.IsReadyToTrigger(appId, envId, pipelineId) - if err != nil { - handler.Logger.Errorw("service err, IsReadyToTrigger", "err", err, "appId", appId, "envId", envId, "pipelineId", pipelineId) - writeJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - writeJsonResp(w, err, result, http.StatusOK) -} - -func (handler PipelineConfigRestHandlerImpl) FetchCDPipelineStrategy(w http.ResponseWriter, r *http.Request) { - token := r.Header.Get("token") - vars := mux.Vars(r) - appId, err := strconv.Atoi(vars["appId"]) - if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - handler.Logger.Infow("request payload, FetchCDPipelineStrategy", "appId", appId) - //RBAC - object := handler.enforcerUtil.GetAppRBACNameByAppId(appId) - if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); !ok { - writeJsonResp(w, err, "Unauthorized User", http.StatusForbidden) - return - } - //RBAC - - result, err := handler.pipelineBuilder.FetchCDPipelineStrategy(appId) - if err != nil { - handler.Logger.Errorw("service err, FetchCDPipelineStrategy", "err", err, "appId", appId) - writeJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - - writeJsonResp(w, err, result, http.StatusOK) -} - -func (handler PipelineConfigRestHandlerImpl) UpgradeForAllApps(w http.ResponseWriter, r *http.Request) { - userId, err := handler.userAuthService.GetLoggedInUser(r) - if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) - return - } - vars := mux.Vars(r) - chartRefId, err := strconv.Atoi(vars["chartRefId"]) - if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - - decoder := json.NewDecoder(r.Body) - var chartUpgradeRequest pipeline.ChartUpgradeRequest - err = decoder.Decode(&chartUpgradeRequest) - if err != nil { - handler.Logger.Errorw("request err, UpgradeForAllApps", "err", err, "payload", chartUpgradeRequest) - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - chartUpgradeRequest.ChartRefId = chartRefId - chartUpgradeRequest.UserId = userId - handler.Logger.Infow("request payload, UpgradeForAllApps", "payload", chartUpgradeRequest) - token := r.Header.Get("token") - if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionCreate, "*/*"); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) - return - } - if ok := handler.enforcer.Enforce(token, rbac.ResourceEnvironment, rbac.ActionCreate, "*/*"); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) - return - } - - newAppOverride, err := handler.chartService.GetAppOverrideForDefaultTemplate(chartUpgradeRequest.ChartRefId) - if err != nil { - handler.Logger.Errorw("service err, UpgradeForAllApps", "err", err, "payload", chartUpgradeRequest) - writeJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - - ctx, cancel := context.WithCancel(r.Context()) - if cn, ok := w.(http.CloseNotifier); ok { - go func(done <-chan struct{}, closed <-chan bool) { - select { - case <-done: - case <-closed: - cancel() - } - }(ctx.Done(), cn.CloseNotify()) - } - ctx = context.WithValue(r.Context(), "token", token) - - var appIds []int - if chartUpgradeRequest.All || len(chartUpgradeRequest.AppIds) == 0 { - apps, err := handler.pipelineBuilder.GetAppList() - if err != nil { - handler.Logger.Errorw("service err, UpgradeForAllApps", "err", err, "payload", chartUpgradeRequest) - writeJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - for _, app := range apps { - appIds = append(appIds, app.Id) - } - } else { - appIds = chartUpgradeRequest.AppIds - } - response := make(map[string][]map[string]string) - var failedIds []map[string]string - for _, appId := range appIds { - appResponse := make(map[string]string) - template, err := handler.chartService.GetByAppIdAndChartRefId(appId, chartRefId) - if err != nil && pg.ErrNoRows != err { - handler.Logger.Errorw("err in checking weather exist or not, skip for upgrade", "err", err, "payload", chartUpgradeRequest) - appResponse["appId"] = strconv.Itoa(appId) - appResponse["message"] = "err in checking weather exist or not, skip for upgrade" - failedIds = append(failedIds, appResponse) - continue - } - if template != nil && template.Id > 0 { - handler.Logger.Warnw("this ref chart already configured for this app, skip for upgrade", "payload", chartUpgradeRequest) - appResponse["appId"] = strconv.Itoa(appId) - appResponse["message"] = "this ref chart already configured for this app, skip for upgrade" - failedIds = append(failedIds, appResponse) - continue - } - flag, err := handler.chartService.UpgradeForApp(appId, chartRefId, newAppOverride, userId, ctx) - if err != nil { - handler.Logger.Errorw("service err, UpdateCiTemplate", "err", err, "payload", chartUpgradeRequest) - appResponse["appId"] = strconv.Itoa(appId) - appResponse["message"] = err.Error() - failedIds = append(failedIds, appResponse) - } else if flag == false { - handler.Logger.Debugw("unable to upgrade for app", "appId", appId, "payload", chartUpgradeRequest) - appResponse["appId"] = strconv.Itoa(appId) - appResponse["message"] = "no error found, but failed to upgrade" - failedIds = append(failedIds, appResponse) - } - - } - response["failed"] = failedIds - writeJsonResp(w, err, response, http.StatusOK) -} - -func (handler PipelineConfigRestHandlerImpl) EnvConfigOverrideReset(w http.ResponseWriter, r *http.Request) { - userId, err := handler.userAuthService.GetLoggedInUser(r) - if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) - return - } - token := r.Header.Get("token") - vars := mux.Vars(r) - appId, err := strconv.Atoi(vars["appId"]) - if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - environmentId, err := strconv.Atoi(vars["environmentId"]) - if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - - id, err := strconv.Atoi(vars["id"]) - if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - handler.Logger.Infow("request payload, EnvConfigOverrideReset", "appId", appId, "environmentId", environmentId) - app, err := handler.pipelineBuilder.GetApp(appId) - if err != nil { - handler.Logger.Errorw("service err, EnvConfigOverrideReset", "err", err, "appId", appId, "environmentId", environmentId) - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - resourceName := handler.enforcerUtil.GetAppRBACNameByAppId(appId) - if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionDelete, resourceName); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) - return - } - object := handler.enforcerUtil.GetAppRBACByAppNameAndEnvId(app.AppName, environmentId) - if ok := handler.enforcer.Enforce(token, rbac.ResourceEnvironment, rbac.ActionDelete, object); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) - return - } - isSuccess, err := handler.propertiesConfigService.ResetEnvironmentProperties(id) - if err != nil { - handler.Logger.Errorw("service err, EnvConfigOverrideReset", "err", err, "appId", appId, "environmentId", environmentId) - writeJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - writeJsonResp(w, err, isSuccess, http.StatusOK) -} - -func (handler PipelineConfigRestHandlerImpl) EnvConfigOverrideCreateNamespace(w http.ResponseWriter, r *http.Request) { - userId, err := handler.userAuthService.GetLoggedInUser(r) - if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) - return - } - token := r.Header.Get("token") - vars := mux.Vars(r) - appId, err := strconv.Atoi(vars["appId"]) - if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - environmentId, err := strconv.Atoi(vars["environmentId"]) - if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - decoder := json.NewDecoder(r.Body) - var envConfigProperties pipeline.EnvironmentProperties - err = decoder.Decode(&envConfigProperties) - envConfigProperties.UserId = userId - envConfigProperties.EnvironmentId = environmentId - if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - handler.Logger.Infow("request payload, EnvConfigOverrideCreateNamespace", "appId", appId, "environmentId", environmentId, "payload", envConfigProperties) - app, err := handler.pipelineBuilder.GetApp(appId) - if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - resourceName := handler.enforcerUtil.GetAppRBACNameByAppId(appId) - if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionCreate, resourceName); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) - return - } - object := handler.enforcerUtil.GetAppRBACByAppNameAndEnvId(app.AppName, environmentId) - if ok := handler.enforcer.Enforce(token, rbac.ResourceEnvironment, rbac.ActionCreate, object); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) - return - } - createResp, err := handler.propertiesConfigService.CreateEnvironmentPropertiesWithNamespace(appId, &envConfigProperties) - if err != nil { - handler.Logger.Errorw("service err, EnvConfigOverrideCreateNamespace", "err", err, "appId", appId, "environmentId", environmentId, "payload", envConfigProperties) - writeJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - writeJsonResp(w, err, createResp, http.StatusOK) -} - -func (handler PipelineConfigRestHandlerImpl) AppMetricsEnableDisable(w http.ResponseWriter, r *http.Request) { - decoder := json.NewDecoder(r.Body) - userId, err := handler.userAuthService.GetLoggedInUser(r) - if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) - return - } - token := r.Header.Get("token") - vars := mux.Vars(r) - appId, err := strconv.Atoi(vars["appId"]) - if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - var request pipeline.AppMetricEnableDisableRequest - err = decoder.Decode(&request) - request.AppId = appId - request.UserId = userId - if err != nil { - handler.Logger.Errorw("request err, AppMetricsEnableDisable", "err", err, "appId", appId, "payload", request) - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - handler.Logger.Infow("request payload, AppMetricsEnableDisable", "err", err, "appId", appId, "payload", request) - app, err := handler.pipelineBuilder.GetApp(appId) - if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - resourceName := handler.enforcerUtil.GetAppRBACName(app.AppName) - if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionCreate, resourceName); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) - return - } - ctx, cancel := context.WithCancel(r.Context()) - if cn, ok := w.(http.CloseNotifier); ok { - go func(done <-chan struct{}, closed <-chan bool) { - select { - case <-done: - case <-closed: - cancel() - } - }(ctx.Done(), cn.CloseNotify()) - } - ctx = context.WithValue(r.Context(), "token", token) - createResp, err := handler.chartService.AppMetricsEnableDisable(request) - if err != nil { - handler.Logger.Errorw("service err, AppMetricsEnableDisable", "err", err, "appId", appId, "payload", request) - writeJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - writeJsonResp(w, err, createResp, http.StatusOK) -} - -func (handler PipelineConfigRestHandlerImpl) EnvMetricsEnableDisable(w http.ResponseWriter, r *http.Request) { - userId, err := handler.userAuthService.GetLoggedInUser(r) - if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) - return - } - token := r.Header.Get("token") - vars := mux.Vars(r) - appId, err := strconv.Atoi(vars["appId"]) - if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - environmentId, err := strconv.Atoi(vars["environmentId"]) - if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - decoder := json.NewDecoder(r.Body) - var request pipeline.AppMetricEnableDisableRequest - err = decoder.Decode(&request) - request.UserId = userId - request.AppId = appId - request.EnvironmentId = environmentId - if err != nil { - handler.Logger.Errorw("request err, EnvMetricsEnableDisable", "err", err, "appId", appId, "environmentId", environmentId, "payload", request) - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - handler.Logger.Infow("request payload, EnvMetricsEnableDisable", "err", err, "appId", appId, "environmentId", environmentId, "payload", request) - app, err := handler.pipelineBuilder.GetApp(appId) - if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - resourceName := handler.enforcerUtil.GetAppRBACNameByAppId(appId) - if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionCreate, resourceName); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) - return - } - object := handler.enforcerUtil.GetAppRBACByAppNameAndEnvId(app.AppName, request.EnvironmentId) - if ok := handler.enforcer.Enforce(token, rbac.ResourceEnvironment, rbac.ActionCreate, object); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) - return - } - createResp, err := handler.propertiesConfigService.EnvMetricsEnableDisable(&request) - if err != nil { - handler.Logger.Errorw("service err, EnvMetricsEnableDisable", "err", err, "appId", appId, "environmentId", environmentId, "payload", request) - writeJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - writeJsonResp(w, err, createResp, http.StatusOK) -} - -func (handler *PipelineConfigRestHandlerImpl) GetCdBuildHistory(w http.ResponseWriter, r *http.Request) { - userId, err := handler.userAuthService.GetLoggedInUser(r) - if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) - return - } - token := r.Header.Get("token") - vars := mux.Vars(r) - appId, err := strconv.Atoi(vars["appId"]) - if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - pipelineId, err := strconv.Atoi(vars["pipelineId"]) - if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - - environmentId, err := strconv.Atoi(vars["environmentId"]) - if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - - offsetQueryParam := r.URL.Query().Get("offset") - offset, err := strconv.Atoi(offsetQueryParam) - if offsetQueryParam == "" || err != nil { - handler.Logger.Errorw("request err, GetCdBuildHistory", "err", err, "appId", appId, "environmentId", environmentId, "pipelineId", pipelineId, "offset", offset) - writeJsonResp(w, err, "invalid offset", http.StatusBadRequest) - return - } - sizeQueryParam := r.URL.Query().Get("size") - limit, err := strconv.Atoi(sizeQueryParam) - if sizeQueryParam == "" || err != nil { - handler.Logger.Errorw("request err, GetCdBuildHistory", "err", err, "appId", appId, "environmentId", environmentId, "pipelineId", pipelineId, "sizeQueryParam", sizeQueryParam) - writeJsonResp(w, err, "invalid size", http.StatusBadRequest) - return - } - handler.Logger.Infow("request payload, GetCdBuildHistory", "err", err, "appId", appId, "environmentId", environmentId, "pipelineId", pipelineId, "offset", offset) - //RBAC CHECK - resourceName := handler.enforcerUtil.GetAppRBACNameByAppId(appId) - if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, resourceName); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) - return - } - //RBAC CHECK - - resp, err := handler.cdHandelr.GetCdBuildHistory(appId, environmentId, pipelineId, offset, limit) - if err != nil { - handler.Logger.Errorw("service err, GetCdBuildHistory", "err", err, "appId", appId, "environmentId", environmentId, "pipelineId", pipelineId, "offset", offset) - writeJsonResp(w, err, resp, http.StatusInternalServerError) - return - } - - writeJsonResp(w, err, resp, http.StatusOK) -} - -func (handler *PipelineConfigRestHandlerImpl) GetCdBuildLogs(w http.ResponseWriter, r *http.Request) { - userId, err := handler.userAuthService.GetLoggedInUser(r) - if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) - return - } - token := r.Header.Get("token") - vars := mux.Vars(r) - appId, err := strconv.Atoi(vars["appId"]) - if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - environmentId, err := strconv.Atoi(vars["environmentId"]) - if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - pipelineId, err := strconv.Atoi(vars["pipelineId"]) - if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - - workflowId, err := strconv.Atoi(vars["workflowId"]) - if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - handler.Logger.Infow("request payload, GetCdBuildLogs", "err", err, "appId", appId, "environmentId", environmentId, "pipelineId", pipelineId, "workflowId", workflowId) - - //RBAC CHECK - resourceName := handler.enforcerUtil.GetAppRBACNameByAppId(appId) - if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, resourceName); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) - return - } - //RBAC CHECK - - logsReader, cleanUp, err := handler.cdHandelr.GetRunningWorkflowLogs(environmentId, pipelineId, workflowId) - if err != nil { - handler.Logger.Errorw("service err, GetCdBuildLogs", "err", err, "appId", appId, "environmentId", environmentId, "pipelineId", pipelineId, "workflowId", workflowId) - writeJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - lastSeenMsgId := -1 - lastEventId := r.Header.Get("Last-Event-ID") - if len(lastEventId) > 0 { - lastSeenMsgId, err = strconv.Atoi(lastEventId) - if err != nil { - handler.Logger.Errorw("request err, GetCdBuildLogs", "err", err, "appId", appId, "environmentId", environmentId, "pipelineId", pipelineId, "workflowId", workflowId, "lastEventId", lastEventId) - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - } - ctx, cancel := context.WithCancel(r.Context()) - if cn, ok := w.(http.CloseNotifier); ok { - go func(done <-chan struct{}, closed <-chan bool) { - select { - case <-done: - case <-closed: - cancel() - } - }(ctx.Done(), cn.CloseNotify()) - } - defer cancel() - defer cleanUp() - handler.streamOutput(w, logsReader, lastSeenMsgId) -} - -func (handler PipelineConfigRestHandlerImpl) FetchCdWorkflowDetails(w http.ResponseWriter, r *http.Request) { - userId, err := handler.userAuthService.GetLoggedInUser(r) - if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) - return - } - token := r.Header.Get("token") - vars := mux.Vars(r) - appId, err := strconv.Atoi(vars["appId"]) - if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - environmentId, err := strconv.Atoi(vars["environmentId"]) - if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - pipelineId, err := strconv.Atoi(vars["pipelineId"]) - if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - buildId, err := strconv.Atoi(vars["workflowRunnerId"]) - if err != nil || buildId == 0 { - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - handler.Logger.Infow("request payload, FetchCdWorkflowDetails", "err", err, "appId", appId, "environmentId", environmentId, "pipelineId", pipelineId, "buildId", buildId) - - //RBAC CHECK - resourceName := handler.enforcerUtil.GetAppRBACNameByAppId(appId) - if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, resourceName); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) - return - } - //RBAC CHECK - - resp, err := handler.cdHandelr.FetchCdWorkflowDetails(appId, environmentId, pipelineId, buildId) - if err != nil { - handler.Logger.Errorw("service err, FetchCdWorkflowDetails", "err", err, "appId", appId, "environmentId", environmentId, "pipelineId", pipelineId, "buildId", buildId) - if util.IsErrNoRows(err) { - err = &util.ApiError{Code: "404", HttpStatusCode: http.StatusNotFound, UserMessage: "no workflow found"} - writeJsonResp(w, err, nil, http.StatusOK) - } else { - writeJsonResp(w, err, nil, http.StatusInternalServerError) - } - return - } - writeJsonResp(w, err, resp, http.StatusOK) -} - -func (handler PipelineConfigRestHandlerImpl) DownloadCdWorkflowArtifacts(w http.ResponseWriter, r *http.Request) { - userId, err := handler.userAuthService.GetLoggedInUser(r) - if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) - return - } - token := r.Header.Get("token") - vars := mux.Vars(r) - appId, err := strconv.Atoi(vars["appId"]) - if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - pipelineId, err := strconv.Atoi(vars["pipelineId"]) - if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - buildId, err := strconv.Atoi(vars["workflowRunnerId"]) - if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - handler.Logger.Infow("request payload, DownloadCdWorkflowArtifacts", "err", err, "appId", appId, "pipelineId", pipelineId, "buildId", buildId) - - //RBAC CHECK - resourceName := handler.enforcerUtil.GetAppRBACNameByAppId(appId) - if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, resourceName); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) - return - } - object := handler.enforcerUtil.GetAppRBACByAppIdAndPipelineId(appId, pipelineId) - if ok := handler.enforcer.Enforce(token, rbac.ResourceEnvironment, rbac.ActionGet, object); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) - return - } - //RBAC CHECK - - file, err := handler.cdHandelr.DownloadCdWorkflowArtifacts(pipelineId, buildId) - defer file.Close() - - if err != nil { - handler.Logger.Errorw("service err, DownloadCdWorkflowArtifacts", "err", err, "appId", appId, "pipelineId", pipelineId, "buildId", buildId) - if util.IsErrNoRows(err) { - err = &util.ApiError{Code: "404", HttpStatusCode: 200, UserMessage: "no workflow found"} - writeJsonResp(w, err, nil, http.StatusOK) - } else { - writeJsonResp(w, err, nil, http.StatusInternalServerError) - } - return - } - w.Header().Set("Content-Disposition", "attachment; filename="+strconv.Itoa(buildId)+".zip") - w.Header().Set("Content-Type", "application/octet-stream") - w.Header().Set("Content-Length", r.Header.Get("Content-Length")) - _, err = io.Copy(w, file) - if err != nil { - handler.Logger.Errorw("service err, DownloadCdWorkflowArtifacts", "err", err, "appId", appId, "pipelineId", pipelineId, "buildId", buildId) - } -} - -func (handler PipelineConfigRestHandlerImpl) FetchCdPrePostStageStatus(w http.ResponseWriter, r *http.Request) { - userId, err := handler.userAuthService.GetLoggedInUser(r) - if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) - return - } - token := r.Header.Get("token") - vars := mux.Vars(r) - appId, err := strconv.Atoi(vars["appId"]) - if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - pipelineId, err := strconv.Atoi(vars["pipelineId"]) - if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - handler.Logger.Infow("request payload, FetchCdPrePostStageStatus", "err", err, "appId", appId, "pipelineId", pipelineId) - - //RBAC CHECK - resourceName := handler.enforcerUtil.GetAppRBACNameByAppId(appId) - if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, resourceName); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) - return - } - object := handler.enforcerUtil.GetAppRBACByAppIdAndPipelineId(appId, pipelineId) - if ok := handler.enforcer.Enforce(token, rbac.ResourceEnvironment, rbac.ActionGet, object); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) - return - } - //RBAC CHECK - - resp, err := handler.cdHandelr.FetchCdPrePostStageStatus(pipelineId) - if err != nil { - handler.Logger.Errorw("service err, FetchCdPrePostStageStatus", "err", err, "appId", appId, "pipelineId", pipelineId) - if util.IsErrNoRows(err) { - err = &util.ApiError{Code: "404", HttpStatusCode: 200, UserMessage: "no status found"} - writeJsonResp(w, err, nil, http.StatusOK) - } else { - writeJsonResp(w, err, nil, http.StatusInternalServerError) - } - return - } - writeJsonResp(w, err, resp, http.StatusOK) -} - -func (handler PipelineConfigRestHandlerImpl) FetchConfigmapSecretsForCdStages(w http.ResponseWriter, r *http.Request) { - userId, err := handler.userAuthService.GetLoggedInUser(r) - if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) - return - } - vars := mux.Vars(r) - pipelineId, err := strconv.Atoi(vars["pipelineId"]) - if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - handler.Logger.Infow("request payload, FetchConfigmapSecretsForCdStages", "err", err, "pipelineId", pipelineId) - pipeline, err := handler.pipelineBuilder.FindPipelineById(pipelineId) - if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - - resp, err := handler.pipelineBuilder.FetchConfigmapSecretsForCdStages(pipeline.AppId, pipeline.EnvironmentId, pipelineId) - if err != nil { - handler.Logger.Errorw("service err, FetchConfigmapSecretsForCdStages", "err", err, "pipelineId", pipelineId) - writeJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - writeJsonResp(w, err, resp, http.StatusOK) -} - -func (handler PipelineConfigRestHandlerImpl) GetCdPipelineById(w http.ResponseWriter, r *http.Request) { - token := r.Header.Get("token") - vars := mux.Vars(r) - appId, err := strconv.Atoi(vars["appId"]) - if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - pipelineId, err := strconv.Atoi(vars["pipelineId"]) - if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - handler.Logger.Infow("request payload, GetCdPipelineById", "err", err, "appId", appId, "pipelineId", pipelineId) - app, err := handler.pipelineBuilder.GetApp(appId) - if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - resourceName := handler.enforcerUtil.GetAppRBACName(app.AppName) - if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, resourceName); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) - return - } - ciConf, err := handler.pipelineBuilder.GetCdPipelineById(pipelineId) - if err != nil { - handler.Logger.Errorw("service err, GetCdPipelineById", "err", err, "appId", appId, "pipelineId", pipelineId) - writeJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - writeJsonResp(w, err, ciConf, http.StatusOK) -} - -func (handler PipelineConfigRestHandlerImpl) FetchAppWorkflowStatusForTriggerView(w http.ResponseWriter, r *http.Request) { - userId, err := handler.userAuthService.GetLoggedInUser(r) - if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) - return - } - token := r.Header.Get("token") - vars := mux.Vars(r) - appId, err := strconv.Atoi(vars["appId"]) - if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - handler.Logger.Infow("request payload, FetchAppWorkflowStatusForTriggerView", "err", err, "appId", appId) - //RBAC CHECK - resourceName := handler.enforcerUtil.GetAppRBACNameByAppId(appId) - if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, resourceName); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) - return - } - //RBAC CHECK - - triggerWorkflowStatus := pipelineConfig.TriggerWorkflowStatus{} - ciWorkflowStatus, err := handler.ciHandler.FetchCiStatusForTriggerView(appId) - if err != nil { - handler.Logger.Errorw("service err, FetchAppWorkflowStatusForTriggerView", "err", err, "appId", appId) - if util.IsErrNoRows(err) { - err = &util.ApiError{Code: "404", HttpStatusCode: 200, UserMessage: "no workflow found"} - writeJsonResp(w, err, nil, http.StatusOK) - } else { - writeJsonResp(w, err, nil, http.StatusInternalServerError) - } - return - } - - cdWorkflowStatus, err := handler.cdHandelr.FetchAppWorkflowStatusForTriggerView(appId) - if err != nil { - handler.Logger.Errorw("service err, FetchAppWorkflowStatusForTriggerView", "err", err, "appId", appId) - if util.IsErrNoRows(err) { - err = &util.ApiError{Code: "404", HttpStatusCode: 200, UserMessage: "no status found"} - writeJsonResp(w, err, nil, http.StatusOK) - } else { - writeJsonResp(w, err, nil, http.StatusInternalServerError) - } - return - } - triggerWorkflowStatus.CiWorkflowStatus = ciWorkflowStatus - triggerWorkflowStatus.CdWorkflowStatus = cdWorkflowStatus - writeJsonResp(w, err, triggerWorkflowStatus, http.StatusOK) -} - -func (handler PipelineConfigRestHandlerImpl) FetchMaterialInfo(w http.ResponseWriter, r *http.Request) { - userId, err := handler.userAuthService.GetLoggedInUser(r) - if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) - return - } - vars := mux.Vars(r) - ciArtifactId, err := strconv.Atoi(vars["ciArtifactId"]) - if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - handler.Logger.Infow("request payload, FetchMaterialInfo", "err", err, "ciArtifactId", ciArtifactId) - resp, err := handler.ciHandler.FetchMaterialInfoByArtifactId(ciArtifactId) - if err != nil { - handler.Logger.Errorw("service err, FetchMaterialInfo", "err", err, "ciArtifactId", ciArtifactId) - if util.IsErrNoRows(err) { - err = &util.ApiError{Code: "404", HttpStatusCode: http.StatusNotFound, UserMessage: "no material info found"} - writeJsonResp(w, err, nil, http.StatusOK) - } else { - writeJsonResp(w, err, nil, http.StatusInternalServerError) - } - return - } - //RBAC - token := r.Header.Get("token") - object := handler.enforcerUtil.GetAppRBACNameByAppId(resp.AppId) - if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); !ok { - writeJsonResp(w, err, "Unauthorized User", http.StatusForbidden) - return - } - //RBAC - - writeJsonResp(w, err, resp, http.StatusOK) -} - -func (handler PipelineConfigRestHandlerImpl) GetCIPipelineById(w http.ResponseWriter, r *http.Request) { - token := r.Header.Get("token") - vars := mux.Vars(r) - appId, err := strconv.Atoi(vars["appId"]) - if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - pipelineId, err := strconv.Atoi(vars["pipelineId"]) - if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - handler.Logger.Infow("request payload, GetCIPipelineById", "err", err, "appId", appId, "pipelineId", pipelineId) - app, err := handler.pipelineBuilder.GetApp(appId) - if err != nil { - handler.Logger.Infow("service error, GetCIPipelineById", "err", err, "appId", appId, "pipelineId", pipelineId) - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - resourceName := handler.enforcerUtil.GetAppRBACName(app.AppName) - if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, resourceName); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) - return - } - ciPipeline, err := handler.pipelineBuilder.GetCiPipelineById(pipelineId) - if err != nil { - handler.Logger.Infow("service error, GetCIPipelineById", "err", err, "appId", appId, "pipelineId", pipelineId) - writeJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - writeJsonResp(w, err, ciPipeline, http.StatusOK) -} - -func (handler PipelineConfigRestHandlerImpl) PipelineNameSuggestion(w http.ResponseWriter, r *http.Request) { - token := r.Header.Get("token") - vars := mux.Vars(r) - appId, err := strconv.Atoi(vars["appId"]) - if err != nil { - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - pType := vars["type"] - handler.Logger.Infow("request payload, PipelineNameSuggestion", "err", err, "appId", appId) - app, err := handler.pipelineBuilder.GetApp(appId) - if err != nil { - handler.Logger.Infow("service error, GetCIPipelineById", "err", err, "appId", appId) - writeJsonResp(w, err, nil, http.StatusBadRequest) - return - } - suggestedName := fmt.Sprintf("%s-%d-%s", pType, appId, util2.Generate(4)) - resourceName := handler.enforcerUtil.GetAppRBACName(app.AppName) - if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, resourceName); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) - return - } - writeJsonResp(w, err, suggestedName, http.StatusOK) -} \ No newline at end of file diff --git a/api/restHandler/PipelineTriggerRestHandler.go b/api/restHandler/PipelineTriggerRestHandler.go index ae823bc64a..40c116897e 100644 --- a/api/restHandler/PipelineTriggerRestHandler.go +++ b/api/restHandler/PipelineTriggerRestHandler.go @@ -22,6 +22,7 @@ import ( "encoding/json" "fmt" "github.com/devtron-labs/devtron/api/bean" + "github.com/devtron-labs/devtron/api/restHandler/common" "github.com/devtron-labs/devtron/pkg/app" "github.com/devtron-labs/devtron/pkg/deploymentGroup" "github.com/devtron-labs/devtron/pkg/pipeline" @@ -73,14 +74,14 @@ func (handler PipelineTriggerRestHandlerImpl) OverrideConfig(w http.ResponseWrit decoder := json.NewDecoder(r.Body) userId, err := handler.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } var overrideRequest bean.ValuesOverrideRequest err = decoder.Decode(&overrideRequest) if err != nil { handler.logger.Errorw("request err, OverrideConfig", "err", err, "payload", overrideRequest) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } overrideRequest.UserId = userId @@ -88,7 +89,7 @@ func (handler PipelineTriggerRestHandlerImpl) OverrideConfig(w http.ResponseWrit err = handler.validator.Struct(overrideRequest) if err != nil { handler.logger.Errorw("request err, OverrideConfig", "err", err, "payload", overrideRequest) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } token := r.Header.Get("token") @@ -96,12 +97,12 @@ func (handler PipelineTriggerRestHandlerImpl) OverrideConfig(w http.ResponseWrit //rbac block starts from here object := handler.enforcerUtil.GetAppRBACNameByAppId(overrideRequest.AppId) if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionTrigger, object); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) return } object = handler.enforcerUtil.GetAppRBACByAppIdAndPipelineId(overrideRequest.AppId, overrideRequest.PipelineId) if ok := handler.enforcer.Enforce(token, rbac.ResourceEnvironment, rbac.ActionTrigger, object); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) return } //rback block ends here @@ -110,25 +111,25 @@ func (handler PipelineTriggerRestHandlerImpl) OverrideConfig(w http.ResponseWrit mergeResp, err := handler.workflowDagExecutor.ManualCdTrigger(&overrideRequest, ctx) if err != nil { handler.logger.Errorw("request err, OverrideConfig", "err", err, "payload", overrideRequest) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } res := map[string]interface{}{"releaseId": mergeResp} - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } func (handler PipelineTriggerRestHandlerImpl) StartStopApp(w http.ResponseWriter, r *http.Request) { decoder := json.NewDecoder(r.Body) userId, err := handler.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } var overrideRequest pipeline.StopAppRequest err = decoder.Decode(&overrideRequest) if err != nil { handler.logger.Errorw("request err, StartStopApp", "err", err, "payload", overrideRequest) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } overrideRequest.UserId = userId @@ -136,19 +137,19 @@ func (handler PipelineTriggerRestHandlerImpl) StartStopApp(w http.ResponseWriter err = handler.validator.Struct(overrideRequest) if err != nil { handler.logger.Errorw("validation err, StartStopApp", "err", err, "payload", overrideRequest) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } token := r.Header.Get("token") //rbac block starts from here object := handler.enforcerUtil.GetAppRBACNameByAppId(overrideRequest.AppId) if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionTrigger, object); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) return } object = handler.enforcerUtil.GetEnvRBACNameByAppId(overrideRequest.AppId, overrideRequest.EnvironmentId) if ok := handler.enforcer.Enforce(token, rbac.ResourceEnvironment, rbac.ActionTrigger, object); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) return } //rback block ends here @@ -157,11 +158,11 @@ func (handler PipelineTriggerRestHandlerImpl) StartStopApp(w http.ResponseWriter mergeResp, err := handler.workflowDagExecutor.StopStartApp(&overrideRequest, ctx) if err != nil { handler.logger.Errorw("service err, StartStopApp", "err", err, "payload", overrideRequest) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } res := map[string]interface{}{"releaseId": mergeResp} - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } func (handler PipelineTriggerRestHandlerImpl) StartStopDeploymentGroup(w http.ResponseWriter, r *http.Request) { @@ -169,21 +170,21 @@ func (handler PipelineTriggerRestHandlerImpl) StartStopDeploymentGroup(w http.Re userId, err := handler.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } var stopDeploymentGroupRequest pipeline.StopDeploymentGroupRequest err = decoder.Decode(&stopDeploymentGroupRequest) if err != nil { handler.logger.Errorw("request err, StartStopDeploymentGroup", "err", err, "payload", stopDeploymentGroupRequest) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } stopDeploymentGroupRequest.UserId = userId err = handler.validator.Struct(stopDeploymentGroupRequest) if err != nil { handler.logger.Errorw("validation err, StartStopDeploymentGroup", "err", err, "payload", stopDeploymentGroupRequest) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } handler.logger.Infow("request payload, StartStopDeploymentGroup", "err", err, "payload", stopDeploymentGroupRequest) @@ -192,19 +193,19 @@ func (handler PipelineTriggerRestHandlerImpl) StartStopDeploymentGroup(w http.Re dg, err := handler.deploymentGroupService.GetDeploymentGroupById(stopDeploymentGroupRequest.DeploymentGroupId) if err != nil { handler.logger.Errorw("request err, StartStopDeploymentGroup", "err", err, "payload", stopDeploymentGroupRequest) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } token := r.Header.Get("token") // RBAC enforcer applying object := handler.enforcerUtil.GetTeamRBACByCiPipelineId(dg.CiPipelineId) if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionTrigger, object); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) return } object = handler.enforcerUtil.GetEnvRBACNameByCiPipelineIdAndEnvId(dg.CiPipelineId, dg.EnvironmentId) if ok := handler.enforcer.Enforce(token, rbac.ResourceEnvironment, rbac.ActionTrigger, object); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) return } //rback block ends here @@ -213,31 +214,31 @@ func (handler PipelineTriggerRestHandlerImpl) StartStopDeploymentGroup(w http.Re res, err := handler.workflowDagExecutor.TriggerBulkHibernateAsync(stopDeploymentGroupRequest, ctx) if err != nil { handler.logger.Errorw("service err, StartStopDeploymentGroup", "err", err, "payload", stopDeploymentGroupRequest) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } func (handler PipelineTriggerRestHandlerImpl) ReleaseStatusUpdate(w http.ResponseWriter, r *http.Request) { decoder := json.NewDecoder(r.Body) userId, err := handler.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } var releaseStatusUpdateRequest bean.ReleaseStatusUpdateRequest err = decoder.Decode(&releaseStatusUpdateRequest) if err != nil { handler.logger.Errorw("request err, ReleaseStatusUpdate", "err", err, "payload", releaseStatusUpdateRequest) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } handler.logger.Infow("request payload, ReleaseStatusUpdate, override request ----", "err", err, "payload", releaseStatusUpdateRequest) res, err := handler.appService.UpdateReleaseStatus(&releaseStatusUpdateRequest) if err != nil { handler.logger.Errorw("service err, ReleaseStatusUpdate", "err", err, "payload", releaseStatusUpdateRequest) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } m := map[string]bool{ @@ -246,5 +247,5 @@ func (handler PipelineTriggerRestHandlerImpl) ReleaseStatusUpdate(w http.Respons if err != nil { handler.logger.Errorw("marshal err, ReleaseStatusUpdate", "err", err, "payload", m) } - writeJsonResp(w, err, resJson, http.StatusOK) + common.WriteJsonResp(w, err, resJson, http.StatusOK) } diff --git a/api/restHandler/PolicyResthandler.go b/api/restHandler/PolicyResthandler.go index f4ae17a02f..6ba162aa3f 100644 --- a/api/restHandler/PolicyResthandler.go +++ b/api/restHandler/PolicyResthandler.go @@ -22,6 +22,7 @@ import ( "errors" "fmt" "github.com/devtron-labs/devtron/api/bean" + "github.com/devtron-labs/devtron/api/restHandler/common" security2 "github.com/devtron-labs/devtron/internal/sql/repository/security" "github.com/devtron-labs/devtron/pkg/cluster" "github.com/devtron-labs/devtron/pkg/security" @@ -68,14 +69,14 @@ func (impl PolicyRestHandlerImpl) SavePolicy(w http.ResponseWriter, r *http.Requ decoder := json.NewDecoder(r.Body) userId, err := impl.userService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } var req bean.CreateVulnerabilityPolicyRequest err = decoder.Decode(&req) if err != nil { impl.logger.Errorw("request err, SavePolicy", "err", err, "payload", req) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } impl.logger.Infow("request payload, SavePolicy", "payload", req) @@ -84,26 +85,26 @@ func (impl PolicyRestHandlerImpl) SavePolicy(w http.ResponseWriter, r *http.Requ if req.AppId > 0 && req.EnvId > 0 { object := impl.enforcerUtil.GetAppRBACNameByAppId(req.AppId) if ok := impl.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionCreate, object); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) return } object = impl.enforcerUtil.GetEnvRBACNameByAppId(req.AppId, req.EnvId) if ok := impl.enforcer.Enforce(token, rbac.ResourceEnvironment, rbac.ActionCreate, object); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) return } } else if req.AppId == 0 && req.EnvId > 0 { // for env level access check env level access. token := r.Header.Get("token") if ok := impl.enforcer.Enforce(token, rbac.ResourceGlobalEnvironment, rbac.ActionCreate, "*"); !ok { - writeJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) + common.WriteJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) return } } else { // for global and cluster level check super admin access only roles, err := impl.userService.CheckUserRoles(userId) if err != nil { - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } superAdmin := false @@ -113,7 +114,7 @@ func (impl PolicyRestHandlerImpl) SavePolicy(w http.ResponseWriter, r *http.Requ } } if superAdmin == false { - writeJsonResp(w, fmt.Errorf("unauthorized user"), nil, http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), nil, http.StatusForbidden) return } } @@ -122,17 +123,17 @@ func (impl PolicyRestHandlerImpl) SavePolicy(w http.ResponseWriter, r *http.Requ res, err := impl.policyService.SavePolicy(req, userId) if err != nil { impl.logger.Errorw("service err, SavePolicy", "err", err, "payload", req) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } func (impl PolicyRestHandlerImpl) UpdatePolicy(w http.ResponseWriter, r *http.Request) { decoder := json.NewDecoder(r.Body) userId, err := impl.userService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } var req bean.UpdatePolicyParams @@ -140,13 +141,13 @@ func (impl PolicyRestHandlerImpl) UpdatePolicy(w http.ResponseWriter, r *http.Re err = decoder.Decode(&req) if err != nil { impl.logger.Errorw("request err, UpdatePolicy", "err", err, "payload", req) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } impl.logger.Infow("request payload, UpdatePolicy", "err", err, "payload", req) policy, err := impl.policyService.GetCvePolicy(req.Id, userId) if err != nil { - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } token := r.Header.Get("token") @@ -154,26 +155,26 @@ func (impl PolicyRestHandlerImpl) UpdatePolicy(w http.ResponseWriter, r *http.Re if policy.AppId > 0 && policy.EnvironmentId > 0 { object := impl.enforcerUtil.GetAppRBACNameByAppId(policy.AppId) if ok := impl.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionUpdate, object); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) return } object = impl.enforcerUtil.GetEnvRBACNameByAppId(policy.AppId, policy.EnvironmentId) if ok := impl.enforcer.Enforce(token, rbac.ResourceEnvironment, rbac.ActionUpdate, object); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) return } } else if policy.AppId == 0 && policy.EnvironmentId > 0 { // for env level access check env level access. token := r.Header.Get("token") if ok := impl.enforcer.Enforce(token, rbac.ResourceGlobalEnvironment, rbac.ActionUpdate, "*"); !ok { - writeJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) + common.WriteJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) return } } else { // for global and cluster level check super admin access only roles, err := impl.userService.CheckUserRoles(userId) if err != nil { - writeJsonResp(w, err, "Failed to get user by id", http.StatusInternalServerError) + common.WriteJsonResp(w, err, "Failed to get user by id", http.StatusInternalServerError) return } superAdmin := false @@ -183,7 +184,7 @@ func (impl PolicyRestHandlerImpl) UpdatePolicy(w http.ResponseWriter, r *http.Re } } if superAdmin == false { - writeJsonResp(w, fmt.Errorf("unauthorized user"), nil, http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), nil, http.StatusForbidden) return } } @@ -192,16 +193,16 @@ func (impl PolicyRestHandlerImpl) UpdatePolicy(w http.ResponseWriter, r *http.Re res, err := impl.policyService.UpdatePolicy(req, userId) if err != nil { impl.logger.Errorw("service err, UpdatePolicy", "err", err, "payload", req) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } func (impl PolicyRestHandlerImpl) GetPolicy(w http.ResponseWriter, r *http.Request) { userId, err := impl.userService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } req := bean.FetchPolicyParams{} @@ -214,7 +215,7 @@ func (impl PolicyRestHandlerImpl) GetPolicy(w http.ResponseWriter, r *http.Reque ids, err := strconv.Atoi(id) if err != nil { impl.logger.Errorw("request err, GetPolicy", "err", err, "id", id) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) } req.Id = ids } @@ -238,7 +239,7 @@ func (impl PolicyRestHandlerImpl) GetPolicy(w http.ResponseWriter, r *http.Reque res, err := impl.policyService.GetPolicies(policyLevel, clusterId, environmentId, appId) if err != nil { impl.logger.Errorw("service err, GetPolicy", "err", err, "policyLevel", policyLevel, "clusterId", clusterId, "environmentId", environmentId, "appId", appId) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } @@ -264,7 +265,7 @@ func (impl PolicyRestHandlerImpl) GetPolicy(w http.ResponseWriter, r *http.Reque // for env level access check env level access. environment, err := impl.environmentService.FindById(policy.EnvId) if err != nil { - writeJsonResp(w, err, "Failed to get environment by id", http.StatusInternalServerError) + common.WriteJsonResp(w, err, "Failed to get environment by id", http.StatusInternalServerError) return } if ok := impl.enforcer.Enforce(token, rbac.ResourceGlobalEnvironment, rbac.ActionGet, environment.Environment); ok { @@ -275,7 +276,7 @@ func (impl PolicyRestHandlerImpl) GetPolicy(w http.ResponseWriter, r *http.Reque environments, err := impl.environmentService.GetByClusterId(clusterId) if err != nil { impl.logger.Errorw("service err, GetPolicy", "err", err, "clusterId", clusterId) - writeJsonResp(w, err, "Failed to get cluster by id", http.StatusInternalServerError) + common.WriteJsonResp(w, err, "Failed to get cluster by id", http.StatusInternalServerError) return } for _, environment := range environments { @@ -293,7 +294,7 @@ func (impl PolicyRestHandlerImpl) GetPolicy(w http.ResponseWriter, r *http.Reque } } res.Policies = vulnerabilityPolicy - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } //TODO - move to image-scanner @@ -305,15 +306,15 @@ func (impl PolicyRestHandlerImpl) VerifyImage(w http.ResponseWriter, r *http.Req err := decoder.Decode(&req) if err != nil { impl.logger.Errorw("request err, VerifyImage", "err", err, "payload", req) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } impl.logger.Infow("request payload, VerifyImage", "req", req) res, err := impl.policyService.VerifyImage(&req) if err != nil { impl.logger.Errorw("request err, VerifyImage", "err", err, "payload", req) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } diff --git a/api/restHandler/PubSubClientRestHandler.go b/api/restHandler/PubSubClientRestHandler.go index 58dda5800f..dee67daf9a 100644 --- a/api/restHandler/PubSubClientRestHandler.go +++ b/api/restHandler/PubSubClientRestHandler.go @@ -19,6 +19,7 @@ package restHandler import ( "encoding/json" + "github.com/devtron-labs/devtron/api/restHandler/common" "github.com/devtron-labs/devtron/client/pubsub" "github.com/devtron-labs/devtron/pkg/pipeline" "go.uber.org/zap" @@ -50,7 +51,7 @@ func (impl *PubSubClientRestHandlerImpl) PublishEventsToNats(w http.ResponseWrit err := decoder.Decode(&publishRequest) if err != nil { impl.logger.Errorw("request err, HandleExternalCiWebhook", "err", err, "payload", publishRequest) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } @@ -58,22 +59,22 @@ func (impl *PubSubClientRestHandlerImpl) PublishEventsToNats(w http.ResponseWrit splitToken := strings.Split(reqToken, "Bearer") if len(splitToken) != 2 { impl.logger.Debugw("request err, HandleExternalCiWebhook", "payload", publishRequest, "token", reqToken) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } reqToken = strings.TrimSpace(splitToken[1]) if impl.cdConfig.OrchestratorToken != reqToken { - writeJsonResp(w, err, "Unauthorized req", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized req", http.StatusUnauthorized) return } id, err := impl.natsPublishClient.Publish(&publishRequest) if err != nil { impl.logger.Errorw("service err, HandleExternalCiWebhook", "err", err, "payload", publishRequest) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } result := make(map[string]string) result["id"] = id - writeJsonResp(w, err, result, http.StatusAccepted) + common.WriteJsonResp(w, err, result, http.StatusAccepted) } diff --git a/api/restHandler/ReleaseMetricsRestHandler.go b/api/restHandler/ReleaseMetricsRestHandler.go index 1e95ed70b5..02b54da495 100644 --- a/api/restHandler/ReleaseMetricsRestHandler.go +++ b/api/restHandler/ReleaseMetricsRestHandler.go @@ -20,6 +20,7 @@ package restHandler import ( "encoding/json" "fmt" + "github.com/devtron-labs/devtron/api/restHandler/common" "github.com/devtron-labs/devtron/client/lens" "github.com/devtron-labs/devtron/internal/sql/repository/pipelineConfig" "github.com/devtron-labs/devtron/pkg/app" @@ -74,14 +75,14 @@ func (impl *ReleaseMetricsRestHandlerImpl) ResetDataForAppEnvironment(w http.Res decoder := json.NewDecoder(r.Body) userId, err := impl.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } var req MetricsRequest err = decoder.Decode(&req) if err != nil { impl.logger.Errorw("request err, ResetDataForAppEnvironment", "err", err, "payload", req) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } impl.logger.Infow("request payload, ResetDataForAppEnvironment", "err", err, "payload", req) @@ -89,20 +90,20 @@ func (impl *ReleaseMetricsRestHandlerImpl) ResetDataForAppEnvironment(w http.Res token := r.Header.Get("token") appRbacObject := impl.enforcerUtil.GetAppRBACNameByAppId(req.AppId) if appRbacObject == "" { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) return } envRbacObject := impl.enforcerUtil.GetEnvRBACNameByAppId(req.AppId, req.EnvironmentId) if envRbacObject == "" { - writeJsonResp(w, fmt.Errorf("envId is incorrect"), nil, http.StatusBadRequest) + common.WriteJsonResp(w, fmt.Errorf("envId is incorrect"), nil, http.StatusBadRequest) return } if ok := impl.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionCreate, appRbacObject); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) return } if ok := impl.enforcer.Enforce(token, rbac.ResourceEnvironment, rbac.ActionCreate, envRbacObject); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) return } //RBAC end @@ -110,10 +111,10 @@ func (impl *ReleaseMetricsRestHandlerImpl) ResetDataForAppEnvironment(w http.Res err = impl.ReleaseDataService.TriggerEventForAllRelease(req.AppId, req.EnvironmentId) if err != nil { impl.logger.Errorw("service err, ResetDataForAppEnvironment", "err", err, "payload", req) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, true, http.StatusOK) + common.WriteJsonResp(w, err, true, http.StatusOK) } func (impl *ReleaseMetricsRestHandlerImpl) ResetDataForAllAppEnvironment(w http.ResponseWriter, r *http.Request) { @@ -121,7 +122,7 @@ func (impl *ReleaseMetricsRestHandlerImpl) ResetDataForAllAppEnvironment(w http. pipelines, err := impl.pipelineRepository.UniqueAppEnvironmentPipelines() if err != nil { impl.logger.Errorw("service err, ResetDataForAllAppEnvironment", "err", err) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) } for _, pipeline := range pipelines { appRbacObject := impl.enforcerUtil.GetAppRBACNameByAppId(pipeline.AppId) @@ -155,23 +156,23 @@ func (impl *ReleaseMetricsRestHandlerImpl) GetDeploymentMetrics(w http.ResponseW err := decoder.Decode(metricRequest, r.URL.Query()) if err != nil { impl.logger.Errorw("request err, GetDeploymentMetrics", "err", err, "payload", metricRequest) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } token := r.Header.Get("token") appRbacObject := impl.enforcerUtil.GetAppRBACNameByAppId(metricRequest.AppId) if appRbacObject == "" { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) return } if ok := impl.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, appRbacObject); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) return } resBody, resCode, err := impl.ReleaseDataService.GetDeploymentMetrics(metricRequest) if err != nil { impl.logger.Errorw("service err, GetDeploymentMetrics", "err", err, "payload", metricRequest) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } w.Header().Set("Content-Type", "application/json") diff --git a/api/restHandler/SsoLoginHandler.go b/api/restHandler/SsoLoginHandler.go index 6542a17155..ef93502abd 100644 --- a/api/restHandler/SsoLoginHandler.go +++ b/api/restHandler/SsoLoginHandler.go @@ -21,6 +21,7 @@ import ( "encoding/json" "errors" "github.com/devtron-labs/devtron/api/bean" + "github.com/devtron-labs/devtron/api/restHandler/common" "github.com/devtron-labs/devtron/client/pubsub" "github.com/devtron-labs/devtron/pkg/sso" "github.com/devtron-labs/devtron/pkg/user" @@ -61,7 +62,7 @@ func NewSsoLoginRestHandlerImpl(userAuthService user.UserAuthService, validator func (handler SsoLoginRestHandlerImpl) CreateSSOLoginConfig(w http.ResponseWriter, r *http.Request) { userId, err := handler.userService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } decoder := json.NewDecoder(r.Body) @@ -69,13 +70,13 @@ func (handler SsoLoginRestHandlerImpl) CreateSSOLoginConfig(w http.ResponseWrite err = decoder.Decode(&dto) if err != nil { handler.logger.Errorw("request err, CreateSSOLoginConfig", "err", err, "payload", dto) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } token := r.Header.Get("token") if ok := handler.enforcer.Enforce(token, rbac.ResourceGlobal, rbac.ActionCreate, "*"); !ok { - writeJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) + common.WriteJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) return } @@ -83,16 +84,16 @@ func (handler SsoLoginRestHandlerImpl) CreateSSOLoginConfig(w http.ResponseWrite resp, err := handler.ssoLoginService.CreateSSOLogin(&dto) if err != nil { handler.logger.Errorw("service err, CreateSSOLoginConfig", "err", err, "payload", dto) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, nil, resp, http.StatusOK) + common.WriteJsonResp(w, nil, resp, http.StatusOK) } func (handler SsoLoginRestHandlerImpl) UpdateSSOLoginConfig(w http.ResponseWriter, r *http.Request) { userId, err := handler.userService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } @@ -101,13 +102,13 @@ func (handler SsoLoginRestHandlerImpl) UpdateSSOLoginConfig(w http.ResponseWrite err = decoder.Decode(&dto) if err != nil { handler.logger.Errorw("request err, UpdateSSOLoginConfig", "err", err, "payload", dto) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } token := r.Header.Get("token") if ok := handler.enforcer.Enforce(token, rbac.ResourceGlobal, rbac.ActionUpdate, "*"); !ok { - writeJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) + common.WriteJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) return } @@ -115,26 +116,26 @@ func (handler SsoLoginRestHandlerImpl) UpdateSSOLoginConfig(w http.ResponseWrite resp, err := handler.ssoLoginService.UpdateSSOLogin(&dto) if err != nil { handler.logger.Errorw("service err, UpdateSSOLoginConfig", "err", err, "payload", dto) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, nil, resp, http.StatusOK) + common.WriteJsonResp(w, nil, resp, http.StatusOK) } func (handler SsoLoginRestHandlerImpl) GetAllSSOLoginConfig(w http.ResponseWriter, r *http.Request) { res, err := handler.ssoLoginService.GetAll() if err != nil { handler.logger.Errorw("service err, GetAllSSOLoginConfig", "err", err) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, nil, res, http.StatusOK) + common.WriteJsonResp(w, nil, res, http.StatusOK) } func (handler SsoLoginRestHandlerImpl) GetSSOLoginConfig(w http.ResponseWriter, r *http.Request) { userId, err := handler.userService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } vars := mux.Vars(r) @@ -142,35 +143,35 @@ func (handler SsoLoginRestHandlerImpl) GetSSOLoginConfig(w http.ResponseWriter, id, err := strconv.Atoi(vars["id"]) if err != nil { handler.logger.Errorw("request err, GetSSOLoginConfig", "err", err, "id", id) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } token := r.Header.Get("token") if ok := handler.enforcer.Enforce(token, rbac.ResourceGlobal, rbac.ActionGet, "*"); !ok { - writeJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) + common.WriteJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) return } res, err := handler.ssoLoginService.GetById(int32(id)) if err != nil { handler.logger.Errorw("service err, GetSSOLoginConfig", "err", err) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, nil, res, http.StatusOK) + common.WriteJsonResp(w, nil, res, http.StatusOK) } func (handler SsoLoginRestHandlerImpl) GetSSOLoginConfigByName(w http.ResponseWriter, r *http.Request) { userId, err := handler.userService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } token := r.Header.Get("token") if ok := handler.enforcer.Enforce(token, rbac.ResourceGlobal, rbac.ActionGet, "*"); !ok { - writeJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) + common.WriteJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) return } @@ -179,8 +180,8 @@ func (handler SsoLoginRestHandlerImpl) GetSSOLoginConfigByName(w http.ResponseWr res, err := handler.ssoLoginService.GetByName(name) if err != nil { handler.logger.Errorw("service err, GetSSOLoginConfigByName", "err", err) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, nil, res, http.StatusOK) + common.WriteJsonResp(w, nil, res, http.StatusOK) } diff --git a/api/restHandler/TeamRestHandler.go b/api/restHandler/TeamRestHandler.go index 6c4dfd294f..383761c583 100644 --- a/api/restHandler/TeamRestHandler.go +++ b/api/restHandler/TeamRestHandler.go @@ -20,6 +20,7 @@ package restHandler import ( "encoding/json" "fmt" + "github.com/devtron-labs/devtron/api/restHandler/common" "github.com/devtron-labs/devtron/pkg/pipeline" "github.com/devtron-labs/devtron/pkg/team" "github.com/devtron-labs/devtron/pkg/user" @@ -77,14 +78,14 @@ func (impl TeamRestHandlerImpl) SaveTeam(w http.ResponseWriter, r *http.Request) decoder := json.NewDecoder(r.Body) userId, err := impl.userService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } var bean team.TeamRequest err = decoder.Decode(&bean) if err != nil { impl.logger.Errorw("request err, SaveTeam", "err", err, "payload", bean) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } bean.UserId = userId @@ -92,22 +93,22 @@ func (impl TeamRestHandlerImpl) SaveTeam(w http.ResponseWriter, r *http.Request) err = impl.validator.Struct(bean) if err != nil { impl.logger.Errorw("validation err, SaveTeam", "err", err, "payload", bean) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } token := r.Header.Get("token") if ok := impl.enforcer.Enforce(token, rbac.ResourceTeam, rbac.ActionCreate, "*"); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) return } res, err := impl.teamService.Create(&bean) if err != nil { impl.logger.Errorw("service err, SaveTeam", "err", err, "payload", bean) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } func (impl TeamRestHandlerImpl) FetchAll(w http.ResponseWriter, r *http.Request) { @@ -115,7 +116,7 @@ func (impl TeamRestHandlerImpl) FetchAll(w http.ResponseWriter, r *http.Request) res, err := impl.teamService.FetchAllActive() if err != nil { impl.logger.Errorw("service err, FetchAllActive", "err", err) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } // RBAC enforcer applying @@ -127,7 +128,7 @@ func (impl TeamRestHandlerImpl) FetchAll(w http.ResponseWriter, r *http.Request) } //RBAC enforcer Ends - writeJsonResp(w, err, result, http.StatusOK) + common.WriteJsonResp(w, err, result, http.StatusOK) } func (impl TeamRestHandlerImpl) FetchOne(w http.ResponseWriter, r *http.Request) { @@ -136,38 +137,38 @@ func (impl TeamRestHandlerImpl) FetchOne(w http.ResponseWriter, r *http.Request) idi, err := strconv.Atoi(id) if err != nil { impl.logger.Errorw("request err, FetchOne", "err", err, "id", id) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } res, err := impl.teamService.FetchOne(idi) if err != nil { impl.logger.Errorw("service err, FetchOne", "err", err, "id", idi) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } token := r.Header.Get("token") if ok := impl.enforcer.Enforce(token, rbac.ResourceTeam, rbac.ActionGet, strings.ToLower(res.Name)); !ok { - writeJsonResp(w, err, "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden) return } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } func (impl TeamRestHandlerImpl) UpdateTeam(w http.ResponseWriter, r *http.Request) { decoder := json.NewDecoder(r.Body) userId, err := impl.userService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } var bean team.TeamRequest err = decoder.Decode(&bean) if err != nil { impl.logger.Errorw("request err, UpdateTeam", "err", err, "bean", bean) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } bean.UserId = userId @@ -175,21 +176,21 @@ func (impl TeamRestHandlerImpl) UpdateTeam(w http.ResponseWriter, r *http.Reques err = impl.validator.Struct(bean) if err != nil { impl.logger.Errorw("validation err, UpdateTeam", "err", err, "bean", bean) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } token := r.Header.Get("token") if ok := impl.enforcer.Enforce(token, rbac.ResourceTeam, rbac.ActionUpdate, strings.ToLower(bean.Name)); !ok { - writeJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) return } res, err := impl.teamService.Update(&bean) if err != nil { impl.logger.Errorw("service err, UpdateTeam", "err", err, "bean", bean) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } func (impl TeamRestHandlerImpl) FindTeamByAppId(w http.ResponseWriter, r *http.Request) { @@ -197,18 +198,18 @@ func (impl TeamRestHandlerImpl) FindTeamByAppId(w http.ResponseWriter, r *http.R appId, err := strconv.Atoi(vars["appId"]) if err != nil { impl.logger.Errorw("request err, FindTeamByAppId", "err", err, "appId", appId) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } team, err := impl.teamService.FindTeamByAppId(appId) if err != nil { impl.logger.Errorw("service err, FindTeamByAppId", "err", err, "appId", appId) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, team, http.StatusOK) + common.WriteJsonResp(w, err, team, http.StatusOK) } func (impl TeamRestHandlerImpl) FindActiveTeamByAppName(w http.ResponseWriter, r *http.Request) { @@ -217,23 +218,23 @@ func (impl TeamRestHandlerImpl) FindActiveTeamByAppName(w http.ResponseWriter, r team, err := impl.teamService.FindActiveTeamByAppName(appName) if err != nil { impl.logger.Errorw("service err, FindActiveTeamByAppName", "err", err, "appName", appName) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, team, http.StatusOK) + common.WriteJsonResp(w, err, team, http.StatusOK) } func (impl TeamRestHandlerImpl) FetchForAutocomplete(w http.ResponseWriter, r *http.Request) { userId, err := impl.userService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } teams, err := impl.teamService.FetchForAutocomplete() if err != nil { impl.logger.Errorw("service err, FetchForAutocomplete", "err", err) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } token := r.Header.Get("token") @@ -248,20 +249,20 @@ func (impl TeamRestHandlerImpl) FetchForAutocomplete(w http.ResponseWriter, r *h if len(grantedTeams) == 0 { grantedTeams = make([]team.TeamRequest, 0) } - writeJsonResp(w, err, grantedTeams, http.StatusOK) + common.WriteJsonResp(w, err, grantedTeams, http.StatusOK) } func (impl TeamRestHandlerImpl) FetchForUser(w http.ResponseWriter, r *http.Request) { userId, err := impl.userService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } teams, err := impl.teamService.FindTeamsByUser(int32(userId)) if err != nil { impl.logger.Errorw("service err, FetchForUser", "err", err, "userId", userId) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, teams, http.StatusOK) + common.WriteJsonResp(w, err, teams, http.StatusOK) } diff --git a/api/restHandler/TelemetryRestHandler.go b/api/restHandler/TelemetryRestHandler.go index 92b4a61c3e..1c8d807c9c 100644 --- a/api/restHandler/TelemetryRestHandler.go +++ b/api/restHandler/TelemetryRestHandler.go @@ -18,6 +18,7 @@ package restHandler import ( + "github.com/devtron-labs/devtron/api/restHandler/common" "github.com/devtron-labs/devtron/client/telemetry" "go.uber.org/zap" "net/http" @@ -42,8 +43,8 @@ func (handler TelemetryRestHandlerImpl) GetTelemetryMetaInfo(w http.ResponseWrit res, err := handler.telemetryEventClient.GetTelemetryMetaInfo() if err != nil { handler.logger.Errorw("service err, GetTelemetryMetaInfo", "err", err) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, nil, res, http.StatusOK) + common.WriteJsonResp(w, nil, res, http.StatusOK) } diff --git a/api/restHandler/TestSuitRestHandler.go b/api/restHandler/TestSuitRestHandler.go index 1f5c454f45..c56681dbd7 100644 --- a/api/restHandler/TestSuitRestHandler.go +++ b/api/restHandler/TestSuitRestHandler.go @@ -20,6 +20,7 @@ package restHandler import ( "encoding/json" "fmt" + "github.com/devtron-labs/devtron/api/restHandler/common" "github.com/devtron-labs/devtron/client/events" "github.com/devtron-labs/devtron/client/grafana" "github.com/devtron-labs/devtron/pkg/user" @@ -76,7 +77,7 @@ func (impl TestSuitRestHandlerImpl) SuitesProxy(w http.ResponseWriter, r *http.R userId, err := impl.userService.GetLoggedInUser(r) impl.logger.Debugw("request for user", "userId", userId) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } decoder := json.NewDecoder(r.Body) @@ -84,7 +85,7 @@ func (impl TestSuitRestHandlerImpl) SuitesProxy(w http.ResponseWriter, r *http.R err = decoder.Decode(&bean) if err != nil { impl.logger.Errorw("decode err", "err", err) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } @@ -93,14 +94,14 @@ func (impl TestSuitRestHandlerImpl) SuitesProxy(w http.ResponseWriter, r *http.R if err != nil { impl.logger.Error(err) } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } func (impl TestSuitRestHandlerImpl) GetTestSuites(w http.ResponseWriter, r *http.Request) { userId, err := impl.userService.GetLoggedInUser(r) impl.logger.Debugw("request for user", "userId", userId) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } @@ -109,14 +110,14 @@ func (impl TestSuitRestHandlerImpl) GetTestSuites(w http.ResponseWriter, r *http if err != nil { impl.logger.Error(err) } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } func (impl TestSuitRestHandlerImpl) DetailedTestSuites(w http.ResponseWriter, r *http.Request) { userId, err := impl.userService.GetLoggedInUser(r) impl.logger.Debugw("request for user", "userId", userId) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } @@ -125,21 +126,21 @@ func (impl TestSuitRestHandlerImpl) DetailedTestSuites(w http.ResponseWriter, r if err != nil { impl.logger.Error(err) } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } func (impl TestSuitRestHandlerImpl) GetAllSuitByID(w http.ResponseWriter, r *http.Request) { userId, err := impl.userService.GetLoggedInUser(r) impl.logger.Debugw("request for user", "userId", userId) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } vars := mux.Vars(r) id, err := strconv.Atoi(vars["pipelineId"]) if err != nil { impl.logger.Error(err) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } link := fmt.Sprintf("%s/%s/%d", impl.config.TestSuitURL, "testsuite", id) @@ -147,14 +148,14 @@ func (impl TestSuitRestHandlerImpl) GetAllSuitByID(w http.ResponseWriter, r *htt if err != nil { impl.logger.Error(err) } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } func (impl TestSuitRestHandlerImpl) GetAllTestCases(w http.ResponseWriter, r *http.Request) { userId, err := impl.userService.GetLoggedInUser(r) impl.logger.Debugw("request for user", "userId", userId) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } @@ -163,21 +164,21 @@ func (impl TestSuitRestHandlerImpl) GetAllTestCases(w http.ResponseWriter, r *ht if err != nil { impl.logger.Error(err) } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } func (impl TestSuitRestHandlerImpl) GetTestCaseByID(w http.ResponseWriter, r *http.Request) { userId, err := impl.userService.GetLoggedInUser(r) impl.logger.Debugw("request for user", "userId", userId) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } vars := mux.Vars(r) id, err := strconv.Atoi(vars["pipelineId"]) if err != nil { impl.logger.Error(err) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } link := fmt.Sprintf("%s/%s/%d", impl.config.TestSuitURL, "testcase", id) @@ -185,21 +186,21 @@ func (impl TestSuitRestHandlerImpl) GetTestCaseByID(w http.ResponseWriter, r *ht if err != nil { impl.logger.Error(err) } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } func (impl TestSuitRestHandlerImpl) RedirectTriggerForApp(w http.ResponseWriter, r *http.Request) { userId, err := impl.userService.GetLoggedInUser(r) impl.logger.Debugw("request for user", "userId", userId) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } vars := mux.Vars(r) appId, err := strconv.Atoi(vars["pipelineId"]) if err != nil { impl.logger.Error(err) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } link := fmt.Sprintf("%s/%s/%d", impl.config.TestSuitURL, "triggers", appId) @@ -208,14 +209,14 @@ func (impl TestSuitRestHandlerImpl) RedirectTriggerForApp(w http.ResponseWriter, if err != nil { impl.logger.Error(err) } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } func (impl TestSuitRestHandlerImpl) RedirectTriggerForEnv(w http.ResponseWriter, r *http.Request) { userId, err := impl.userService.GetLoggedInUser(r) impl.logger.Debugw("request for user", "userId", userId) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } @@ -223,13 +224,13 @@ func (impl TestSuitRestHandlerImpl) RedirectTriggerForEnv(w http.ResponseWriter, appId, err := strconv.Atoi(vars["pipelineId"]) if err != nil { impl.logger.Error(err) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } envId, err := strconv.Atoi(vars["triggerId"]) if err != nil { impl.logger.Error(err) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } @@ -238,7 +239,7 @@ func (impl TestSuitRestHandlerImpl) RedirectTriggerForEnv(w http.ResponseWriter, if err != nil { impl.logger.Error(err) } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } func (impl TestSuitRestHandlerImpl) HttpGet(url string) (map[string]interface{}, error) { diff --git a/api/restHandler/UserAuthHandler.go b/api/restHandler/UserAuthHandler.go index c7a43e9f68..58d4e07a37 100644 --- a/api/restHandler/UserAuthHandler.go +++ b/api/restHandler/UserAuthHandler.go @@ -20,6 +20,7 @@ package restHandler import ( "encoding/json" "fmt" + "github.com/devtron-labs/devtron/api/restHandler/common" "net/http" "strings" @@ -76,25 +77,25 @@ func (handler UserAuthHandlerImpl) LoginHandler(w http.ResponseWriter, r *http.R err := decoder.Decode(up) if err != nil { handler.logger.Errorw("request err, LoginHandler", "err", err, "payload", up) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) } err = handler.validator.Struct(up) if err != nil { handler.logger.Errorw("validation err, LoginHandler", "err", err, "payload", up) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } token, err := handler.userAuthService.HandleLogin(up.Username, up.Password) if err != nil { - writeJsonResp(w, fmt.Errorf("invalid username or password"), nil, http.StatusForbidden) + common.WriteJsonResp(w, fmt.Errorf("invalid username or password"), nil, http.StatusForbidden) return } response := make(map[string]interface{}) response["token"] = token http.SetCookie(w, &http.Cookie{Name: "argocd.token", Value: token, Path: "/"}) - writeJsonResp(w, nil, response, http.StatusOK) + common.WriteJsonResp(w, nil, response, http.StatusOK) } func (handler UserAuthHandlerImpl) CallbackHandler(w http.ResponseWriter, r *http.Request) { @@ -169,7 +170,7 @@ func (handler UserAuthHandlerImpl) AddDefaultPolicyAndRoles(w http.ResponseWrite err := json.Unmarshal([]byte(adminPolicies), &policiesAdmin) if err != nil { handler.logger.Errorw("request err, AddDefaultPolicyAndRoles", "err", err, "payload", policiesAdmin) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } handler.logger.Debugw("request payload, AddDefaultPolicyAndRoles", "policiesAdmin", policiesAdmin) @@ -179,7 +180,7 @@ func (handler UserAuthHandlerImpl) AddDefaultPolicyAndRoles(w http.ResponseWrite err = json.Unmarshal([]byte(triggerPolicies), &policiesTrigger) if err != nil { handler.logger.Errorw("request err, AddDefaultPolicyAndRoles", "err", err, "payload", policiesTrigger) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } handler.logger.Debugw("request payload, AddDefaultPolicyAndRoles", "policiesTrigger", policiesTrigger) @@ -189,7 +190,7 @@ func (handler UserAuthHandlerImpl) AddDefaultPolicyAndRoles(w http.ResponseWrite err = json.Unmarshal([]byte(viewPolicies), &policiesView) if err != nil { handler.logger.Errorw("request err, AddDefaultPolicyAndRoles", "err", err, "payload", policiesView) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } handler.logger.Debugw("request payload, AddDefaultPolicyAndRoles", "policiesView", policiesView) @@ -215,13 +216,13 @@ func (handler UserAuthHandlerImpl) AddDefaultPolicyAndRoles(w http.ResponseWrite err = json.Unmarshal([]byte(roleAdmin), &roleAdminData) if err != nil { handler.logger.Errorw("request err, AddDefaultPolicyAndRoles", "err", err, "payload", roleAdminData) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } _, err = handler.userAuthService.CreateRole(&roleAdminData) if err != nil { handler.logger.Errorw("service err, AddDefaultPolicyAndRoles", "err", err, "payload", roleAdminData) - writeJsonResp(w, err, "Role Creation Failed", http.StatusInternalServerError) + common.WriteJsonResp(w, err, "Role Creation Failed", http.StatusInternalServerError) return } @@ -229,13 +230,13 @@ func (handler UserAuthHandlerImpl) AddDefaultPolicyAndRoles(w http.ResponseWrite err = json.Unmarshal([]byte(roleTrigger), &roleTriggerData) if err != nil { handler.logger.Errorw("request err, AddDefaultPolicyAndRoles", "err", err, "payload", roleTriggerData) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } _, err = handler.userAuthService.CreateRole(&roleTriggerData) if err != nil { handler.logger.Errorw("service err, AddDefaultPolicyAndRoles", "err", err, "payload", roleTriggerData) - writeJsonResp(w, err, "Role Creation Failed", http.StatusInternalServerError) + common.WriteJsonResp(w, err, "Role Creation Failed", http.StatusInternalServerError) return } @@ -243,13 +244,13 @@ func (handler UserAuthHandlerImpl) AddDefaultPolicyAndRoles(w http.ResponseWrite err = json.Unmarshal([]byte(roleView), &roleViewData) if err != nil { handler.logger.Errorw("request err, AddDefaultPolicyAndRoles", "err", err, "payload", roleViewData) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } _, err = handler.userAuthService.CreateRole(&roleViewData) if err != nil { handler.logger.Errorw("service err, AddDefaultPolicyAndRoles", "err", err, "payload", roleTriggerData) - writeJsonResp(w, err, "Role Creation Failed", http.StatusInternalServerError) + common.WriteJsonResp(w, err, "Role Creation Failed", http.StatusInternalServerError) return } @@ -259,8 +260,8 @@ func (handler UserAuthHandlerImpl) AuthVerification(w http.ResponseWriter, r *ht res, err := handler.userAuthService.AuthVerification(r) if err != nil { handler.logger.Errorw("service err, AuthVerification", "err", err) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, nil, res, http.StatusOK) + common.WriteJsonResp(w, nil, res, http.StatusOK) } diff --git a/api/restHandler/UserRestHandler.go b/api/restHandler/UserRestHandler.go index ee7496561d..77e9a593de 100644 --- a/api/restHandler/UserRestHandler.go +++ b/api/restHandler/UserRestHandler.go @@ -20,6 +20,7 @@ package restHandler import ( "encoding/json" "errors" + "github.com/devtron-labs/devtron/api/restHandler/common" "net/http" "strconv" "strings" @@ -78,14 +79,14 @@ func (handler UserRestHandlerImpl) CreateUser(w http.ResponseWriter, r *http.Req decoder := json.NewDecoder(r.Body) userId, err := handler.userService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } var userInfo bean.UserInfo err = decoder.Decode(&userInfo) if err != nil { handler.logger.Errorw("request err, CreateUser", "err", err, "payload", userInfo) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } userInfo.UserId = userId @@ -114,7 +115,7 @@ func (handler UserRestHandlerImpl) CreateUser(w http.ResponseWriter, r *http.Req groupRoles, err := handler.roleGroupService.FetchRolesForGroups(userInfo.Groups) if err != nil && err != pg.ErrNoRows { handler.logger.Errorw("service err, UpdateUser", "err", err, "payload", userInfo) - writeJsonResp(w, err, "", http.StatusInternalServerError) + common.WriteJsonResp(w, err, "", http.StatusInternalServerError) return } @@ -140,7 +141,7 @@ func (handler UserRestHandlerImpl) CreateUser(w http.ResponseWriter, r *http.Req err = handler.validator.Struct(userInfo) if err != nil { handler.logger.Errorw("validation err, CreateUser", "err", err, "payload", userInfo) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } @@ -148,29 +149,29 @@ func (handler UserRestHandlerImpl) CreateUser(w http.ResponseWriter, r *http.Req if err != nil { handler.logger.Errorw("service err, CreateUser", "err", err, "payload", userInfo) if _, ok := err.(*util.ApiError); ok { - writeJsonResp(w, err, "User Creation Failed", http.StatusOK) + common.WriteJsonResp(w, err, "User Creation Failed", http.StatusOK) } else { handler.logger.Errorw("error on creating new user", "err", err) - writeJsonResp(w, err, "", http.StatusInternalServerError) + common.WriteJsonResp(w, err, "", http.StatusInternalServerError) } return } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } func (handler UserRestHandlerImpl) UpdateUser(w http.ResponseWriter, r *http.Request) { decoder := json.NewDecoder(r.Body) userId, err := handler.userService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } var userInfo bean.UserInfo err = decoder.Decode(&userInfo) if err != nil { handler.logger.Errorw("request err, UpdateUser", "err", err, "payload", userInfo) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } userInfo.UserId = userId @@ -182,14 +183,14 @@ func (handler UserRestHandlerImpl) UpdateUser(w http.ResponseWriter, r *http.Req for _, filter := range userInfo.RoleFilters { if len(filter.Team) > 0 { if ok := handler.enforcer.Enforce(token, rbac.ResourceUser, rbac.ActionUpdate, strings.ToLower(filter.Team)); !ok { - writeJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) + common.WriteJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) return } } } } else { if ok := handler.enforcer.Enforce(token, rbac.ResourceUser, rbac.ActionUpdate, "*"); !ok { - writeJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) + common.WriteJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) return } } @@ -199,7 +200,7 @@ func (handler UserRestHandlerImpl) UpdateUser(w http.ResponseWriter, r *http.Req groupRoles, err := handler.roleGroupService.FetchRolesForGroups(userInfo.Groups) if err != nil && err != pg.ErrNoRows { handler.logger.Errorw("service err, UpdateUser", "err", err, "payload", userInfo) - writeJsonResp(w, err, "", http.StatusInternalServerError) + common.WriteJsonResp(w, err, "", http.StatusInternalServerError) return } @@ -227,7 +228,7 @@ func (handler UserRestHandlerImpl) UpdateUser(w http.ResponseWriter, r *http.Req err = handler.validator.Struct(userInfo) if err != nil { handler.logger.Errorw("validation err, UpdateUser", "err", err, "payload", userInfo) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } @@ -237,16 +238,16 @@ func (handler UserRestHandlerImpl) UpdateUser(w http.ResponseWriter, r *http.Req res, err := handler.userService.UpdateUser(&userInfo) if err != nil { handler.logger.Errorw("service err, UpdateUser", "err", err, "payload", userInfo) - writeJsonResp(w, err, "", http.StatusInternalServerError) + common.WriteJsonResp(w, err, "", http.StatusInternalServerError) return } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } func (handler UserRestHandlerImpl) GetById(w http.ResponseWriter, r *http.Request) { userId, err := handler.userService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } vars := mux.Vars(r) @@ -254,13 +255,13 @@ func (handler UserRestHandlerImpl) GetById(w http.ResponseWriter, r *http.Reques id, err := strconv.Atoi(vars["id"]) if err != nil { handler.logger.Errorw("request err, GetById", "err", err, "id", id) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } res, err := handler.userService.GetById(int32(id)) if err != nil { handler.logger.Errorw("service err, GetById", "err", err, "id", id) - writeJsonResp(w, err, "Failed to get by id", http.StatusInternalServerError) + common.WriteJsonResp(w, err, "Failed to get by id", http.StatusInternalServerError) return } @@ -288,30 +289,30 @@ func (handler UserRestHandlerImpl) GetById(w http.ResponseWriter, r *http.Reques authPass = true } if authPass == false { - writeJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) + common.WriteJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) return } } //RBAC enforcer Ends - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } func (handler UserRestHandlerImpl) GetAll(w http.ResponseWriter, r *http.Request) { res, err := handler.userService.GetAll() if err != nil { handler.logger.Errorw("service err, GetAll", "err", err) - writeJsonResp(w, err, "Failed to Get", http.StatusInternalServerError) + common.WriteJsonResp(w, err, "Failed to Get", http.StatusInternalServerError) return } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } func (handler UserRestHandlerImpl) DeleteUser(w http.ResponseWriter, r *http.Request) { userId, err := handler.userService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } vars := mux.Vars(r) @@ -319,13 +320,13 @@ func (handler UserRestHandlerImpl) DeleteUser(w http.ResponseWriter, r *http.Req id, err := strconv.Atoi(vars["id"]) if err != nil { handler.logger.Errorw("request err, DeleteUser", "err", err, "id", id) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } handler.logger.Infow("request payload, DeleteUser", "err", err, "id", id) user, err := handler.userService.GetById(int32(id)) if err != nil { - writeJsonResp(w, err, "", http.StatusInternalServerError) + common.WriteJsonResp(w, err, "", http.StatusInternalServerError) return } @@ -335,14 +336,14 @@ func (handler UserRestHandlerImpl) DeleteUser(w http.ResponseWriter, r *http.Req for _, filter := range user.RoleFilters { if len(filter.Team) > 0 { if ok := handler.enforcer.Enforce(token, rbac.ResourceUser, rbac.ActionDelete, strings.ToLower(filter.Team)); !ok { - writeJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) + common.WriteJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) return } } } } else { if ok := handler.enforcer.Enforce(token, rbac.ResourceUser, rbac.ActionDelete, ""); !ok { - writeJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) + common.WriteJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) return } } @@ -351,11 +352,11 @@ func (handler UserRestHandlerImpl) DeleteUser(w http.ResponseWriter, r *http.Req res, err := handler.userService.DeleteUser(user) if err != nil { handler.logger.Errorw("service err, DeleteUser", "err", err, "id", id) - writeJsonResp(w, err, "", http.StatusInternalServerError) + common.WriteJsonResp(w, err, "", http.StatusInternalServerError) return } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } func (handler UserRestHandlerImpl) FetchRoleGroupById(w http.ResponseWriter, r *http.Request) { @@ -364,13 +365,13 @@ func (handler UserRestHandlerImpl) FetchRoleGroupById(w http.ResponseWriter, r * id, err := strconv.Atoi(vars["id"]) if err != nil { handler.logger.Errorw("request err, FetchRoleGroupById", "err", err, "id", id) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } res, err := handler.roleGroupService.FetchRoleGroupsById(int32(id)) if err != nil { handler.logger.Errorw("service err, FetchRoleGroupById", "err", err, "id", id) - writeJsonResp(w, err, "Failed to get by id", http.StatusInternalServerError) + common.WriteJsonResp(w, err, "Failed to get by id", http.StatusInternalServerError) return } @@ -381,7 +382,7 @@ func (handler UserRestHandlerImpl) FetchRoleGroupById(w http.ResponseWriter, r * for _, filter := range res.RoleFilters { if len(filter.Team) > 0 { if ok := handler.enforcer.Enforce(token, rbac.ResourceUser, rbac.ActionGet, strings.ToLower(filter.Team)); !ok { - writeJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) + common.WriteJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) return } } @@ -389,21 +390,21 @@ func (handler UserRestHandlerImpl) FetchRoleGroupById(w http.ResponseWriter, r * } //RBAC enforcer Ends - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } func (handler UserRestHandlerImpl) CreateRoleGroup(w http.ResponseWriter, r *http.Request) { decoder := json.NewDecoder(r.Body) userId, err := handler.userService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } var request bean.RoleGroup err = decoder.Decode(&request) if err != nil { handler.logger.Errorw("request err, CreateRoleGroup", "err", err, "payload", request) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } request.UserId = userId @@ -415,14 +416,14 @@ func (handler UserRestHandlerImpl) CreateRoleGroup(w http.ResponseWriter, r *htt for _, filter := range request.RoleFilters { if len(filter.Team) > 0 { if ok := handler.enforcer.Enforce(token, rbac.ResourceUser, rbac.ActionCreate, strings.ToLower(filter.Team)); !ok { - writeJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) + common.WriteJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) return } } } } else { if ok := handler.enforcer.Enforce(token, rbac.ResourceUser, rbac.ActionCreate, "*"); !ok { - writeJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) + common.WriteJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) return } } @@ -430,7 +431,7 @@ func (handler UserRestHandlerImpl) CreateRoleGroup(w http.ResponseWriter, r *htt err = handler.validator.Struct(request) if err != nil { handler.logger.Errorw("validation err, CreateRoleGroup", "err", err, "payload", request) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } @@ -438,28 +439,28 @@ func (handler UserRestHandlerImpl) CreateRoleGroup(w http.ResponseWriter, r *htt if err != nil { handler.logger.Errorw("service err, CreateRoleGroup", "err", err, "payload", request) if _, ok := err.(*util.ApiError); ok { - writeJsonResp(w, err, nil, http.StatusOK) + common.WriteJsonResp(w, err, nil, http.StatusOK) } else { - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) } return } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } func (handler UserRestHandlerImpl) UpdateRoleGroup(w http.ResponseWriter, r *http.Request) { decoder := json.NewDecoder(r.Body) userId, err := handler.userService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } var request bean.RoleGroup err = decoder.Decode(&request) if err != nil { handler.logger.Errorw("request err, UpdateRoleGroup", "err", err, "payload", request) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } request.UserId = userId @@ -470,14 +471,14 @@ func (handler UserRestHandlerImpl) UpdateRoleGroup(w http.ResponseWriter, r *htt for _, filter := range request.RoleFilters { if len(filter.Team) > 0 { if ok := handler.enforcer.Enforce(token, rbac.ResourceUser, rbac.ActionUpdate, strings.ToLower(filter.Team)); !ok { - writeJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) + common.WriteJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) return } } } } else { if ok := handler.enforcer.Enforce(token, rbac.ResourceUser, rbac.ActionUpdate, "*"); !ok { - writeJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) + common.WriteJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) return } } @@ -486,39 +487,39 @@ func (handler UserRestHandlerImpl) UpdateRoleGroup(w http.ResponseWriter, r *htt err = handler.validator.Struct(request) if err != nil { handler.logger.Errorw("validation err, UpdateRoleGroup", "err", err, "payload", request) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } res, err := handler.roleGroupService.UpdateRoleGroup(&request) if err != nil { handler.logger.Errorw("service err, UpdateRoleGroup", "err", err, "payload", request) - writeJsonResp(w, err, "", http.StatusInternalServerError) + common.WriteJsonResp(w, err, "", http.StatusInternalServerError) return } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } func (handler UserRestHandlerImpl) FetchRoleGroups(w http.ResponseWriter, r *http.Request) { userId, err := handler.userService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } res, err := handler.roleGroupService.FetchRoleGroups() if err != nil { handler.logger.Errorw("service err, FetchRoleGroups", "err", err) - writeJsonResp(w, err, "", http.StatusInternalServerError) + common.WriteJsonResp(w, err, "", http.StatusInternalServerError) return } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } func (handler UserRestHandlerImpl) FetchRoleGroupsByName(w http.ResponseWriter, r *http.Request) { userId, err := handler.userService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } vars := mux.Vars(r) @@ -526,17 +527,17 @@ func (handler UserRestHandlerImpl) FetchRoleGroupsByName(w http.ResponseWriter, res, err := handler.roleGroupService.FetchRoleGroupsByName(userGroupName) if err != nil { handler.logger.Errorw("service err, FetchRoleGroupsByName", "err", err, "userGroupName", userGroupName) - writeJsonResp(w, err, "", http.StatusInternalServerError) + common.WriteJsonResp(w, err, "", http.StatusInternalServerError) return } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } func (handler UserRestHandlerImpl) DeleteRoleGroup(w http.ResponseWriter, r *http.Request) { userId, err := handler.userService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } vars := mux.Vars(r) @@ -544,14 +545,14 @@ func (handler UserRestHandlerImpl) DeleteRoleGroup(w http.ResponseWriter, r *htt id, err := strconv.Atoi(vars["id"]) if err != nil { handler.logger.Errorw("request err, DeleteRoleGroup", "err", err, "id", id) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } handler.logger.Infow("request payload, DeleteRoleGroup", "id", id) userGroup, err := handler.roleGroupService.FetchRoleGroupsById(int32(id)) if err != nil { handler.logger.Errorw("service err, DeleteRoleGroup", "err", err, "id", id) - writeJsonResp(w, err, "", http.StatusInternalServerError) + common.WriteJsonResp(w, err, "", http.StatusInternalServerError) return } @@ -560,7 +561,7 @@ func (handler UserRestHandlerImpl) DeleteRoleGroup(w http.ResponseWriter, r *htt for _, filter := range userGroup.RoleFilters { if len(filter.Team) > 0 { if ok := handler.enforcer.Enforce(token, rbac.ResourceUser, rbac.ActionDelete, strings.ToLower(filter.Team)); !ok { - writeJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) + common.WriteJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden) return } } @@ -571,23 +572,23 @@ func (handler UserRestHandlerImpl) DeleteRoleGroup(w http.ResponseWriter, r *htt res, err := handler.roleGroupService.DeleteRoleGroup(userGroup) if err != nil { handler.logger.Errorw("service err, DeleteRoleGroup", "err", err, "id", id) - writeJsonResp(w, err, "", http.StatusInternalServerError) + common.WriteJsonResp(w, err, "", http.StatusInternalServerError) return } - writeJsonResp(w, err, res, http.StatusOK) + common.WriteJsonResp(w, err, res, http.StatusOK) } func (handler UserRestHandlerImpl) CheckUserRoles(w http.ResponseWriter, r *http.Request) { userId, err := handler.userService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } roles, err := handler.userService.CheckUserRoles(userId) if err != nil { handler.logger.Errorw("service err, CheckUserRoles", "err", err, "userId", userId) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } result := make(map[string]interface{}) @@ -598,30 +599,30 @@ func (handler UserRestHandlerImpl) CheckUserRoles(w http.ResponseWriter, r *http result["superAdmin"] = true } } - writeJsonResp(w, err, result, http.StatusOK) + common.WriteJsonResp(w, err, result, http.StatusOK) } func (handler UserRestHandlerImpl) SyncOrchestratorToCasbin(w http.ResponseWriter, r *http.Request) { userId, err := handler.userService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } user, err := handler.userService.GetById(userId) if err != nil { handler.logger.Errorw("service err, SyncOrchestratorToCasbin", "err", err, "userId", userId) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } if user.EmailId != "admin" { - writeJsonResp(w, err, nil, http.StatusUnauthorized) + common.WriteJsonResp(w, err, nil, http.StatusUnauthorized) return } flag, err := handler.userService.SyncOrchestratorToCasbin() if err != nil { handler.logger.Errorw("service err, SyncOrchestratorToCasbin", "err", err) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, err, flag, http.StatusOK) + common.WriteJsonResp(w, err, flag, http.StatusOK) } diff --git a/api/restHandler/WebhookDataRestHandler.go b/api/restHandler/WebhookDataRestHandler.go index a8db0e0c8e..eedcc089d1 100644 --- a/api/restHandler/WebhookDataRestHandler.go +++ b/api/restHandler/WebhookDataRestHandler.go @@ -18,6 +18,7 @@ package restHandler import ( + "github.com/devtron-labs/devtron/api/restHandler/common" "github.com/devtron-labs/devtron/client/gitSensor" "github.com/devtron-labs/devtron/internal/sql/repository/pipelineConfig" "github.com/devtron-labs/devtron/pkg/pipeline" @@ -62,7 +63,7 @@ func (impl WebhookDataRestHandlerImpl) GetWebhookPayloadDataForPipelineMaterialI userId, err := impl.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } @@ -70,7 +71,7 @@ func (impl WebhookDataRestHandlerImpl) GetWebhookPayloadDataForPipelineMaterialI pipelineMaterialId, err := strconv.Atoi(vars["pipelineMaterialId"]) if err != nil { impl.logger.Error("can not get pipelineMaterialId from request") - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } @@ -79,7 +80,7 @@ func (impl WebhookDataRestHandlerImpl) GetWebhookPayloadDataForPipelineMaterialI ciPipelineMaterial, err := impl.ciPipelineMaterialRepository.GetById(pipelineMaterialId) if err != nil { impl.logger.Errorw("Error in fetching ciPipelineMaterial", "err", err, "pipelineMaterialId", pipelineMaterialId) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } @@ -87,7 +88,7 @@ func (impl WebhookDataRestHandlerImpl) GetWebhookPayloadDataForPipelineMaterialI token := r.Header.Get("token") object := impl.enforcerUtil.GetAppRBACNameByAppId(ciPipelineMaterial.CiPipeline.AppId) if ok := impl.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); !ok { - writeJsonResp(w, err, "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden) return } //RBAC @@ -96,14 +97,14 @@ func (impl WebhookDataRestHandlerImpl) GetWebhookPayloadDataForPipelineMaterialI limit, err := strconv.Atoi(v.Get("limit")) if err != nil { impl.logger.Error("can not get limit from request") - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } offset, err := strconv.Atoi(v.Get("offset")) if err != nil { impl.logger.Error("can not get offset from request") - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } @@ -119,11 +120,11 @@ func (impl WebhookDataRestHandlerImpl) GetWebhookPayloadDataForPipelineMaterialI response, err := impl.gitSensorClient.GetWebhookPayloadDataForPipelineMaterialId(webhookPayloadDataRequest) if err != nil { impl.logger.Errorw("service err, GetWebhookPayloadDataForPipelineMaterialId", "err", err) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } - writeJsonResp(w, nil, response, http.StatusOK) + common.WriteJsonResp(w, nil, response, http.StatusOK) } @@ -131,7 +132,7 @@ func (impl WebhookDataRestHandlerImpl) GetWebhookPayloadFilterDataForPipelineMat userId, err := impl.userAuthService.GetLoggedInUser(r) if userId == 0 || err != nil { - writeJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) return } @@ -139,7 +140,7 @@ func (impl WebhookDataRestHandlerImpl) GetWebhookPayloadFilterDataForPipelineMat pipelineMaterialId, err := strconv.Atoi(vars["pipelineMaterialId"]) if err != nil { impl.logger.Error("can not get pipelineMaterialId from request") - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } @@ -148,7 +149,7 @@ func (impl WebhookDataRestHandlerImpl) GetWebhookPayloadFilterDataForPipelineMat ciPipelineMaterial, err := impl.ciPipelineMaterialRepository.GetById(pipelineMaterialId) if err != nil { impl.logger.Errorw("Error in fetching ciPipelineMaterial", "err", err, "pipelineMaterialId", pipelineMaterialId) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } @@ -156,7 +157,7 @@ func (impl WebhookDataRestHandlerImpl) GetWebhookPayloadFilterDataForPipelineMat token := r.Header.Get("token") object := impl.enforcerUtil.GetAppRBACNameByAppId(ciPipelineMaterial.CiPipeline.AppId) if ok := impl.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); !ok { - writeJsonResp(w, err, "Unauthorized User", http.StatusForbidden) + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden) return } //RBAC @@ -164,7 +165,7 @@ func (impl WebhookDataRestHandlerImpl) GetWebhookPayloadFilterDataForPipelineMat parsedDataId, err := strconv.Atoi(vars["parsedDataId"]) if err != nil { impl.logger.Error("can not get parsedDataId from request") - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } @@ -176,7 +177,7 @@ func (impl WebhookDataRestHandlerImpl) GetWebhookPayloadFilterDataForPipelineMat response, err := impl.gitSensorClient.GetWebhookPayloadFilterDataForPipelineMaterialId(webhookPayloadFilterDataRequest) if err != nil { impl.logger.Errorw("service err, GetWebhookPayloadFilterDataForPipelineMaterialId", "err", err) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } @@ -185,7 +186,7 @@ func (impl WebhookDataRestHandlerImpl) GetWebhookPayloadFilterDataForPipelineMat webhookEventData, err := impl.webhookEventDataConfig.GetById(response.PayloadId) if err != nil { impl.logger.Errorw("error in getting webhook payload data", "err", err) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } @@ -194,6 +195,6 @@ func (impl WebhookDataRestHandlerImpl) GetWebhookPayloadFilterDataForPipelineMat } } - writeJsonResp(w, nil, response, http.StatusOK) + common.WriteJsonResp(w, nil, response, http.StatusOK) } diff --git a/api/restHandler/WebhookEventHandler.go b/api/restHandler/WebhookEventHandler.go index e1bb1ca0c5..b0db62c37c 100644 --- a/api/restHandler/WebhookEventHandler.go +++ b/api/restHandler/WebhookEventHandler.go @@ -18,6 +18,7 @@ package restHandler import ( + "github.com/devtron-labs/devtron/api/restHandler/common" client "github.com/devtron-labs/devtron/client/events" "github.com/devtron-labs/devtron/client/pubsub" "github.com/devtron-labs/devtron/pkg/git" @@ -61,7 +62,7 @@ func (impl WebhookEventHandlerImpl) OnWebhookEvent(w http.ResponseWriter, r *htt secretFromRequest := vars["secret"] if err != nil { impl.logger.Errorw("Error in getting git host Id from request", "err", err) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } @@ -72,7 +73,7 @@ func (impl WebhookEventHandlerImpl) OnWebhookEvent(w http.ResponseWriter, r *htt gitHost, err := impl.gitHostConfig.GetById(gitHostId) if err != nil { impl.logger.Errorw("Error in getting git host from DB", "err", err, "gitHostId", gitHostId) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } @@ -80,7 +81,7 @@ func (impl WebhookEventHandlerImpl) OnWebhookEvent(w http.ResponseWriter, r *htt requestBodyBytes, err := ioutil.ReadAll(r.Body) if err != nil { impl.logger.Errorw("Cannot read the request body:", "err", err) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } @@ -88,7 +89,7 @@ func (impl WebhookEventHandlerImpl) OnWebhookEvent(w http.ResponseWriter, r *htt impl.logger.Debug("Secret validation result ", isValidSig) if !isValidSig { impl.logger.Error("Signature mismatch") - writeJsonResp(w, err, nil, http.StatusUnauthorized) + common.WriteJsonResp(w, err, nil, http.StatusUnauthorized) return } @@ -97,7 +98,7 @@ func (impl WebhookEventHandlerImpl) OnWebhookEvent(w http.ResponseWriter, r *htt impl.logger.Debugw("eventType : ", eventType) if len(eventType) == 0 { impl.logger.Errorw("Event type not known ", eventType) - writeJsonResp(w, err, nil, http.StatusBadRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } @@ -112,7 +113,7 @@ func (impl WebhookEventHandlerImpl) OnWebhookEvent(w http.ResponseWriter, r *htt err = impl.webhookEventDataConfig.Save(webhookEvent) if err != nil { impl.logger.Errorw("Error while saving webhook data", "err", err) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) return } @@ -120,6 +121,6 @@ func (impl WebhookEventHandlerImpl) OnWebhookEvent(w http.ResponseWriter, r *htt err = impl.eventClient.WriteNatsEvent(pubsub.WEBHOOK_EVENT_TOPIC, webhookEvent) if err != nil { impl.logger.Errorw("Error while handling webhook in git-sensor", "err", err) - writeJsonResp(w, err, nil, http.StatusInternalServerError) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) } } diff --git a/api/restHandler/apiError.go b/api/restHandler/common/apiError.go similarity index 98% rename from api/restHandler/apiError.go rename to api/restHandler/common/apiError.go index 66441e7f20..2bf6b3e1a6 100644 --- a/api/restHandler/apiError.go +++ b/api/restHandler/common/apiError.go @@ -15,7 +15,7 @@ * */ -package restHandler +package common import ( "encoding/json" @@ -28,7 +28,7 @@ import ( //use of writeJsonRespStructured is preferable. it api exists due to historical reason // err.message is used as internal message for ApiError object in resp -func writeJsonResp(w http.ResponseWriter, err error, respBody interface{}, status int) { +func WriteJsonResp(w http.ResponseWriter, err error, respBody interface{}, status int) { response := Response{} if err == nil { response.Result = respBody diff --git a/api/restHandler/pipeline/BuildPipelineRestHandler.go b/api/restHandler/pipeline/BuildPipelineRestHandler.go new file mode 100644 index 0000000000..826e4f9250 --- /dev/null +++ b/api/restHandler/pipeline/BuildPipelineRestHandler.go @@ -0,0 +1,800 @@ +package pipeline + +import ( + "context" + "encoding/json" + "errors" + "fmt" + "github.com/argoproj/argo/pkg/apis/workflow/v1alpha1" + "github.com/devtron-labs/devtron/api/restHandler/common" + "github.com/devtron-labs/devtron/internal/sql/repository/pipelineConfig" + "github.com/devtron-labs/devtron/internal/util" + "github.com/devtron-labs/devtron/pkg/bean" + "github.com/devtron-labs/devtron/util/rbac" + "github.com/gorilla/mux" + "io" + "net/http" + "strconv" +) + +type DevtronAppBuildRestHandler interface { + CreateCiConfig(w http.ResponseWriter, r *http.Request) + UpdateCiTemplate(w http.ResponseWriter, r *http.Request) + + GetCiPipeline(w http.ResponseWriter, r *http.Request) + PatchCiPipelines(w http.ResponseWriter, r *http.Request) + TriggerCiPipeline(w http.ResponseWriter, r *http.Request) + GetCiPipelineMin(w http.ResponseWriter, r *http.Request) + GetCIPipelineById(w http.ResponseWriter, r *http.Request) + HandleWorkflowWebhook(w http.ResponseWriter, r *http.Request) + GetBuildLogs(w http.ResponseWriter, r *http.Request) + // CancelWorkflow CancelBuild + CancelWorkflow(w http.ResponseWriter, r *http.Request) +} + +type DevtronAppBuildMaterialRestHandler interface { + CreateMaterial(w http.ResponseWriter, r *http.Request) + UpdateMaterial(w http.ResponseWriter, r *http.Request) + FetchMaterials(w http.ResponseWriter, r *http.Request) + RefreshMaterials(w http.ResponseWriter, r *http.Request) + FetchMaterialInfo(w http.ResponseWriter, r *http.Request) + FetchChanges(w http.ResponseWriter, r *http.Request) +} + +type DevtronAppBuildHistoryRestHandler interface { + GetHistoricBuildLogs(w http.ResponseWriter, r *http.Request) + GetBuildHistory(w http.ResponseWriter, r *http.Request) + DownloadCiWorkflowArtifacts(w http.ResponseWriter, r *http.Request) +} + +func (handler PipelineConfigRestHandlerImpl) CreateCiConfig(w http.ResponseWriter, r *http.Request) { + decoder := json.NewDecoder(r.Body) + userId, err := handler.userAuthService.GetLoggedInUser(r) + if userId == 0 || err != nil { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + return + } + var createRequest bean.CiConfigRequest + err = decoder.Decode(&createRequest) + createRequest.UserId = userId + if err != nil { + handler.Logger.Errorw("request err, create ci config", "err", err, "create request", createRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + handler.Logger.Infow("request payload, create ci config", "create request", createRequest) + err = handler.validator.Struct(createRequest) + if err != nil { + handler.Logger.Errorw("validation err, create ci config", "err", err, "create request", createRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + token := r.Header.Get("token") + app, err := handler.pipelineBuilder.GetApp(createRequest.AppId) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + resourceName := handler.enforcerUtil.GetAppRBACName(app.AppName) + if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionCreate, resourceName); !ok { + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + return + } + createResp, err := handler.pipelineBuilder.CreateCiPipeline(&createRequest) + if err != nil { + handler.Logger.Errorw("service err, create", "err", err, "create request", createRequest) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + common.WriteJsonResp(w, err, createResp, http.StatusOK) +} + +func (handler PipelineConfigRestHandlerImpl) UpdateCiTemplate(w http.ResponseWriter, r *http.Request) { + decoder := json.NewDecoder(r.Body) + userId, err := handler.userAuthService.GetLoggedInUser(r) + if userId == 0 || err != nil { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + return + } + var configRequest bean.CiConfigRequest + err = decoder.Decode(&configRequest) + configRequest.UserId = userId + if err != nil { + handler.Logger.Errorw("request err, UpdateCiTemplate", "err", err, "UpdateCiTemplate", configRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + handler.Logger.Infow("request payload, update ci template", "UpdateCiTemplate", configRequest) + err = handler.validator.Struct(configRequest) + if err != nil { + handler.Logger.Errorw("validation err, UpdateCiTemplate", "err", err, "UpdateCiTemplate", configRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + token := r.Header.Get("token") + app, err := handler.pipelineBuilder.GetApp(configRequest.AppId) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + resourceName := handler.enforcerUtil.GetAppRBACName(app.AppName) + if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionCreate, resourceName); !ok { + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + return + } + createResp, err := handler.pipelineBuilder.UpdateCiTemplate(&configRequest) + if err != nil { + handler.Logger.Errorw("service err, UpdateCiTemplate", "err", err, "UpdateCiTemplate", configRequest) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + common.WriteJsonResp(w, err, createResp, http.StatusOK) +} + +func (handler PipelineConfigRestHandlerImpl) PatchCiPipelines(w http.ResponseWriter, r *http.Request) { + decoder := json.NewDecoder(r.Body) + userId, err := handler.userAuthService.GetLoggedInUser(r) + if userId == 0 || err != nil { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + return + } + var patchRequest bean.CiPatchRequest + err = decoder.Decode(&patchRequest) + patchRequest.UserId = userId + if err != nil { + handler.Logger.Errorw("request err, PatchCiPipelines", "err", err, "PatchCiPipelines", patchRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + handler.Logger.Infow("request payload, PatchCiPipelines", "PatchCiPipelines", patchRequest) + err = handler.validator.Struct(patchRequest) + if err != nil { + handler.Logger.Errorw("validation err", "err", err) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + handler.Logger.Debugw("update request ", "req", patchRequest) + token := r.Header.Get("token") + app, err := handler.pipelineBuilder.GetApp(patchRequest.AppId) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + resourceName := handler.enforcerUtil.GetAppRBACName(app.AppName) + if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionCreate, resourceName); !ok { + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + return + } + createResp, err := handler.pipelineBuilder.PatchCiPipeline(&patchRequest) + if err != nil { + handler.Logger.Errorw("service err, PatchCiPipelines", "err", err, "PatchCiPipelines", patchRequest) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + common.WriteJsonResp(w, err, createResp, http.StatusOK) +} + +func (handler PipelineConfigRestHandlerImpl) GetCiPipeline(w http.ResponseWriter, r *http.Request) { + vars := mux.Vars(r) + appId, err := strconv.Atoi(vars["appId"]) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + token := r.Header.Get("token") + app, err := handler.pipelineBuilder.GetApp(appId) + if err != nil { + handler.Logger.Errorw("service err, GetCiPipeline", "err", err, "appId", appId) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + resourceName := handler.enforcerUtil.GetAppRBACName(app.AppName) + if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, resourceName); !ok { + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + return + } + ciConf, err := handler.pipelineBuilder.GetCiPipeline(appId) + if err != nil { + handler.Logger.Errorw("service err, GetCiPipeline", "err", err, "appId", appId) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + if ciConf == nil || ciConf.Id == 0 { + err = &util.ApiError{Code: "404", HttpStatusCode: 200, UserMessage: "no data found"} + } + common.WriteJsonResp(w, err, ciConf, http.StatusOK) +} + +func (handler PipelineConfigRestHandlerImpl) TriggerCiPipeline(w http.ResponseWriter, r *http.Request) { + userId, err := handler.userAuthService.GetLoggedInUser(r) + if userId == 0 || err != nil { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + return + } + decoder := json.NewDecoder(r.Body) + var ciTriggerRequest bean.CiTriggerRequest + err = decoder.Decode(&ciTriggerRequest) + if err != nil { + handler.Logger.Errorw("request err, TriggerCiPipeline", "err", err, "payload", ciTriggerRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + if !handler.validForMultiMaterial(ciTriggerRequest) { + handler.Logger.Errorw("invalid req, commit hash not present for multi-git", "payload", ciTriggerRequest) + common.WriteJsonResp(w, errors.New("invalid req, commit hash not present for multi-git"), + nil, http.StatusBadRequest) + } + ciTriggerRequest.TriggeredBy = userId + handler.Logger.Infow("request payload, TriggerCiPipeline", "payload", ciTriggerRequest) + + //RBAC CHECK CD PIPELINE - FOR USER + pipelines, err := handler.pipelineRepository.FindAutomaticByCiPipelineId(ciTriggerRequest.PipelineId) + var authorizedPipelines []pipelineConfig.Pipeline + var unauthorizedPipelines []pipelineConfig.Pipeline + //fetching user only for getting token + triggeredBy, err := handler.userAuthService.GetById(ciTriggerRequest.TriggeredBy) + if err != nil { + handler.Logger.Errorw("service err, TriggerCiPipeline", "err", err, "payload", ciTriggerRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + token := triggeredBy.AccessToken + for _, p := range pipelines { + pass := 0 + object := handler.enforcerUtil.GetAppRBACNameByAppId(p.AppId) + if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionTrigger, object); !ok { + handler.Logger.Debug(fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + } else { + pass = 1 + } + object = handler.enforcerUtil.GetAppRBACByAppIdAndPipelineId(p.AppId, p.Id) + if ok := handler.enforcer.Enforce(token, rbac.ResourceEnvironment, rbac.ActionTrigger, object); !ok { + handler.Logger.Debug(fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + } else { + pass = 2 + } + if pass == 2 { + authorizedPipelines = append(authorizedPipelines, *p) + } else { + unauthorizedPipelines = append(unauthorizedPipelines, *p) + } + } + resMessage := "allowed for all pipelines" + response := make(map[string]string) + if len(unauthorizedPipelines) > 0 { + resMessage = "not authorized for few pipelines, will not effected" + } + //RBAC CHECK CD PIPELINE - FOR USER + + resp, err := handler.ciHandler.HandleCIManual(ciTriggerRequest) + if err != nil { + handler.Logger.Errorw("service err, TriggerCiPipeline", "err", err, "payload", ciTriggerRequest) + common.WriteJsonResp(w, err, response, http.StatusInternalServerError) + } + response["apiResponse"] = strconv.Itoa(resp) + response["authStatus"] = resMessage + + common.WriteJsonResp(w, err, response, http.StatusOK) +} + +func (handler PipelineConfigRestHandlerImpl) FetchMaterials(w http.ResponseWriter, r *http.Request) { + userId, err := handler.userAuthService.GetLoggedInUser(r) + if userId == 0 || err != nil { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + return + } + vars := mux.Vars(r) + pipelineId, err := strconv.Atoi(vars["pipelineId"]) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + handler.Logger.Infow("request payload, FetchMaterials", "pipelineId", pipelineId) + ciPipeline, err := handler.ciPipelineRepository.FindById(pipelineId) + if err != nil { + handler.Logger.Errorw("service err, UpdateCiTemplate", "err", err, "pipelineId", pipelineId) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + //RBAC + token := r.Header.Get("token") + object := handler.enforcerUtil.GetAppRBACNameByAppId(ciPipeline.AppId) + if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); !ok { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden) + return + } + //RBAC + resp, err := handler.ciHandler.FetchMaterialsByPipelineId(pipelineId) + if err != nil { + handler.Logger.Errorw("service err, FetchMaterials", "err", err, "pipelineId", pipelineId) + common.WriteJsonResp(w, err, resp, http.StatusInternalServerError) + return + } + common.WriteJsonResp(w, err, resp, http.StatusOK) +} + +func (handler PipelineConfigRestHandlerImpl) RefreshMaterials(w http.ResponseWriter, r *http.Request) { + userId, err := handler.userAuthService.GetLoggedInUser(r) + if userId == 0 || err != nil { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + return + } + vars := mux.Vars(r) + gitMaterialId, err := strconv.Atoi(vars["gitMaterialId"]) + if err != nil { + handler.Logger.Error(err) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + handler.Logger.Infow("request payload, RefreshMaterials", "gitMaterialId", gitMaterialId) + material, err := handler.materialRepository.FindById(gitMaterialId) + if err != nil { + handler.Logger.Errorw("service err, RefreshMaterials", "err", err, "gitMaterialId", gitMaterialId) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + //RBAC + token := r.Header.Get("token") + object := handler.enforcerUtil.GetAppRBACNameByAppId(material.AppId) + if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); !ok { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden) + return + } + //RBAC + + resp, err := handler.ciHandler.RefreshMaterialByCiPipelineMaterialId(material.Id) + if err != nil { + handler.Logger.Errorw("service err, RefreshMaterials", "err", err, "gitMaterialId", gitMaterialId) + common.WriteJsonResp(w, err, resp, http.StatusInternalServerError) + return + } + common.WriteJsonResp(w, err, resp, http.StatusOK) +} + +func (handler PipelineConfigRestHandlerImpl) GetCiPipelineMin(w http.ResponseWriter, r *http.Request) { + userId, err := handler.userAuthService.GetLoggedInUser(r) + if userId == 0 || err != nil { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + return + } + vars := mux.Vars(r) + appId, err := strconv.Atoi(vars["appId"]) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + //RBAC + handler.Logger.Infow("request payload, GetCiPipelineMin", "appId", appId) + token := r.Header.Get("token") + object := handler.enforcerUtil.GetAppRBACNameByAppId(appId) + if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); !ok { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden) + return + } + //RBAC + ciPipelines, err := handler.pipelineBuilder.GetCiPipelineMin(appId) + if err != nil { + handler.Logger.Errorw("service err, GetCiPipelineMin", "err", err, "appId", appId) + if util.IsErrNoRows(err) { + err = &util.ApiError{Code: "404", HttpStatusCode: http.StatusNotFound, UserMessage: "no data found"} + common.WriteJsonResp(w, err, nil, http.StatusOK) + } else { + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + } + return + } + common.WriteJsonResp(w, err, ciPipelines, http.StatusOK) +} + +func (handler PipelineConfigRestHandlerImpl) DownloadCiWorkflowArtifacts(w http.ResponseWriter, r *http.Request) { + userId, err := handler.userAuthService.GetLoggedInUser(r) + if userId == 0 || err != nil { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + return + } + vars := mux.Vars(r) + pipelineId, err := strconv.Atoi(vars["pipelineId"]) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + buildId, err := strconv.Atoi(vars["workflowId"]) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + handler.Logger.Infow("request payload, DownloadCiWorkflowArtifacts", "pipelineId", pipelineId, "buildId", buildId) + ciPipeline, err := handler.ciPipelineRepository.FindById(pipelineId) + if err != nil { + handler.Logger.Error(err) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + //RBAC + token := r.Header.Get("token") + object := handler.enforcerUtil.GetAppRBACNameByAppId(ciPipeline.AppId) + if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); !ok { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden) + return + } + //RBAC + + file, err := handler.ciHandler.DownloadCiWorkflowArtifacts(pipelineId, buildId) + defer file.Close() + if err != nil { + handler.Logger.Errorw("service err, DownloadCiWorkflowArtifacts", "err", err, "pipelineId", pipelineId, "buildId", buildId) + if util.IsErrNoRows(err) { + err = &util.ApiError{Code: "404", HttpStatusCode: 200, UserMessage: "no workflow found"} + common.WriteJsonResp(w, err, nil, http.StatusOK) + } else { + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + } + return + } + w.Header().Set("Content-Disposition", "attachment; filename="+strconv.Itoa(buildId)+".zip") + w.Header().Set("Content-Type", "application/octet-stream") + w.Header().Set("Content-Length", r.Header.Get("Content-Length")) + _, err = io.Copy(w, file) + if err != nil { + handler.Logger.Errorw("service err, DownloadCiWorkflowArtifacts", "err", err, "pipelineId", pipelineId, "buildId", buildId) + } +} + +func (handler PipelineConfigRestHandlerImpl) GetHistoricBuildLogs(w http.ResponseWriter, r *http.Request) { + userId, err := handler.userAuthService.GetLoggedInUser(r) + if userId == 0 || err != nil { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + return + } + vars := mux.Vars(r) + pipelineId, err := strconv.Atoi(vars["pipelineId"]) + if err != nil { + handler.Logger.Error(err) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + workflowId, err := strconv.Atoi(vars["workflowId"]) + if err != nil { + handler.Logger.Error(err) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + handler.Logger.Infow("request payload, GetHistoricBuildLogs", "pipelineId", pipelineId, "workflowId", workflowId) + ciPipeline, err := handler.ciPipelineRepository.FindById(pipelineId) + if err != nil { + handler.Logger.Errorw("service err, GetHistoricBuildLogs", "err", err, "pipelineId", pipelineId, "workflowId", workflowId) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + //RBAC + token := r.Header.Get("token") + object := handler.enforcerUtil.GetAppRBACNameByAppId(ciPipeline.AppId) + if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); !ok { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden) + return + } + //RBAC + resp, err := handler.ciHandler.GetHistoricBuildLogs(pipelineId, workflowId, nil) + if err != nil { + handler.Logger.Errorw("service err, GetHistoricBuildLogs", "err", err, "pipelineId", pipelineId, "workflowId", workflowId) + common.WriteJsonResp(w, err, resp, http.StatusInternalServerError) + return + } + common.WriteJsonResp(w, err, resp, http.StatusOK) +} + +func (handler *PipelineConfigRestHandlerImpl) GetBuildHistory(w http.ResponseWriter, r *http.Request) { + userId, err := handler.userAuthService.GetLoggedInUser(r) + if userId == 0 || err != nil { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + return + } + vars := mux.Vars(r) + pipelineId, err := strconv.Atoi(vars["pipelineId"]) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + offsetQueryParam := r.URL.Query().Get("offset") + offset, err := strconv.Atoi(offsetQueryParam) + if offsetQueryParam == "" || err != nil { + common.WriteJsonResp(w, err, "invalid offset", http.StatusBadRequest) + return + } + sizeQueryParam := r.URL.Query().Get("size") + limit, err := strconv.Atoi(sizeQueryParam) + if sizeQueryParam == "" || err != nil { + common.WriteJsonResp(w, err, "invalid size", http.StatusBadRequest) + return + } + handler.Logger.Infow("request payload, GetBuildHistory", "pipelineId", pipelineId, "offset", offset) + ciPipeline, err := handler.ciPipelineRepository.FindById(pipelineId) + if err != nil { + handler.Logger.Errorw("service err, GetBuildHistory", "err", err, "pipelineId", pipelineId, "offset", offset) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + //RBAC + token := r.Header.Get("token") + object := handler.enforcerUtil.GetAppRBACNameByAppId(ciPipeline.AppId) + if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); !ok { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden) + return + } + //RBAC + + resp, err := handler.ciHandler.GetBuildHistory(pipelineId, offset, limit) + if err != nil { + handler.Logger.Errorw("service err, GetBuildHistory", "err", err, "pipelineId", pipelineId, "offset", offset) + common.WriteJsonResp(w, err, resp, http.StatusInternalServerError) + return + } + common.WriteJsonResp(w, err, resp, http.StatusOK) +} + +func (handler *PipelineConfigRestHandlerImpl) GetBuildLogs(w http.ResponseWriter, r *http.Request) { + userId, err := handler.userAuthService.GetLoggedInUser(r) + if userId == 0 || err != nil { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + return + } + vars := mux.Vars(r) + pipelineId, err := strconv.Atoi(vars["pipelineId"]) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + + workflowId, err := strconv.Atoi(vars["workflowId"]) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + handler.Logger.Infow("request payload, GetBuildLogs", "pipelineId", pipelineId, "workflowId", workflowId) + ciPipeline, err := handler.ciPipelineRepository.FindById(pipelineId) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + //RBAC + token := r.Header.Get("token") + object := handler.enforcerUtil.GetAppRBACNameByAppId(ciPipeline.AppId) + if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); !ok { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden) + return + } + //RBAC + lastSeenMsgId := -1 + lastEventId := r.Header.Get("Last-Event-ID") + if len(lastEventId) > 0 { + lastSeenMsgId, err = strconv.Atoi(lastEventId) + if err != nil { + handler.Logger.Errorw("request err, GetBuildLogs", "err", err, "pipelineId", pipelineId, "workflowId", workflowId, "lastEventId", lastEventId) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + } + logsReader, cleanUp, err := handler.ciHandler.GetRunningWorkflowLogs(pipelineId, workflowId) + if err != nil { + handler.Logger.Errorw("service err, GetBuildLogs", "err", err, "pipelineId", pipelineId, "workflowId", workflowId, "lastEventId", lastEventId) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + + ctx, cancel := context.WithCancel(r.Context()) + if cn, ok := w.(http.CloseNotifier); ok { + go func(done <-chan struct{}, closed <-chan bool) { + select { + case <-done: + case <-closed: + cancel() + } + }(ctx.Done(), cn.CloseNotify()) + } + defer cancel() + defer cleanUp() + handler.streamOutput(w, logsReader, lastSeenMsgId) +} + +func (handler PipelineConfigRestHandlerImpl) FetchMaterialInfo(w http.ResponseWriter, r *http.Request) { + userId, err := handler.userAuthService.GetLoggedInUser(r) + if userId == 0 || err != nil { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + return + } + vars := mux.Vars(r) + ciArtifactId, err := strconv.Atoi(vars["ciArtifactId"]) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + handler.Logger.Infow("request payload, FetchMaterialInfo", "err", err, "ciArtifactId", ciArtifactId) + resp, err := handler.ciHandler.FetchMaterialInfoByArtifactId(ciArtifactId) + if err != nil { + handler.Logger.Errorw("service err, FetchMaterialInfo", "err", err, "ciArtifactId", ciArtifactId) + if util.IsErrNoRows(err) { + err = &util.ApiError{Code: "404", HttpStatusCode: http.StatusNotFound, UserMessage: "no material info found"} + common.WriteJsonResp(w, err, nil, http.StatusOK) + } else { + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + } + return + } + //RBAC + token := r.Header.Get("token") + object := handler.enforcerUtil.GetAppRBACNameByAppId(resp.AppId) + if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); !ok { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden) + return + } + //RBAC + + common.WriteJsonResp(w, err, resp, http.StatusOK) +} + +func (handler PipelineConfigRestHandlerImpl) GetCIPipelineById(w http.ResponseWriter, r *http.Request) { + token := r.Header.Get("token") + vars := mux.Vars(r) + appId, err := strconv.Atoi(vars["appId"]) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + pipelineId, err := strconv.Atoi(vars["pipelineId"]) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + handler.Logger.Infow("request payload, GetCIPipelineById", "err", err, "appId", appId, "pipelineId", pipelineId) + app, err := handler.pipelineBuilder.GetApp(appId) + if err != nil { + handler.Logger.Infow("service error, GetCIPipelineById", "err", err, "appId", appId, "pipelineId", pipelineId) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + resourceName := handler.enforcerUtil.GetAppRBACName(app.AppName) + if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, resourceName); !ok { + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + return + } + ciPipeline, err := handler.pipelineBuilder.GetCiPipelineById(pipelineId) + if err != nil { + handler.Logger.Infow("service error, GetCIPipelineById", "err", err, "appId", appId, "pipelineId", pipelineId) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + common.WriteJsonResp(w, err, ciPipeline, http.StatusOK) +} + +func (handler PipelineConfigRestHandlerImpl) CreateMaterial(w http.ResponseWriter, r *http.Request) { + token := r.Header.Get("token") + decoder := json.NewDecoder(r.Body) + userId, err := handler.userAuthService.GetLoggedInUser(r) + if userId == 0 || err != nil { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + return + } + var createMaterialDto bean.CreateMaterialDTO + err = decoder.Decode(&createMaterialDto) + createMaterialDto.UserId = userId + if err != nil { + handler.Logger.Errorw("request err, CreateMaterial", "err", err, "CreateMaterial", createMaterialDto) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + handler.Logger.Infow("request payload, CreateMaterial", "CreateMaterial", createMaterialDto) + err = handler.validator.Struct(createMaterialDto) + if err != nil { + handler.Logger.Errorw("validation err, CreateMaterial", "err", err, "CreateMaterial", createMaterialDto) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + for _, gitMaterial := range createMaterialDto.Material { + validationResult, err := handler.ValidateGitMaterialUrl(gitMaterial.GitProviderId, gitMaterial.Url) + if err != nil { + handler.Logger.Errorw("service err, CreateMaterial", "err", err, "CreateMaterial", createMaterialDto) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } else { + if !validationResult { + handler.Logger.Errorw("validation err, CreateMaterial : invalid git material url", "err", err, "gitMaterialUrl", gitMaterial.Url, "CreateMaterial", createMaterialDto) + common.WriteJsonResp(w, fmt.Errorf("validation for url failed"), nil, http.StatusBadRequest) + return + } + } + } + resourceObject := handler.enforcerUtil.GetAppRBACNameByAppId(createMaterialDto.AppId) + if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionCreate, resourceObject); !ok { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden) + return + } + + createResp, err := handler.pipelineBuilder.CreateMaterialsForApp(&createMaterialDto) + if err != nil { + handler.Logger.Errorw("service err, CreateMaterial", "err", err, "CreateMaterial", createMaterialDto) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + common.WriteJsonResp(w, err, createResp, http.StatusOK) +} + +func (handler PipelineConfigRestHandlerImpl) UpdateMaterial(w http.ResponseWriter, r *http.Request) { + token := r.Header.Get("token") + decoder := json.NewDecoder(r.Body) + userId, err := handler.userAuthService.GetLoggedInUser(r) + if userId == 0 || err != nil { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + return + } + var updateMaterialDto bean.UpdateMaterialDTO + err = decoder.Decode(&updateMaterialDto) + updateMaterialDto.UserId = userId + if err != nil { + handler.Logger.Errorw("request err, UpdateMaterial", "err", err, "UpdateMaterial", updateMaterialDto) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + handler.Logger.Infow("request payload, UpdateMaterial", "UpdateMaterial", updateMaterialDto) + err = handler.validator.Struct(updateMaterialDto) + if err != nil { + handler.Logger.Errorw("validation err, UpdateMaterial", "err", err, "UpdateMaterial", updateMaterialDto) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + validationResult, err := handler.ValidateGitMaterialUrl(updateMaterialDto.Material.GitProviderId, updateMaterialDto.Material.Url) + if err != nil { + handler.Logger.Errorw("service err, UpdateMaterial", "err", err, "UpdateMaterial", updateMaterialDto) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } else { + if !validationResult { + handler.Logger.Errorw("validation err, UpdateMaterial : invalid git material url", "err", err, "gitMaterialUrl", updateMaterialDto.Material.Url, "UpdateMaterial", updateMaterialDto) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + } + resourceObject := handler.enforcerUtil.GetAppRBACNameByAppId(updateMaterialDto.AppId) + if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionCreate, resourceObject); !ok { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden) + return + } + + createResp, err := handler.pipelineBuilder.UpdateMaterialsForApp(&updateMaterialDto) + if err != nil { + handler.Logger.Errorw("service err, UpdateMaterial", "err", err, "UpdateMaterial", updateMaterialDto) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + common.WriteJsonResp(w, err, createResp, http.StatusOK) +} + +func (handler PipelineConfigRestHandlerImpl) HandleWorkflowWebhook(w http.ResponseWriter, r *http.Request) { + decoder := json.NewDecoder(r.Body) + var wfUpdateReq v1alpha1.WorkflowStatus + err := decoder.Decode(&wfUpdateReq) + if err != nil { + handler.Logger.Errorw("request err, HandleWorkflowWebhook", "err", err, "payload", wfUpdateReq) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + handler.Logger.Infow("request payload, HandleWorkflowWebhook", "payload", wfUpdateReq) + resp, err := handler.ciHandler.UpdateWorkflow(wfUpdateReq) + if err != nil { + handler.Logger.Errorw("service err, HandleWorkflowWebhook", "err", err, "payload", wfUpdateReq) + common.WriteJsonResp(w, err, resp, http.StatusInternalServerError) + return + } + common.WriteJsonResp(w, err, resp, http.StatusOK) +} + +func (handler PipelineConfigRestHandlerImpl) validForMultiMaterial(ciTriggerRequest bean.CiTriggerRequest) bool { + if len(ciTriggerRequest.CiPipelineMaterial) > 1 { + for _, m := range ciTriggerRequest.CiPipelineMaterial { + if m.GitCommit.Commit == "" { + return false + } + } + } + return true +} + diff --git a/api/restHandler/pipeline/DeploymentPipelineRestHandler.go b/api/restHandler/pipeline/DeploymentPipelineRestHandler.go new file mode 100644 index 0000000000..436e2fa9ed --- /dev/null +++ b/api/restHandler/pipeline/DeploymentPipelineRestHandler.go @@ -0,0 +1,1460 @@ +package pipeline + +import ( + "context" + "encoding/json" + "fmt" + bean2 "github.com/devtron-labs/devtron/api/bean" + "github.com/devtron-labs/devtron/api/restHandler/common" + "github.com/devtron-labs/devtron/internal/sql/repository/security" + "github.com/devtron-labs/devtron/internal/util" + "github.com/devtron-labs/devtron/pkg/bean" + "github.com/devtron-labs/devtron/pkg/pipeline" + "github.com/devtron-labs/devtron/util/rbac" + "github.com/go-pg/pg" + "github.com/gorilla/mux" + "io" + "net/http" + "strconv" +) + +type DevtronAppDeploymentRestHandler interface { + CreateCdPipeline(w http.ResponseWriter, r *http.Request) + GetCdPipelineById(w http.ResponseWriter, r *http.Request) + PatchCdPipeline(w http.ResponseWriter, r *http.Request) + GetCdPipelines(w http.ResponseWriter, r *http.Request) + GetCdPipelinesForAppAndEnv(w http.ResponseWriter, r *http.Request) + + GetArtifactsByCDPipeline(w http.ResponseWriter, r *http.Request) + GetArtifactForRollback(w http.ResponseWriter, r *http.Request) + + UpgradeForAllApps(w http.ResponseWriter, r *http.Request) + + IsReadyToTrigger(w http.ResponseWriter, r *http.Request) + FetchCdWorkflowDetails(w http.ResponseWriter, r *http.Request) +} + +type DevtronAppDeploymentConfigRestHandler interface { + ConfigureDeploymentTemplateForApp(w http.ResponseWriter, r *http.Request) + GetDeploymentTemplate(w http.ResponseWriter, r *http.Request) + GetAppOverrideForDefaultTemplate(w http.ResponseWriter, r *http.Request) + + EnvConfigOverrideCreate(w http.ResponseWriter, r *http.Request) + EnvConfigOverrideUpdate(w http.ResponseWriter, r *http.Request) + GetEnvConfigOverride(w http.ResponseWriter, r *http.Request) + EnvConfigOverrideReset(w http.ResponseWriter, r *http.Request) + + UpdateAppOverride(w http.ResponseWriter, r *http.Request) + GetConfigmapSecretsForDeploymentStages(w http.ResponseWriter, r *http.Request) + GetDeploymentPipelineStrategy(w http.ResponseWriter, r *http.Request) + + AppMetricsEnableDisable(w http.ResponseWriter, r *http.Request) + EnvMetricsEnableDisable(w http.ResponseWriter, r *http.Request) +} + +type DevtronAppPrePostDeploymentRestHandler interface { + GetMigrationConfig(w http.ResponseWriter, r *http.Request) + CreateMigrationConfig(w http.ResponseWriter, r *http.Request) + UpdateMigrationConfig(w http.ResponseWriter, r *http.Request) + GetStageStatus(w http.ResponseWriter, r *http.Request) + GetPrePostDeploymentLogs(w http.ResponseWriter, r *http.Request) + // CancelStage Cancel Pre/Post ArgoWorkflow execution + CancelStage(w http.ResponseWriter, r *http.Request) +} + +type DevtronAppDeploymentHistoryRestHandler interface { + ListDeploymentHistory(w http.ResponseWriter, r *http.Request) + DownloadArtifacts(w http.ResponseWriter, r *http.Request) +} + +func (handler PipelineConfigRestHandlerImpl) ConfigureDeploymentTemplateForApp(w http.ResponseWriter, r *http.Request) { + decoder := json.NewDecoder(r.Body) + userId, err := handler.userAuthService.GetLoggedInUser(r) + if userId == 0 || err != nil { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + return + } + var templateRequest pipeline.TemplateRequest + err = decoder.Decode(&templateRequest) + templateRequest.UserId = userId + if err != nil { + handler.Logger.Errorw("request err, ConfigureDeploymentTemplateForApp", "err", err, "payload", templateRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + chartRefId := templateRequest.ChartRefId + validate, err2 := handler.chartService.DeploymentTemplateValidate(templateRequest.ValuesOverride, chartRefId) + if !validate { + common.WriteJsonResp(w, err2, nil, http.StatusBadRequest) + return + } + handler.Logger.Infow("request payload, ConfigureDeploymentTemplateForApp", "payload", templateRequest) + err = handler.validator.Struct(templateRequest) + if err != nil { + handler.Logger.Errorw("validation err, ConfigureDeploymentTemplateForApp", "err", err, "payload", templateRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + token := r.Header.Get("token") + app, err := handler.pipelineBuilder.GetApp(templateRequest.AppId) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + resourceName := handler.enforcerUtil.GetAppRBACName(app.AppName) + if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionCreate, resourceName); !ok { + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + return + } + ctx, cancel := context.WithCancel(r.Context()) + if cn, ok := w.(http.CloseNotifier); ok { + go func(done <-chan struct{}, closed <-chan bool) { + select { + case <-done: + case <-closed: + cancel() + } + }(ctx.Done(), cn.CloseNotify()) + } + ctx = context.WithValue(r.Context(), "token", token) + createResp, err := handler.chartService.Create(templateRequest, ctx) + if err != nil { + handler.Logger.Errorw("service err, ConfigureDeploymentTemplateForApp", "err", err, "payload", templateRequest) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + common.WriteJsonResp(w, err, createResp, http.StatusOK) +} + +func (handler PipelineConfigRestHandlerImpl) CreateCdPipeline(w http.ResponseWriter, r *http.Request) { + decoder := json.NewDecoder(r.Body) + userId, err := handler.userAuthService.GetLoggedInUser(r) + if userId == 0 || err != nil { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + return + } + var cdPipeline bean.CdPipelines + err = decoder.Decode(&cdPipeline) + cdPipeline.UserId = userId + if err != nil { + handler.Logger.Errorw("request err, CreateCdPipeline", "err", err, "payload", cdPipeline) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + handler.Logger.Infow("request payload, CreateCdPipeline", "payload", cdPipeline) + err = handler.validator.Struct(cdPipeline) + if err != nil { + handler.Logger.Errorw("validation err, CreateCdPipeline", "err", err, "payload", cdPipeline) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + handler.Logger.Debugw("pipeline create request ", "req", cdPipeline) + token := r.Header.Get("token") + app, err := handler.pipelineBuilder.GetApp(cdPipeline.AppId) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + + //RBAC + resourceName := handler.enforcerUtil.GetAppRBACName(app.AppName) + if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionCreate, resourceName); !ok { + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + return + } + for _, deploymentPipeline := range cdPipeline.Pipelines { + object := handler.enforcerUtil.GetAppRBACByAppNameAndEnvId(app.AppName, deploymentPipeline.EnvironmentId) + handler.Logger.Debugw("Triggered Request By:", "object", object) + if ok := handler.enforcer.Enforce(token, rbac.ResourceEnvironment, rbac.ActionCreate, object); !ok { + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + return + } + } + //RBAC + + ctx := context.WithValue(r.Context(), "token", token) + createResp, err := handler.pipelineBuilder.CreateCdPipelines(&cdPipeline, ctx) + if err != nil { + handler.Logger.Errorw("service err, CreateCdPipeline", "err", err, "payload", cdPipeline) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + common.WriteJsonResp(w, err, createResp, http.StatusOK) +} + +func (handler PipelineConfigRestHandlerImpl) PatchCdPipeline(w http.ResponseWriter, r *http.Request) { + decoder := json.NewDecoder(r.Body) + userId, err := handler.userAuthService.GetLoggedInUser(r) + if userId == 0 || err != nil { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + return + } + var cdPipeline bean.CDPatchRequest + err = decoder.Decode(&cdPipeline) + cdPipeline.UserId = userId + if err != nil { + handler.Logger.Errorw("request err, PatchCdPipeline", "err", err, "payload", cdPipeline) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + + v := r.URL.Query() + forceDelete := false + force := v.Get("force") + if len(force) > 0 { + forceDelete, err = strconv.ParseBool(force) + if err != nil { + handler.Logger.Errorw("request err, PatchCdPipeline", "err", err, "payload", cdPipeline) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + } + cdPipeline.ForceDelete = forceDelete + handler.Logger.Infow("request payload, PatchCdPipeline", "payload", cdPipeline) + err = handler.validator.StructPartial(cdPipeline, "AppId", "Action") + if err == nil { + if cdPipeline.Action == bean.CD_CREATE { + err = handler.validator.Struct(cdPipeline.Pipeline) + } else if cdPipeline.Action == bean.CD_DELETE { + err = handler.validator.Var(cdPipeline.Pipeline.Id, "gt=0") + } + } + if err != nil { + handler.Logger.Errorw("validation err, PatchCdPipeline", "err", err, "payload", cdPipeline) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + token := r.Header.Get("token") + app, err := handler.pipelineBuilder.GetApp(cdPipeline.AppId) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + resourceName := handler.enforcerUtil.GetAppRBACName(app.AppName) + if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionUpdate, resourceName); !ok { + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + return + } + + object := handler.enforcerUtil.GetAppRBACByAppIdAndPipelineId(cdPipeline.AppId, cdPipeline.Pipeline.Id) + if ok := handler.enforcer.Enforce(token, rbac.ResourceEnvironment, rbac.ActionUpdate, object); !ok { + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + return + } + + ctx := context.WithValue(r.Context(), "token", token) + createResp, err := handler.pipelineBuilder.PatchCdPipelines(&cdPipeline, ctx) + if err != nil { + handler.Logger.Errorw("service err, PatchCdPipeline", "err", err, "payload", cdPipeline) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + common.WriteJsonResp(w, err, createResp, http.StatusOK) +} + +func (handler PipelineConfigRestHandlerImpl) EnvConfigOverrideCreate(w http.ResponseWriter, r *http.Request) { + userId, err := handler.userAuthService.GetLoggedInUser(r) + if userId == 0 || err != nil { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + return + } + decoder := json.NewDecoder(r.Body) + var envConfigProperties pipeline.EnvironmentProperties + err = decoder.Decode(&envConfigProperties) + if err != nil { + handler.Logger.Errorw("request err, EnvConfigOverrideCreate", "err", err, "payload", envConfigProperties) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + token := r.Header.Get("token") + vars := mux.Vars(r) + appId, err := strconv.Atoi(vars["appId"]) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + environmentId, err := strconv.Atoi(vars["environmentId"]) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + envConfigProperties.UserId = userId + envConfigProperties.EnvironmentId = environmentId + handler.Logger.Infow("request payload, EnvConfigOverrideCreate", "payload", envConfigProperties) + + resourceName := handler.enforcerUtil.GetAppRBACNameByAppId(appId) + if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionCreate, resourceName); !ok { + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + return + } + object := handler.enforcerUtil.GetEnvRBACNameByAppId(appId, environmentId) + if ok := handler.enforcer.Enforce(token, rbac.ResourceEnvironment, rbac.ActionUpdate, object); !ok { + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + return + } + chartRefId := envConfigProperties.ChartRefId + validate, err2 := handler.chartService.DeploymentTemplateValidate(envConfigProperties.EnvOverrideValues, chartRefId) + if !validate { + handler.Logger.Errorw("validation err, UpdateAppOverride", "err", err2, "payload", envConfigProperties) + common.WriteJsonResp(w, err2, nil, http.StatusBadRequest) + return + } + createResp, err := handler.propertiesConfigService.CreateEnvironmentProperties(appId, &envConfigProperties) + if err != nil { + if err.Error() == bean2.NOCHARTEXIST { + ctx, cancel := context.WithCancel(r.Context()) + if cn, ok := w.(http.CloseNotifier); ok { + go func(done <-chan struct{}, closed <-chan bool) { + select { + case <-done: + case <-closed: + cancel() + } + }(ctx.Done(), cn.CloseNotify()) + } + ctx = context.WithValue(r.Context(), "token", token) + templateRequest := pipeline.TemplateRequest{ + AppId: appId, + ChartRefId: envConfigProperties.ChartRefId, + ValuesOverride: []byte("{}"), + UserId: userId, + } + + _, err = handler.chartService.CreateChartFromEnvOverride(templateRequest, ctx) + if err != nil { + handler.Logger.Errorw("service err, EnvConfigOverrideCreate", "err", err, "payload", envConfigProperties) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + createResp, err = handler.propertiesConfigService.CreateEnvironmentProperties(appId, &envConfigProperties) + if err != nil { + handler.Logger.Errorw("service err, EnvConfigOverrideCreate", "err", err, "payload", envConfigProperties) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + } else { + handler.Logger.Errorw("service err, EnvConfigOverrideCreate", "err", err, "payload", envConfigProperties) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + } + common.WriteJsonResp(w, err, createResp, http.StatusOK) +} + +func (handler PipelineConfigRestHandlerImpl) EnvConfigOverrideUpdate(w http.ResponseWriter, r *http.Request) { + decoder := json.NewDecoder(r.Body) + //userId := getLoggedInUser(r) + userId, err := handler.userAuthService.GetLoggedInUser(r) + if userId == 0 || err != nil { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + return + } + var envConfigProperties pipeline.EnvironmentProperties + err = decoder.Decode(&envConfigProperties) + envConfigProperties.UserId = userId + if err != nil { + handler.Logger.Errorw("request err, EnvConfigOverrideUpdate", "err", err, "payload", envConfigProperties) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + handler.Logger.Infow("request payload, EnvConfigOverrideUpdate", "payload", envConfigProperties) + err = handler.validator.Struct(envConfigProperties) + if err != nil { + handler.Logger.Errorw("validation err, EnvConfigOverrideUpdate", "err", err, "payload", envConfigProperties) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + token := r.Header.Get("token") + envConfigOverride, err := handler.propertiesConfigService.GetAppIdByChartEnvId(envConfigProperties.Id) + if err != nil { + handler.Logger.Errorw("service err, EnvConfigOverrideUpdate", "err", err, "payload", envConfigProperties) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + appId := envConfigOverride.Chart.AppId + envId := envConfigOverride.TargetEnvironment + resourceName := handler.enforcerUtil.GetAppRBACNameByAppId(appId) + if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionUpdate, resourceName); !ok { + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + return + } + object := handler.enforcerUtil.GetEnvRBACNameByAppId(appId, envId) + if ok := handler.enforcer.Enforce(token, rbac.ResourceEnvironment, rbac.ActionUpdate, object); !ok { + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + return + } + chartRefId := envConfigProperties.ChartRefId + validate, err2 := handler.chartService.DeploymentTemplateValidate(envConfigProperties.EnvOverrideValues, chartRefId) + if !validate { + handler.Logger.Errorw("validation err, UpdateAppOverride", "err", err2, "payload", envConfigProperties) + common.WriteJsonResp(w, err2, nil, http.StatusBadRequest) + return + } + createResp, err := handler.propertiesConfigService.UpdateEnvironmentProperties(appId, &envConfigProperties, userId) + if err != nil { + handler.Logger.Errorw("service err, EnvConfigOverrideUpdate", "err", err, "payload", envConfigProperties) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + common.WriteJsonResp(w, err, createResp, http.StatusOK) +} + +func (handler PipelineConfigRestHandlerImpl) GetEnvConfigOverride(w http.ResponseWriter, r *http.Request) { + vars := mux.Vars(r) + environmentId, err := strconv.Atoi(vars["environmentId"]) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + appId, err := strconv.Atoi(vars["appId"]) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + chartRefId, err := strconv.Atoi(vars["chartRefId"]) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + token := r.Header.Get("token") + app, err := handler.pipelineBuilder.GetApp(appId) + if err != nil { + handler.Logger.Errorw("service err, GetEnvConfigOverride", "err", err, "payload", appId, environmentId, chartRefId) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + handler.Logger.Infow("request payload, GetEnvConfigOverride", "payload", appId, environmentId, chartRefId) + resourceName := handler.enforcerUtil.GetAppRBACName(app.AppName) + if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, resourceName); !ok { + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + return + } + env, err := handler.propertiesConfigService.GetEnvironmentProperties(appId, environmentId, chartRefId) + if err != nil { + handler.Logger.Errorw("service err, GetEnvConfigOverride", "err", err, "payload", appId, environmentId, chartRefId) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + common.WriteJsonResp(w, err, env, http.StatusOK) +} + +func (handler PipelineConfigRestHandlerImpl) GetDeploymentTemplate(w http.ResponseWriter, r *http.Request) { + vars := mux.Vars(r) + appId, err := strconv.Atoi(vars["appId"]) + if err != nil { + handler.Logger.Error(err) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + chartRefId, err := strconv.Atoi(vars["chartRefId"]) + if err != nil { + handler.Logger.Error(err) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + handler.Logger.Infow("request payload, GetDeploymentTemplate", "appId", appId, "chartRefId", chartRefId) + token := r.Header.Get("token") + app, err := handler.pipelineBuilder.GetApp(appId) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + resourceName := handler.enforcerUtil.GetAppRBACName(app.AppName) + if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, resourceName); !ok { + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + return + } + + appConfigResponse := map[string]json.RawMessage{} + appConfigResponse["globalConfig"] = nil + + template, err := handler.chartService.FindLatestChartForAppByAppId(appId) + if err != nil && pg.ErrNoRows != err { + handler.Logger.Errorw("service err, GetDeploymentTemplate", "err", err, "appId", appId, "chartRefId", chartRefId) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + + if pg.ErrNoRows == err { + appOverride, err := handler.chartService.GetAppOverrideForDefaultTemplate(chartRefId) + if err != nil { + handler.Logger.Errorw("service err, GetDeploymentTemplate", "err", err, "appId", appId, "chartRefId", chartRefId) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + mapB, _ := json.Marshal(appOverride) + if err != nil { + handler.Logger.Errorw("marshal err, GetDeploymentTemplate", "err", err, "appId", appId, "chartRefId", chartRefId) + return + } + appConfigResponse["globalConfig"] = mapB + } else { + if template.ChartRefId != chartRefId { + templateRequested, err := handler.chartService.GetByAppIdAndChartRefId(appId, chartRefId) + if err != nil && err != pg.ErrNoRows { + handler.Logger.Errorw("service err, GetDeploymentTemplate", "err", err, "appId", appId, "chartRefId", chartRefId) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + + if pg.ErrNoRows == err { + template.ChartRefId = chartRefId + template.Id = 0 + template.Latest = false + } else { + template.ChartRefId = templateRequested.ChartRefId + template.Id = templateRequested.Id + template.ChartRepositoryId = templateRequested.ChartRepositoryId + template.RefChartTemplate = templateRequested.RefChartTemplate + template.RefChartTemplateVersion = templateRequested.RefChartTemplateVersion + template.Latest = templateRequested.Latest + } + } + + bytes, err := json.Marshal(template) + if err != nil { + handler.Logger.Errorw("marshal err, GetDeploymentTemplate", "err", err, "appId", appId, "chartRefId", chartRefId) + return + } + appOverride := json.RawMessage(bytes) + appConfigResponse["globalConfig"] = appOverride + } + + common.WriteJsonResp(w, nil, appConfigResponse, http.StatusOK) +} + +func (handler PipelineConfigRestHandlerImpl) GetCdPipelines(w http.ResponseWriter, r *http.Request) { + vars := mux.Vars(r) + appId, err := strconv.Atoi(vars["appId"]) + if err != nil { + handler.Logger.Errorw("request err, GetCdPipelines", "err", err, "appId", appId) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + handler.Logger.Infow("request payload, GetCdPipelines", "appId", appId) + token := r.Header.Get("token") + app, err := handler.pipelineBuilder.GetApp(appId) + if err != nil { + handler.Logger.Errorw("service err, GetCdPipelines", "err", err, "appId", appId) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + resourceName := handler.enforcerUtil.GetAppRBACName(app.AppName) + if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, resourceName); !ok { + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + return + } + + ciConf, err := handler.pipelineBuilder.GetCdPipelinesForApp(appId) + if err != nil { + handler.Logger.Errorw("service err, GetCdPipelines", "err", err, "appId", appId) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + + common.WriteJsonResp(w, err, ciConf, http.StatusOK) +} + +func (handler PipelineConfigRestHandlerImpl) GetCdPipelinesForAppAndEnv(w http.ResponseWriter, r *http.Request) { + vars := mux.Vars(r) + appId, err := strconv.Atoi(vars["appId"]) + if err != nil { + handler.Logger.Errorw("request err, GetCdPipelinesForAppAndEnv", "err", err, "appId", appId) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + + envId, err := strconv.Atoi(vars["envId"]) + if err != nil { + handler.Logger.Errorw("request err, GetCdPipelinesForAppAndEnv", "err", err, "envId", envId) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + handler.Logger.Infow("request payload, GetCdPipelinesForAppAndEnv", "appId", appId, "envId", envId) + token := r.Header.Get("token") + app, err := handler.pipelineBuilder.GetApp(appId) + if err != nil { + handler.Logger.Errorw("service err, GetCdPipelinesForAppAndEnv", "err", err, "appId", appId, "envId", envId) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + //rbac + resourceName := handler.enforcerUtil.GetAppRBACName(app.AppName) + if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, resourceName); !ok { + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + return + } + object := handler.enforcerUtil.GetEnvRBACNameByAppId(appId, envId) + if ok := handler.enforcer.Enforce(token, rbac.ResourceEnvironment, rbac.ActionGet, object); !ok { + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + return + } + //rbac + + cdPipelines, err := handler.pipelineBuilder.GetCdPipelinesForAppAndEnv(appId, envId) + if err != nil { + handler.Logger.Errorw("service err, GetCdPipelinesForAppAndEnv", "err", err, "appId", appId, "envId", envId) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + common.WriteJsonResp(w, err, cdPipelines, http.StatusOK) +} + +func (handler PipelineConfigRestHandlerImpl) GetArtifactsByCDPipeline(w http.ResponseWriter, r *http.Request) { + token := r.Header.Get("token") + vars := mux.Vars(r) + cdPipelineId, err := strconv.Atoi(vars["cd_pipeline_id"]) + if err != nil { + handler.Logger.Errorw("request err, GetArtifactsByCDPipeline", "err", err, "cdPipelineId", cdPipelineId) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + stage := r.URL.Query().Get("stage") + if len(stage) == 0 { + stage = "PRE" + } + handler.Logger.Infow("request payload, GetArtifactsByCDPipeline", "cdPipelineId", cdPipelineId, "stage", stage) + deploymentPipeline, err := handler.pipelineBuilder.FindPipelineById(cdPipelineId) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + app, err := handler.pipelineBuilder.GetApp(deploymentPipeline.AppId) + if err != nil { + handler.Logger.Errorw("service err, GetArtifactsByCDPipeline", "err", err, "cdPipelineId", cdPipelineId, "stage", stage) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + + //rbac block starts from here + object := handler.enforcerUtil.GetAppRBACName(app.AppName) + if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); !ok { + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + return + } + + object = handler.enforcerUtil.GetAppRBACByAppNameAndEnvId(app.AppName, deploymentPipeline.EnvironmentId) + if ok := handler.enforcer.Enforce(token, rbac.ResourceEnvironment, rbac.ActionGet, object); !ok { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden) + return + } + //rbac block ends here + + ciArtifactResponse, err := handler.pipelineBuilder.GetArtifactsByCDPipeline(cdPipelineId, bean2.CdWorkflowType(stage)) + if err != nil { + handler.Logger.Errorw("service err, GetArtifactsByCDPipeline", "err", err, "cdPipelineId", cdPipelineId, "stage", stage) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + + var digests []string + for _, item := range ciArtifactResponse.CiArtifacts { + digests = append(digests, item.ImageDigest) + } + + pipelineModel, err := handler.pipelineRepository.FindById(cdPipelineId) + if err != nil { + handler.Logger.Errorw("service err, GetArtifactsByCDPipeline", "err", err, "cdPipelineId", cdPipelineId, "stage", stage) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + } + if len(digests) > 0 { + vulnerableMap := make(map[string]bool) + for _, digest := range digests { + if len(digest) > 0 { + var cveStores []*security.CveStore + imageScanResult, err := handler.scanResultRepository.FindByImageDigest(digest) + if err != nil && err != pg.ErrNoRows { + handler.Logger.Errorw("service err, GetArtifactsByCDPipeline", "err", err, "cdPipelineId", cdPipelineId, "stage", stage) + continue //skip for other artifact to complete + } + for _, item := range imageScanResult { + cveStores = append(cveStores, &item.CveStore) + } + blockCveList, err := handler.policyService.GetBlockedCVEList(cveStores, pipelineModel.Environment.ClusterId, pipelineModel.EnvironmentId, pipelineModel.AppId, pipelineModel.App.AppStore) + if err != nil { + handler.Logger.Errorw("service err, GetArtifactsByCDPipeline", "err", err, "cdPipelineId", cdPipelineId, "stage", stage) + } + if len(blockCveList) > 0 { + vulnerableMap[digest] = true + } + } + } + var ciArtifactsFinal []bean.CiArtifactBean + for _, item := range ciArtifactResponse.CiArtifacts { + if item.ScanEnabled { // skip setting for artifacts which have marked scan disabled, but here deal with same digest + if _, ok := vulnerableMap[item.ImageDigest]; ok { + item.IsVulnerable = true + } + } + ciArtifactsFinal = append(ciArtifactsFinal, item) + } + ciArtifactResponse.CiArtifacts = ciArtifactsFinal + } + + common.WriteJsonResp(w, err, ciArtifactResponse, http.StatusOK) +} + +func (handler PipelineConfigRestHandlerImpl) GetAppOverrideForDefaultTemplate(w http.ResponseWriter, r *http.Request) { + token := r.Header.Get("token") + vars := mux.Vars(r) + appId, err := strconv.Atoi(vars["appId"]) + if err != nil { + handler.Logger.Errorw("request err, GetAppOverrideForDefaultTemplate", "err", err, "appId", appId) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + chartRefId, err := strconv.Atoi(vars["chartRefId"]) + if err != nil { + handler.Logger.Errorw("request err, GetAppOverrideForDefaultTemplate", "err", err, "chartRefId", chartRefId) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + + //RBAC + object := handler.enforcerUtil.GetAppRBACNameByAppId(appId) + if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); !ok { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden) + return + } + //RBAC + + appOverride, err := handler.chartService.GetAppOverrideForDefaultTemplate(chartRefId) + if err != nil { + handler.Logger.Errorw("service err, UpdateCiTemplate", "err", err, "appId", appId, "chartRefId", chartRefId) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + common.WriteJsonResp(w, err, appOverride, http.StatusOK) +} + +func (handler PipelineConfigRestHandlerImpl) UpdateAppOverride(w http.ResponseWriter, r *http.Request) { + decoder := json.NewDecoder(r.Body) + userId, err := handler.userAuthService.GetLoggedInUser(r) + if userId == 0 || err != nil { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + return + } + + var templateRequest pipeline.TemplateRequest + err = decoder.Decode(&templateRequest) + templateRequest.UserId = userId + if err != nil { + handler.Logger.Errorw("request err, UpdateAppOverride", "err", err, "payload", templateRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + + err = handler.validator.Struct(templateRequest) + if err != nil { + handler.Logger.Errorw("validation err, UpdateAppOverride", "err", err, "payload", templateRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + handler.Logger.Infow("request payload, UpdateAppOverride", "payload", templateRequest) + + token := r.Header.Get("token") + app, err := handler.pipelineBuilder.GetApp(templateRequest.AppId) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + + resourceName := handler.enforcerUtil.GetAppRBACName(app.AppName) + if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionCreate, resourceName); !ok { + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + return + } + chartRefId := templateRequest.ChartRefId + validate, err2 := handler.chartService.DeploymentTemplateValidate(templateRequest.ValuesOverride, chartRefId) + if !validate { + handler.Logger.Errorw("validation err, UpdateAppOverride", "err", err2, "payload", templateRequest) + common.WriteJsonResp(w, err2, nil, http.StatusBadRequest) + return + } + createResp, err := handler.chartService.UpdateAppOverride(&templateRequest) + if err != nil { + handler.Logger.Errorw("service err, UpdateAppOverride", "err", err, "payload", templateRequest) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + common.WriteJsonResp(w, err, createResp, http.StatusOK) + +} +func (handler PipelineConfigRestHandlerImpl) GetArtifactForRollback(w http.ResponseWriter, r *http.Request) { + vars := mux.Vars(r) + cdPipelineId, err := strconv.Atoi(vars["cd_pipeline_id"]) + if err != nil { + handler.Logger.Errorw("request err, GetArtifactForRollback", "err", err, "cdPipelineId", cdPipelineId) + common.WriteJsonResp(w, err, "invalid request", http.StatusBadRequest) + return + } + handler.Logger.Infow("request payload, GetArtifactForRollback", "cdPipelineId", cdPipelineId) + token := r.Header.Get("token") + deploymentPipeline, err := handler.pipelineBuilder.FindPipelineById(cdPipelineId) + if err != nil { + handler.Logger.Errorw("service err, GetArtifactForRollback", "err", err, "cdPipelineId", cdPipelineId) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + app, err := handler.pipelineBuilder.GetApp(deploymentPipeline.AppId) + if err != nil { + handler.Logger.Errorw("service err, GetArtifactForRollback", "err", err, "cdPipelineId", cdPipelineId) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + + //rbac block starts from here + object := handler.enforcerUtil.GetAppRBACName(app.AppName) + if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); !ok { + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + return + } + object = handler.enforcerUtil.GetAppRBACByAppNameAndEnvId(app.AppName, deploymentPipeline.EnvironmentId) + if ok := handler.enforcer.Enforce(token, rbac.ResourceEnvironment, rbac.ActionGet, object); !ok { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden) + return + } + //rbac block ends here + + ciArtifactResponse, err := handler.pipelineBuilder.FetchArtifactForRollback(cdPipelineId) + if err != nil { + handler.Logger.Errorw("service err, GetArtifactForRollback", "err", err, "cdPipelineId", cdPipelineId) + common.WriteJsonResp(w, err, "unable to fetch artifacts", http.StatusInternalServerError) + return + } + common.WriteJsonResp(w, err, ciArtifactResponse, http.StatusOK) +} + +func (handler PipelineConfigRestHandlerImpl) GetMigrationConfig(w http.ResponseWriter, r *http.Request) { + vars := mux.Vars(r) + pipelineId, err := strconv.Atoi(vars["pipelineId"]) + if err != nil { + handler.Logger.Errorw("request err, GetMigrationConfig", "err", err, "pipelineId", pipelineId) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + handler.Logger.Infow("request payload, GetMigrationConfig", "pipelineId", pipelineId) + token := r.Header.Get("token") + deploymentPipeline, err := handler.pipelineBuilder.FindPipelineById(pipelineId) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + app, err := handler.pipelineBuilder.GetApp(deploymentPipeline.AppId) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + resourceName := handler.enforcerUtil.GetAppRBACName(app.AppName) + if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, resourceName); !ok { + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + return + } + ciConf, err := handler.dbMigrationService.GetByPipelineId(pipelineId) + if err != nil { + handler.Logger.Errorw("service err, GetMigrationConfig", "err", err, "pipelineId", pipelineId) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + common.WriteJsonResp(w, err, ciConf, http.StatusOK) +} + +func (handler PipelineConfigRestHandlerImpl) CreateMigrationConfig(w http.ResponseWriter, r *http.Request) { + decoder := json.NewDecoder(r.Body) + userId, err := handler.userAuthService.GetLoggedInUser(r) + if userId == 0 || err != nil { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + return + } + var dbMigrationConfigBean pipeline.DbMigrationConfigBean + err = decoder.Decode(&dbMigrationConfigBean) + + dbMigrationConfigBean.UserId = userId + if err != nil { + handler.Logger.Errorw("request err, CreateMigrationConfig", "err", err, "payload", dbMigrationConfigBean) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + err = handler.validator.Struct(dbMigrationConfigBean) + if err != nil { + handler.Logger.Errorw("validation err, CreateMigrationConfig", "err", err, "payload", dbMigrationConfigBean) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + handler.Logger.Infow("request payload, CreateMigrationConfig", "payload", dbMigrationConfigBean) + token := r.Header.Get("token") + deploymentPipeline, err := handler.pipelineBuilder.FindPipelineById(dbMigrationConfigBean.PipelineId) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + app, err := handler.pipelineBuilder.GetApp(deploymentPipeline.AppId) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + } + resourceName := handler.enforcerUtil.GetAppRBACName(app.AppName) + if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionCreate, resourceName); !ok { + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + return + } + createResp, err := handler.dbMigrationService.Save(&dbMigrationConfigBean) + if err != nil { + handler.Logger.Errorw("service err, CreateMigrationConfig", "err", err, "payload", dbMigrationConfigBean) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + common.WriteJsonResp(w, err, createResp, http.StatusOK) +} +func (handler PipelineConfigRestHandlerImpl) UpdateMigrationConfig(w http.ResponseWriter, r *http.Request) { + decoder := json.NewDecoder(r.Body) + userId, err := handler.userAuthService.GetLoggedInUser(r) + if userId == 0 || err != nil { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + return + } + var dbMigrationConfigBean pipeline.DbMigrationConfigBean + err = decoder.Decode(&dbMigrationConfigBean) + dbMigrationConfigBean.UserId = userId + if err != nil { + handler.Logger.Errorw("request err, UpdateMigrationConfig", "err", err, "payload", dbMigrationConfigBean) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + err = handler.validator.Struct(dbMigrationConfigBean) + if err != nil { + handler.Logger.Errorw("validation err, UpdateMigrationConfig", "err", err, "payload", dbMigrationConfigBean) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + handler.Logger.Infow("request payload, UpdateMigrationConfig", "payload", dbMigrationConfigBean) + token := r.Header.Get("token") + deploymentPipeline, err := handler.pipelineBuilder.FindPipelineById(dbMigrationConfigBean.PipelineId) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + app, err := handler.pipelineBuilder.GetApp(deploymentPipeline.AppId) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + resourceName := handler.enforcerUtil.GetAppRBACName(app.AppName) + if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionCreate, resourceName); !ok { + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + return + } + createResp, err := handler.dbMigrationService.Update(&dbMigrationConfigBean) + if err != nil { + handler.Logger.Errorw("service err, UpdateMigrationConfig", "err", err, "payload", dbMigrationConfigBean) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + common.WriteJsonResp(w, err, createResp, http.StatusOK) +} + +func (handler PipelineConfigRestHandlerImpl) EnvConfigOverrideReset(w http.ResponseWriter, r *http.Request) { + userId, err := handler.userAuthService.GetLoggedInUser(r) + if userId == 0 || err != nil { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + return + } + token := r.Header.Get("token") + vars := mux.Vars(r) + appId, err := strconv.Atoi(vars["appId"]) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + environmentId, err := strconv.Atoi(vars["environmentId"]) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + + id, err := strconv.Atoi(vars["id"]) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + handler.Logger.Infow("request payload, EnvConfigOverrideReset", "appId", appId, "environmentId", environmentId) + app, err := handler.pipelineBuilder.GetApp(appId) + if err != nil { + handler.Logger.Errorw("service err, EnvConfigOverrideReset", "err", err, "appId", appId, "environmentId", environmentId) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + resourceName := handler.enforcerUtil.GetAppRBACNameByAppId(appId) + if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionDelete, resourceName); !ok { + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + return + } + object := handler.enforcerUtil.GetAppRBACByAppNameAndEnvId(app.AppName, environmentId) + if ok := handler.enforcer.Enforce(token, rbac.ResourceEnvironment, rbac.ActionDelete, object); !ok { + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + return + } + isSuccess, err := handler.propertiesConfigService.ResetEnvironmentProperties(id) + if err != nil { + handler.Logger.Errorw("service err, EnvConfigOverrideReset", "err", err, "appId", appId, "environmentId", environmentId) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + common.WriteJsonResp(w, err, isSuccess, http.StatusOK) +} + +func (handler PipelineConfigRestHandlerImpl) AppMetricsEnableDisable(w http.ResponseWriter, r *http.Request) { + decoder := json.NewDecoder(r.Body) + userId, err := handler.userAuthService.GetLoggedInUser(r) + if userId == 0 || err != nil { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + return + } + token := r.Header.Get("token") + vars := mux.Vars(r) + appId, err := strconv.Atoi(vars["appId"]) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + var appMetricEnableDisableRequest pipeline.AppMetricEnableDisableRequest + err = decoder.Decode(&appMetricEnableDisableRequest) + appMetricEnableDisableRequest.AppId = appId + appMetricEnableDisableRequest.UserId = userId + if err != nil { + handler.Logger.Errorw("request err, AppMetricsEnableDisable", "err", err, "appId", appId, "payload", appMetricEnableDisableRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + handler.Logger.Infow("request payload, AppMetricsEnableDisable", "err", err, "appId", appId, "payload", appMetricEnableDisableRequest) + app, err := handler.pipelineBuilder.GetApp(appId) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + resourceName := handler.enforcerUtil.GetAppRBACName(app.AppName) + if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionCreate, resourceName); !ok { + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + return + } + ctx, cancel := context.WithCancel(r.Context()) + if cn, ok := w.(http.CloseNotifier); ok { + go func(done <-chan struct{}, closed <-chan bool) { + select { + case <-done: + case <-closed: + cancel() + } + }(ctx.Done(), cn.CloseNotify()) + } + ctx = context.WithValue(r.Context(), "token", token) + createResp, err := handler.chartService.AppMetricsEnableDisable(appMetricEnableDisableRequest) + if err != nil { + handler.Logger.Errorw("service err, AppMetricsEnableDisable", "err", err, "appId", appId, "payload", appMetricEnableDisableRequest) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + common.WriteJsonResp(w, err, createResp, http.StatusOK) +} + +func (handler PipelineConfigRestHandlerImpl) EnvMetricsEnableDisable(w http.ResponseWriter, r *http.Request) { + userId, err := handler.userAuthService.GetLoggedInUser(r) + if userId == 0 || err != nil { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + return + } + token := r.Header.Get("token") + vars := mux.Vars(r) + appId, err := strconv.Atoi(vars["appId"]) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + environmentId, err := strconv.Atoi(vars["environmentId"]) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + decoder := json.NewDecoder(r.Body) + var appMetricEnableDisableRequest pipeline.AppMetricEnableDisableRequest + err = decoder.Decode(&appMetricEnableDisableRequest) + appMetricEnableDisableRequest.UserId = userId + appMetricEnableDisableRequest.AppId = appId + appMetricEnableDisableRequest.EnvironmentId = environmentId + if err != nil { + handler.Logger.Errorw("request err, EnvMetricsEnableDisable", "err", err, "appId", appId, "environmentId", environmentId, "payload", appMetricEnableDisableRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + handler.Logger.Infow("request payload, EnvMetricsEnableDisable", "err", err, "appId", appId, "environmentId", environmentId, "payload", appMetricEnableDisableRequest) + app, err := handler.pipelineBuilder.GetApp(appId) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + resourceName := handler.enforcerUtil.GetAppRBACNameByAppId(appId) + if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionCreate, resourceName); !ok { + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + return + } + object := handler.enforcerUtil.GetAppRBACByAppNameAndEnvId(app.AppName, appMetricEnableDisableRequest.EnvironmentId) + if ok := handler.enforcer.Enforce(token, rbac.ResourceEnvironment, rbac.ActionCreate, object); !ok { + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + return + } + createResp, err := handler.propertiesConfigService.EnvMetricsEnableDisable(&appMetricEnableDisableRequest) + if err != nil { + handler.Logger.Errorw("service err, EnvMetricsEnableDisable", "err", err, "appId", appId, "environmentId", environmentId, "payload", appMetricEnableDisableRequest) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + common.WriteJsonResp(w, err, createResp, http.StatusOK) +} + +func (handler *PipelineConfigRestHandlerImpl) ListDeploymentHistory(w http.ResponseWriter, r *http.Request) { + userId, err := handler.userAuthService.GetLoggedInUser(r) + if userId == 0 || err != nil { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + return + } + token := r.Header.Get("token") + vars := mux.Vars(r) + appId, err := strconv.Atoi(vars["appId"]) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + pipelineId, err := strconv.Atoi(vars["pipelineId"]) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + + environmentId, err := strconv.Atoi(vars["environmentId"]) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + + offsetQueryParam := r.URL.Query().Get("offset") + offset, err := strconv.Atoi(offsetQueryParam) + if offsetQueryParam == "" || err != nil { + handler.Logger.Errorw("request err, ListDeploymentHistory", "err", err, "appId", appId, "environmentId", environmentId, "pipelineId", pipelineId, "offset", offset) + common.WriteJsonResp(w, err, "invalid offset", http.StatusBadRequest) + return + } + sizeQueryParam := r.URL.Query().Get("size") + limit, err := strconv.Atoi(sizeQueryParam) + if sizeQueryParam == "" || err != nil { + handler.Logger.Errorw("request err, ListDeploymentHistory", "err", err, "appId", appId, "environmentId", environmentId, "pipelineId", pipelineId, "sizeQueryParam", sizeQueryParam) + common.WriteJsonResp(w, err, "invalid size", http.StatusBadRequest) + return + } + handler.Logger.Infow("request payload, ListDeploymentHistory", "err", err, "appId", appId, "environmentId", environmentId, "pipelineId", pipelineId, "offset", offset) + //RBAC CHECK + resourceName := handler.enforcerUtil.GetAppRBACNameByAppId(appId) + if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, resourceName); !ok { + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + return + } + //RBAC CHECK + + resp, err := handler.cdHandler.GetCdBuildHistory(appId, environmentId, pipelineId, offset, limit) + if err != nil { + handler.Logger.Errorw("service err, List", "err", err, "appId", appId, "environmentId", environmentId, "pipelineId", pipelineId, "offset", offset) + common.WriteJsonResp(w, err, resp, http.StatusInternalServerError) + return + } + + common.WriteJsonResp(w, err, resp, http.StatusOK) +} + +func (handler *PipelineConfigRestHandlerImpl) GetPrePostDeploymentLogs(w http.ResponseWriter, r *http.Request) { + userId, err := handler.userAuthService.GetLoggedInUser(r) + if userId == 0 || err != nil { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + return + } + token := r.Header.Get("token") + vars := mux.Vars(r) + appId, err := strconv.Atoi(vars["appId"]) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + environmentId, err := strconv.Atoi(vars["environmentId"]) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + pipelineId, err := strconv.Atoi(vars["pipelineId"]) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + + workflowId, err := strconv.Atoi(vars["workflowId"]) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + handler.Logger.Infow("request payload, GetPrePostDeploymentLogs", "err", err, "appId", appId, "environmentId", environmentId, "pipelineId", pipelineId, "workflowId", workflowId) + + //RBAC CHECK + resourceName := handler.enforcerUtil.GetAppRBACNameByAppId(appId) + if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, resourceName); !ok { + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + return + } + //RBAC CHECK + + logsReader, cleanUp, err := handler.cdHandler.GetRunningWorkflowLogs(environmentId, pipelineId, workflowId) + if err != nil { + handler.Logger.Errorw("service err, GetPrePostDeploymentLogs", "err", err, "appId", appId, "environmentId", environmentId, "pipelineId", pipelineId, "workflowId", workflowId) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + lastSeenMsgId := -1 + lastEventId := r.Header.Get("Last-Event-ID") + if len(lastEventId) > 0 { + lastSeenMsgId, err = strconv.Atoi(lastEventId) + if err != nil { + handler.Logger.Errorw("request err, GetPrePostDeploymentLogs", "err", err, "appId", appId, "environmentId", environmentId, "pipelineId", pipelineId, "workflowId", workflowId, "lastEventId", lastEventId) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + } + ctx, cancel := context.WithCancel(r.Context()) + if cn, ok := w.(http.CloseNotifier); ok { + go func(done <-chan struct{}, closed <-chan bool) { + select { + case <-done: + case <-closed: + cancel() + } + }(ctx.Done(), cn.CloseNotify()) + } + defer cancel() + defer cleanUp() + handler.streamOutput(w, logsReader, lastSeenMsgId) +} + +func (handler PipelineConfigRestHandlerImpl) FetchCdWorkflowDetails(w http.ResponseWriter, r *http.Request) { + userId, err := handler.userAuthService.GetLoggedInUser(r) + if userId == 0 || err != nil { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + return + } + token := r.Header.Get("token") + vars := mux.Vars(r) + appId, err := strconv.Atoi(vars["appId"]) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + environmentId, err := strconv.Atoi(vars["environmentId"]) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + pipelineId, err := strconv.Atoi(vars["pipelineId"]) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + buildId, err := strconv.Atoi(vars["workflowRunnerId"]) + if err != nil || buildId == 0 { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + handler.Logger.Infow("request payload, FetchCdWorkflowDetails", "err", err, "appId", appId, "environmentId", environmentId, "pipelineId", pipelineId, "buildId", buildId) + + //RBAC CHECK + resourceName := handler.enforcerUtil.GetAppRBACNameByAppId(appId) + if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, resourceName); !ok { + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + return + } + //RBAC CHECK + + resp, err := handler.cdHandler.FetchCdWorkflowDetails(appId, environmentId, pipelineId, buildId) + if err != nil { + handler.Logger.Errorw("service err, FetchCdWorkflowDetails", "err", err, "appId", appId, "environmentId", environmentId, "pipelineId", pipelineId, "buildId", buildId) + if util.IsErrNoRows(err) { + err = &util.ApiError{Code: "404", HttpStatusCode: http.StatusNotFound, UserMessage: "no workflow found"} + common.WriteJsonResp(w, err, nil, http.StatusOK) + } else { + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + } + return + } + common.WriteJsonResp(w, err, resp, http.StatusOK) +} + +func (handler PipelineConfigRestHandlerImpl) DownloadArtifacts(w http.ResponseWriter, r *http.Request) { + userId, err := handler.userAuthService.GetLoggedInUser(r) + if userId == 0 || err != nil { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + return + } + token := r.Header.Get("token") + vars := mux.Vars(r) + appId, err := strconv.Atoi(vars["appId"]) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + pipelineId, err := strconv.Atoi(vars["pipelineId"]) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + buildId, err := strconv.Atoi(vars["workflowRunnerId"]) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + handler.Logger.Infow("request payload, DownloadArtifacts", "err", err, "appId", appId, "pipelineId", pipelineId, "buildId", buildId) + + //RBAC CHECK + resourceName := handler.enforcerUtil.GetAppRBACNameByAppId(appId) + if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, resourceName); !ok { + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + return + } + object := handler.enforcerUtil.GetAppRBACByAppIdAndPipelineId(appId, pipelineId) + if ok := handler.enforcer.Enforce(token, rbac.ResourceEnvironment, rbac.ActionGet, object); !ok { + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + return + } + //RBAC CHECK + + file, err := handler.cdHandler.DownloadCdWorkflowArtifacts(pipelineId, buildId) + defer file.Close() + + if err != nil { + handler.Logger.Errorw("service err, DownloadArtifacts", "err", err, "appId", appId, "pipelineId", pipelineId, "buildId", buildId) + if util.IsErrNoRows(err) { + err = &util.ApiError{Code: "404", HttpStatusCode: 200, UserMessage: "no workflow found"} + common.WriteJsonResp(w, err, nil, http.StatusOK) + } else { + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + } + return + } + w.Header().Set("Content-Disposition", "attachment; filename="+strconv.Itoa(buildId)+".zip") + w.Header().Set("Content-Type", "application/octet-stream") + w.Header().Set("Content-Length", r.Header.Get("Content-Length")) + _, err = io.Copy(w, file) + if err != nil { + handler.Logger.Errorw("service err, DownloadArtifacts", "err", err, "appId", appId, "pipelineId", pipelineId, "buildId", buildId) + } +} + +func (handler PipelineConfigRestHandlerImpl) GetStageStatus(w http.ResponseWriter, r *http.Request) { + userId, err := handler.userAuthService.GetLoggedInUser(r) + if userId == 0 || err != nil { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + return + } + token := r.Header.Get("token") + vars := mux.Vars(r) + appId, err := strconv.Atoi(vars["appId"]) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + pipelineId, err := strconv.Atoi(vars["pipelineId"]) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + handler.Logger.Infow("request payload, GetStageStatus", "err", err, "appId", appId, "pipelineId", pipelineId) + + //RBAC CHECK + resourceName := handler.enforcerUtil.GetAppRBACNameByAppId(appId) + if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, resourceName); !ok { + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + return + } + object := handler.enforcerUtil.GetAppRBACByAppIdAndPipelineId(appId, pipelineId) + if ok := handler.enforcer.Enforce(token, rbac.ResourceEnvironment, rbac.ActionGet, object); !ok { + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + return + } + //RBAC CHECK + + resp, err := handler.cdHandler.FetchCdPrePostStageStatus(pipelineId) + if err != nil { + handler.Logger.Errorw("service err, GetStageStatus", "err", err, "appId", appId, "pipelineId", pipelineId) + if util.IsErrNoRows(err) { + err = &util.ApiError{Code: "404", HttpStatusCode: 200, UserMessage: "no status found"} + common.WriteJsonResp(w, err, nil, http.StatusOK) + } else { + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + } + return + } + common.WriteJsonResp(w, err, resp, http.StatusOK) +} + +func (handler PipelineConfigRestHandlerImpl) GetConfigmapSecretsForDeploymentStages(w http.ResponseWriter, r *http.Request) { + userId, err := handler.userAuthService.GetLoggedInUser(r) + if userId == 0 || err != nil { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + return + } + vars := mux.Vars(r) + pipelineId, err := strconv.Atoi(vars["pipelineId"]) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + handler.Logger.Infow("request payload, GetConfigmapSecretsForDeploymentStages", "err", err, "pipelineId", pipelineId) + deploymentPipeline, err := handler.pipelineBuilder.FindPipelineById(pipelineId) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + + resp, err := handler.pipelineBuilder.FetchConfigmapSecretsForCdStages(deploymentPipeline.AppId, deploymentPipeline.EnvironmentId, pipelineId) + if err != nil { + handler.Logger.Errorw("service err, GetConfigmapSecretsForDeploymentStages", "err", err, "pipelineId", pipelineId) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + common.WriteJsonResp(w, err, resp, http.StatusOK) +} + +func (handler PipelineConfigRestHandlerImpl) GetCdPipelineById(w http.ResponseWriter, r *http.Request) { + token := r.Header.Get("token") + vars := mux.Vars(r) + appId, err := strconv.Atoi(vars["appId"]) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + pipelineId, err := strconv.Atoi(vars["pipelineId"]) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + handler.Logger.Infow("request payload, GetCdPipelineById", "err", err, "appId", appId, "pipelineId", pipelineId) + app, err := handler.pipelineBuilder.GetApp(appId) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + resourceName := handler.enforcerUtil.GetAppRBACName(app.AppName) + if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, resourceName); !ok { + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + return + } + ciConf, err := handler.pipelineBuilder.GetCdPipelineById(pipelineId) + if err != nil { + handler.Logger.Errorw("service err, GetCdPipelineById", "err", err, "appId", appId, "pipelineId", pipelineId) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + common.WriteJsonResp(w, err, ciConf, http.StatusOK) +} + diff --git a/api/restHandler/pipeline/PipelineConfigRestHandler.go b/api/restHandler/pipeline/PipelineConfigRestHandler.go new file mode 100644 index 0000000000..c26a1f356d --- /dev/null +++ b/api/restHandler/pipeline/PipelineConfigRestHandler.go @@ -0,0 +1,1175 @@ +/* + * Copyright (c) 2020 Devtron Labs + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package pipeline + +import ( + "bufio" + "context" + "encoding/json" + "fmt" + "github.com/devtron-labs/devtron/api/restHandler/common" + "io" + "net/http" + "strconv" + "strings" + + bean2 "github.com/devtron-labs/devtron/api/bean" + "github.com/devtron-labs/devtron/client/argocdServer/application" + "github.com/devtron-labs/devtron/client/gitSensor" + "github.com/devtron-labs/devtron/internal/sql/repository" + "github.com/devtron-labs/devtron/internal/sql/repository/pipelineConfig" + "github.com/devtron-labs/devtron/internal/sql/repository/security" + "github.com/devtron-labs/devtron/internal/util" + "github.com/devtron-labs/devtron/pkg/appClone" + "github.com/devtron-labs/devtron/pkg/appWorkflow" + "github.com/devtron-labs/devtron/pkg/bean" + request "github.com/devtron-labs/devtron/pkg/cluster" + "github.com/devtron-labs/devtron/pkg/pipeline" + security2 "github.com/devtron-labs/devtron/pkg/security" + "github.com/devtron-labs/devtron/pkg/team" + "github.com/devtron-labs/devtron/pkg/user" + util2 "github.com/devtron-labs/devtron/util" + "github.com/devtron-labs/devtron/util/rbac" + "github.com/go-pg/pg" + "github.com/gorilla/mux" + "github.com/grpc-ecosystem/grpc-gateway/runtime" + "go.uber.org/zap" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + "gopkg.in/go-playground/validator.v9" +) + +type DevtronAppAutoCompleteRestHandler interface { + GitListAutocomplete(w http.ResponseWriter, r *http.Request) + DockerListAutocomplete(w http.ResponseWriter, r *http.Request) + TeamListAutocomplete(w http.ResponseWriter, r *http.Request) + EnvironmentListAutocomplete(w http.ResponseWriter, r *http.Request) + GetAppListForAutocomplete(w http.ResponseWriter, r *http.Request) +} + +type DevtronAppRestHandler interface { + CreateApp(w http.ResponseWriter, r *http.Request) + DeleteApp(w http.ResponseWriter, r *http.Request) + GetApp(w http.ResponseWriter, r *http.Request) + + FindAppsByTeamId(w http.ResponseWriter, r *http.Request) + FindAppsByTeamName(w http.ResponseWriter, r *http.Request) + GetAppListByTeamIds(w http.ResponseWriter, r *http.Request) +} + +type DevtronAppWorkflowRestHandler interface { + FetchWorkflowDetails(w http.ResponseWriter, r *http.Request) + FetchAppWorkflowStatusForTriggerView(w http.ResponseWriter, r *http.Request) +} + +type PipelineConfigRestHandler interface { + DevtronAppAutoCompleteRestHandler + DevtronAppRestHandler + DevtronAppWorkflowRestHandler + DevtronAppBuildRestHandler + DevtronAppBuildMaterialRestHandler + DevtronAppBuildHistoryRestHandler + DevtronAppDeploymentRestHandler + DevtronAppDeploymentHistoryRestHandler + DevtronAppPrePostDeploymentRestHandler + DevtronAppDeploymentConfigRestHandler + + EnvConfigOverrideCreateNamespace(w http.ResponseWriter, r *http.Request) + PipelineNameSuggestion(w http.ResponseWriter, r *http.Request) +} + +type PipelineConfigRestHandlerImpl struct { + pipelineBuilder pipeline.PipelineBuilder + ciPipelineRepository pipelineConfig.CiPipelineRepository + ciHandler pipeline.CiHandler + Logger *zap.SugaredLogger + chartService pipeline.ChartService + propertiesConfigService pipeline.PropertiesConfigService + dbMigrationService pipeline.DbMigrationService + application application.ServiceClient + userAuthService user.UserService + validator *validator.Validate + teamService team.TeamService + enforcer rbac.Enforcer + gitSensorClient gitSensor.GitSensorClient + pipelineRepository pipelineConfig.PipelineRepository + appWorkflowService appWorkflow.AppWorkflowService + enforcerUtil rbac.EnforcerUtil + envService request.EnvironmentService + gitRegistryConfig pipeline.GitRegistryConfig + dockerRegistryConfig pipeline.DockerRegistryConfig + cdHandler pipeline.CdHandler + appCloneService appClone.AppCloneService + materialRepository pipelineConfig.MaterialRepository + policyService security2.PolicyService + scanResultRepository security.ImageScanResultRepository + gitProviderRepo repository.GitProviderRepository +} + +func NewPipelineRestHandlerImpl(pipelineBuilder pipeline.PipelineBuilder, Logger *zap.SugaredLogger, + chartService pipeline.ChartService, + propertiesConfigService pipeline.PropertiesConfigService, + dbMigrationService pipeline.DbMigrationService, + application application.ServiceClient, + userAuthService user.UserService, + teamService team.TeamService, + enforcer rbac.Enforcer, + ciHandler pipeline.CiHandler, + validator *validator.Validate, + gitSensorClient gitSensor.GitSensorClient, + ciPipelineRepository pipelineConfig.CiPipelineRepository, pipelineRepository pipelineConfig.PipelineRepository, + enforcerUtil rbac.EnforcerUtil, envService request.EnvironmentService, + gitRegistryConfig pipeline.GitRegistryConfig, dockerRegistryConfig pipeline.DockerRegistryConfig, + cdHandler pipeline.CdHandler, + appCloneService appClone.AppCloneService, + appWorkflowService appWorkflow.AppWorkflowService, + materialRepository pipelineConfig.MaterialRepository, policyService security2.PolicyService, + scanResultRepository security.ImageScanResultRepository, gitProviderRepo repository.GitProviderRepository) *PipelineConfigRestHandlerImpl { + return &PipelineConfigRestHandlerImpl{ + pipelineBuilder: pipelineBuilder, + Logger: Logger, + chartService: chartService, + propertiesConfigService: propertiesConfigService, + dbMigrationService: dbMigrationService, + application: application, + userAuthService: userAuthService, + validator: validator, + teamService: teamService, + enforcer: enforcer, + ciHandler: ciHandler, + gitSensorClient: gitSensorClient, + ciPipelineRepository: ciPipelineRepository, + pipelineRepository: pipelineRepository, + enforcerUtil: enforcerUtil, + envService: envService, + gitRegistryConfig: gitRegistryConfig, + dockerRegistryConfig: dockerRegistryConfig, + cdHandler: cdHandler, + appCloneService: appCloneService, + appWorkflowService: appWorkflowService, + materialRepository: materialRepository, + policyService: policyService, + scanResultRepository: scanResultRepository, + gitProviderRepo: gitProviderRepo, + } +} + +const ( + devtron = "DEVTRON" + SSH_URL_PREFIX = "git@" + HTTPS_URL_PREFIX = "https://" +) + +func (handler PipelineConfigRestHandlerImpl) DeleteApp(w http.ResponseWriter, r *http.Request) { + token := r.Header.Get("token") + userId, err := handler.userAuthService.GetLoggedInUser(r) + if userId == 0 || err != nil { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + return + } + vars := mux.Vars(r) + appId, err := strconv.Atoi(vars["appId"]) + if err != nil { + handler.Logger.Errorw("request err, delete app", "err", err, "appId", appId) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + handler.Logger.Infow("request payload, delete app", "appId", appId) + wfs, err := handler.appWorkflowService.FindAppWorkflows(appId) + if err != nil { + handler.Logger.Errorw("could not fetch wfs", "err", err, "appId", appId) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + if len(wfs) != 0 { + handler.Logger.Info("cannot delete app with workflow's") + err = &util.ApiError{Code: "400", HttpStatusCode: 400, UserMessage: "cannot delete app having workflow's"} + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + + resourceObject := handler.enforcerUtil.GetAppRBACNameByAppId(appId) + if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionDelete, resourceObject); !ok { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden) + return + } + + err = handler.pipelineBuilder.DeleteApp(appId, userId) + if err != nil { + handler.Logger.Errorw("service error, delete app", "err", err, "appId", appId) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + common.WriteJsonResp(w, err, nil, http.StatusOK) +} + +func (handler PipelineConfigRestHandlerImpl) CreateApp(w http.ResponseWriter, r *http.Request) { + token := r.Header.Get("token") + decoder := json.NewDecoder(r.Body) + userId, err := handler.userAuthService.GetLoggedInUser(r) + if userId == 0 || err != nil { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + return + } + var createRequest bean.CreateAppDTO + err = decoder.Decode(&createRequest) + createRequest.UserId = userId + if err != nil { + handler.Logger.Errorw("request err, CreateApp", "err", err, "CreateApp", createRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + + handler.Logger.Infow("request payload, CreateApp", "CreateApp", createRequest) + err = handler.validator.Struct(createRequest) + if err != nil { + handler.Logger.Errorw("validation err, CreateApp", "err", err, "CreateApp", createRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + + project, err := handler.teamService.FetchOne(createRequest.TeamId) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + // with admin roles, you have to access for all the apps of the project to create new app. (admin or manager with specific app permission can't create app.) + if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionCreate, fmt.Sprintf("%s/%s", strings.ToLower(project.Name), "*")); !ok { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden) + return + } + var createResp *bean.CreateAppDTO + err = nil + if createRequest.TemplateId == 0 { + createResp, err = handler.pipelineBuilder.CreateApp(&createRequest) + } else { + ctx, cancel := context.WithCancel(r.Context()) + if cn, ok := w.(http.CloseNotifier); ok { + go func(done <-chan struct{}, closed <-chan bool) { + select { + case <-done: + case <-closed: + cancel() + } + }(ctx.Done(), cn.CloseNotify()) + } + ctx = context.WithValue(r.Context(), "token", token) + createResp, err = handler.appCloneService.CloneApp(&createRequest, ctx) + } + if err != nil { + handler.Logger.Errorw("service err, CreateApp", "err", err, "CreateApp", createRequest) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + common.WriteJsonResp(w, err, createResp, http.StatusOK) +} + +func (handler PipelineConfigRestHandlerImpl) ValidateGitMaterialUrl(gitProviderId int, url string) (bool, error) { + gitProvider, err := handler.gitProviderRepo.FindOne(strconv.Itoa(gitProviderId)) + if err != nil { + return false, err + } + if gitProvider.AuthMode == repository.AUTH_MODE_SSH { + hasPrefixResult := strings.HasPrefix(url, SSH_URL_PREFIX) + return hasPrefixResult, nil + } + hasPrefixResult := strings.HasPrefix(url, HTTPS_URL_PREFIX) + return hasPrefixResult, nil +} + +func (handler PipelineConfigRestHandlerImpl) GetApp(w http.ResponseWriter, r *http.Request) { + token := r.Header.Get("token") + vars := mux.Vars(r) + appId, err := strconv.Atoi(vars["appId"]) + if err != nil { + handler.Logger.Errorw("request err, get app", "err", err, "appId", appId) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + handler.Logger.Infow("request payload, get app", "appId", appId) + ciConf, err := handler.pipelineBuilder.GetApp(appId) + if err != nil { + handler.Logger.Errorw("service err, get app", "err", err, "appId", appId) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + + //rbac implementation starts here + object := handler.enforcerUtil.GetAppRBACNameByAppId(appId) + if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); !ok { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden) + return + } + //rbac implementation ends here + + common.WriteJsonResp(w, err, ciConf, http.StatusOK) +} + +func (handler PipelineConfigRestHandlerImpl) FindAppsByTeamId(w http.ResponseWriter, r *http.Request) { + vars := mux.Vars(r) + teamId, err := strconv.Atoi(vars["teamId"]) + if err != nil { + handler.Logger.Errorw("request err, FindAppsByTeamId", "err", err, "teamId", teamId) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + handler.Logger.Infow("request payload, FindAppsByTeamId", "teamId", teamId) + project, err := handler.pipelineBuilder.FindAppsByTeamId(teamId) + if err != nil { + handler.Logger.Errorw("service err, FindAppsByTeamId", "err", err, "teamId", teamId) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + common.WriteJsonResp(w, err, project, http.StatusOK) +} + +func (handler PipelineConfigRestHandlerImpl) FindAppsByTeamName(w http.ResponseWriter, r *http.Request) { + vars := mux.Vars(r) + teamName := vars["teamName"] + handler.Logger.Infow("request payload, FindAppsByTeamName", "teamName", teamName) + project, err := handler.pipelineBuilder.FindAppsByTeamName(teamName) + if err != nil { + handler.Logger.Errorw("service err, FindAppsByTeamName", "err", err, "teamName", teamName) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + common.WriteJsonResp(w, err, project, http.StatusOK) +} + +func (handler PipelineConfigRestHandlerImpl) FetchWorkflowDetails(w http.ResponseWriter, r *http.Request) { + userId, err := handler.userAuthService.GetLoggedInUser(r) + if userId == 0 || err != nil { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + return + } + vars := mux.Vars(r) + appId, err := strconv.Atoi(vars["appId"]) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + pipelineId, err := strconv.Atoi(vars["pipelineId"]) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + buildId, err := strconv.Atoi(vars["workflowId"]) + if err != nil || buildId == 0 { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + handler.Logger.Infow("request payload, FetchWorkflowDetails", "appId", appId, "pipelineId", pipelineId, "buildId", buildId, "buildId", buildId) + ciPipeline, err := handler.ciPipelineRepository.FindById(pipelineId) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + //RBAC + token := r.Header.Get("token") + object := handler.enforcerUtil.GetAppRBACNameByAppId(ciPipeline.AppId) + if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); !ok { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden) + return + } + //RBAC + resp, err := handler.ciHandler.FetchWorkflowDetails(appId, pipelineId, buildId) + if err != nil { + handler.Logger.Errorw("service err, FetchWorkflowDetails", "err", err, "appId", appId, "pipelineId", pipelineId, "buildId", buildId, "buildId", buildId) + if util.IsErrNoRows(err) { + err = &util.ApiError{Code: "404", HttpStatusCode: http.StatusNotFound, UserMessage: "no workflow found"} + common.WriteJsonResp(w, err, nil, http.StatusOK) + } else { + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + } + return + } + common.WriteJsonResp(w, err, resp, http.StatusOK) +} + +func (handler PipelineConfigRestHandlerImpl) CancelStage(w http.ResponseWriter, r *http.Request) { + userId, err := handler.userAuthService.GetLoggedInUser(r) + if userId == 0 || err != nil { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + return + } + vars := mux.Vars(r) + pipelineId, err := strconv.Atoi(vars["pipelineId"]) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + workflowRunnerId, err := strconv.Atoi(vars["workflowRunnerId"]) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + cdPipeline, err := handler.pipelineRepository.FindById(pipelineId) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + handler.Logger.Infow("request payload, CancelStage", "pipelineId", pipelineId, "workflowRunnerId", workflowRunnerId) + + //RBAC + token := r.Header.Get("token") + object := handler.enforcerUtil.GetAppRBACNameByAppId(cdPipeline.AppId) + if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionTrigger, object); !ok { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden) + return + } + //RBAC + + resp, err := handler.cdHandler.CancelStage(workflowRunnerId) + if err != nil { + handler.Logger.Errorw("service err, CancelStage", "err", err, "pipelineId", pipelineId, "workflowRunnerId", workflowRunnerId) + if util.IsErrNoRows(err) { + common.WriteJsonResp(w, err, nil, http.StatusNotFound) + } else { + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + } + return + } + common.WriteJsonResp(w, err, resp, http.StatusOK) +} + +func (handler PipelineConfigRestHandlerImpl) CancelWorkflow(w http.ResponseWriter, r *http.Request) { + userId, err := handler.userAuthService.GetLoggedInUser(r) + if userId == 0 || err != nil { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + return + } + vars := mux.Vars(r) + workflowId, err := strconv.Atoi(vars["workflowId"]) + if err != nil { + handler.Logger.Errorw("request err, CancelWorkflow", "err", err, "workflowId", workflowId) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + pipelineId, err := strconv.Atoi(vars["pipelineId"]) + if err != nil { + handler.Logger.Errorw("request err, CancelWorkflow", "err", err, "pipelineId", pipelineId) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + handler.Logger.Infow("request payload, CancelWorkflow", "workflowId", workflowId, "pipelineId", pipelineId) + + ciPipeline, err := handler.ciPipelineRepository.FindById(pipelineId) + if err != nil { + handler.Logger.Errorw("service err, CancelWorkflow", "err", err, "workflowId", workflowId, "pipelineId", pipelineId) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + //RBAC + token := r.Header.Get("token") + object := handler.enforcerUtil.GetAppRBACNameByAppId(ciPipeline.AppId) + if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionTrigger, object); !ok { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden) + return + } + //RBAC + + resp, err := handler.ciHandler.CancelBuild(workflowId) + if err != nil { + handler.Logger.Errorw("service err, CancelWorkflow", "err", err, "workflowId", workflowId, "pipelineId", pipelineId) + if util.IsErrNoRows(err) { + common.WriteJsonResp(w, err, nil, http.StatusNotFound) + } else { + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + } + return + } + common.WriteJsonResp(w, err, resp, http.StatusOK) +} + +// FetchChanges FIXME check if deprecated +func (handler PipelineConfigRestHandlerImpl) FetchChanges(w http.ResponseWriter, r *http.Request) { + userId, err := handler.userAuthService.GetLoggedInUser(r) + if userId == 0 || err != nil { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + return + } + vars := mux.Vars(r) + ciMaterialId, err := strconv.Atoi(vars["ciMaterialId"]) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + + pipelineId, err := strconv.Atoi(vars["pipelineId"]) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + handler.Logger.Infow("request payload, FetchChanges", "ciMaterialId", ciMaterialId, "pipelineId", pipelineId) + ciPipeline, err := handler.ciPipelineRepository.FindById(pipelineId) + if err != nil { + handler.Logger.Errorw("request err, FetchChanges", "err", err, "ciMaterialId", ciMaterialId, "pipelineId", pipelineId) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + //RBAC + token := r.Header.Get("token") + object := handler.enforcerUtil.GetAppRBACNameByAppId(ciPipeline.AppId) + if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); !ok { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden) + return + } + //RBAC + + changeRequest := &gitSensor.FetchScmChangesRequest{ + PipelineMaterialId: ciMaterialId, + } + changes, err := handler.gitSensorClient.FetchChanges(changeRequest) + if err != nil { + handler.Logger.Errorw("service err, FetchChanges", "err", err, "ciMaterialId", ciMaterialId, "pipelineId", pipelineId) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + common.WriteJsonResp(w, err, changes.Commits, http.StatusCreated) +} + +func (handler *PipelineConfigRestHandlerImpl) streamOutput(w http.ResponseWriter, reader *bufio.Reader, lastSeenMsgId int) { + f, ok := w.(http.Flusher) + if !ok { + http.Error(w, "unexpected server doesnt support streaming", http.StatusInternalServerError) + } + + // Important to make it work in browsers + w.Header().Set("Connection", "keep-alive") + w.Header().Set("Cache-Control", "no-cache") + w.Header().Set("Transfer-Encoding", "chunked") + w.Header().Set("Content-Type", "text/event-stream") + w.Header().Set("X-Accel-Buffering", "no") + w.Header().Set("X-Content-Type-Options", "nosniff") + + //var wroteHeader bool + startOfStream := []byte("START_OF_STREAM") + endOfStreamEvent := []byte("END_OF_STREAM") + reconnectEvent := []byte("RECONNECT_STREAM") + unexpectedEndOfStreamEvent := []byte("UNEXPECTED_END_OF_STREAM") + streamStarted := false + msgCounter := 0 + if lastSeenMsgId == -1 { + handler.sendData(startOfStream, w, msgCounter) + handler.sendEvent(startOfStream, w) + f.Flush() + } else { + handler.sendEvent(reconnectEvent, w) + f.Flush() + } + + for { + data, err := reader.ReadBytes('\n') + if err == io.EOF { + if streamStarted { + handler.sendData(endOfStreamEvent, w, msgCounter) + handler.sendEvent(endOfStreamEvent, w) + f.Flush() + return + } + return + } + if err != nil { + //TODO handle error + handler.sendData(unexpectedEndOfStreamEvent, w, msgCounter) + handler.sendEvent(unexpectedEndOfStreamEvent, w) + f.Flush() + return + } + msgCounter = msgCounter + 1 + //skip for seen msg + if msgCounter <= lastSeenMsgId { + continue + } + if strings.Contains(string(data), devtron) { + continue + } + + var res []byte + res = append(res, "id:"...) + res = append(res, fmt.Sprintf("%d\n", msgCounter)...) + res = append(res, "data:"...) + res = append(res, data...) + res = append(res, '\n') + + if _, err = w.Write(res); err != nil { + //TODO handle error + handler.Logger.Errorw("Failed to send response chunk, streamOutput", "err", err) + handler.sendData(unexpectedEndOfStreamEvent, w, msgCounter) + handler.sendEvent(unexpectedEndOfStreamEvent, w) + f.Flush() + return + } + streamStarted = true + f.Flush() + } +} + +func (handler *PipelineConfigRestHandlerImpl) sendEvent(event []byte, w http.ResponseWriter) { + var res []byte + res = append(res, "event:"...) + res = append(res, event...) + res = append(res, '\n') + res = append(res, "data:"...) + res = append(res, '\n', '\n') + + if _, err := w.Write(res); err != nil { + handler.Logger.Debugf("Failed to send response chunk: %v", err) + return + } + +} +func (handler *PipelineConfigRestHandlerImpl) sendData(event []byte, w http.ResponseWriter, msgId int) { + var res []byte + res = append(res, "id:"...) + res = append(res, fmt.Sprintf("%d\n", msgId)...) + res = append(res, "data:"...) + res = append(res, event...) + res = append(res, '\n', '\n') + if _, err := w.Write(res); err != nil { + handler.Logger.Errorw("Failed to send response chunk, sendData", "err", err) + return + } +} + +func (handler *PipelineConfigRestHandlerImpl) handleForwardResponseStreamError(wroteHeader bool, w http.ResponseWriter, err error) { + code := "000" + if !wroteHeader { + s, ok := status.FromError(err) + if !ok { + s = status.New(codes.Unknown, err.Error()) + } + w.WriteHeader(runtime.HTTPStatusFromCode(s.Code())) + code = fmt.Sprint(s.Code()) + } + response := bean2.Response{} + apiErr := bean2.ApiError{} + apiErr.Code = code // 000=unknown + apiErr.InternalMessage = err.Error() + response.Errors = []bean2.ApiError{apiErr} + buf, err2 := json.Marshal(response) + if err2 != nil { + handler.Logger.Errorw("marshal err, handleForwardResponseStreamError", "err", err2, "response", response) + } + if _, err3 := w.Write(buf); err3 != nil { + handler.Logger.Errorw("Failed to notify error to client, handleForwardResponseStreamError", "err", err3, "response", response) + return + } +} + +func (handler PipelineConfigRestHandlerImpl) GetAppListForAutocomplete(w http.ResponseWriter, r *http.Request) { + userId, err := handler.userAuthService.GetLoggedInUser(r) + if userId == 0 || err != nil { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + return + } + v := r.URL.Query() + teamId := v.Get("teamId") + handler.Logger.Infow("request payload, GetAppListForAutocomplete", "teamId", teamId) + var apps []pipeline.AppBean + if len(teamId) == 0 { + apps, err = handler.pipelineBuilder.GetAppList() + if err != nil { + handler.Logger.Errorw("service err, GetAppListForAutocomplete", "err", err, "teamId", teamId) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + } else { + teamId, err := strconv.Atoi(teamId) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } else { + apps, err = handler.pipelineBuilder.FindAppsByTeamId(teamId) + if err != nil { + handler.Logger.Errorw("service err, GetAppListForAutocomplete", "err", err, "teamId", teamId) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + } + } + + token := r.Header.Get("token") + var accessedApps []pipeline.AppBean + // RBAC + objects := handler.enforcerUtil.GetRbacObjectsForAllApps() + for _, app := range apps { + object := objects[app.Id] + if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); ok { + accessedApps = append(accessedApps, app) + } + } + // RBAC + if len(accessedApps) == 0 { + accessedApps = make([]pipeline.AppBean, 0) + } + common.WriteJsonResp(w, err, accessedApps, http.StatusOK) +} + +func (handler PipelineConfigRestHandlerImpl) GetAppListByTeamIds(w http.ResponseWriter, r *http.Request) { + userId, err := handler.userAuthService.GetLoggedInUser(r) + if userId == 0 || err != nil { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + return + } + //vars := mux.Vars(r) + v := r.URL.Query() + params := v.Get("teamIds") + if len(params) == 0 { + common.WriteJsonResp(w, err, "StatusBadRequest", http.StatusBadRequest) + return + } + handler.Logger.Infow("request payload, GetAppListByTeamIds", "payload", params) + var teamIds []int + teamIdList := strings.Split(params, ",") + for _, item := range teamIdList { + teamId, err := strconv.Atoi(item) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + teamIds = append(teamIds, teamId) + } + projectWiseApps, err := handler.pipelineBuilder.GetAppListByTeamIds(teamIds) + if err != nil { + handler.Logger.Errorw("service err, GetAppListByTeamIds", "err", err, "payload", params) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + + token := r.Header.Get("token") + // RBAC + for _, project := range projectWiseApps { + var accessedApps []*pipeline.AppBean + for _, app := range project.AppList { + object := fmt.Sprintf("%s/%s", project.ProjectName, app.Name) + if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); ok { + accessedApps = append(accessedApps, app) + } + } + if len(accessedApps) == 0 { + accessedApps = make([]*pipeline.AppBean, 0) + } + project.AppList = accessedApps + } + // RBAC + common.WriteJsonResp(w, err, projectWiseApps, http.StatusOK) +} + +func (handler PipelineConfigRestHandlerImpl) EnvironmentListAutocomplete(w http.ResponseWriter, r *http.Request) { + token := r.Header.Get("token") + vars := mux.Vars(r) + appId, err := strconv.Atoi(vars["appId"]) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + handler.Logger.Infow("request payload, EnvironmentListAutocomplete", "appId", appId) + //RBAC + object := handler.enforcerUtil.GetAppRBACNameByAppId(appId) + if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); !ok { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden) + return + } + //RBAC + result, err := handler.envService.GetEnvironmentListForAutocomplete() + if err != nil { + handler.Logger.Errorw("service err, EnvironmentListAutocomplete", "err", err, "appId", appId) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + common.WriteJsonResp(w, err, result, http.StatusOK) +} + +func (handler PipelineConfigRestHandlerImpl) GitListAutocomplete(w http.ResponseWriter, r *http.Request) { + token := r.Header.Get("token") + vars := mux.Vars(r) + appId, err := strconv.Atoi(vars["appId"]) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + handler.Logger.Infow("request payload, GitListAutocomplete", "appId", appId) + //RBAC + object := handler.enforcerUtil.GetAppRBACNameByAppId(appId) + if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); !ok { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden) + return + } + //RBAC + res, err := handler.gitRegistryConfig.GetAll() + if err != nil { + handler.Logger.Errorw("service err, GitListAutocomplete", "err", err, "appId", appId) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + + common.WriteJsonResp(w, err, res, http.StatusOK) +} + +func (handler PipelineConfigRestHandlerImpl) DockerListAutocomplete(w http.ResponseWriter, r *http.Request) { + token := r.Header.Get("token") + vars := mux.Vars(r) + appId, err := strconv.Atoi(vars["appId"]) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + handler.Logger.Infow("request payload, DockerListAutocomplete", "appId", appId) + //RBAC + object := handler.enforcerUtil.GetAppRBACNameByAppId(appId) + if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); !ok { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden) + return + } + //RBAC + res, err := handler.dockerRegistryConfig.ListAllActive() + if err != nil { + handler.Logger.Errorw("service err, DockerListAutocomplete", "err", err, "appId", appId) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + + common.WriteJsonResp(w, err, res, http.StatusOK) +} + +func (handler PipelineConfigRestHandlerImpl) TeamListAutocomplete(w http.ResponseWriter, r *http.Request) { + token := r.Header.Get("token") + vars := mux.Vars(r) + appId, err := strconv.Atoi(vars["appId"]) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + handler.Logger.Infow("request payload, TeamListAutocomplete", "appId", appId) + //RBAC + object := handler.enforcerUtil.GetAppRBACNameByAppId(appId) + if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); !ok { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden) + return + } + //RBAC + result, err := handler.teamService.FetchForAutocomplete() + if err != nil { + handler.Logger.Errorw("service err, TeamListAutocomplete", "err", err, "appId", appId) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + + common.WriteJsonResp(w, err, result, http.StatusOK) +} + +func (handler PipelineConfigRestHandlerImpl) IsReadyToTrigger(w http.ResponseWriter, r *http.Request) { + token := r.Header.Get("token") + vars := mux.Vars(r) + appId, err := strconv.Atoi(vars["appId"]) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + envId, err := strconv.Atoi(vars["envId"]) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + pipelineId, err := strconv.Atoi(vars["pipelineId"]) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + handler.Logger.Infow("request payload, IsReadyToTrigger", "appId", appId, "envId", envId, "pipelineId", pipelineId) + //RBAC + object := handler.enforcerUtil.GetAppRBACNameByAppId(appId) + if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); !ok { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden) + return + } + object = handler.enforcerUtil.GetEnvRBACNameByAppId(appId, envId) + if ok := handler.enforcer.Enforce(token, rbac.ResourceEnvironment, rbac.ActionGet, strings.ToLower(object)); !ok { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden) + return + } + //RBAC + + result, err := handler.chartService.IsReadyToTrigger(appId, envId, pipelineId) + if err != nil { + handler.Logger.Errorw("service err, IsReadyToTrigger", "err", err, "appId", appId, "envId", envId, "pipelineId", pipelineId) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + common.WriteJsonResp(w, err, result, http.StatusOK) +} + +func (handler PipelineConfigRestHandlerImpl) GetDeploymentPipelineStrategy(w http.ResponseWriter, r *http.Request) { + token := r.Header.Get("token") + vars := mux.Vars(r) + appId, err := strconv.Atoi(vars["appId"]) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + handler.Logger.Infow("request payload, GetDeploymentPipelineStrategy", "appId", appId) + //RBAC + object := handler.enforcerUtil.GetAppRBACNameByAppId(appId) + if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); !ok { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden) + return + } + //RBAC + + result, err := handler.pipelineBuilder.FetchCDPipelineStrategy(appId) + if err != nil { + handler.Logger.Errorw("service err, GetDeploymentPipelineStrategy", "err", err, "appId", appId) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + + common.WriteJsonResp(w, err, result, http.StatusOK) +} + +func (handler PipelineConfigRestHandlerImpl) UpgradeForAllApps(w http.ResponseWriter, r *http.Request) { + userId, err := handler.userAuthService.GetLoggedInUser(r) + if userId == 0 || err != nil { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + return + } + vars := mux.Vars(r) + chartRefId, err := strconv.Atoi(vars["chartRefId"]) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + + decoder := json.NewDecoder(r.Body) + var chartUpgradeRequest pipeline.ChartUpgradeRequest + err = decoder.Decode(&chartUpgradeRequest) + if err != nil { + handler.Logger.Errorw("request err, UpgradeForAllApps", "err", err, "payload", chartUpgradeRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + chartUpgradeRequest.ChartRefId = chartRefId + chartUpgradeRequest.UserId = userId + handler.Logger.Infow("request payload, UpgradeForAllApps", "payload", chartUpgradeRequest) + token := r.Header.Get("token") + if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionCreate, "*/*"); !ok { + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + return + } + if ok := handler.enforcer.Enforce(token, rbac.ResourceEnvironment, rbac.ActionCreate, "*/*"); !ok { + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + return + } + + newAppOverride, err := handler.chartService.GetAppOverrideForDefaultTemplate(chartUpgradeRequest.ChartRefId) + if err != nil { + handler.Logger.Errorw("service err, UpgradeForAllApps", "err", err, "payload", chartUpgradeRequest) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + + ctx, cancel := context.WithCancel(r.Context()) + if cn, ok := w.(http.CloseNotifier); ok { + go func(done <-chan struct{}, closed <-chan bool) { + select { + case <-done: + case <-closed: + cancel() + } + }(ctx.Done(), cn.CloseNotify()) + } + ctx = context.WithValue(r.Context(), "token", token) + + var appIds []int + if chartUpgradeRequest.All || len(chartUpgradeRequest.AppIds) == 0 { + apps, err := handler.pipelineBuilder.GetAppList() + if err != nil { + handler.Logger.Errorw("service err, UpgradeForAllApps", "err", err, "payload", chartUpgradeRequest) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + for _, app := range apps { + appIds = append(appIds, app.Id) + } + } else { + appIds = chartUpgradeRequest.AppIds + } + response := make(map[string][]map[string]string) + var failedIds []map[string]string + for _, appId := range appIds { + appResponse := make(map[string]string) + template, err := handler.chartService.GetByAppIdAndChartRefId(appId, chartRefId) + if err != nil && pg.ErrNoRows != err { + handler.Logger.Errorw("err in checking weather exist or not, skip for upgrade", "err", err, "payload", chartUpgradeRequest) + appResponse["appId"] = strconv.Itoa(appId) + appResponse["message"] = "err in checking weather exist or not, skip for upgrade" + failedIds = append(failedIds, appResponse) + continue + } + if template != nil && template.Id > 0 { + handler.Logger.Warnw("this ref chart already configured for this app, skip for upgrade", "payload", chartUpgradeRequest) + appResponse["appId"] = strconv.Itoa(appId) + appResponse["message"] = "this ref chart already configured for this app, skip for upgrade" + failedIds = append(failedIds, appResponse) + continue + } + flag, err := handler.chartService.UpgradeForApp(appId, chartRefId, newAppOverride, userId, ctx) + if err != nil { + handler.Logger.Errorw("service err, UpdateCiTemplate", "err", err, "payload", chartUpgradeRequest) + appResponse["appId"] = strconv.Itoa(appId) + appResponse["message"] = err.Error() + failedIds = append(failedIds, appResponse) + } else if flag == false { + handler.Logger.Debugw("unable to upgrade for app", "appId", appId, "payload", chartUpgradeRequest) + appResponse["appId"] = strconv.Itoa(appId) + appResponse["message"] = "no error found, but failed to upgrade" + failedIds = append(failedIds, appResponse) + } + + } + response["failed"] = failedIds + common.WriteJsonResp(w, err, response, http.StatusOK) +} + +func (handler PipelineConfigRestHandlerImpl) EnvConfigOverrideCreateNamespace(w http.ResponseWriter, r *http.Request) { + userId, err := handler.userAuthService.GetLoggedInUser(r) + if userId == 0 || err != nil { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + return + } + token := r.Header.Get("token") + vars := mux.Vars(r) + appId, err := strconv.Atoi(vars["appId"]) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + environmentId, err := strconv.Atoi(vars["environmentId"]) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + decoder := json.NewDecoder(r.Body) + var envConfigProperties pipeline.EnvironmentProperties + err = decoder.Decode(&envConfigProperties) + envConfigProperties.UserId = userId + envConfigProperties.EnvironmentId = environmentId + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + handler.Logger.Infow("request payload, EnvConfigOverrideCreateNamespace", "appId", appId, "environmentId", environmentId, "payload", envConfigProperties) + app, err := handler.pipelineBuilder.GetApp(appId) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + resourceName := handler.enforcerUtil.GetAppRBACNameByAppId(appId) + if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionCreate, resourceName); !ok { + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + return + } + object := handler.enforcerUtil.GetAppRBACByAppNameAndEnvId(app.AppName, environmentId) + if ok := handler.enforcer.Enforce(token, rbac.ResourceEnvironment, rbac.ActionCreate, object); !ok { + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + return + } + createResp, err := handler.propertiesConfigService.CreateEnvironmentPropertiesWithNamespace(appId, &envConfigProperties) + if err != nil { + handler.Logger.Errorw("service err, EnvConfigOverrideCreateNamespace", "err", err, "appId", appId, "environmentId", environmentId, "payload", envConfigProperties) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + common.WriteJsonResp(w, err, createResp, http.StatusOK) +} + +func (handler PipelineConfigRestHandlerImpl) FetchAppWorkflowStatusForTriggerView(w http.ResponseWriter, r *http.Request) { + userId, err := handler.userAuthService.GetLoggedInUser(r) + if userId == 0 || err != nil { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + return + } + token := r.Header.Get("token") + vars := mux.Vars(r) + appId, err := strconv.Atoi(vars["appId"]) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + handler.Logger.Infow("request payload, FetchAppWorkflowStatusForTriggerView", "err", err, "appId", appId) + //RBAC CHECK + resourceName := handler.enforcerUtil.GetAppRBACNameByAppId(appId) + if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, resourceName); !ok { + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + return + } + //RBAC CHECK + + triggerWorkflowStatus := pipelineConfig.TriggerWorkflowStatus{} + ciWorkflowStatus, err := handler.ciHandler.FetchCiStatusForTriggerView(appId) + if err != nil { + handler.Logger.Errorw("service err, FetchAppWorkflowStatusForTriggerView", "err", err, "appId", appId) + if util.IsErrNoRows(err) { + err = &util.ApiError{Code: "404", HttpStatusCode: 200, UserMessage: "no workflow found"} + common.WriteJsonResp(w, err, nil, http.StatusOK) + } else { + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + } + return + } + + cdWorkflowStatus, err := handler.cdHandler.FetchAppWorkflowStatusForTriggerView(appId) + if err != nil { + handler.Logger.Errorw("service err, FetchAppWorkflowStatusForTriggerView", "err", err, "appId", appId) + if util.IsErrNoRows(err) { + err = &util.ApiError{Code: "404", HttpStatusCode: 200, UserMessage: "no status found"} + common.WriteJsonResp(w, err, nil, http.StatusOK) + } else { + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + } + return + } + triggerWorkflowStatus.CiWorkflowStatus = ciWorkflowStatus + triggerWorkflowStatus.CdWorkflowStatus = cdWorkflowStatus + common.WriteJsonResp(w, err, triggerWorkflowStatus, http.StatusOK) +} + +func (handler PipelineConfigRestHandlerImpl) PipelineNameSuggestion(w http.ResponseWriter, r *http.Request) { + token := r.Header.Get("token") + vars := mux.Vars(r) + appId, err := strconv.Atoi(vars["appId"]) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + pType := vars["type"] + handler.Logger.Infow("request payload, PipelineNameSuggestion", "err", err, "appId", appId) + app, err := handler.pipelineBuilder.GetApp(appId) + if err != nil { + handler.Logger.Infow("service error, GetCIPipelineById", "err", err, "appId", appId) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + suggestedName := fmt.Sprintf("%s-%d-%s", pType, appId, util2.Generate(4)) + resourceName := handler.enforcerUtil.GetAppRBACName(app.AppName) + if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, resourceName); !ok { + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + return + } + common.WriteJsonResp(w, err, suggestedName, http.StatusOK) +} diff --git a/api/router/ApplicationRouter.go b/api/router/ApplicationRouter.go index ec7ea47d66..adeba55d36 100644 --- a/api/router/ApplicationRouter.go +++ b/api/router/ApplicationRouter.go @@ -29,11 +29,11 @@ type ApplicationRouter interface { } type ApplicationRouterImpl struct { - handler restHandler.ApplicationRestHandler + handler restHandler.ArgoApplicationRestHandler logger *zap.SugaredLogger } -func NewApplicationRouterImpl(handler restHandler.ApplicationRestHandler, logger *zap.SugaredLogger) *ApplicationRouterImpl { +func NewApplicationRouterImpl(handler restHandler.ArgoApplicationRestHandler, logger *zap.SugaredLogger) *ApplicationRouterImpl { return &ApplicationRouterImpl{ handler: handler, logger: logger, diff --git a/api/router/PipelineConfigRouter.go b/api/router/PipelineConfigRouter.go index b9cd5ec936..461a2fa8e2 100644 --- a/api/router/PipelineConfigRouter.go +++ b/api/router/PipelineConfigRouter.go @@ -19,6 +19,7 @@ package router import ( "github.com/devtron-labs/devtron/api/restHandler" + "github.com/devtron-labs/devtron/api/restHandler/pipeline" "github.com/gorilla/mux" ) @@ -26,12 +27,12 @@ type PipelineConfigRouter interface { initPipelineConfigRouter(configRouter *mux.Router) } type PipelineConfigRouterImpl struct { - restHandler restHandler.PipelineConfigRestHandler + restHandler pipeline.PipelineConfigRestHandler appWorkflowRestHandler restHandler.AppWorkflowRestHandler webhookDataRestHandler restHandler.WebhookDataRestHandler } -func NewPipelineRouterImpl(restHandler restHandler.PipelineConfigRestHandler, appWorkflowRestHandler restHandler.AppWorkflowRestHandler, webhookDataRestHandler restHandler.WebhookDataRestHandler) *PipelineConfigRouterImpl { +func NewPipelineRouterImpl(restHandler pipeline.PipelineConfigRestHandler, appWorkflowRestHandler restHandler.AppWorkflowRestHandler, webhookDataRestHandler restHandler.WebhookDataRestHandler) *PipelineConfigRouterImpl { return &PipelineConfigRouterImpl{restHandler: restHandler, appWorkflowRestHandler: appWorkflowRestHandler, webhookDataRestHandler: webhookDataRestHandler} } @@ -60,7 +61,7 @@ func (router PipelineConfigRouterImpl) initPipelineConfigRouter(configRouter *mu //save environment specific override configRouter.Path("/env/{appId}/{environmentId}").HandlerFunc(router.restHandler.EnvConfigOverrideCreate).Methods("POST") configRouter.Path("/env").HandlerFunc(router.restHandler.EnvConfigOverrideUpdate).Methods("PUT") - configRouter.Path("/env/{appId}/{environmentId}/{chartRefId}").HandlerFunc(router.restHandler.GetEnvConfOverride).Methods("GET") + configRouter.Path("/env/{appId}/{environmentId}/{chartRefId}").HandlerFunc(router.restHandler.GetEnvConfigOverride).Methods("GET") configRouter.Path("/ci-pipeline").HandlerFunc(router.restHandler.CreateCiConfig).Methods("POST") configRouter.Path("/ci-pipeline/{appId}").HandlerFunc(router.restHandler.GetCiPipeline).Methods("GET") @@ -68,7 +69,7 @@ func (router PipelineConfigRouterImpl) initPipelineConfigRouter(configRouter *mu configRouter.Path("/ci-pipeline/patch").HandlerFunc(router.restHandler.PatchCiPipelines).Methods("POST") configRouter.Path("/cd-pipeline/{cd_pipeline_id}/material").HandlerFunc(router.restHandler.GetArtifactsByCDPipeline).Methods("GET") - configRouter.Path("/cd-pipeline/{cd_pipeline_id}/material/rollback").HandlerFunc(router.restHandler.FetchArtifactForRollback).Methods("GET") + configRouter.Path("/cd-pipeline/{cd_pipeline_id}/material/rollback").HandlerFunc(router.restHandler.GetArtifactForRollback).Methods("GET") configRouter.Path("/migrate/db").HandlerFunc(router.restHandler.CreateMigrationConfig).Methods("POST") configRouter.Path("/migrate/db/update").HandlerFunc(router.restHandler.UpdateMigrationConfig).Methods("POST") @@ -99,7 +100,7 @@ func (router PipelineConfigRouterImpl) initPipelineConfigRouter(configRouter *mu configRouter.Path("/{appId}/autocomplete/team").HandlerFunc(router.restHandler.TeamListAutocomplete).Methods("GET") configRouter.Path("/cd-pipeline/{appId}/{envId}/{pipelineId}").HandlerFunc(router.restHandler.IsReadyToTrigger).Methods("GET") - configRouter.Path("/cd-pipeline/strategies/{appId}").HandlerFunc(router.restHandler.FetchCDPipelineStrategy).Methods("GET") + configRouter.Path("/cd-pipeline/strategies/{appId}").HandlerFunc(router.restHandler.GetDeploymentPipelineStrategy).Methods("GET") configRouter.Path("/upgrade/all/{chartRefId}").HandlerFunc(router.restHandler.UpgradeForAllApps).Methods("POST") @@ -118,14 +119,14 @@ func (router PipelineConfigRouterImpl) initPipelineConfigRouter(configRouter *mu configRouter.Path("/app-wf/{app-id}/{app-wf-id}"). HandlerFunc(router.appWorkflowRestHandler.DeleteAppWorkflow).Methods("DELETE") - configRouter.Path("/cd-pipeline/workflow/history/{appId}/{environmentId}/{pipelineId}").HandlerFunc(router.restHandler.GetCdBuildHistory).Methods("GET") - configRouter.Path("/cd-pipeline/workflow/logs/{appId}/{environmentId}/{pipelineId}/{workflowId}").HandlerFunc(router.restHandler.GetCdBuildLogs).Methods("GET") + configRouter.Path("/cd-pipeline/workflow/history/{appId}/{environmentId}/{pipelineId}").HandlerFunc(router.restHandler.ListDeploymentHistory).Methods("GET") + configRouter.Path("/cd-pipeline/workflow/logs/{appId}/{environmentId}/{pipelineId}/{workflowId}").HandlerFunc(router.restHandler.GetPrePostDeploymentLogs).Methods("GET") configRouter.Path("/cd-pipeline/workflow/trigger-info/{appId}/{environmentId}/{pipelineId}/{workflowRunnerId}").HandlerFunc(router.restHandler.FetchCdWorkflowDetails).Methods("GET") - configRouter.Path("/cd-pipeline/workflow/download/{appId}/{environmentId}/{pipelineId}/{workflowRunnerId}").HandlerFunc(router.restHandler.DownloadCdWorkflowArtifacts).Methods("GET") - configRouter.Path("/cd-pipeline/workflow/status/{appId}/{environmentId}/{pipelineId}").HandlerFunc(router.restHandler.FetchCdPrePostStageStatus).Methods("GET") + configRouter.Path("/cd-pipeline/workflow/download/{appId}/{environmentId}/{pipelineId}/{workflowRunnerId}").HandlerFunc(router.restHandler.DownloadArtifacts).Methods("GET") + configRouter.Path("/cd-pipeline/workflow/status/{appId}/{environmentId}/{pipelineId}").HandlerFunc(router.restHandler.GetStageStatus).Methods("GET") configRouter.Path("/cd-pipeline/{appId}/{pipelineId}").HandlerFunc(router.restHandler.GetCdPipelineById).Methods("GET") - configRouter.Path("/cd/configmap-secrets/{pipelineId}").HandlerFunc(router.restHandler.FetchConfigmapSecretsForCdStages).Methods("GET") + configRouter.Path("/cd/configmap-secrets/{pipelineId}").HandlerFunc(router.restHandler.GetConfigmapSecretsForDeploymentStages).Methods("GET") configRouter.Path("/workflow/status/{appId}").HandlerFunc(router.restHandler.FetchAppWorkflowStatusForTriggerView).Methods("GET") diff --git a/api/router/WebhookRouter.go b/api/router/WebhookRouter.go index 97159c34c4..e82c2a56be 100644 --- a/api/router/WebhookRouter.go +++ b/api/router/WebhookRouter.go @@ -19,6 +19,7 @@ package router import ( "github.com/devtron-labs/devtron/api/restHandler" + "github.com/devtron-labs/devtron/api/restHandler/pipeline" "github.com/gorilla/mux" ) @@ -27,14 +28,14 @@ type WebhookRouter interface { } type WebhookRouterImpl struct { - gitWebhookRestHandler restHandler.GitWebhookRestHandler - pipelineRestHandler restHandler.PipelineConfigRestHandler - externalCiRestHandler restHandler.ExternalCiRestHandler + gitWebhookRestHandler restHandler.GitWebhookRestHandler + pipelineRestHandler pipeline.PipelineConfigRestHandler + externalCiRestHandler restHandler.ExternalCiRestHandler pubSubClientRestHandler restHandler.PubSubClientRestHandler } func NewWebhookRouterImpl(gitWebhookRestHandler restHandler.GitWebhookRestHandler, - pipelineRestHandler restHandler.PipelineConfigRestHandler, externalCiRestHandler restHandler.ExternalCiRestHandler, + pipelineRestHandler pipeline.PipelineConfigRestHandler, externalCiRestHandler restHandler.ExternalCiRestHandler, pubSubClientRestHandler restHandler.PubSubClientRestHandler) *WebhookRouterImpl { return &WebhookRouterImpl{ gitWebhookRestHandler: gitWebhookRestHandler, diff --git a/api/router/router.go b/api/router/router.go index 864a6176c4..e76272ee3a 100644 --- a/api/router/router.go +++ b/api/router/router.go @@ -19,8 +19,7 @@ package router import ( "encoding/json" - "net/http" - "github.com/devtron-labs/devtron/api/restHandler" + "github.com/devtron-labs/devtron/api/restHandler/common" "github.com/devtron-labs/devtron/api/router/pubsub" pubsub2 "github.com/devtron-labs/devtron/client/pubsub" "github.com/devtron-labs/devtron/client/telemetry" @@ -28,6 +27,7 @@ import ( "github.com/gorilla/mux" "github.com/prometheus/client_golang/prometheus/promhttp" "go.uber.org/zap" + "net/http" ) type MuxRouter struct { @@ -163,7 +163,7 @@ func (r MuxRouter) Init() { r.Router.Path("/health").HandlerFunc(func(writer http.ResponseWriter, request *http.Request) { writer.Header().Set("Content-Type", "application/json") writer.WriteHeader(200) - response := restHandler.Response{} + response := common.Response{} response.Code = 200 response.Result = "OK" b, err := json.Marshal(response) diff --git a/wire_gen.go b/wire_gen.go index ed2f4b4980..81edb47fb0 100644 --- a/wire_gen.go +++ b/wire_gen.go @@ -8,6 +8,7 @@ package main import ( "github.com/devtron-labs/devtron/api/connector" "github.com/devtron-labs/devtron/api/restHandler" + pipeline2 "github.com/devtron-labs/devtron/api/restHandler/pipeline" "github.com/devtron-labs/devtron/api/router" pubsub2 "github.com/devtron-labs/devtron/api/router/pubsub" "github.com/devtron-labs/devtron/api/sse" @@ -242,7 +243,7 @@ func InitializeApp() (*App, error) { imageScanObjectMetaRepositoryImpl := security.NewImageScanObjectMetaRepositoryImpl(db, sugaredLogger) cveStoreRepositoryImpl := security.NewCveStoreRepositoryImpl(db, sugaredLogger) policyServiceImpl := security2.NewPolicyServiceImpl(environmentServiceImpl, sugaredLogger, appRepositoryImpl, pipelineOverrideRepositoryImpl, cvePolicyRepositoryImpl, clusterServiceImpl, pipelineRepositoryImpl, imageScanResultRepositoryImpl, imageScanDeployInfoRepositoryImpl, imageScanObjectMetaRepositoryImpl, httpClient, ciArtifactRepositoryImpl, ciConfig, imageScanHistoryRepositoryImpl, cveStoreRepositoryImpl, ciTemplateRepositoryImpl) - pipelineConfigRestHandlerImpl := restHandler.NewPipelineRestHandlerImpl(pipelineBuilderImpl, sugaredLogger, chartServiceImpl, propertiesConfigServiceImpl, dbMigrationServiceImpl, serviceClientImpl, userServiceImpl, teamServiceImpl, enforcerImpl, ciHandlerImpl, validate, gitSensorClientImpl, ciPipelineRepositoryImpl, pipelineRepositoryImpl, enforcerUtilImpl, environmentServiceImpl, gitRegistryConfigImpl, dockerRegistryConfigImpl, cdHandlerImpl, appCloneServiceImpl, appWorkflowServiceImpl, materialRepositoryImpl, policyServiceImpl, imageScanResultRepositoryImpl, gitProviderRepositoryImpl) + pipelineConfigRestHandlerImpl := pipeline2.NewPipelineRestHandlerImpl(pipelineBuilderImpl, sugaredLogger, chartServiceImpl, propertiesConfigServiceImpl, dbMigrationServiceImpl, serviceClientImpl, userServiceImpl, teamServiceImpl, enforcerImpl, ciHandlerImpl, validate, gitSensorClientImpl, ciPipelineRepositoryImpl, pipelineRepositoryImpl, enforcerUtilImpl, environmentServiceImpl, gitRegistryConfigImpl, dockerRegistryConfigImpl, cdHandlerImpl, appCloneServiceImpl, appWorkflowServiceImpl, materialRepositoryImpl, policyServiceImpl, imageScanResultRepositoryImpl, gitProviderRepositoryImpl) appWorkflowRestHandlerImpl := restHandler.NewAppWorkflowRestHandlerImpl(sugaredLogger, userServiceImpl, appWorkflowServiceImpl, teamServiceImpl, enforcerImpl, pipelineBuilderImpl, appRepositoryImpl, enforcerUtilImpl) webhookEventDataRepositoryImpl := repository.NewWebhookEventDataRepositoryImpl(db) webhookEventDataConfigImpl := pipeline.NewWebhookEventDataConfigImpl(sugaredLogger, webhookEventDataRepositoryImpl) @@ -292,8 +293,8 @@ func InitializeApp() (*App, error) { userAuthRouterImpl := router.NewUserAuthRouterImpl(sugaredLogger, userAuthHandlerImpl, argocdServerConfig, dexConfig, argoCDSettings, userServiceImpl) pumpImpl := connector.NewPumpImpl(sugaredLogger) terminalSessionHandlerImpl := terminal.NewTerminalSessionHandlerImpl(environmentServiceImpl, clusterServiceImpl, sugaredLogger) - applicationRestHandlerImpl := restHandler.NewApplicationRestHandlerImpl(serviceClientImpl, pumpImpl, enforcerImpl, teamServiceImpl, environmentServiceImpl, sugaredLogger, enforcerUtilImpl, terminalSessionHandlerImpl) - applicationRouterImpl := router.NewApplicationRouterImpl(applicationRestHandlerImpl, sugaredLogger) + argoApplicationRestHandlerImpl := restHandler.NewArgoApplicationRestHandlerImpl(serviceClientImpl, pumpImpl, enforcerImpl, teamServiceImpl, environmentServiceImpl, sugaredLogger, enforcerUtilImpl, terminalSessionHandlerImpl) + applicationRouterImpl := router.NewApplicationRouterImpl(argoApplicationRestHandlerImpl, sugaredLogger) argoConfig, err := ArgoUtil.GetArgoConfig() if err != nil { return nil, err From 1bd013b6de12ac9d331aa6255750db971ab03cf7 Mon Sep 17 00:00:00 2001 From: Prashant Ghildiyal Date: Wed, 24 Nov 2021 23:11:33 +0530 Subject: [PATCH 2/3] work in progress refactoring --- .../app/AutoCompleteRestHandler.go | 170 +++ .../BuildPipelineRestHandler.go | 164 ++- .../DeploymentPipelineRestHandler.go | 276 +++- .../app/PipelineConfigRestHandler.go | 585 ++++++++ .../pipeline/PipelineConfigRestHandler.go | 1175 ----------------- api/router/PipelineConfigRouter.go | 4 +- api/router/WebhookRouter.go | 4 +- 7 files changed, 1196 insertions(+), 1182 deletions(-) create mode 100644 api/restHandler/app/AutoCompleteRestHandler.go rename api/restHandler/{pipeline => app}/BuildPipelineRestHandler.go (83%) rename api/restHandler/{pipeline => app}/DeploymentPipelineRestHandler.go (84%) create mode 100644 api/restHandler/app/PipelineConfigRestHandler.go delete mode 100644 api/restHandler/pipeline/PipelineConfigRestHandler.go diff --git a/api/restHandler/app/AutoCompleteRestHandler.go b/api/restHandler/app/AutoCompleteRestHandler.go new file mode 100644 index 0000000000..914dce7f07 --- /dev/null +++ b/api/restHandler/app/AutoCompleteRestHandler.go @@ -0,0 +1,170 @@ +package app + +import ( + "github.com/devtron-labs/devtron/api/restHandler/common" + "github.com/devtron-labs/devtron/pkg/pipeline" + "github.com/devtron-labs/devtron/util/rbac" + "github.com/gorilla/mux" + "net/http" + "strconv" +) + +type DevtronAppAutoCompleteRestHandler interface { + GitListAutocomplete(w http.ResponseWriter, r *http.Request) + DockerListAutocomplete(w http.ResponseWriter, r *http.Request) + TeamListAutocomplete(w http.ResponseWriter, r *http.Request) + EnvironmentListAutocomplete(w http.ResponseWriter, r *http.Request) + GetAppListForAutocomplete(w http.ResponseWriter, r *http.Request) +} + +func (handler PipelineConfigRestHandlerImpl) GetAppListForAutocomplete(w http.ResponseWriter, r *http.Request) { + userId, err := handler.userAuthService.GetLoggedInUser(r) + if userId == 0 || err != nil { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + return + } + v := r.URL.Query() + teamId := v.Get("teamId") + handler.Logger.Infow("request payload, GetAppListForAutocomplete", "teamId", teamId) + var apps []pipeline.AppBean + if len(teamId) == 0 { + apps, err = handler.pipelineBuilder.GetAppList() + if err != nil { + handler.Logger.Errorw("service err, GetAppListForAutocomplete", "err", err, "teamId", teamId) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + } else { + teamId, err := strconv.Atoi(teamId) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } else { + apps, err = handler.pipelineBuilder.FindAppsByTeamId(teamId) + if err != nil { + handler.Logger.Errorw("service err, GetAppListForAutocomplete", "err", err, "teamId", teamId) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + } + } + + token := r.Header.Get("token") + var accessedApps []pipeline.AppBean + // RBAC + objects := handler.enforcerUtil.GetRbacObjectsForAllApps() + for _, app := range apps { + object := objects[app.Id] + if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); ok { + accessedApps = append(accessedApps, app) + } + } + // RBAC + if len(accessedApps) == 0 { + accessedApps = make([]pipeline.AppBean, 0) + } + common.WriteJsonResp(w, err, accessedApps, http.StatusOK) +} + +func (handler PipelineConfigRestHandlerImpl) EnvironmentListAutocomplete(w http.ResponseWriter, r *http.Request) { + token := r.Header.Get("token") + vars := mux.Vars(r) + appId, err := strconv.Atoi(vars["appId"]) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + handler.Logger.Infow("request payload, EnvironmentListAutocomplete", "appId", appId) + //RBAC + object := handler.enforcerUtil.GetAppRBACNameByAppId(appId) + if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); !ok { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden) + return + } + //RBAC + result, err := handler.envService.GetEnvironmentListForAutocomplete() + if err != nil { + handler.Logger.Errorw("service err, EnvironmentListAutocomplete", "err", err, "appId", appId) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + common.WriteJsonResp(w, err, result, http.StatusOK) +} + +func (handler PipelineConfigRestHandlerImpl) GitListAutocomplete(w http.ResponseWriter, r *http.Request) { + token := r.Header.Get("token") + vars := mux.Vars(r) + appId, err := strconv.Atoi(vars["appId"]) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + handler.Logger.Infow("request payload, GitListAutocomplete", "appId", appId) + //RBAC + object := handler.enforcerUtil.GetAppRBACNameByAppId(appId) + if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); !ok { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden) + return + } + //RBAC + res, err := handler.gitRegistryConfig.GetAll() + if err != nil { + handler.Logger.Errorw("service err, GitListAutocomplete", "err", err, "appId", appId) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + + common.WriteJsonResp(w, err, res, http.StatusOK) +} + +func (handler PipelineConfigRestHandlerImpl) DockerListAutocomplete(w http.ResponseWriter, r *http.Request) { + token := r.Header.Get("token") + vars := mux.Vars(r) + appId, err := strconv.Atoi(vars["appId"]) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + handler.Logger.Infow("request payload, DockerListAutocomplete", "appId", appId) + //RBAC + object := handler.enforcerUtil.GetAppRBACNameByAppId(appId) + if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); !ok { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden) + return + } + //RBAC + res, err := handler.dockerRegistryConfig.ListAllActive() + if err != nil { + handler.Logger.Errorw("service err, DockerListAutocomplete", "err", err, "appId", appId) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + + common.WriteJsonResp(w, err, res, http.StatusOK) +} + +func (handler PipelineConfigRestHandlerImpl) TeamListAutocomplete(w http.ResponseWriter, r *http.Request) { + token := r.Header.Get("token") + vars := mux.Vars(r) + appId, err := strconv.Atoi(vars["appId"]) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + handler.Logger.Infow("request payload, TeamListAutocomplete", "appId", appId) + //RBAC + object := handler.enforcerUtil.GetAppRBACNameByAppId(appId) + if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); !ok { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden) + return + } + //RBAC + result, err := handler.teamService.FetchForAutocomplete() + if err != nil { + handler.Logger.Errorw("service err, TeamListAutocomplete", "err", err, "appId", appId) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + + common.WriteJsonResp(w, err, result, http.StatusOK) +} \ No newline at end of file diff --git a/api/restHandler/pipeline/BuildPipelineRestHandler.go b/api/restHandler/app/BuildPipelineRestHandler.go similarity index 83% rename from api/restHandler/pipeline/BuildPipelineRestHandler.go rename to api/restHandler/app/BuildPipelineRestHandler.go index 826e4f9250..80849a470f 100644 --- a/api/restHandler/pipeline/BuildPipelineRestHandler.go +++ b/api/restHandler/app/BuildPipelineRestHandler.go @@ -1,4 +1,4 @@ -package pipeline +package app import ( "context" @@ -7,6 +7,8 @@ import ( "fmt" "github.com/argoproj/argo/pkg/apis/workflow/v1alpha1" "github.com/devtron-labs/devtron/api/restHandler/common" + "github.com/devtron-labs/devtron/client/gitSensor" + "github.com/devtron-labs/devtron/internal/sql/repository" "github.com/devtron-labs/devtron/internal/sql/repository/pipelineConfig" "github.com/devtron-labs/devtron/internal/util" "github.com/devtron-labs/devtron/pkg/bean" @@ -15,6 +17,7 @@ import ( "io" "net/http" "strconv" + "strings" ) type DevtronAppBuildRestHandler interface { @@ -798,3 +801,162 @@ func (handler PipelineConfigRestHandlerImpl) validForMultiMaterial(ciTriggerRequ return true } +func (handler PipelineConfigRestHandlerImpl) ValidateGitMaterialUrl(gitProviderId int, url string) (bool, error) { + gitProvider, err := handler.gitProviderRepo.FindOne(strconv.Itoa(gitProviderId)) + if err != nil { + return false, err + } + if gitProvider.AuthMode == repository.AUTH_MODE_SSH { + hasPrefixResult := strings.HasPrefix(url, SSH_URL_PREFIX) + return hasPrefixResult, nil + } + hasPrefixResult := strings.HasPrefix(url, HTTPS_URL_PREFIX) + return hasPrefixResult, nil +} + +func (handler PipelineConfigRestHandlerImpl) CancelWorkflow(w http.ResponseWriter, r *http.Request) { + userId, err := handler.userAuthService.GetLoggedInUser(r) + if userId == 0 || err != nil { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + return + } + vars := mux.Vars(r) + workflowId, err := strconv.Atoi(vars["workflowId"]) + if err != nil { + handler.Logger.Errorw("request err, CancelWorkflow", "err", err, "workflowId", workflowId) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + pipelineId, err := strconv.Atoi(vars["pipelineId"]) + if err != nil { + handler.Logger.Errorw("request err, CancelWorkflow", "err", err, "pipelineId", pipelineId) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + handler.Logger.Infow("request payload, CancelWorkflow", "workflowId", workflowId, "pipelineId", pipelineId) + + ciPipeline, err := handler.ciPipelineRepository.FindById(pipelineId) + if err != nil { + handler.Logger.Errorw("service err, CancelWorkflow", "err", err, "workflowId", workflowId, "pipelineId", pipelineId) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + //RBAC + token := r.Header.Get("token") + object := handler.enforcerUtil.GetAppRBACNameByAppId(ciPipeline.AppId) + if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionTrigger, object); !ok { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden) + return + } + //RBAC + + resp, err := handler.ciHandler.CancelBuild(workflowId) + if err != nil { + handler.Logger.Errorw("service err, CancelWorkflow", "err", err, "workflowId", workflowId, "pipelineId", pipelineId) + if util.IsErrNoRows(err) { + common.WriteJsonResp(w, err, nil, http.StatusNotFound) + } else { + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + } + return + } + common.WriteJsonResp(w, err, resp, http.StatusOK) +} + +// FetchChanges FIXME check if deprecated +func (handler PipelineConfigRestHandlerImpl) FetchChanges(w http.ResponseWriter, r *http.Request) { + userId, err := handler.userAuthService.GetLoggedInUser(r) + if userId == 0 || err != nil { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + return + } + vars := mux.Vars(r) + ciMaterialId, err := strconv.Atoi(vars["ciMaterialId"]) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + + pipelineId, err := strconv.Atoi(vars["pipelineId"]) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + handler.Logger.Infow("request payload, FetchChanges", "ciMaterialId", ciMaterialId, "pipelineId", pipelineId) + ciPipeline, err := handler.ciPipelineRepository.FindById(pipelineId) + if err != nil { + handler.Logger.Errorw("request err, FetchChanges", "err", err, "ciMaterialId", ciMaterialId, "pipelineId", pipelineId) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + //RBAC + token := r.Header.Get("token") + object := handler.enforcerUtil.GetAppRBACNameByAppId(ciPipeline.AppId) + if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); !ok { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden) + return + } + //RBAC + + changeRequest := &gitSensor.FetchScmChangesRequest{ + PipelineMaterialId: ciMaterialId, + } + changes, err := handler.gitSensorClient.FetchChanges(changeRequest) + if err != nil { + handler.Logger.Errorw("service err, FetchChanges", "err", err, "ciMaterialId", ciMaterialId, "pipelineId", pipelineId) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + common.WriteJsonResp(w, err, changes.Commits, http.StatusCreated) +} + +func (handler PipelineConfigRestHandlerImpl) FetchWorkflowDetails(w http.ResponseWriter, r *http.Request) { + userId, err := handler.userAuthService.GetLoggedInUser(r) + if userId == 0 || err != nil { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + return + } + vars := mux.Vars(r) + appId, err := strconv.Atoi(vars["appId"]) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + pipelineId, err := strconv.Atoi(vars["pipelineId"]) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + buildId, err := strconv.Atoi(vars["workflowId"]) + if err != nil || buildId == 0 { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + handler.Logger.Infow("request payload, FetchWorkflowDetails", "appId", appId, "pipelineId", pipelineId, "buildId", buildId, "buildId", buildId) + ciPipeline, err := handler.ciPipelineRepository.FindById(pipelineId) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + //RBAC + token := r.Header.Get("token") + object := handler.enforcerUtil.GetAppRBACNameByAppId(ciPipeline.AppId) + if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); !ok { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden) + return + } + //RBAC + resp, err := handler.ciHandler.FetchWorkflowDetails(appId, pipelineId, buildId) + if err != nil { + handler.Logger.Errorw("service err, FetchWorkflowDetails", "err", err, "appId", appId, "pipelineId", pipelineId, "buildId", buildId, "buildId", buildId) + if util.IsErrNoRows(err) { + err = &util.ApiError{Code: "404", HttpStatusCode: http.StatusNotFound, UserMessage: "no workflow found"} + common.WriteJsonResp(w, err, nil, http.StatusOK) + } else { + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + } + return + } + common.WriteJsonResp(w, err, resp, http.StatusOK) +} + diff --git a/api/restHandler/pipeline/DeploymentPipelineRestHandler.go b/api/restHandler/app/DeploymentPipelineRestHandler.go similarity index 84% rename from api/restHandler/pipeline/DeploymentPipelineRestHandler.go rename to api/restHandler/app/DeploymentPipelineRestHandler.go index 436e2fa9ed..3fecd8c04f 100644 --- a/api/restHandler/pipeline/DeploymentPipelineRestHandler.go +++ b/api/restHandler/app/DeploymentPipelineRestHandler.go @@ -1,4 +1,4 @@ -package pipeline +package app import ( "context" @@ -16,6 +16,7 @@ import ( "io" "net/http" "strconv" + "strings" ) type DevtronAppDeploymentRestHandler interface { @@ -50,6 +51,8 @@ type DevtronAppDeploymentConfigRestHandler interface { AppMetricsEnableDisable(w http.ResponseWriter, r *http.Request) EnvMetricsEnableDisable(w http.ResponseWriter, r *http.Request) + + EnvConfigOverrideCreateNamespace(w http.ResponseWriter, r *http.Request) } type DevtronAppPrePostDeploymentRestHandler interface { @@ -1415,7 +1418,7 @@ func (handler PipelineConfigRestHandlerImpl) GetConfigmapSecretsForDeploymentSta common.WriteJsonResp(w, err, nil, http.StatusBadRequest) return } - + //FIXME: add RBAC resp, err := handler.pipelineBuilder.FetchConfigmapSecretsForCdStages(deploymentPipeline.AppId, deploymentPipeline.EnvironmentId, pipelineId) if err != nil { handler.Logger.Errorw("service err, GetConfigmapSecretsForDeploymentStages", "err", err, "pipelineId", pipelineId) @@ -1458,3 +1461,272 @@ func (handler PipelineConfigRestHandlerImpl) GetCdPipelineById(w http.ResponseWr common.WriteJsonResp(w, err, ciConf, http.StatusOK) } +func (handler PipelineConfigRestHandlerImpl) CancelStage(w http.ResponseWriter, r *http.Request) { + userId, err := handler.userAuthService.GetLoggedInUser(r) + if userId == 0 || err != nil { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + return + } + vars := mux.Vars(r) + pipelineId, err := strconv.Atoi(vars["pipelineId"]) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + workflowRunnerId, err := strconv.Atoi(vars["workflowRunnerId"]) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + cdPipeline, err := handler.pipelineRepository.FindById(pipelineId) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + handler.Logger.Infow("request payload, CancelStage", "pipelineId", pipelineId, "workflowRunnerId", workflowRunnerId) + + //RBAC + token := r.Header.Get("token") + object := handler.enforcerUtil.GetAppRBACNameByAppId(cdPipeline.AppId) + if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionTrigger, object); !ok { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden) + return + } + //RBAC + + resp, err := handler.cdHandler.CancelStage(workflowRunnerId) + if err != nil { + handler.Logger.Errorw("service err, CancelStage", "err", err, "pipelineId", pipelineId, "workflowRunnerId", workflowRunnerId) + if util.IsErrNoRows(err) { + common.WriteJsonResp(w, err, nil, http.StatusNotFound) + } else { + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + } + return + } + common.WriteJsonResp(w, err, resp, http.StatusOK) +} + +func (handler PipelineConfigRestHandlerImpl) GetDeploymentPipelineStrategy(w http.ResponseWriter, r *http.Request) { + token := r.Header.Get("token") + vars := mux.Vars(r) + appId, err := strconv.Atoi(vars["appId"]) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + handler.Logger.Infow("request payload, GetDeploymentPipelineStrategy", "appId", appId) + //RBAC + object := handler.enforcerUtil.GetAppRBACNameByAppId(appId) + if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); !ok { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden) + return + } + //RBAC + + result, err := handler.pipelineBuilder.FetchCDPipelineStrategy(appId) + if err != nil { + handler.Logger.Errorw("service err, GetDeploymentPipelineStrategy", "err", err, "appId", appId) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + + common.WriteJsonResp(w, err, result, http.StatusOK) +} + +func (handler PipelineConfigRestHandlerImpl) EnvConfigOverrideCreateNamespace(w http.ResponseWriter, r *http.Request) { + userId, err := handler.userAuthService.GetLoggedInUser(r) + if userId == 0 || err != nil { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + return + } + token := r.Header.Get("token") + vars := mux.Vars(r) + appId, err := strconv.Atoi(vars["appId"]) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + environmentId, err := strconv.Atoi(vars["environmentId"]) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + decoder := json.NewDecoder(r.Body) + var envConfigProperties pipeline.EnvironmentProperties + err = decoder.Decode(&envConfigProperties) + envConfigProperties.UserId = userId + envConfigProperties.EnvironmentId = environmentId + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + handler.Logger.Infow("request payload, EnvConfigOverrideCreateNamespace", "appId", appId, "environmentId", environmentId, "payload", envConfigProperties) + app, err := handler.pipelineBuilder.GetApp(appId) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + resourceName := handler.enforcerUtil.GetAppRBACNameByAppId(appId) + if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionCreate, resourceName); !ok { + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + return + } + object := handler.enforcerUtil.GetAppRBACByAppNameAndEnvId(app.AppName, environmentId) + if ok := handler.enforcer.Enforce(token, rbac.ResourceEnvironment, rbac.ActionCreate, object); !ok { + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + return + } + createResp, err := handler.propertiesConfigService.CreateEnvironmentPropertiesWithNamespace(appId, &envConfigProperties) + if err != nil { + handler.Logger.Errorw("service err, EnvConfigOverrideCreateNamespace", "err", err, "appId", appId, "environmentId", environmentId, "payload", envConfigProperties) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + common.WriteJsonResp(w, err, createResp, http.StatusOK) +} + +func (handler PipelineConfigRestHandlerImpl) IsReadyToTrigger(w http.ResponseWriter, r *http.Request) { + token := r.Header.Get("token") + vars := mux.Vars(r) + appId, err := strconv.Atoi(vars["appId"]) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + envId, err := strconv.Atoi(vars["envId"]) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + pipelineId, err := strconv.Atoi(vars["pipelineId"]) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + handler.Logger.Infow("request payload, IsReadyToTrigger", "appId", appId, "envId", envId, "pipelineId", pipelineId) + //RBAC + object := handler.enforcerUtil.GetAppRBACNameByAppId(appId) + if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); !ok { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden) + return + } + object = handler.enforcerUtil.GetEnvRBACNameByAppId(appId, envId) + if ok := handler.enforcer.Enforce(token, rbac.ResourceEnvironment, rbac.ActionGet, strings.ToLower(object)); !ok { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden) + return + } + //RBAC + + result, err := handler.chartService.IsReadyToTrigger(appId, envId, pipelineId) + if err != nil { + handler.Logger.Errorw("service err, IsReadyToTrigger", "err", err, "appId", appId, "envId", envId, "pipelineId", pipelineId) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + common.WriteJsonResp(w, err, result, http.StatusOK) +} + +func (handler PipelineConfigRestHandlerImpl) UpgradeForAllApps(w http.ResponseWriter, r *http.Request) { + userId, err := handler.userAuthService.GetLoggedInUser(r) + if userId == 0 || err != nil { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + return + } + vars := mux.Vars(r) + chartRefId, err := strconv.Atoi(vars["chartRefId"]) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + + decoder := json.NewDecoder(r.Body) + var chartUpgradeRequest pipeline.ChartUpgradeRequest + err = decoder.Decode(&chartUpgradeRequest) + if err != nil { + handler.Logger.Errorw("request err, UpgradeForAllApps", "err", err, "payload", chartUpgradeRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + chartUpgradeRequest.ChartRefId = chartRefId + chartUpgradeRequest.UserId = userId + handler.Logger.Infow("request payload, UpgradeForAllApps", "payload", chartUpgradeRequest) + token := r.Header.Get("token") + if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionCreate, "*/*"); !ok { + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + return + } + if ok := handler.enforcer.Enforce(token, rbac.ResourceEnvironment, rbac.ActionCreate, "*/*"); !ok { + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + return + } + + newAppOverride, err := handler.chartService.GetAppOverrideForDefaultTemplate(chartUpgradeRequest.ChartRefId) + if err != nil { + handler.Logger.Errorw("service err, UpgradeForAllApps", "err", err, "payload", chartUpgradeRequest) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + + ctx, cancel := context.WithCancel(r.Context()) + if cn, ok := w.(http.CloseNotifier); ok { + go func(done <-chan struct{}, closed <-chan bool) { + select { + case <-done: + case <-closed: + cancel() + } + }(ctx.Done(), cn.CloseNotify()) + } + ctx = context.WithValue(r.Context(), "token", token) + + var appIds []int + if chartUpgradeRequest.All || len(chartUpgradeRequest.AppIds) == 0 { + apps, err := handler.pipelineBuilder.GetAppList() + if err != nil { + handler.Logger.Errorw("service err, UpgradeForAllApps", "err", err, "payload", chartUpgradeRequest) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + for _, app := range apps { + appIds = append(appIds, app.Id) + } + } else { + appIds = chartUpgradeRequest.AppIds + } + response := make(map[string][]map[string]string) + var failedIds []map[string]string + for _, appId := range appIds { + appResponse := make(map[string]string) + template, err := handler.chartService.GetByAppIdAndChartRefId(appId, chartRefId) + if err != nil && pg.ErrNoRows != err { + handler.Logger.Errorw("err in checking weather exist or not, skip for upgrade", "err", err, "payload", chartUpgradeRequest) + appResponse["appId"] = strconv.Itoa(appId) + appResponse["message"] = "err in checking weather exist or not, skip for upgrade" + failedIds = append(failedIds, appResponse) + continue + } + if template != nil && template.Id > 0 { + handler.Logger.Warnw("this ref chart already configured for this app, skip for upgrade", "payload", chartUpgradeRequest) + appResponse["appId"] = strconv.Itoa(appId) + appResponse["message"] = "this ref chart already configured for this app, skip for upgrade" + failedIds = append(failedIds, appResponse) + continue + } + flag, err := handler.chartService.UpgradeForApp(appId, chartRefId, newAppOverride, userId, ctx) + if err != nil { + handler.Logger.Errorw("service err, UpdateCiTemplate", "err", err, "payload", chartUpgradeRequest) + appResponse["appId"] = strconv.Itoa(appId) + appResponse["message"] = err.Error() + failedIds = append(failedIds, appResponse) + } else if flag == false { + handler.Logger.Debugw("unable to upgrade for app", "appId", appId, "payload", chartUpgradeRequest) + appResponse["appId"] = strconv.Itoa(appId) + appResponse["message"] = "no error found, but failed to upgrade" + failedIds = append(failedIds, appResponse) + } + + } + response["failed"] = failedIds + common.WriteJsonResp(w, err, response, http.StatusOK) +} \ No newline at end of file diff --git a/api/restHandler/app/PipelineConfigRestHandler.go b/api/restHandler/app/PipelineConfigRestHandler.go new file mode 100644 index 0000000000..946a42c436 --- /dev/null +++ b/api/restHandler/app/PipelineConfigRestHandler.go @@ -0,0 +1,585 @@ +/* + * Copyright (c) 2020 Devtron Labs + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package app + +import ( + "bufio" + "context" + "encoding/json" + "fmt" + "github.com/devtron-labs/devtron/api/restHandler/common" + "io" + "net/http" + "strconv" + "strings" + + bean2 "github.com/devtron-labs/devtron/api/bean" + "github.com/devtron-labs/devtron/client/argocdServer/application" + "github.com/devtron-labs/devtron/client/gitSensor" + "github.com/devtron-labs/devtron/internal/sql/repository" + "github.com/devtron-labs/devtron/internal/sql/repository/pipelineConfig" + "github.com/devtron-labs/devtron/internal/sql/repository/security" + "github.com/devtron-labs/devtron/internal/util" + "github.com/devtron-labs/devtron/pkg/appClone" + "github.com/devtron-labs/devtron/pkg/appWorkflow" + "github.com/devtron-labs/devtron/pkg/bean" + request "github.com/devtron-labs/devtron/pkg/cluster" + "github.com/devtron-labs/devtron/pkg/pipeline" + security2 "github.com/devtron-labs/devtron/pkg/security" + "github.com/devtron-labs/devtron/pkg/team" + "github.com/devtron-labs/devtron/pkg/user" + util2 "github.com/devtron-labs/devtron/util" + "github.com/devtron-labs/devtron/util/rbac" + "github.com/gorilla/mux" + "github.com/grpc-ecosystem/grpc-gateway/runtime" + "go.uber.org/zap" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + "gopkg.in/go-playground/validator.v9" +) + + + +type DevtronAppRestHandler interface { + CreateApp(w http.ResponseWriter, r *http.Request) + DeleteApp(w http.ResponseWriter, r *http.Request) + GetApp(w http.ResponseWriter, r *http.Request) + + FindAppsByTeamId(w http.ResponseWriter, r *http.Request) + FindAppsByTeamName(w http.ResponseWriter, r *http.Request) + GetAppListByTeamIds(w http.ResponseWriter, r *http.Request) +} + +type DevtronAppWorkflowRestHandler interface { + FetchAppWorkflowStatusForTriggerView(w http.ResponseWriter, r *http.Request) +} + +type PipelineConfigRestHandler interface { + DevtronAppAutoCompleteRestHandler + DevtronAppRestHandler + DevtronAppWorkflowRestHandler + DevtronAppBuildRestHandler + DevtronAppBuildMaterialRestHandler + DevtronAppBuildHistoryRestHandler + DevtronAppDeploymentRestHandler + DevtronAppDeploymentHistoryRestHandler + DevtronAppPrePostDeploymentRestHandler + DevtronAppDeploymentConfigRestHandler + + PipelineNameSuggestion(w http.ResponseWriter, r *http.Request) +} + +type PipelineConfigRestHandlerImpl struct { + pipelineBuilder pipeline.PipelineBuilder + ciPipelineRepository pipelineConfig.CiPipelineRepository + ciHandler pipeline.CiHandler + Logger *zap.SugaredLogger + chartService pipeline.ChartService + propertiesConfigService pipeline.PropertiesConfigService + dbMigrationService pipeline.DbMigrationService + application application.ServiceClient + userAuthService user.UserService + validator *validator.Validate + teamService team.TeamService + enforcer rbac.Enforcer + gitSensorClient gitSensor.GitSensorClient + pipelineRepository pipelineConfig.PipelineRepository + appWorkflowService appWorkflow.AppWorkflowService + enforcerUtil rbac.EnforcerUtil + envService request.EnvironmentService + gitRegistryConfig pipeline.GitRegistryConfig + dockerRegistryConfig pipeline.DockerRegistryConfig + cdHandler pipeline.CdHandler + appCloneService appClone.AppCloneService + materialRepository pipelineConfig.MaterialRepository + policyService security2.PolicyService + scanResultRepository security.ImageScanResultRepository + gitProviderRepo repository.GitProviderRepository +} + +func NewPipelineRestHandlerImpl(pipelineBuilder pipeline.PipelineBuilder, Logger *zap.SugaredLogger, + chartService pipeline.ChartService, + propertiesConfigService pipeline.PropertiesConfigService, + dbMigrationService pipeline.DbMigrationService, + application application.ServiceClient, + userAuthService user.UserService, + teamService team.TeamService, + enforcer rbac.Enforcer, + ciHandler pipeline.CiHandler, + validator *validator.Validate, + gitSensorClient gitSensor.GitSensorClient, + ciPipelineRepository pipelineConfig.CiPipelineRepository, pipelineRepository pipelineConfig.PipelineRepository, + enforcerUtil rbac.EnforcerUtil, envService request.EnvironmentService, + gitRegistryConfig pipeline.GitRegistryConfig, dockerRegistryConfig pipeline.DockerRegistryConfig, + cdHandler pipeline.CdHandler, + appCloneService appClone.AppCloneService, + appWorkflowService appWorkflow.AppWorkflowService, + materialRepository pipelineConfig.MaterialRepository, policyService security2.PolicyService, + scanResultRepository security.ImageScanResultRepository, gitProviderRepo repository.GitProviderRepository) *PipelineConfigRestHandlerImpl { + return &PipelineConfigRestHandlerImpl{ + pipelineBuilder: pipelineBuilder, + Logger: Logger, + chartService: chartService, + propertiesConfigService: propertiesConfigService, + dbMigrationService: dbMigrationService, + application: application, + userAuthService: userAuthService, + validator: validator, + teamService: teamService, + enforcer: enforcer, + ciHandler: ciHandler, + gitSensorClient: gitSensorClient, + ciPipelineRepository: ciPipelineRepository, + pipelineRepository: pipelineRepository, + enforcerUtil: enforcerUtil, + envService: envService, + gitRegistryConfig: gitRegistryConfig, + dockerRegistryConfig: dockerRegistryConfig, + cdHandler: cdHandler, + appCloneService: appCloneService, + appWorkflowService: appWorkflowService, + materialRepository: materialRepository, + policyService: policyService, + scanResultRepository: scanResultRepository, + gitProviderRepo: gitProviderRepo, + } +} + +const ( + devtron = "DEVTRON" + SSH_URL_PREFIX = "git@" + HTTPS_URL_PREFIX = "https://" +) + +func (handler PipelineConfigRestHandlerImpl) DeleteApp(w http.ResponseWriter, r *http.Request) { + token := r.Header.Get("token") + userId, err := handler.userAuthService.GetLoggedInUser(r) + if userId == 0 || err != nil { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + return + } + vars := mux.Vars(r) + appId, err := strconv.Atoi(vars["appId"]) + if err != nil { + handler.Logger.Errorw("request err, delete app", "err", err, "appId", appId) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + handler.Logger.Infow("request payload, delete app", "appId", appId) + wfs, err := handler.appWorkflowService.FindAppWorkflows(appId) + if err != nil { + handler.Logger.Errorw("could not fetch wfs", "err", err, "appId", appId) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + if len(wfs) != 0 { + handler.Logger.Info("cannot delete app with workflow's") + err = &util.ApiError{Code: "400", HttpStatusCode: 400, UserMessage: "cannot delete app having workflow's"} + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + + resourceObject := handler.enforcerUtil.GetAppRBACNameByAppId(appId) + if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionDelete, resourceObject); !ok { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden) + return + } + + err = handler.pipelineBuilder.DeleteApp(appId, userId) + if err != nil { + handler.Logger.Errorw("service error, delete app", "err", err, "appId", appId) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + common.WriteJsonResp(w, err, nil, http.StatusOK) +} + +func (handler PipelineConfigRestHandlerImpl) CreateApp(w http.ResponseWriter, r *http.Request) { + token := r.Header.Get("token") + decoder := json.NewDecoder(r.Body) + userId, err := handler.userAuthService.GetLoggedInUser(r) + if userId == 0 || err != nil { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + return + } + var createRequest bean.CreateAppDTO + err = decoder.Decode(&createRequest) + createRequest.UserId = userId + if err != nil { + handler.Logger.Errorw("request err, CreateApp", "err", err, "CreateApp", createRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + + handler.Logger.Infow("request payload, CreateApp", "CreateApp", createRequest) + err = handler.validator.Struct(createRequest) + if err != nil { + handler.Logger.Errorw("validation err, CreateApp", "err", err, "CreateApp", createRequest) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + + project, err := handler.teamService.FetchOne(createRequest.TeamId) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + // with admin roles, you have to access for all the apps of the project to create new app. (admin or manager with specific app permission can't create app.) + if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionCreate, fmt.Sprintf("%s/%s", strings.ToLower(project.Name), "*")); !ok { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden) + return + } + var createResp *bean.CreateAppDTO + err = nil + if createRequest.TemplateId == 0 { + createResp, err = handler.pipelineBuilder.CreateApp(&createRequest) + } else { + ctx, cancel := context.WithCancel(r.Context()) + if cn, ok := w.(http.CloseNotifier); ok { + go func(done <-chan struct{}, closed <-chan bool) { + select { + case <-done: + case <-closed: + cancel() + } + }(ctx.Done(), cn.CloseNotify()) + } + ctx = context.WithValue(r.Context(), "token", token) + createResp, err = handler.appCloneService.CloneApp(&createRequest, ctx) + } + if err != nil { + handler.Logger.Errorw("service err, CreateApp", "err", err, "CreateApp", createRequest) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + common.WriteJsonResp(w, err, createResp, http.StatusOK) +} + +func (handler PipelineConfigRestHandlerImpl) GetApp(w http.ResponseWriter, r *http.Request) { + token := r.Header.Get("token") + vars := mux.Vars(r) + appId, err := strconv.Atoi(vars["appId"]) + if err != nil { + handler.Logger.Errorw("request err, get app", "err", err, "appId", appId) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + handler.Logger.Infow("request payload, get app", "appId", appId) + ciConf, err := handler.pipelineBuilder.GetApp(appId) + if err != nil { + handler.Logger.Errorw("service err, get app", "err", err, "appId", appId) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + + //rbac implementation starts here + object := handler.enforcerUtil.GetAppRBACNameByAppId(appId) + if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); !ok { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden) + return + } + //rbac implementation ends here + + common.WriteJsonResp(w, err, ciConf, http.StatusOK) +} + +func (handler PipelineConfigRestHandlerImpl) FindAppsByTeamId(w http.ResponseWriter, r *http.Request) { + vars := mux.Vars(r) + teamId, err := strconv.Atoi(vars["teamId"]) + if err != nil { + handler.Logger.Errorw("request err, FindAppsByTeamId", "err", err, "teamId", teamId) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + handler.Logger.Infow("request payload, FindAppsByTeamId", "teamId", teamId) + project, err := handler.pipelineBuilder.FindAppsByTeamId(teamId) + if err != nil { + handler.Logger.Errorw("service err, FindAppsByTeamId", "err", err, "teamId", teamId) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + common.WriteJsonResp(w, err, project, http.StatusOK) +} + +func (handler PipelineConfigRestHandlerImpl) FindAppsByTeamName(w http.ResponseWriter, r *http.Request) { + vars := mux.Vars(r) + teamName := vars["teamName"] + handler.Logger.Infow("request payload, FindAppsByTeamName", "teamName", teamName) + project, err := handler.pipelineBuilder.FindAppsByTeamName(teamName) + if err != nil { + handler.Logger.Errorw("service err, FindAppsByTeamName", "err", err, "teamName", teamName) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + common.WriteJsonResp(w, err, project, http.StatusOK) +} + +func (handler *PipelineConfigRestHandlerImpl) streamOutput(w http.ResponseWriter, reader *bufio.Reader, lastSeenMsgId int) { + f, ok := w.(http.Flusher) + if !ok { + http.Error(w, "unexpected server doesnt support streaming", http.StatusInternalServerError) + } + + // Important to make it work in browsers + w.Header().Set("Connection", "keep-alive") + w.Header().Set("Cache-Control", "no-cache") + w.Header().Set("Transfer-Encoding", "chunked") + w.Header().Set("Content-Type", "text/event-stream") + w.Header().Set("X-Accel-Buffering", "no") + w.Header().Set("X-Content-Type-Options", "nosniff") + + //var wroteHeader bool + startOfStream := []byte("START_OF_STREAM") + endOfStreamEvent := []byte("END_OF_STREAM") + reconnectEvent := []byte("RECONNECT_STREAM") + unexpectedEndOfStreamEvent := []byte("UNEXPECTED_END_OF_STREAM") + streamStarted := false + msgCounter := 0 + if lastSeenMsgId == -1 { + handler.sendData(startOfStream, w, msgCounter) + handler.sendEvent(startOfStream, w) + f.Flush() + } else { + handler.sendEvent(reconnectEvent, w) + f.Flush() + } + + for { + data, err := reader.ReadBytes('\n') + if err == io.EOF { + if streamStarted { + handler.sendData(endOfStreamEvent, w, msgCounter) + handler.sendEvent(endOfStreamEvent, w) + f.Flush() + return + } + return + } + if err != nil { + //TODO handle error + handler.sendData(unexpectedEndOfStreamEvent, w, msgCounter) + handler.sendEvent(unexpectedEndOfStreamEvent, w) + f.Flush() + return + } + msgCounter = msgCounter + 1 + //skip for seen msg + if msgCounter <= lastSeenMsgId { + continue + } + if strings.Contains(string(data), devtron) { + continue + } + + var res []byte + res = append(res, "id:"...) + res = append(res, fmt.Sprintf("%d\n", msgCounter)...) + res = append(res, "data:"...) + res = append(res, data...) + res = append(res, '\n') + + if _, err = w.Write(res); err != nil { + //TODO handle error + handler.Logger.Errorw("Failed to send response chunk, streamOutput", "err", err) + handler.sendData(unexpectedEndOfStreamEvent, w, msgCounter) + handler.sendEvent(unexpectedEndOfStreamEvent, w) + f.Flush() + return + } + streamStarted = true + f.Flush() + } +} + +func (handler *PipelineConfigRestHandlerImpl) sendEvent(event []byte, w http.ResponseWriter) { + var res []byte + res = append(res, "event:"...) + res = append(res, event...) + res = append(res, '\n') + res = append(res, "data:"...) + res = append(res, '\n', '\n') + + if _, err := w.Write(res); err != nil { + handler.Logger.Debugf("Failed to send response chunk: %v", err) + return + } + +} +func (handler *PipelineConfigRestHandlerImpl) sendData(event []byte, w http.ResponseWriter, msgId int) { + var res []byte + res = append(res, "id:"...) + res = append(res, fmt.Sprintf("%d\n", msgId)...) + res = append(res, "data:"...) + res = append(res, event...) + res = append(res, '\n', '\n') + if _, err := w.Write(res); err != nil { + handler.Logger.Errorw("Failed to send response chunk, sendData", "err", err) + return + } +} + +func (handler *PipelineConfigRestHandlerImpl) handleForwardResponseStreamError(wroteHeader bool, w http.ResponseWriter, err error) { + code := "000" + if !wroteHeader { + s, ok := status.FromError(err) + if !ok { + s = status.New(codes.Unknown, err.Error()) + } + w.WriteHeader(runtime.HTTPStatusFromCode(s.Code())) + code = fmt.Sprint(s.Code()) + } + response := bean2.Response{} + apiErr := bean2.ApiError{} + apiErr.Code = code // 000=unknown + apiErr.InternalMessage = err.Error() + response.Errors = []bean2.ApiError{apiErr} + buf, err2 := json.Marshal(response) + if err2 != nil { + handler.Logger.Errorw("marshal err, handleForwardResponseStreamError", "err", err2, "response", response) + } + if _, err3 := w.Write(buf); err3 != nil { + handler.Logger.Errorw("Failed to notify error to client, handleForwardResponseStreamError", "err", err3, "response", response) + return + } +} + +func (handler PipelineConfigRestHandlerImpl) GetAppListByTeamIds(w http.ResponseWriter, r *http.Request) { + userId, err := handler.userAuthService.GetLoggedInUser(r) + if userId == 0 || err != nil { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + return + } + //vars := mux.Vars(r) + v := r.URL.Query() + params := v.Get("teamIds") + if len(params) == 0 { + common.WriteJsonResp(w, err, "StatusBadRequest", http.StatusBadRequest) + return + } + handler.Logger.Infow("request payload, GetAppListByTeamIds", "payload", params) + var teamIds []int + teamIdList := strings.Split(params, ",") + for _, item := range teamIdList { + teamId, err := strconv.Atoi(item) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + teamIds = append(teamIds, teamId) + } + projectWiseApps, err := handler.pipelineBuilder.GetAppListByTeamIds(teamIds) + if err != nil { + handler.Logger.Errorw("service err, GetAppListByTeamIds", "err", err, "payload", params) + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + return + } + + token := r.Header.Get("token") + // RBAC + for _, project := range projectWiseApps { + var accessedApps []*pipeline.AppBean + for _, app := range project.AppList { + object := fmt.Sprintf("%s/%s", project.ProjectName, app.Name) + if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); ok { + accessedApps = append(accessedApps, app) + } + } + if len(accessedApps) == 0 { + accessedApps = make([]*pipeline.AppBean, 0) + } + project.AppList = accessedApps + } + // RBAC + common.WriteJsonResp(w, err, projectWiseApps, http.StatusOK) +} + +func (handler PipelineConfigRestHandlerImpl) FetchAppWorkflowStatusForTriggerView(w http.ResponseWriter, r *http.Request) { + userId, err := handler.userAuthService.GetLoggedInUser(r) + if userId == 0 || err != nil { + common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) + return + } + token := r.Header.Get("token") + vars := mux.Vars(r) + appId, err := strconv.Atoi(vars["appId"]) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + handler.Logger.Infow("request payload, FetchAppWorkflowStatusForTriggerView", "err", err, "appId", appId) + //RBAC CHECK + resourceName := handler.enforcerUtil.GetAppRBACNameByAppId(appId) + if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, resourceName); !ok { + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + return + } + //RBAC CHECK + + triggerWorkflowStatus := pipelineConfig.TriggerWorkflowStatus{} + ciWorkflowStatus, err := handler.ciHandler.FetchCiStatusForTriggerView(appId) + if err != nil { + handler.Logger.Errorw("service err, FetchAppWorkflowStatusForTriggerView", "err", err, "appId", appId) + if util.IsErrNoRows(err) { + err = &util.ApiError{Code: "404", HttpStatusCode: 200, UserMessage: "no workflow found"} + common.WriteJsonResp(w, err, nil, http.StatusOK) + } else { + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + } + return + } + + cdWorkflowStatus, err := handler.cdHandler.FetchAppWorkflowStatusForTriggerView(appId) + if err != nil { + handler.Logger.Errorw("service err, FetchAppWorkflowStatusForTriggerView", "err", err, "appId", appId) + if util.IsErrNoRows(err) { + err = &util.ApiError{Code: "404", HttpStatusCode: 200, UserMessage: "no status found"} + common.WriteJsonResp(w, err, nil, http.StatusOK) + } else { + common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) + } + return + } + triggerWorkflowStatus.CiWorkflowStatus = ciWorkflowStatus + triggerWorkflowStatus.CdWorkflowStatus = cdWorkflowStatus + common.WriteJsonResp(w, err, triggerWorkflowStatus, http.StatusOK) +} + +func (handler PipelineConfigRestHandlerImpl) PipelineNameSuggestion(w http.ResponseWriter, r *http.Request) { + token := r.Header.Get("token") + vars := mux.Vars(r) + appId, err := strconv.Atoi(vars["appId"]) + if err != nil { + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + pType := vars["type"] + handler.Logger.Infow("request payload, PipelineNameSuggestion", "err", err, "appId", appId) + app, err := handler.pipelineBuilder.GetApp(appId) + if err != nil { + handler.Logger.Infow("service error, GetCIPipelineById", "err", err, "appId", appId) + common.WriteJsonResp(w, err, nil, http.StatusBadRequest) + return + } + suggestedName := fmt.Sprintf("%s-%d-%s", pType, appId, util2.Generate(4)) + resourceName := handler.enforcerUtil.GetAppRBACName(app.AppName) + if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, resourceName); !ok { + common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) + return + } + common.WriteJsonResp(w, err, suggestedName, http.StatusOK) +} diff --git a/api/restHandler/pipeline/PipelineConfigRestHandler.go b/api/restHandler/pipeline/PipelineConfigRestHandler.go deleted file mode 100644 index c26a1f356d..0000000000 --- a/api/restHandler/pipeline/PipelineConfigRestHandler.go +++ /dev/null @@ -1,1175 +0,0 @@ -/* - * Copyright (c) 2020 Devtron Labs - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package pipeline - -import ( - "bufio" - "context" - "encoding/json" - "fmt" - "github.com/devtron-labs/devtron/api/restHandler/common" - "io" - "net/http" - "strconv" - "strings" - - bean2 "github.com/devtron-labs/devtron/api/bean" - "github.com/devtron-labs/devtron/client/argocdServer/application" - "github.com/devtron-labs/devtron/client/gitSensor" - "github.com/devtron-labs/devtron/internal/sql/repository" - "github.com/devtron-labs/devtron/internal/sql/repository/pipelineConfig" - "github.com/devtron-labs/devtron/internal/sql/repository/security" - "github.com/devtron-labs/devtron/internal/util" - "github.com/devtron-labs/devtron/pkg/appClone" - "github.com/devtron-labs/devtron/pkg/appWorkflow" - "github.com/devtron-labs/devtron/pkg/bean" - request "github.com/devtron-labs/devtron/pkg/cluster" - "github.com/devtron-labs/devtron/pkg/pipeline" - security2 "github.com/devtron-labs/devtron/pkg/security" - "github.com/devtron-labs/devtron/pkg/team" - "github.com/devtron-labs/devtron/pkg/user" - util2 "github.com/devtron-labs/devtron/util" - "github.com/devtron-labs/devtron/util/rbac" - "github.com/go-pg/pg" - "github.com/gorilla/mux" - "github.com/grpc-ecosystem/grpc-gateway/runtime" - "go.uber.org/zap" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/status" - "gopkg.in/go-playground/validator.v9" -) - -type DevtronAppAutoCompleteRestHandler interface { - GitListAutocomplete(w http.ResponseWriter, r *http.Request) - DockerListAutocomplete(w http.ResponseWriter, r *http.Request) - TeamListAutocomplete(w http.ResponseWriter, r *http.Request) - EnvironmentListAutocomplete(w http.ResponseWriter, r *http.Request) - GetAppListForAutocomplete(w http.ResponseWriter, r *http.Request) -} - -type DevtronAppRestHandler interface { - CreateApp(w http.ResponseWriter, r *http.Request) - DeleteApp(w http.ResponseWriter, r *http.Request) - GetApp(w http.ResponseWriter, r *http.Request) - - FindAppsByTeamId(w http.ResponseWriter, r *http.Request) - FindAppsByTeamName(w http.ResponseWriter, r *http.Request) - GetAppListByTeamIds(w http.ResponseWriter, r *http.Request) -} - -type DevtronAppWorkflowRestHandler interface { - FetchWorkflowDetails(w http.ResponseWriter, r *http.Request) - FetchAppWorkflowStatusForTriggerView(w http.ResponseWriter, r *http.Request) -} - -type PipelineConfigRestHandler interface { - DevtronAppAutoCompleteRestHandler - DevtronAppRestHandler - DevtronAppWorkflowRestHandler - DevtronAppBuildRestHandler - DevtronAppBuildMaterialRestHandler - DevtronAppBuildHistoryRestHandler - DevtronAppDeploymentRestHandler - DevtronAppDeploymentHistoryRestHandler - DevtronAppPrePostDeploymentRestHandler - DevtronAppDeploymentConfigRestHandler - - EnvConfigOverrideCreateNamespace(w http.ResponseWriter, r *http.Request) - PipelineNameSuggestion(w http.ResponseWriter, r *http.Request) -} - -type PipelineConfigRestHandlerImpl struct { - pipelineBuilder pipeline.PipelineBuilder - ciPipelineRepository pipelineConfig.CiPipelineRepository - ciHandler pipeline.CiHandler - Logger *zap.SugaredLogger - chartService pipeline.ChartService - propertiesConfigService pipeline.PropertiesConfigService - dbMigrationService pipeline.DbMigrationService - application application.ServiceClient - userAuthService user.UserService - validator *validator.Validate - teamService team.TeamService - enforcer rbac.Enforcer - gitSensorClient gitSensor.GitSensorClient - pipelineRepository pipelineConfig.PipelineRepository - appWorkflowService appWorkflow.AppWorkflowService - enforcerUtil rbac.EnforcerUtil - envService request.EnvironmentService - gitRegistryConfig pipeline.GitRegistryConfig - dockerRegistryConfig pipeline.DockerRegistryConfig - cdHandler pipeline.CdHandler - appCloneService appClone.AppCloneService - materialRepository pipelineConfig.MaterialRepository - policyService security2.PolicyService - scanResultRepository security.ImageScanResultRepository - gitProviderRepo repository.GitProviderRepository -} - -func NewPipelineRestHandlerImpl(pipelineBuilder pipeline.PipelineBuilder, Logger *zap.SugaredLogger, - chartService pipeline.ChartService, - propertiesConfigService pipeline.PropertiesConfigService, - dbMigrationService pipeline.DbMigrationService, - application application.ServiceClient, - userAuthService user.UserService, - teamService team.TeamService, - enforcer rbac.Enforcer, - ciHandler pipeline.CiHandler, - validator *validator.Validate, - gitSensorClient gitSensor.GitSensorClient, - ciPipelineRepository pipelineConfig.CiPipelineRepository, pipelineRepository pipelineConfig.PipelineRepository, - enforcerUtil rbac.EnforcerUtil, envService request.EnvironmentService, - gitRegistryConfig pipeline.GitRegistryConfig, dockerRegistryConfig pipeline.DockerRegistryConfig, - cdHandler pipeline.CdHandler, - appCloneService appClone.AppCloneService, - appWorkflowService appWorkflow.AppWorkflowService, - materialRepository pipelineConfig.MaterialRepository, policyService security2.PolicyService, - scanResultRepository security.ImageScanResultRepository, gitProviderRepo repository.GitProviderRepository) *PipelineConfigRestHandlerImpl { - return &PipelineConfigRestHandlerImpl{ - pipelineBuilder: pipelineBuilder, - Logger: Logger, - chartService: chartService, - propertiesConfigService: propertiesConfigService, - dbMigrationService: dbMigrationService, - application: application, - userAuthService: userAuthService, - validator: validator, - teamService: teamService, - enforcer: enforcer, - ciHandler: ciHandler, - gitSensorClient: gitSensorClient, - ciPipelineRepository: ciPipelineRepository, - pipelineRepository: pipelineRepository, - enforcerUtil: enforcerUtil, - envService: envService, - gitRegistryConfig: gitRegistryConfig, - dockerRegistryConfig: dockerRegistryConfig, - cdHandler: cdHandler, - appCloneService: appCloneService, - appWorkflowService: appWorkflowService, - materialRepository: materialRepository, - policyService: policyService, - scanResultRepository: scanResultRepository, - gitProviderRepo: gitProviderRepo, - } -} - -const ( - devtron = "DEVTRON" - SSH_URL_PREFIX = "git@" - HTTPS_URL_PREFIX = "https://" -) - -func (handler PipelineConfigRestHandlerImpl) DeleteApp(w http.ResponseWriter, r *http.Request) { - token := r.Header.Get("token") - userId, err := handler.userAuthService.GetLoggedInUser(r) - if userId == 0 || err != nil { - common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) - return - } - vars := mux.Vars(r) - appId, err := strconv.Atoi(vars["appId"]) - if err != nil { - handler.Logger.Errorw("request err, delete app", "err", err, "appId", appId) - common.WriteJsonResp(w, err, nil, http.StatusBadRequest) - return - } - handler.Logger.Infow("request payload, delete app", "appId", appId) - wfs, err := handler.appWorkflowService.FindAppWorkflows(appId) - if err != nil { - handler.Logger.Errorw("could not fetch wfs", "err", err, "appId", appId) - common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - if len(wfs) != 0 { - handler.Logger.Info("cannot delete app with workflow's") - err = &util.ApiError{Code: "400", HttpStatusCode: 400, UserMessage: "cannot delete app having workflow's"} - common.WriteJsonResp(w, err, nil, http.StatusBadRequest) - return - } - - resourceObject := handler.enforcerUtil.GetAppRBACNameByAppId(appId) - if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionDelete, resourceObject); !ok { - common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden) - return - } - - err = handler.pipelineBuilder.DeleteApp(appId, userId) - if err != nil { - handler.Logger.Errorw("service error, delete app", "err", err, "appId", appId) - common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - common.WriteJsonResp(w, err, nil, http.StatusOK) -} - -func (handler PipelineConfigRestHandlerImpl) CreateApp(w http.ResponseWriter, r *http.Request) { - token := r.Header.Get("token") - decoder := json.NewDecoder(r.Body) - userId, err := handler.userAuthService.GetLoggedInUser(r) - if userId == 0 || err != nil { - common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) - return - } - var createRequest bean.CreateAppDTO - err = decoder.Decode(&createRequest) - createRequest.UserId = userId - if err != nil { - handler.Logger.Errorw("request err, CreateApp", "err", err, "CreateApp", createRequest) - common.WriteJsonResp(w, err, nil, http.StatusBadRequest) - return - } - - handler.Logger.Infow("request payload, CreateApp", "CreateApp", createRequest) - err = handler.validator.Struct(createRequest) - if err != nil { - handler.Logger.Errorw("validation err, CreateApp", "err", err, "CreateApp", createRequest) - common.WriteJsonResp(w, err, nil, http.StatusBadRequest) - return - } - - project, err := handler.teamService.FetchOne(createRequest.TeamId) - if err != nil { - common.WriteJsonResp(w, err, nil, http.StatusBadRequest) - return - } - // with admin roles, you have to access for all the apps of the project to create new app. (admin or manager with specific app permission can't create app.) - if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionCreate, fmt.Sprintf("%s/%s", strings.ToLower(project.Name), "*")); !ok { - common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden) - return - } - var createResp *bean.CreateAppDTO - err = nil - if createRequest.TemplateId == 0 { - createResp, err = handler.pipelineBuilder.CreateApp(&createRequest) - } else { - ctx, cancel := context.WithCancel(r.Context()) - if cn, ok := w.(http.CloseNotifier); ok { - go func(done <-chan struct{}, closed <-chan bool) { - select { - case <-done: - case <-closed: - cancel() - } - }(ctx.Done(), cn.CloseNotify()) - } - ctx = context.WithValue(r.Context(), "token", token) - createResp, err = handler.appCloneService.CloneApp(&createRequest, ctx) - } - if err != nil { - handler.Logger.Errorw("service err, CreateApp", "err", err, "CreateApp", createRequest) - common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - common.WriteJsonResp(w, err, createResp, http.StatusOK) -} - -func (handler PipelineConfigRestHandlerImpl) ValidateGitMaterialUrl(gitProviderId int, url string) (bool, error) { - gitProvider, err := handler.gitProviderRepo.FindOne(strconv.Itoa(gitProviderId)) - if err != nil { - return false, err - } - if gitProvider.AuthMode == repository.AUTH_MODE_SSH { - hasPrefixResult := strings.HasPrefix(url, SSH_URL_PREFIX) - return hasPrefixResult, nil - } - hasPrefixResult := strings.HasPrefix(url, HTTPS_URL_PREFIX) - return hasPrefixResult, nil -} - -func (handler PipelineConfigRestHandlerImpl) GetApp(w http.ResponseWriter, r *http.Request) { - token := r.Header.Get("token") - vars := mux.Vars(r) - appId, err := strconv.Atoi(vars["appId"]) - if err != nil { - handler.Logger.Errorw("request err, get app", "err", err, "appId", appId) - common.WriteJsonResp(w, err, nil, http.StatusBadRequest) - return - } - handler.Logger.Infow("request payload, get app", "appId", appId) - ciConf, err := handler.pipelineBuilder.GetApp(appId) - if err != nil { - handler.Logger.Errorw("service err, get app", "err", err, "appId", appId) - common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - - //rbac implementation starts here - object := handler.enforcerUtil.GetAppRBACNameByAppId(appId) - if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); !ok { - common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden) - return - } - //rbac implementation ends here - - common.WriteJsonResp(w, err, ciConf, http.StatusOK) -} - -func (handler PipelineConfigRestHandlerImpl) FindAppsByTeamId(w http.ResponseWriter, r *http.Request) { - vars := mux.Vars(r) - teamId, err := strconv.Atoi(vars["teamId"]) - if err != nil { - handler.Logger.Errorw("request err, FindAppsByTeamId", "err", err, "teamId", teamId) - common.WriteJsonResp(w, err, nil, http.StatusBadRequest) - return - } - handler.Logger.Infow("request payload, FindAppsByTeamId", "teamId", teamId) - project, err := handler.pipelineBuilder.FindAppsByTeamId(teamId) - if err != nil { - handler.Logger.Errorw("service err, FindAppsByTeamId", "err", err, "teamId", teamId) - common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - common.WriteJsonResp(w, err, project, http.StatusOK) -} - -func (handler PipelineConfigRestHandlerImpl) FindAppsByTeamName(w http.ResponseWriter, r *http.Request) { - vars := mux.Vars(r) - teamName := vars["teamName"] - handler.Logger.Infow("request payload, FindAppsByTeamName", "teamName", teamName) - project, err := handler.pipelineBuilder.FindAppsByTeamName(teamName) - if err != nil { - handler.Logger.Errorw("service err, FindAppsByTeamName", "err", err, "teamName", teamName) - common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - common.WriteJsonResp(w, err, project, http.StatusOK) -} - -func (handler PipelineConfigRestHandlerImpl) FetchWorkflowDetails(w http.ResponseWriter, r *http.Request) { - userId, err := handler.userAuthService.GetLoggedInUser(r) - if userId == 0 || err != nil { - common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) - return - } - vars := mux.Vars(r) - appId, err := strconv.Atoi(vars["appId"]) - if err != nil { - common.WriteJsonResp(w, err, nil, http.StatusBadRequest) - return - } - pipelineId, err := strconv.Atoi(vars["pipelineId"]) - if err != nil { - common.WriteJsonResp(w, err, nil, http.StatusBadRequest) - return - } - buildId, err := strconv.Atoi(vars["workflowId"]) - if err != nil || buildId == 0 { - common.WriteJsonResp(w, err, nil, http.StatusBadRequest) - return - } - handler.Logger.Infow("request payload, FetchWorkflowDetails", "appId", appId, "pipelineId", pipelineId, "buildId", buildId, "buildId", buildId) - ciPipeline, err := handler.ciPipelineRepository.FindById(pipelineId) - if err != nil { - common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - //RBAC - token := r.Header.Get("token") - object := handler.enforcerUtil.GetAppRBACNameByAppId(ciPipeline.AppId) - if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); !ok { - common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden) - return - } - //RBAC - resp, err := handler.ciHandler.FetchWorkflowDetails(appId, pipelineId, buildId) - if err != nil { - handler.Logger.Errorw("service err, FetchWorkflowDetails", "err", err, "appId", appId, "pipelineId", pipelineId, "buildId", buildId, "buildId", buildId) - if util.IsErrNoRows(err) { - err = &util.ApiError{Code: "404", HttpStatusCode: http.StatusNotFound, UserMessage: "no workflow found"} - common.WriteJsonResp(w, err, nil, http.StatusOK) - } else { - common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) - } - return - } - common.WriteJsonResp(w, err, resp, http.StatusOK) -} - -func (handler PipelineConfigRestHandlerImpl) CancelStage(w http.ResponseWriter, r *http.Request) { - userId, err := handler.userAuthService.GetLoggedInUser(r) - if userId == 0 || err != nil { - common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) - return - } - vars := mux.Vars(r) - pipelineId, err := strconv.Atoi(vars["pipelineId"]) - if err != nil { - common.WriteJsonResp(w, err, nil, http.StatusBadRequest) - return - } - workflowRunnerId, err := strconv.Atoi(vars["workflowRunnerId"]) - if err != nil { - common.WriteJsonResp(w, err, nil, http.StatusBadRequest) - return - } - cdPipeline, err := handler.pipelineRepository.FindById(pipelineId) - if err != nil { - common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - handler.Logger.Infow("request payload, CancelStage", "pipelineId", pipelineId, "workflowRunnerId", workflowRunnerId) - - //RBAC - token := r.Header.Get("token") - object := handler.enforcerUtil.GetAppRBACNameByAppId(cdPipeline.AppId) - if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionTrigger, object); !ok { - common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden) - return - } - //RBAC - - resp, err := handler.cdHandler.CancelStage(workflowRunnerId) - if err != nil { - handler.Logger.Errorw("service err, CancelStage", "err", err, "pipelineId", pipelineId, "workflowRunnerId", workflowRunnerId) - if util.IsErrNoRows(err) { - common.WriteJsonResp(w, err, nil, http.StatusNotFound) - } else { - common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) - } - return - } - common.WriteJsonResp(w, err, resp, http.StatusOK) -} - -func (handler PipelineConfigRestHandlerImpl) CancelWorkflow(w http.ResponseWriter, r *http.Request) { - userId, err := handler.userAuthService.GetLoggedInUser(r) - if userId == 0 || err != nil { - common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) - return - } - vars := mux.Vars(r) - workflowId, err := strconv.Atoi(vars["workflowId"]) - if err != nil { - handler.Logger.Errorw("request err, CancelWorkflow", "err", err, "workflowId", workflowId) - common.WriteJsonResp(w, err, nil, http.StatusBadRequest) - return - } - pipelineId, err := strconv.Atoi(vars["pipelineId"]) - if err != nil { - handler.Logger.Errorw("request err, CancelWorkflow", "err", err, "pipelineId", pipelineId) - common.WriteJsonResp(w, err, nil, http.StatusBadRequest) - return - } - handler.Logger.Infow("request payload, CancelWorkflow", "workflowId", workflowId, "pipelineId", pipelineId) - - ciPipeline, err := handler.ciPipelineRepository.FindById(pipelineId) - if err != nil { - handler.Logger.Errorw("service err, CancelWorkflow", "err", err, "workflowId", workflowId, "pipelineId", pipelineId) - common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - //RBAC - token := r.Header.Get("token") - object := handler.enforcerUtil.GetAppRBACNameByAppId(ciPipeline.AppId) - if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionTrigger, object); !ok { - common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden) - return - } - //RBAC - - resp, err := handler.ciHandler.CancelBuild(workflowId) - if err != nil { - handler.Logger.Errorw("service err, CancelWorkflow", "err", err, "workflowId", workflowId, "pipelineId", pipelineId) - if util.IsErrNoRows(err) { - common.WriteJsonResp(w, err, nil, http.StatusNotFound) - } else { - common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) - } - return - } - common.WriteJsonResp(w, err, resp, http.StatusOK) -} - -// FetchChanges FIXME check if deprecated -func (handler PipelineConfigRestHandlerImpl) FetchChanges(w http.ResponseWriter, r *http.Request) { - userId, err := handler.userAuthService.GetLoggedInUser(r) - if userId == 0 || err != nil { - common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) - return - } - vars := mux.Vars(r) - ciMaterialId, err := strconv.Atoi(vars["ciMaterialId"]) - if err != nil { - common.WriteJsonResp(w, err, nil, http.StatusBadRequest) - return - } - - pipelineId, err := strconv.Atoi(vars["pipelineId"]) - if err != nil { - common.WriteJsonResp(w, err, nil, http.StatusBadRequest) - return - } - handler.Logger.Infow("request payload, FetchChanges", "ciMaterialId", ciMaterialId, "pipelineId", pipelineId) - ciPipeline, err := handler.ciPipelineRepository.FindById(pipelineId) - if err != nil { - handler.Logger.Errorw("request err, FetchChanges", "err", err, "ciMaterialId", ciMaterialId, "pipelineId", pipelineId) - common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - //RBAC - token := r.Header.Get("token") - object := handler.enforcerUtil.GetAppRBACNameByAppId(ciPipeline.AppId) - if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); !ok { - common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden) - return - } - //RBAC - - changeRequest := &gitSensor.FetchScmChangesRequest{ - PipelineMaterialId: ciMaterialId, - } - changes, err := handler.gitSensorClient.FetchChanges(changeRequest) - if err != nil { - handler.Logger.Errorw("service err, FetchChanges", "err", err, "ciMaterialId", ciMaterialId, "pipelineId", pipelineId) - common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - common.WriteJsonResp(w, err, changes.Commits, http.StatusCreated) -} - -func (handler *PipelineConfigRestHandlerImpl) streamOutput(w http.ResponseWriter, reader *bufio.Reader, lastSeenMsgId int) { - f, ok := w.(http.Flusher) - if !ok { - http.Error(w, "unexpected server doesnt support streaming", http.StatusInternalServerError) - } - - // Important to make it work in browsers - w.Header().Set("Connection", "keep-alive") - w.Header().Set("Cache-Control", "no-cache") - w.Header().Set("Transfer-Encoding", "chunked") - w.Header().Set("Content-Type", "text/event-stream") - w.Header().Set("X-Accel-Buffering", "no") - w.Header().Set("X-Content-Type-Options", "nosniff") - - //var wroteHeader bool - startOfStream := []byte("START_OF_STREAM") - endOfStreamEvent := []byte("END_OF_STREAM") - reconnectEvent := []byte("RECONNECT_STREAM") - unexpectedEndOfStreamEvent := []byte("UNEXPECTED_END_OF_STREAM") - streamStarted := false - msgCounter := 0 - if lastSeenMsgId == -1 { - handler.sendData(startOfStream, w, msgCounter) - handler.sendEvent(startOfStream, w) - f.Flush() - } else { - handler.sendEvent(reconnectEvent, w) - f.Flush() - } - - for { - data, err := reader.ReadBytes('\n') - if err == io.EOF { - if streamStarted { - handler.sendData(endOfStreamEvent, w, msgCounter) - handler.sendEvent(endOfStreamEvent, w) - f.Flush() - return - } - return - } - if err != nil { - //TODO handle error - handler.sendData(unexpectedEndOfStreamEvent, w, msgCounter) - handler.sendEvent(unexpectedEndOfStreamEvent, w) - f.Flush() - return - } - msgCounter = msgCounter + 1 - //skip for seen msg - if msgCounter <= lastSeenMsgId { - continue - } - if strings.Contains(string(data), devtron) { - continue - } - - var res []byte - res = append(res, "id:"...) - res = append(res, fmt.Sprintf("%d\n", msgCounter)...) - res = append(res, "data:"...) - res = append(res, data...) - res = append(res, '\n') - - if _, err = w.Write(res); err != nil { - //TODO handle error - handler.Logger.Errorw("Failed to send response chunk, streamOutput", "err", err) - handler.sendData(unexpectedEndOfStreamEvent, w, msgCounter) - handler.sendEvent(unexpectedEndOfStreamEvent, w) - f.Flush() - return - } - streamStarted = true - f.Flush() - } -} - -func (handler *PipelineConfigRestHandlerImpl) sendEvent(event []byte, w http.ResponseWriter) { - var res []byte - res = append(res, "event:"...) - res = append(res, event...) - res = append(res, '\n') - res = append(res, "data:"...) - res = append(res, '\n', '\n') - - if _, err := w.Write(res); err != nil { - handler.Logger.Debugf("Failed to send response chunk: %v", err) - return - } - -} -func (handler *PipelineConfigRestHandlerImpl) sendData(event []byte, w http.ResponseWriter, msgId int) { - var res []byte - res = append(res, "id:"...) - res = append(res, fmt.Sprintf("%d\n", msgId)...) - res = append(res, "data:"...) - res = append(res, event...) - res = append(res, '\n', '\n') - if _, err := w.Write(res); err != nil { - handler.Logger.Errorw("Failed to send response chunk, sendData", "err", err) - return - } -} - -func (handler *PipelineConfigRestHandlerImpl) handleForwardResponseStreamError(wroteHeader bool, w http.ResponseWriter, err error) { - code := "000" - if !wroteHeader { - s, ok := status.FromError(err) - if !ok { - s = status.New(codes.Unknown, err.Error()) - } - w.WriteHeader(runtime.HTTPStatusFromCode(s.Code())) - code = fmt.Sprint(s.Code()) - } - response := bean2.Response{} - apiErr := bean2.ApiError{} - apiErr.Code = code // 000=unknown - apiErr.InternalMessage = err.Error() - response.Errors = []bean2.ApiError{apiErr} - buf, err2 := json.Marshal(response) - if err2 != nil { - handler.Logger.Errorw("marshal err, handleForwardResponseStreamError", "err", err2, "response", response) - } - if _, err3 := w.Write(buf); err3 != nil { - handler.Logger.Errorw("Failed to notify error to client, handleForwardResponseStreamError", "err", err3, "response", response) - return - } -} - -func (handler PipelineConfigRestHandlerImpl) GetAppListForAutocomplete(w http.ResponseWriter, r *http.Request) { - userId, err := handler.userAuthService.GetLoggedInUser(r) - if userId == 0 || err != nil { - common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) - return - } - v := r.URL.Query() - teamId := v.Get("teamId") - handler.Logger.Infow("request payload, GetAppListForAutocomplete", "teamId", teamId) - var apps []pipeline.AppBean - if len(teamId) == 0 { - apps, err = handler.pipelineBuilder.GetAppList() - if err != nil { - handler.Logger.Errorw("service err, GetAppListForAutocomplete", "err", err, "teamId", teamId) - common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - } else { - teamId, err := strconv.Atoi(teamId) - if err != nil { - common.WriteJsonResp(w, err, nil, http.StatusBadRequest) - return - } else { - apps, err = handler.pipelineBuilder.FindAppsByTeamId(teamId) - if err != nil { - handler.Logger.Errorw("service err, GetAppListForAutocomplete", "err", err, "teamId", teamId) - common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - } - } - - token := r.Header.Get("token") - var accessedApps []pipeline.AppBean - // RBAC - objects := handler.enforcerUtil.GetRbacObjectsForAllApps() - for _, app := range apps { - object := objects[app.Id] - if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); ok { - accessedApps = append(accessedApps, app) - } - } - // RBAC - if len(accessedApps) == 0 { - accessedApps = make([]pipeline.AppBean, 0) - } - common.WriteJsonResp(w, err, accessedApps, http.StatusOK) -} - -func (handler PipelineConfigRestHandlerImpl) GetAppListByTeamIds(w http.ResponseWriter, r *http.Request) { - userId, err := handler.userAuthService.GetLoggedInUser(r) - if userId == 0 || err != nil { - common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) - return - } - //vars := mux.Vars(r) - v := r.URL.Query() - params := v.Get("teamIds") - if len(params) == 0 { - common.WriteJsonResp(w, err, "StatusBadRequest", http.StatusBadRequest) - return - } - handler.Logger.Infow("request payload, GetAppListByTeamIds", "payload", params) - var teamIds []int - teamIdList := strings.Split(params, ",") - for _, item := range teamIdList { - teamId, err := strconv.Atoi(item) - if err != nil { - common.WriteJsonResp(w, err, nil, http.StatusBadRequest) - return - } - teamIds = append(teamIds, teamId) - } - projectWiseApps, err := handler.pipelineBuilder.GetAppListByTeamIds(teamIds) - if err != nil { - handler.Logger.Errorw("service err, GetAppListByTeamIds", "err", err, "payload", params) - common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - - token := r.Header.Get("token") - // RBAC - for _, project := range projectWiseApps { - var accessedApps []*pipeline.AppBean - for _, app := range project.AppList { - object := fmt.Sprintf("%s/%s", project.ProjectName, app.Name) - if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); ok { - accessedApps = append(accessedApps, app) - } - } - if len(accessedApps) == 0 { - accessedApps = make([]*pipeline.AppBean, 0) - } - project.AppList = accessedApps - } - // RBAC - common.WriteJsonResp(w, err, projectWiseApps, http.StatusOK) -} - -func (handler PipelineConfigRestHandlerImpl) EnvironmentListAutocomplete(w http.ResponseWriter, r *http.Request) { - token := r.Header.Get("token") - vars := mux.Vars(r) - appId, err := strconv.Atoi(vars["appId"]) - if err != nil { - common.WriteJsonResp(w, err, nil, http.StatusBadRequest) - return - } - handler.Logger.Infow("request payload, EnvironmentListAutocomplete", "appId", appId) - //RBAC - object := handler.enforcerUtil.GetAppRBACNameByAppId(appId) - if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); !ok { - common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden) - return - } - //RBAC - result, err := handler.envService.GetEnvironmentListForAutocomplete() - if err != nil { - handler.Logger.Errorw("service err, EnvironmentListAutocomplete", "err", err, "appId", appId) - common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - common.WriteJsonResp(w, err, result, http.StatusOK) -} - -func (handler PipelineConfigRestHandlerImpl) GitListAutocomplete(w http.ResponseWriter, r *http.Request) { - token := r.Header.Get("token") - vars := mux.Vars(r) - appId, err := strconv.Atoi(vars["appId"]) - if err != nil { - common.WriteJsonResp(w, err, nil, http.StatusBadRequest) - return - } - handler.Logger.Infow("request payload, GitListAutocomplete", "appId", appId) - //RBAC - object := handler.enforcerUtil.GetAppRBACNameByAppId(appId) - if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); !ok { - common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden) - return - } - //RBAC - res, err := handler.gitRegistryConfig.GetAll() - if err != nil { - handler.Logger.Errorw("service err, GitListAutocomplete", "err", err, "appId", appId) - common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - - common.WriteJsonResp(w, err, res, http.StatusOK) -} - -func (handler PipelineConfigRestHandlerImpl) DockerListAutocomplete(w http.ResponseWriter, r *http.Request) { - token := r.Header.Get("token") - vars := mux.Vars(r) - appId, err := strconv.Atoi(vars["appId"]) - if err != nil { - common.WriteJsonResp(w, err, nil, http.StatusBadRequest) - return - } - handler.Logger.Infow("request payload, DockerListAutocomplete", "appId", appId) - //RBAC - object := handler.enforcerUtil.GetAppRBACNameByAppId(appId) - if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); !ok { - common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden) - return - } - //RBAC - res, err := handler.dockerRegistryConfig.ListAllActive() - if err != nil { - handler.Logger.Errorw("service err, DockerListAutocomplete", "err", err, "appId", appId) - common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - - common.WriteJsonResp(w, err, res, http.StatusOK) -} - -func (handler PipelineConfigRestHandlerImpl) TeamListAutocomplete(w http.ResponseWriter, r *http.Request) { - token := r.Header.Get("token") - vars := mux.Vars(r) - appId, err := strconv.Atoi(vars["appId"]) - if err != nil { - common.WriteJsonResp(w, err, nil, http.StatusBadRequest) - return - } - handler.Logger.Infow("request payload, TeamListAutocomplete", "appId", appId) - //RBAC - object := handler.enforcerUtil.GetAppRBACNameByAppId(appId) - if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); !ok { - common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden) - return - } - //RBAC - result, err := handler.teamService.FetchForAutocomplete() - if err != nil { - handler.Logger.Errorw("service err, TeamListAutocomplete", "err", err, "appId", appId) - common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - - common.WriteJsonResp(w, err, result, http.StatusOK) -} - -func (handler PipelineConfigRestHandlerImpl) IsReadyToTrigger(w http.ResponseWriter, r *http.Request) { - token := r.Header.Get("token") - vars := mux.Vars(r) - appId, err := strconv.Atoi(vars["appId"]) - if err != nil { - common.WriteJsonResp(w, err, nil, http.StatusBadRequest) - return - } - envId, err := strconv.Atoi(vars["envId"]) - if err != nil { - common.WriteJsonResp(w, err, nil, http.StatusBadRequest) - return - } - pipelineId, err := strconv.Atoi(vars["pipelineId"]) - if err != nil { - common.WriteJsonResp(w, err, nil, http.StatusBadRequest) - return - } - handler.Logger.Infow("request payload, IsReadyToTrigger", "appId", appId, "envId", envId, "pipelineId", pipelineId) - //RBAC - object := handler.enforcerUtil.GetAppRBACNameByAppId(appId) - if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); !ok { - common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden) - return - } - object = handler.enforcerUtil.GetEnvRBACNameByAppId(appId, envId) - if ok := handler.enforcer.Enforce(token, rbac.ResourceEnvironment, rbac.ActionGet, strings.ToLower(object)); !ok { - common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden) - return - } - //RBAC - - result, err := handler.chartService.IsReadyToTrigger(appId, envId, pipelineId) - if err != nil { - handler.Logger.Errorw("service err, IsReadyToTrigger", "err", err, "appId", appId, "envId", envId, "pipelineId", pipelineId) - common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - common.WriteJsonResp(w, err, result, http.StatusOK) -} - -func (handler PipelineConfigRestHandlerImpl) GetDeploymentPipelineStrategy(w http.ResponseWriter, r *http.Request) { - token := r.Header.Get("token") - vars := mux.Vars(r) - appId, err := strconv.Atoi(vars["appId"]) - if err != nil { - common.WriteJsonResp(w, err, nil, http.StatusBadRequest) - return - } - handler.Logger.Infow("request payload, GetDeploymentPipelineStrategy", "appId", appId) - //RBAC - object := handler.enforcerUtil.GetAppRBACNameByAppId(appId) - if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, object); !ok { - common.WriteJsonResp(w, err, "Unauthorized User", http.StatusForbidden) - return - } - //RBAC - - result, err := handler.pipelineBuilder.FetchCDPipelineStrategy(appId) - if err != nil { - handler.Logger.Errorw("service err, GetDeploymentPipelineStrategy", "err", err, "appId", appId) - common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - - common.WriteJsonResp(w, err, result, http.StatusOK) -} - -func (handler PipelineConfigRestHandlerImpl) UpgradeForAllApps(w http.ResponseWriter, r *http.Request) { - userId, err := handler.userAuthService.GetLoggedInUser(r) - if userId == 0 || err != nil { - common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) - return - } - vars := mux.Vars(r) - chartRefId, err := strconv.Atoi(vars["chartRefId"]) - if err != nil { - common.WriteJsonResp(w, err, nil, http.StatusBadRequest) - return - } - - decoder := json.NewDecoder(r.Body) - var chartUpgradeRequest pipeline.ChartUpgradeRequest - err = decoder.Decode(&chartUpgradeRequest) - if err != nil { - handler.Logger.Errorw("request err, UpgradeForAllApps", "err", err, "payload", chartUpgradeRequest) - common.WriteJsonResp(w, err, nil, http.StatusBadRequest) - return - } - chartUpgradeRequest.ChartRefId = chartRefId - chartUpgradeRequest.UserId = userId - handler.Logger.Infow("request payload, UpgradeForAllApps", "payload", chartUpgradeRequest) - token := r.Header.Get("token") - if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionCreate, "*/*"); !ok { - common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) - return - } - if ok := handler.enforcer.Enforce(token, rbac.ResourceEnvironment, rbac.ActionCreate, "*/*"); !ok { - common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) - return - } - - newAppOverride, err := handler.chartService.GetAppOverrideForDefaultTemplate(chartUpgradeRequest.ChartRefId) - if err != nil { - handler.Logger.Errorw("service err, UpgradeForAllApps", "err", err, "payload", chartUpgradeRequest) - common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - - ctx, cancel := context.WithCancel(r.Context()) - if cn, ok := w.(http.CloseNotifier); ok { - go func(done <-chan struct{}, closed <-chan bool) { - select { - case <-done: - case <-closed: - cancel() - } - }(ctx.Done(), cn.CloseNotify()) - } - ctx = context.WithValue(r.Context(), "token", token) - - var appIds []int - if chartUpgradeRequest.All || len(chartUpgradeRequest.AppIds) == 0 { - apps, err := handler.pipelineBuilder.GetAppList() - if err != nil { - handler.Logger.Errorw("service err, UpgradeForAllApps", "err", err, "payload", chartUpgradeRequest) - common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - for _, app := range apps { - appIds = append(appIds, app.Id) - } - } else { - appIds = chartUpgradeRequest.AppIds - } - response := make(map[string][]map[string]string) - var failedIds []map[string]string - for _, appId := range appIds { - appResponse := make(map[string]string) - template, err := handler.chartService.GetByAppIdAndChartRefId(appId, chartRefId) - if err != nil && pg.ErrNoRows != err { - handler.Logger.Errorw("err in checking weather exist or not, skip for upgrade", "err", err, "payload", chartUpgradeRequest) - appResponse["appId"] = strconv.Itoa(appId) - appResponse["message"] = "err in checking weather exist or not, skip for upgrade" - failedIds = append(failedIds, appResponse) - continue - } - if template != nil && template.Id > 0 { - handler.Logger.Warnw("this ref chart already configured for this app, skip for upgrade", "payload", chartUpgradeRequest) - appResponse["appId"] = strconv.Itoa(appId) - appResponse["message"] = "this ref chart already configured for this app, skip for upgrade" - failedIds = append(failedIds, appResponse) - continue - } - flag, err := handler.chartService.UpgradeForApp(appId, chartRefId, newAppOverride, userId, ctx) - if err != nil { - handler.Logger.Errorw("service err, UpdateCiTemplate", "err", err, "payload", chartUpgradeRequest) - appResponse["appId"] = strconv.Itoa(appId) - appResponse["message"] = err.Error() - failedIds = append(failedIds, appResponse) - } else if flag == false { - handler.Logger.Debugw("unable to upgrade for app", "appId", appId, "payload", chartUpgradeRequest) - appResponse["appId"] = strconv.Itoa(appId) - appResponse["message"] = "no error found, but failed to upgrade" - failedIds = append(failedIds, appResponse) - } - - } - response["failed"] = failedIds - common.WriteJsonResp(w, err, response, http.StatusOK) -} - -func (handler PipelineConfigRestHandlerImpl) EnvConfigOverrideCreateNamespace(w http.ResponseWriter, r *http.Request) { - userId, err := handler.userAuthService.GetLoggedInUser(r) - if userId == 0 || err != nil { - common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) - return - } - token := r.Header.Get("token") - vars := mux.Vars(r) - appId, err := strconv.Atoi(vars["appId"]) - if err != nil { - common.WriteJsonResp(w, err, nil, http.StatusBadRequest) - return - } - environmentId, err := strconv.Atoi(vars["environmentId"]) - if err != nil { - common.WriteJsonResp(w, err, nil, http.StatusBadRequest) - return - } - decoder := json.NewDecoder(r.Body) - var envConfigProperties pipeline.EnvironmentProperties - err = decoder.Decode(&envConfigProperties) - envConfigProperties.UserId = userId - envConfigProperties.EnvironmentId = environmentId - if err != nil { - common.WriteJsonResp(w, err, nil, http.StatusBadRequest) - return - } - handler.Logger.Infow("request payload, EnvConfigOverrideCreateNamespace", "appId", appId, "environmentId", environmentId, "payload", envConfigProperties) - app, err := handler.pipelineBuilder.GetApp(appId) - if err != nil { - common.WriteJsonResp(w, err, nil, http.StatusBadRequest) - return - } - resourceName := handler.enforcerUtil.GetAppRBACNameByAppId(appId) - if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionCreate, resourceName); !ok { - common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) - return - } - object := handler.enforcerUtil.GetAppRBACByAppNameAndEnvId(app.AppName, environmentId) - if ok := handler.enforcer.Enforce(token, rbac.ResourceEnvironment, rbac.ActionCreate, object); !ok { - common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) - return - } - createResp, err := handler.propertiesConfigService.CreateEnvironmentPropertiesWithNamespace(appId, &envConfigProperties) - if err != nil { - handler.Logger.Errorw("service err, EnvConfigOverrideCreateNamespace", "err", err, "appId", appId, "environmentId", environmentId, "payload", envConfigProperties) - common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) - return - } - common.WriteJsonResp(w, err, createResp, http.StatusOK) -} - -func (handler PipelineConfigRestHandlerImpl) FetchAppWorkflowStatusForTriggerView(w http.ResponseWriter, r *http.Request) { - userId, err := handler.userAuthService.GetLoggedInUser(r) - if userId == 0 || err != nil { - common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized) - return - } - token := r.Header.Get("token") - vars := mux.Vars(r) - appId, err := strconv.Atoi(vars["appId"]) - if err != nil { - common.WriteJsonResp(w, err, nil, http.StatusBadRequest) - return - } - handler.Logger.Infow("request payload, FetchAppWorkflowStatusForTriggerView", "err", err, "appId", appId) - //RBAC CHECK - resourceName := handler.enforcerUtil.GetAppRBACNameByAppId(appId) - if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, resourceName); !ok { - common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) - return - } - //RBAC CHECK - - triggerWorkflowStatus := pipelineConfig.TriggerWorkflowStatus{} - ciWorkflowStatus, err := handler.ciHandler.FetchCiStatusForTriggerView(appId) - if err != nil { - handler.Logger.Errorw("service err, FetchAppWorkflowStatusForTriggerView", "err", err, "appId", appId) - if util.IsErrNoRows(err) { - err = &util.ApiError{Code: "404", HttpStatusCode: 200, UserMessage: "no workflow found"} - common.WriteJsonResp(w, err, nil, http.StatusOK) - } else { - common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) - } - return - } - - cdWorkflowStatus, err := handler.cdHandler.FetchAppWorkflowStatusForTriggerView(appId) - if err != nil { - handler.Logger.Errorw("service err, FetchAppWorkflowStatusForTriggerView", "err", err, "appId", appId) - if util.IsErrNoRows(err) { - err = &util.ApiError{Code: "404", HttpStatusCode: 200, UserMessage: "no status found"} - common.WriteJsonResp(w, err, nil, http.StatusOK) - } else { - common.WriteJsonResp(w, err, nil, http.StatusInternalServerError) - } - return - } - triggerWorkflowStatus.CiWorkflowStatus = ciWorkflowStatus - triggerWorkflowStatus.CdWorkflowStatus = cdWorkflowStatus - common.WriteJsonResp(w, err, triggerWorkflowStatus, http.StatusOK) -} - -func (handler PipelineConfigRestHandlerImpl) PipelineNameSuggestion(w http.ResponseWriter, r *http.Request) { - token := r.Header.Get("token") - vars := mux.Vars(r) - appId, err := strconv.Atoi(vars["appId"]) - if err != nil { - common.WriteJsonResp(w, err, nil, http.StatusBadRequest) - return - } - pType := vars["type"] - handler.Logger.Infow("request payload, PipelineNameSuggestion", "err", err, "appId", appId) - app, err := handler.pipelineBuilder.GetApp(appId) - if err != nil { - handler.Logger.Infow("service error, GetCIPipelineById", "err", err, "appId", appId) - common.WriteJsonResp(w, err, nil, http.StatusBadRequest) - return - } - suggestedName := fmt.Sprintf("%s-%d-%s", pType, appId, util2.Generate(4)) - resourceName := handler.enforcerUtil.GetAppRBACName(app.AppName) - if ok := handler.enforcer.Enforce(token, rbac.ResourceApplications, rbac.ActionGet, resourceName); !ok { - common.WriteJsonResp(w, fmt.Errorf("unauthorized user"), "Unauthorized User", http.StatusForbidden) - return - } - common.WriteJsonResp(w, err, suggestedName, http.StatusOK) -} diff --git a/api/router/PipelineConfigRouter.go b/api/router/PipelineConfigRouter.go index 461a2fa8e2..3a9e24aa9d 100644 --- a/api/router/PipelineConfigRouter.go +++ b/api/router/PipelineConfigRouter.go @@ -27,12 +27,12 @@ type PipelineConfigRouter interface { initPipelineConfigRouter(configRouter *mux.Router) } type PipelineConfigRouterImpl struct { - restHandler pipeline.PipelineConfigRestHandler + restHandler app.PipelineConfigRestHandler appWorkflowRestHandler restHandler.AppWorkflowRestHandler webhookDataRestHandler restHandler.WebhookDataRestHandler } -func NewPipelineRouterImpl(restHandler pipeline.PipelineConfigRestHandler, appWorkflowRestHandler restHandler.AppWorkflowRestHandler, webhookDataRestHandler restHandler.WebhookDataRestHandler) *PipelineConfigRouterImpl { +func NewPipelineRouterImpl(restHandler app.PipelineConfigRestHandler, appWorkflowRestHandler restHandler.AppWorkflowRestHandler, webhookDataRestHandler restHandler.WebhookDataRestHandler) *PipelineConfigRouterImpl { return &PipelineConfigRouterImpl{restHandler: restHandler, appWorkflowRestHandler: appWorkflowRestHandler, webhookDataRestHandler: webhookDataRestHandler} } diff --git a/api/router/WebhookRouter.go b/api/router/WebhookRouter.go index e82c2a56be..7f70a7b725 100644 --- a/api/router/WebhookRouter.go +++ b/api/router/WebhookRouter.go @@ -29,13 +29,13 @@ type WebhookRouter interface { type WebhookRouterImpl struct { gitWebhookRestHandler restHandler.GitWebhookRestHandler - pipelineRestHandler pipeline.PipelineConfigRestHandler + pipelineRestHandler app.PipelineConfigRestHandler externalCiRestHandler restHandler.ExternalCiRestHandler pubSubClientRestHandler restHandler.PubSubClientRestHandler } func NewWebhookRouterImpl(gitWebhookRestHandler restHandler.GitWebhookRestHandler, - pipelineRestHandler pipeline.PipelineConfigRestHandler, externalCiRestHandler restHandler.ExternalCiRestHandler, + pipelineRestHandler app.PipelineConfigRestHandler, externalCiRestHandler restHandler.ExternalCiRestHandler, pubSubClientRestHandler restHandler.PubSubClientRestHandler) *WebhookRouterImpl { return &WebhookRouterImpl{ gitWebhookRestHandler: gitWebhookRestHandler, From 2afad10ee72a18ad2fe7a2e60237a630aa9c031a Mon Sep 17 00:00:00 2001 From: Prashant Ghildiyal Date: Wed, 24 Nov 2021 23:27:52 +0530 Subject: [PATCH 3/3] compiled after refactoring --- Wire.go | 2 +- api/restHandler/app/BuildPipelineRestHandler.go | 1 + api/router/PipelineConfigRouter.go | 2 +- api/router/WebhookRouter.go | 2 +- wire_gen.go | 4 ++-- 5 files changed, 6 insertions(+), 5 deletions(-) diff --git a/Wire.go b/Wire.go index 3c68eb3b54..47494b8c61 100644 --- a/Wire.go +++ b/Wire.go @@ -23,7 +23,7 @@ package main import ( "github.com/devtron-labs/devtron/api/connector" "github.com/devtron-labs/devtron/api/restHandler" - pipeline2 "github.com/devtron-labs/devtron/api/restHandler/pipeline" + pipeline2 "github.com/devtron-labs/devtron/api/restHandler/app" "github.com/devtron-labs/devtron/api/router" "github.com/devtron-labs/devtron/api/router/pubsub" "github.com/devtron-labs/devtron/api/sse" diff --git a/api/restHandler/app/BuildPipelineRestHandler.go b/api/restHandler/app/BuildPipelineRestHandler.go index 80849a470f..fe8952ee49 100644 --- a/api/restHandler/app/BuildPipelineRestHandler.go +++ b/api/restHandler/app/BuildPipelineRestHandler.go @@ -31,6 +31,7 @@ type DevtronAppBuildRestHandler interface { GetCIPipelineById(w http.ResponseWriter, r *http.Request) HandleWorkflowWebhook(w http.ResponseWriter, r *http.Request) GetBuildLogs(w http.ResponseWriter, r *http.Request) + FetchWorkflowDetails(w http.ResponseWriter, r *http.Request) // CancelWorkflow CancelBuild CancelWorkflow(w http.ResponseWriter, r *http.Request) } diff --git a/api/router/PipelineConfigRouter.go b/api/router/PipelineConfigRouter.go index 3a9e24aa9d..fa232cfebe 100644 --- a/api/router/PipelineConfigRouter.go +++ b/api/router/PipelineConfigRouter.go @@ -19,7 +19,7 @@ package router import ( "github.com/devtron-labs/devtron/api/restHandler" - "github.com/devtron-labs/devtron/api/restHandler/pipeline" + "github.com/devtron-labs/devtron/api/restHandler/app" "github.com/gorilla/mux" ) diff --git a/api/router/WebhookRouter.go b/api/router/WebhookRouter.go index 7f70a7b725..1fa28e2609 100644 --- a/api/router/WebhookRouter.go +++ b/api/router/WebhookRouter.go @@ -19,7 +19,7 @@ package router import ( "github.com/devtron-labs/devtron/api/restHandler" - "github.com/devtron-labs/devtron/api/restHandler/pipeline" + "github.com/devtron-labs/devtron/api/restHandler/app" "github.com/gorilla/mux" ) diff --git a/wire_gen.go b/wire_gen.go index 81edb47fb0..c2ed011af7 100644 --- a/wire_gen.go +++ b/wire_gen.go @@ -8,7 +8,7 @@ package main import ( "github.com/devtron-labs/devtron/api/connector" "github.com/devtron-labs/devtron/api/restHandler" - pipeline2 "github.com/devtron-labs/devtron/api/restHandler/pipeline" + app2 "github.com/devtron-labs/devtron/api/restHandler/app" "github.com/devtron-labs/devtron/api/router" pubsub2 "github.com/devtron-labs/devtron/api/router/pubsub" "github.com/devtron-labs/devtron/api/sse" @@ -243,7 +243,7 @@ func InitializeApp() (*App, error) { imageScanObjectMetaRepositoryImpl := security.NewImageScanObjectMetaRepositoryImpl(db, sugaredLogger) cveStoreRepositoryImpl := security.NewCveStoreRepositoryImpl(db, sugaredLogger) policyServiceImpl := security2.NewPolicyServiceImpl(environmentServiceImpl, sugaredLogger, appRepositoryImpl, pipelineOverrideRepositoryImpl, cvePolicyRepositoryImpl, clusterServiceImpl, pipelineRepositoryImpl, imageScanResultRepositoryImpl, imageScanDeployInfoRepositoryImpl, imageScanObjectMetaRepositoryImpl, httpClient, ciArtifactRepositoryImpl, ciConfig, imageScanHistoryRepositoryImpl, cveStoreRepositoryImpl, ciTemplateRepositoryImpl) - pipelineConfigRestHandlerImpl := pipeline2.NewPipelineRestHandlerImpl(pipelineBuilderImpl, sugaredLogger, chartServiceImpl, propertiesConfigServiceImpl, dbMigrationServiceImpl, serviceClientImpl, userServiceImpl, teamServiceImpl, enforcerImpl, ciHandlerImpl, validate, gitSensorClientImpl, ciPipelineRepositoryImpl, pipelineRepositoryImpl, enforcerUtilImpl, environmentServiceImpl, gitRegistryConfigImpl, dockerRegistryConfigImpl, cdHandlerImpl, appCloneServiceImpl, appWorkflowServiceImpl, materialRepositoryImpl, policyServiceImpl, imageScanResultRepositoryImpl, gitProviderRepositoryImpl) + pipelineConfigRestHandlerImpl := app2.NewPipelineRestHandlerImpl(pipelineBuilderImpl, sugaredLogger, chartServiceImpl, propertiesConfigServiceImpl, dbMigrationServiceImpl, serviceClientImpl, userServiceImpl, teamServiceImpl, enforcerImpl, ciHandlerImpl, validate, gitSensorClientImpl, ciPipelineRepositoryImpl, pipelineRepositoryImpl, enforcerUtilImpl, environmentServiceImpl, gitRegistryConfigImpl, dockerRegistryConfigImpl, cdHandlerImpl, appCloneServiceImpl, appWorkflowServiceImpl, materialRepositoryImpl, policyServiceImpl, imageScanResultRepositoryImpl, gitProviderRepositoryImpl) appWorkflowRestHandlerImpl := restHandler.NewAppWorkflowRestHandlerImpl(sugaredLogger, userServiceImpl, appWorkflowServiceImpl, teamServiceImpl, enforcerImpl, pipelineBuilderImpl, appRepositoryImpl, enforcerUtilImpl) webhookEventDataRepositoryImpl := repository.NewWebhookEventDataRepositoryImpl(db) webhookEventDataConfigImpl := pipeline.NewWebhookEventDataConfigImpl(sugaredLogger, webhookEventDataRepositoryImpl)