Skip to content

Commit 315c6b5

Browse files
committed
GetAppMetadataListByEnvironment
1 parent cf86d19 commit 315c6b5

File tree

7 files changed

+113
-3
lines changed

7 files changed

+113
-3
lines changed

api/restHandler/app/pipeline/configure/BuildPipelineRestHandler.go

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ type DevtronAppBuildRestHandler interface {
7777
CancelWorkflow(w http.ResponseWriter, r *http.Request)
7878

7979
UpdateBranchCiPipelinesWithRegex(w http.ResponseWriter, r *http.Request)
80+
GetAppMetadataListByEnvironment(w http.ResponseWriter, r *http.Request)
8081
GetCiPipelineByEnvironment(w http.ResponseWriter, r *http.Request)
8182
GetCiPipelineByEnvironmentMin(w http.ResponseWriter, r *http.Request)
8283
GetExternalCiByEnvironment(w http.ResponseWriter, r *http.Request)
@@ -2294,3 +2295,73 @@ func (handler *PipelineConfigRestHandlerImpl) GetSourceCiDownStreamInfo(w http.R
22942295
}
22952296
common.WriteJsonResp(w, err, linkedCIDetails, http.StatusOK)
22962297
}
2298+
2299+
func (handler *PipelineConfigRestHandlerImpl) GetAppMetadataListByEnvironment(w http.ResponseWriter, r *http.Request) {
2300+
vars := mux.Vars(r)
2301+
token := r.Header.Get("token")
2302+
userId, err := handler.userAuthService.GetLoggedInUser(r)
2303+
if userId == 0 || err != nil {
2304+
common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized)
2305+
return
2306+
}
2307+
envId, err := strconv.Atoi(vars["envId"])
2308+
if err != nil {
2309+
handler.Logger.Errorw("request err, GetAppMetadataListByEnvironment", "err", err, "envId", envId)
2310+
common.WriteJsonResp(w, err, nil, http.StatusBadRequest)
2311+
return
2312+
}
2313+
v := r.URL.Query()
2314+
appIdsString := v.Get("appIds")
2315+
var appIds []int
2316+
if len(appIdsString) > 0 {
2317+
appIdsSlices := strings.Split(appIdsString, ",")
2318+
for _, appId := range appIdsSlices {
2319+
id, err := strconv.Atoi(appId)
2320+
if err != nil {
2321+
common.WriteJsonResp(w, err, "please provide valid appIds", http.StatusBadRequest)
2322+
return
2323+
}
2324+
appIds = append(appIds, id)
2325+
}
2326+
}
2327+
2328+
resp, err := handler.pipelineBuilder.GetAppMetadataListByEnvironment(envId, appIds)
2329+
if err != nil {
2330+
handler.Logger.Errorw("service err, GetAppMetadataListByEnvironment", "err", err, "envId", envId)
2331+
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
2332+
return
2333+
}
2334+
// return all if user is super admin
2335+
if isActionUserSuperAdmin := handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionGet, "*"); isActionUserSuperAdmin {
2336+
common.WriteJsonResp(w, err, resp, http.StatusOK)
2337+
return
2338+
}
2339+
2340+
// get all the appIds
2341+
appIds = make([]int, 0)
2342+
appContainers := resp.Apps
2343+
for _, appBean := range resp.Apps {
2344+
appIds = append(appIds, appBean.AppId)
2345+
}
2346+
2347+
// get rbac objects for the appids
2348+
rbacObjectsWithAppId := handler.enforcerUtil.GetRbacObjectsByAppIds(appIds)
2349+
rbacObjects := make([]string, len(rbacObjectsWithAppId))
2350+
itr := 0
2351+
for _, object := range rbacObjectsWithAppId {
2352+
rbacObjects[itr] = object
2353+
itr++
2354+
}
2355+
// enforce rbac in batch
2356+
rbacResult := handler.enforcer.EnforceInBatch(token, casbin.ResourceApplications, casbin.ActionGet, rbacObjects)
2357+
// filter out rbac passed apps
2358+
resp.Apps = make([]*bean1.AppMetaData, 0)
2359+
for _, appBean := range appContainers {
2360+
rbacObject := rbacObjectsWithAppId[appBean.AppId]
2361+
if rbacResult[rbacObject] {
2362+
resp.Apps = append(resp.Apps, appBean)
2363+
}
2364+
}
2365+
resp.AppCount = len(resp.Apps)
2366+
common.WriteJsonResp(w, err, resp, http.StatusOK)
2367+
}

api/router/ResourceGroupingRouter.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ func NewResourceGroupingRouterImpl(restHandler configure.PipelineConfigRestHandl
4545
func (router ResourceGroupingRouterImpl) InitResourceGroupingRouter(resourceGroupingRouter *mux.Router) {
4646
resourceGroupingRouter.Path("/{envId}/app-wf").
4747
HandlerFunc(router.appWorkflowRestHandler.FindAppWorkflowByEnvironment).Methods("GET")
48+
resourceGroupingRouter.Path("/{envId}/app-metadata").HandlerFunc(router.pipelineConfigRestHandler.GetAppMetadataListByEnvironment).Methods("GET")
4849
resourceGroupingRouter.Path("/{envId}/ci-pipeline").HandlerFunc(router.pipelineConfigRestHandler.GetCiPipelineByEnvironment).Methods("GET")
4950
resourceGroupingRouter.Path("/{envId}/cd-pipeline").HandlerFunc(router.pipelineConfigRestHandler.GetCdPipelinesByEnvironment).Methods("GET")
5051
resourceGroupingRouter.Path("/{envId}/external-ci").HandlerFunc(router.pipelineConfigRestHandler.GetExternalCiByEnvironment).Methods("GET")

cmd/external-app/wire_gen.go

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/app/AppListingService.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ type AppListingService interface {
7373

7474
FetchAppsByEnvironmentV2(fetchAppListingRequest FetchAppListingRequest, w http.ResponseWriter, r *http.Request, token string) ([]*AppView.AppEnvironmentContainer, int, error)
7575
FetchOverviewAppsByEnvironment(envId, limit, offset int) (*OverviewAppsByEnvironmentBean, error)
76+
FetchAppsEnvContainers(envId, limit, offset int, appIds []int) ([]*AppView.AppEnvironmentContainer, error)
7677
}
7778

7879
const (

pkg/pipeline/BuildPipelineConfigService.go

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import (
2828
"github.com/devtron-labs/devtron/internal/sql/repository/helper"
2929
"github.com/devtron-labs/devtron/internal/sql/repository/pipelineConfig"
3030
"github.com/devtron-labs/devtron/internal/util"
31+
"github.com/devtron-labs/devtron/pkg/app"
3132
"github.com/devtron-labs/devtron/pkg/attributes"
3233
bean2 "github.com/devtron-labs/devtron/pkg/attributes/bean"
3334
"github.com/devtron-labs/devtron/pkg/bean"
@@ -118,6 +119,7 @@ type CiPipelineConfigService interface {
118119
GetExternalCiByEnvironment(request resourceGroup2.ResourceGroupingRequest, token string) (ciConfig []*bean.ExternalCiConfig, err error)
119120
DeleteCiPipeline(request *bean.CiPatchRequest) (*bean.CiPipeline, error)
120121
CreateExternalCiAndAppWorkflowMapping(appId, appWorkflowId int, userId int32, tx *pg.Tx) (int, *appWorkflow.AppWorkflowMapping, error)
122+
GetAppMetadataListByEnvironment(envId int, appIds []int) (appMetadataListBean pipelineConfigBean.AppMetadataListBean, err error)
121123
}
122124

123125
type CiPipelineConfigServiceImpl struct {
@@ -148,6 +150,7 @@ type CiPipelineConfigServiceImpl struct {
148150
buildPipelineSwitchService BuildPipelineSwitchService
149151
pipelineStageRepository repository.PipelineStageRepository
150152
globalPluginRepository repository2.GlobalPluginRepository
153+
appListingService app.AppListingService
151154
}
152155

153156
func NewCiPipelineConfigServiceImpl(logger *zap.SugaredLogger,
@@ -175,7 +178,8 @@ func NewCiPipelineConfigServiceImpl(logger *zap.SugaredLogger,
175178
cdWorkflowRepository pipelineConfig.CdWorkflowRepository,
176179
buildPipelineSwitchService BuildPipelineSwitchService,
177180
pipelineStageRepository repository.PipelineStageRepository,
178-
globalPluginRepository repository2.GlobalPluginRepository) *CiPipelineConfigServiceImpl {
181+
globalPluginRepository repository2.GlobalPluginRepository,
182+
appListingService app.AppListingService) *CiPipelineConfigServiceImpl {
179183
securityConfig := &SecurityConfig{}
180184
err := env.Parse(securityConfig)
181185
if err != nil {
@@ -209,6 +213,7 @@ func NewCiPipelineConfigServiceImpl(logger *zap.SugaredLogger,
209213
buildPipelineSwitchService: buildPipelineSwitchService,
210214
pipelineStageRepository: pipelineStageRepository,
211215
globalPluginRepository: globalPluginRepository,
216+
appListingService: appListingService,
212217
}
213218
}
214219

@@ -2157,3 +2162,24 @@ func (impl *CiPipelineConfigServiceImpl) CreateExternalCiAndAppWorkflowMapping(a
21572162
}
21582163
return externalCiPipeline.Id, appWorkflowMap, nil
21592164
}
2165+
2166+
func (impl *CiPipelineConfigServiceImpl) GetAppMetadataListByEnvironment(envId int, appIds []int) (appMetadataListBean pipelineConfigBean.AppMetadataListBean, err error) {
2167+
appMetadataListBean = pipelineConfigBean.AppMetadataListBean{}
2168+
envContainers, err := impl.appListingService.FetchAppsEnvContainers(envId, 0, 0, appIds)
2169+
if err != nil {
2170+
impl.logger.Errorw("failed to fetch env containers", "err", err, "envId", envId)
2171+
return appMetadataListBean, err
2172+
}
2173+
appMetadataList := make([]*pipelineConfigBean.AppMetaData, 0)
2174+
for _, envContainer := range envContainers {
2175+
appMetaData := &pipelineConfigBean.AppMetaData{
2176+
AppId: envContainer.AppId,
2177+
AppName: envContainer.AppName,
2178+
AppStatus: envContainer.AppStatus,
2179+
}
2180+
appMetadataList = append(appMetadataList, appMetaData)
2181+
}
2182+
appMetadataListBean.Apps = appMetadataList
2183+
appMetadataListBean.AppCount = len(envContainers)
2184+
return appMetadataListBean, nil
2185+
}

pkg/pipeline/bean/pipelineStage.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,3 +222,14 @@ func (v *VariableAndConditionDataForStep) GetTriggerSkipConditions() []*Conditio
222222
func (v *VariableAndConditionDataForStep) GetSuccessFailureConditions() []*ConditionObject {
223223
return v.successFailureConditions
224224
}
225+
226+
type AppMetadataListBean struct {
227+
AppCount int `json:"appCount"`
228+
Apps []*AppMetaData `json:"apps"`
229+
}
230+
231+
type AppMetaData struct {
232+
AppId int `json:"appId"`
233+
AppName string `json:"appName"`
234+
AppStatus string `json:"appStatus"`
235+
}

wire_gen.go

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)