1818package appStore
1919
2020import (
21+ "context"
2122 "encoding/json"
2223 "errors"
2324 "fmt"
@@ -35,6 +36,7 @@ import (
3536 "github.com/devtron-labs/devtron/pkg/cluster"
3637 "github.com/devtron-labs/devtron/pkg/user"
3738 "github.com/devtron-labs/devtron/pkg/user/casbin"
39+ "github.com/devtron-labs/devtron/util"
3840 "github.com/devtron-labs/devtron/util/argo"
3941 "github.com/devtron-labs/devtron/util/rbac"
4042 "github.com/devtron-labs/devtron/util/response"
@@ -54,6 +56,7 @@ type InstalledAppRestHandler interface {
5456 CheckAppExists (w http.ResponseWriter , r * http.Request )
5557 DefaultComponentInstallation (w http.ResponseWriter , r * http.Request )
5658 FetchAppDetailsForInstalledApp (w http.ResponseWriter , r * http.Request )
59+ DeleteArgoInstalledAppWithNonCascade (w http.ResponseWriter , r * http.Request )
5760 FetchAppDetailsForInstalledAppV2 (w http.ResponseWriter , r * http.Request )
5861 FetchResourceTree (w http.ResponseWriter , r * http.Request )
5962 FetchResourceTreeForACDApp (w http.ResponseWriter , r * http.Request )
@@ -67,6 +70,7 @@ type InstalledAppRestHandlerImpl struct {
6770 userAuthService user.UserService
6871 enforcer casbin.Enforcer
6972 enforcerUtil rbac.EnforcerUtil
73+ enforcerUtilHelm rbac.EnforcerUtilHelm
7074 installedAppService service.InstalledAppService
7175 validator * validator.Validate
7276 clusterService cluster.ClusterService
@@ -80,7 +84,7 @@ type InstalledAppRestHandlerImpl struct {
8084}
8185
8286func NewInstalledAppRestHandlerImpl (Logger * zap.SugaredLogger , userAuthService user.UserService ,
83- enforcer casbin.Enforcer , enforcerUtil rbac.EnforcerUtil , installedAppService service.InstalledAppService ,
87+ enforcer casbin.Enforcer , enforcerUtil rbac.EnforcerUtil , enforcerUtilHelm rbac. EnforcerUtilHelm , installedAppService service.InstalledAppService ,
8488 validator * validator.Validate , clusterService cluster.ClusterService , acdServiceClient application.ServiceClient ,
8589 appStoreDeploymentService service.AppStoreDeploymentService , helmAppClient client.HelmAppClient , helmAppService client.HelmAppService ,
8690 argoUserService argo.ArgoUserService ,
@@ -92,6 +96,7 @@ func NewInstalledAppRestHandlerImpl(Logger *zap.SugaredLogger, userAuthService u
9296 userAuthService : userAuthService ,
9397 enforcer : enforcer ,
9498 enforcerUtil : enforcerUtil ,
99+ enforcerUtilHelm : enforcerUtilHelm ,
95100 installedAppService : installedAppService ,
96101 validator : validator ,
97102 clusterService : clusterService ,
@@ -430,6 +435,82 @@ func (handler *InstalledAppRestHandlerImpl) FetchNotesForArgoInstalledApp(w http
430435 common .WriteJsonResp (w , err , & bean2.Notes {Notes : notes }, http .StatusOK )
431436
432437}
438+
439+ func (handler * InstalledAppRestHandlerImpl ) DeleteArgoInstalledAppWithNonCascade (w http.ResponseWriter , r * http.Request ) {
440+ token := r .Header .Get ("token" )
441+ userId , err := handler .userAuthService .GetLoggedInUser (r )
442+ if userId == 0 || err != nil {
443+ common .WriteJsonResp (w , err , nil , http .StatusUnauthorized )
444+ return
445+ }
446+ vars := mux .Vars (r )
447+ installedAppId , err := strconv .Atoi (vars ["installedAppId" ])
448+ if err != nil {
449+ handler .Logger .Errorw ("request err, DeleteArgoInstalledAppWithNonCascade" , "err" , err , "installedAppId" , installedAppId )
450+ common .WriteJsonResp (w , err , nil , http .StatusBadRequest )
451+ return
452+ }
453+ handler .Logger .Infow ("request payload, delete app" , "appId" , installedAppId )
454+ v := r .URL .Query ()
455+ forceDelete := false
456+ force := v .Get ("force" )
457+ if len (force ) > 0 {
458+ forceDelete , err = strconv .ParseBool (force )
459+ if err != nil {
460+ handler .Logger .Errorw ("request err, NonCascadeDeleteCdPipeline" , "err" , err )
461+ common .WriteJsonResp (w , err , nil , http .StatusBadRequest )
462+ return
463+ }
464+ }
465+ installedApp , err := handler .appStoreDeploymentService .GetInstalledApp (installedAppId )
466+ if err != nil {
467+ handler .Logger .Error ("request err, NonCascadeDeleteCdPipeline" , "err" , err )
468+ common .WriteJsonResp (w , err , nil , http .StatusInternalServerError )
469+ return
470+ }
471+ if util .IsBaseStack () || util .IsHelmApp (installedApp .AppOfferingMode ) || util2 .IsHelmApp (installedApp .DeploymentAppType ) {
472+ handler .Logger .Errorw ("request err, NonCascadeDeleteCdPipeline" , "err" , fmt .Errorf ("nocascade delete is not supported for %s" , installedApp .AppName ))
473+ common .WriteJsonResp (w , err , nil , http .StatusBadRequest )
474+ return
475+ }
476+ //rbac block starts from here
477+ rbacObject , rbacObject2 := handler .enforcerUtil .GetHelmObjectByAppNameAndEnvId (installedApp .AppName , installedApp .EnvironmentId )
478+ ok := handler .enforcer .Enforce (token , casbin .ResourceHelmApp , casbin .ActionDelete , rbacObject ) || handler .enforcer .Enforce (token , casbin .ResourceHelmApp , casbin .ActionDelete , rbacObject2 )
479+ if ! ok {
480+ common .WriteJsonResp (w , fmt .Errorf ("unauthorized user" ), nil , http .StatusForbidden )
481+ return
482+ }
483+ //rback block ends here
484+ acdToken , err := handler .argoUserService .GetLatestDevtronArgoCdUserToken ()
485+ if err != nil {
486+ handler .Logger .Errorw ("error in getting acd token" , "err" , err )
487+ common .WriteJsonResp (w , err , nil , http .StatusInternalServerError )
488+ return
489+ }
490+ ctx := context .WithValue (r .Context (), "token" , acdToken )
491+ request := & appStoreBean.InstallAppVersionDTO {}
492+ request .InstalledAppId = installedAppId
493+ request .AppName = installedApp .AppName
494+ request .AppId = installedApp .AppId
495+ request .EnvironmentId = installedApp .EnvironmentId
496+ request .UserId = userId
497+ request .ForceDelete = forceDelete
498+ request .NonCascadeDelete = true
499+ request .AppOfferingMode = installedApp .AppOfferingMode
500+ request .ClusterId = installedApp .ClusterId
501+ request .Namespace = installedApp .Namespace
502+ request .AcdPartialDelete = true
503+
504+ request , err = handler .appStoreDeploymentService .DeleteInstalledApp (ctx , request )
505+ if err != nil {
506+ handler .Logger .Errorw ("service err, DeleteInstalledApp" , "err" , err , "installAppId" , installedAppId )
507+ common .WriteJsonResp (w , err , nil , http .StatusInternalServerError )
508+ return
509+ }
510+ common .WriteJsonResp (w , nil , nil , http .StatusOK )
511+
512+ }
513+
433514func (handler * InstalledAppRestHandlerImpl ) checkNotesAuth (token string , appName string , envId int ) bool {
434515
435516 object , object2 := handler .enforcerUtil .GetHelmObjectByAppNameAndEnvId (appName , envId )
0 commit comments