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