Skip to content

Commit 3851f82

Browse files
feat: active inactive user phase 3 (#4649)
* listing user and group changes * default value chnage * group listing optimisation * wire_gen * order by in group * default values * discard * updated on * case insensitive * script number change * specs * review chnages * sql update * id for user * script number chnage * review comments-1 * review comments * review comments * rest handler remove methods * validation for delete * delete user handling * review comments * review comments * bulk delete user and permission group * legacy code fix from loop in query to bulk query * export csv filters support * Revert "export csv filters support" This reverts commit 4448c9e. * export csv filters * bulk delete support with filters * validation * method break * refactor the method * condition * open api specs * specs * refactoring filters in bulk delete rolegroup * comments * comments * script * group listing * review comments * review comments * review comments * review comments * user delete self-review * error handling * renaming helpers * commets * checks and renaming * last login order * script number change * rolegroup migration * name change * backward compatibility handling * self review name change * chart-group -manager-fix * userrolegroups * change chnage operation * specs update * groups * find by componet id * job project id * sql script chnage * script number change
1 parent 1620bf3 commit 3851f82

File tree

14 files changed

+187
-69
lines changed

14 files changed

+187
-69
lines changed

api/auth/user/UserRestHandler.go

Lines changed: 40 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121
"encoding/json"
2222
"errors"
2323
"fmt"
24+
util2 "github.com/devtron-labs/devtron/api/auth/user/util"
2425
"github.com/devtron-labs/devtron/pkg/auth/user/helper"
2526
"github.com/gorilla/schema"
2627
"net/http"
@@ -110,6 +111,23 @@ func (handler UserRestHandlerImpl) CreateUser(w http.ResponseWriter, r *http.Req
110111
userInfo.UserId = userId
111112
handler.logger.Infow("request payload, CreateUser", "payload", userInfo)
112113

114+
// struct Validations
115+
handler.logger.Infow("request payload, CreateUser ", "payload", userInfo)
116+
err = handler.validator.Struct(userInfo)
117+
if err != nil {
118+
handler.logger.Errorw("validation err, CreateUser", "err", err, "payload", userInfo)
119+
common.WriteJsonResp(w, err, nil, http.StatusBadRequest)
120+
return
121+
}
122+
// Doing this as api is not compatible with previous release of dashboard, groups has been migrated to userRoleGroups
123+
isGroupsPresent := util2.IsGroupsPresent(userInfo.Groups)
124+
if isGroupsPresent {
125+
handler.logger.Errorw("validation error , createUser ", "err", err, "payload", userInfo)
126+
err := &util.ApiError{Code: "406", HttpStatusCode: 406, UserMessage: "Not compatible with request", InternalMessage: "Not compatible with the request payload, as groups has been migrated to userRoleGroups"}
127+
common.WriteJsonResp(w, err, nil, http.StatusNotAcceptable)
128+
return
129+
}
130+
113131
// RBAC enforcer applying
114132
token := r.Header.Get("token")
115133
isActionUserSuperAdmin := false
@@ -143,8 +161,8 @@ func (handler UserRestHandlerImpl) CreateUser(w http.ResponseWriter, r *http.Req
143161
}
144162

145163
// auth check inside groups
146-
if len(userInfo.Groups) > 0 {
147-
groupRoles, err := handler.roleGroupService.FetchRolesForGroups(userInfo.Groups)
164+
if len(userInfo.UserRoleGroup) > 0 {
165+
groupRoles, err := handler.roleGroupService.FetchRolesForUserRoleGroups(userInfo.UserRoleGroup)
148166
if err != nil && err != pg.ErrNoRows {
149167
handler.logger.Errorw("service err, UpdateUser", "err", err, "payload", userInfo)
150168
common.WriteJsonResp(w, err, "", http.StatusInternalServerError)
@@ -173,14 +191,6 @@ func (handler UserRestHandlerImpl) CreateUser(w http.ResponseWriter, r *http.Req
173191
}
174192
//RBAC enforcer Ends
175193

176-
handler.logger.Infow("request payload, CreateUser ", "payload", userInfo)
177-
err = handler.validator.Struct(userInfo)
178-
if err != nil {
179-
handler.logger.Errorw("validation err, CreateUser", "err", err, "payload", userInfo)
180-
common.WriteJsonResp(w, err, nil, http.StatusBadRequest)
181-
return
182-
}
183-
184194
res, err := handler.userService.CreateUser(&userInfo, token, handler.CheckManagerAuth)
185195
if err != nil {
186196
handler.logger.Errorw("service err, CreateUser", "err", err, "payload", userInfo)
@@ -222,6 +232,14 @@ func (handler UserRestHandlerImpl) UpdateUser(w http.ResponseWriter, r *http.Req
222232
common.WriteJsonResp(w, err, nil, http.StatusBadRequest)
223233
return
224234
}
235+
// Doing this as api is not compatible with previous release of dashboard,groups has been migrated to userRoleGroups
236+
isGroupsPresent := util2.IsGroupsPresent(userInfo.Groups)
237+
if isGroupsPresent {
238+
handler.logger.Errorw("validation error , createUser ", "err", err, "payload", userInfo)
239+
err := &util.ApiError{Code: "406", HttpStatusCode: 406, UserMessage: "Not compatible with request, please update to latest version", InternalMessage: "Not compatible with the request payload, as groups has been migrated to userRoleGroups"}
240+
common.WriteJsonResp(w, err, nil, http.StatusNotAcceptable)
241+
return
242+
}
225243

226244
res, rolesChanged, groupsModified, restrictedGroups, err := handler.userService.UpdateUser(&userInfo, token, handler.CheckManagerAuth)
227245

@@ -327,10 +345,10 @@ func (handler UserRestHandlerImpl) GetAllV2(w http.ResponseWriter, r *http.Reque
327345
return
328346
}
329347
var roleFilters []bean.RoleFilter
330-
if len(user.Groups) > 0 {
331-
groupRoleFilters, err := handler.userService.GetRoleFiltersByGroupNames(user.Groups)
348+
if len(user.UserRoleGroup) > 0 {
349+
groupRoleFilters, err := handler.userService.GetRoleFiltersByUserRoleGroups(user.UserRoleGroup)
332350
if err != nil {
333-
handler.logger.Errorw("Error in getting role filters by group names", "err", err, "groupNames", user.Groups)
351+
handler.logger.Errorw("Error in getting role filters by group names", "err", err, "UserRoleGroup", user.UserRoleGroup)
334352
common.WriteJsonResp(w, err, "", http.StatusInternalServerError)
335353
return
336354
}
@@ -397,10 +415,10 @@ func (handler UserRestHandlerImpl) GetAll(w http.ResponseWriter, r *http.Request
397415
return
398416
}
399417
var roleFilters []bean.RoleFilter
400-
if len(user.Groups) > 0 {
401-
groupRoleFilters, err := handler.userService.GetRoleFiltersByGroupNames(user.Groups)
418+
if len(user.UserRoleGroup) > 0 {
419+
groupRoleFilters, err := handler.userService.GetRoleFiltersByUserRoleGroups(user.UserRoleGroup)
402420
if err != nil {
403-
handler.logger.Errorw("Error in getting role filters by group names", "err", err, "groupNames", user.Groups)
421+
handler.logger.Errorw("Error in getting role filters by group names", "err", err, "UserRoleGroup", user.UserRoleGroup)
404422
common.WriteJsonResp(w, err, "", http.StatusInternalServerError)
405423
return
406424
}
@@ -784,10 +802,10 @@ func (handler UserRestHandlerImpl) FetchRoleGroupsV2(w http.ResponseWriter, r *h
784802
return
785803
}
786804
var roleFilters []bean.RoleFilter
787-
if len(user.Groups) > 0 {
788-
groupRoleFilters, err := handler.userService.GetRoleFiltersByGroupNames(user.Groups)
805+
if len(user.UserRoleGroup) > 0 {
806+
groupRoleFilters, err := handler.userService.GetRoleFiltersByUserRoleGroups(user.UserRoleGroup)
789807
if err != nil {
790-
handler.logger.Errorw("Error in getting role filters by group names", "err", err, "groupNames", user.Groups)
808+
handler.logger.Errorw("Error in getting role filters by group names", "err", err, "UserRoleGroup", user.UserRoleGroup)
791809
common.WriteJsonResp(w, err, "", http.StatusInternalServerError)
792810
return
793811
}
@@ -855,10 +873,10 @@ func (handler UserRestHandlerImpl) FetchRoleGroups(w http.ResponseWriter, r *htt
855873
return
856874
}
857875
var roleFilters []bean.RoleFilter
858-
if len(user.Groups) > 0 {
859-
groupRoleFilters, err := handler.userService.GetRoleFiltersByGroupNames(user.Groups)
876+
if len(user.UserRoleGroup) > 0 {
877+
groupRoleFilters, err := handler.userService.GetRoleFiltersByUserRoleGroups(user.UserRoleGroup)
860878
if err != nil {
861-
handler.logger.Errorw("Error in getting role filters by group names", "err", err, "groupNames", user.Groups)
879+
handler.logger.Errorw("Error in getting role filters by group names", "err", err, "UserRoleGroup", user.UserRoleGroup)
862880
common.WriteJsonResp(w, err, "", http.StatusInternalServerError)
863881
return
864882
}

api/auth/user/util/util.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package util
2+
3+
func IsGroupsPresent(groups []string) bool {
4+
if len(groups) > 0 {
5+
return true
6+
}
7+
return false
8+
}

api/bean/AppView.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ type JobContainer struct {
7272
JobActualName string `json:"appName""`
7373
Description GenericNoteResponseBean `json:"description"`
7474
JobCiPipelines []JobCIPipeline `json:"ciPipelines"'`
75+
ProjectId int `json:"projectId"`
7576
}
7677

7778
type JobCIPipeline struct {
@@ -98,6 +99,7 @@ type JobListingContainer struct {
9899
EnvironmentName string `sql:"environment_name" json:"environmentName"`
99100
LastTriggeredEnvironmentName string `sql:"last_triggered_environment_name" json:"lastTriggeredEnvironmentName"`
100101
LastTriggeredEnvironmentId int `sql:"last_triggered_environment_id" json:"lastEnvironmentId"`
102+
ProjectId int `sql:"team_id" json:"projectId"`
101103
}
102104

103105
type CiPipelineLastSucceededTime struct {

api/bean/UserRequest.go

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -30,20 +30,21 @@ type UserRole struct {
3030
}
3131

3232
type UserInfo struct {
33-
Id int32 `json:"id" validate:"number,not-system-admin-userid"`
34-
EmailId string `json:"email_id" validate:"required,not-system-admin-user"` // TODO : have to migrate json key to emailId and also handle backward compatibility
35-
Roles []string `json:"roles,omitempty"`
36-
AccessToken string `json:"access_token,omitempty"`
37-
RoleFilters []RoleFilter `json:"roleFilters"`
38-
Status string `json:"status,omitempty"`
39-
Groups []string `json:"groups"` // this will be deprecated in future do not use
40-
SuperAdmin bool `json:"superAdmin,notnull"`
41-
LastLoginTime time.Time `json:"lastLoginTime"`
42-
UserType string `json:"-"`
43-
LastUsedAt time.Time `json:"-"`
44-
LastUsedByIp string `json:"-"`
45-
Exist bool `json:"-"`
46-
UserId int32 `json:"-"` // created or modified user id
33+
Id int32 `json:"id" validate:"number,not-system-admin-userid"`
34+
EmailId string `json:"email_id" validate:"required,not-system-admin-user"` // TODO : have to migrate json key to emailId and also handle backward compatibility
35+
Roles []string `json:"roles,omitempty"`
36+
AccessToken string `json:"access_token,omitempty"`
37+
RoleFilters []RoleFilter `json:"roleFilters"`
38+
Status string `json:"status,omitempty"`
39+
Groups []string `json:"groups"` // this will be deprecated in future do not use
40+
UserRoleGroup []UserRoleGroup `json:"userRoleGroups"` // role group with metadata
41+
SuperAdmin bool `json:"superAdmin,notnull"`
42+
LastLoginTime time.Time `json:"lastLoginTime"`
43+
UserType string `json:"-"`
44+
LastUsedAt time.Time `json:"-"`
45+
LastUsedByIp string `json:"-"`
46+
Exist bool `json:"-"`
47+
UserId int32 `json:"-"` // created or modified user id
4748
}
4849

4950
type RoleGroup struct {
@@ -145,3 +146,7 @@ type BulkDeleteRequest struct {
145146
ListingRequest *ListingRequest `json:"listingRequest,omitempty"`
146147
LoggedInUserId int32 `json:"-"`
147148
}
149+
150+
type UserRoleGroup struct {
151+
RoleGroup *RoleGroup `json:"roleGroup"`
152+
}

internal/sql/repository/appWorkflow/AppWorkflowRepository.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -500,6 +500,7 @@ func (impl AppWorkflowRepositoryImpl) FindByComponentId(componentId int) ([]*App
500500
Where("app_workflow_mapping.component_id= ?", componentId).
501501
Where("app_workflow.active = ?", true).
502502
Where("app_workflow_mapping.active = ?", true).
503+
Where("app_workflow_mapping.type = ?", CIPIPELINE).
503504
Select()
504505
return appWorkflowsMapping, err
505506
}

internal/sql/repository/helper/AppListingRepositoryQueryBuilder.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ const (
7272

7373
func (impl AppListingRepositoryQueryBuilder) BuildJobListingQuery(appIDs []int, statuses []string, environmentIds []int, sortOrder string) string {
7474
query := "select ci_pipeline.name as ci_pipeline_name,ci_pipeline.id as ci_pipeline_id,app.id as job_id,app.display_name " +
75-
"as job_name, app.app_name,app.description,cwr.started_on,cwr.status,cem.environment_id,cwr.environment_id as last_triggered_environment_id from app left join ci_pipeline on" +
75+
"as job_name, app.app_name,app.description,app.team_id,cwr.started_on,cwr.status,cem.environment_id,cwr.environment_id as last_triggered_environment_id from app left join ci_pipeline on" +
7676
" app.id = ci_pipeline.app_id and ci_pipeline.active=true left join (select cw.ci_pipeline_id, cw.status, cw.started_on, cw.environment_id " +
7777
" from ci_workflow cw inner join (select ci_pipeline_id, MAX(started_on) max_started_on from ci_workflow group by ci_pipeline_id ) " +
7878
"cws on cw.ci_pipeline_id = cws.ci_pipeline_id " +

pkg/app/AppListingService.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -477,6 +477,7 @@ func BuildJobListingResponse(jobContainers []*bean.JobListingContainer, JobsLast
477477
val.JobId = jobContainer.JobId
478478
val.JobName = jobContainer.JobName
479479
val.JobActualName = jobContainer.JobActualName
480+
val.ProjectId = jobContainer.ProjectId
480481
}
481482

482483
if len(val.JobCiPipelines) == 0 {

pkg/auth/user/RoleGroupService.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ type RoleGroupService interface {
4747
FetchRoleGroupsByName(name string) ([]*bean.RoleGroup, error)
4848
DeleteRoleGroup(model *bean.RoleGroup) (bool, error)
4949
BulkDeleteRoleGroups(request *bean.BulkDeleteRequest) (bool, error)
50-
FetchRolesForGroups(groupNames []string) ([]*bean.RoleFilter, error)
50+
FetchRolesForUserRoleGroups(userRoleGroups []bean.UserRoleGroup) ([]*bean.RoleFilter, error)
5151
}
5252

5353
type RoleGroupServiceImpl struct {
@@ -938,7 +938,11 @@ func (impl RoleGroupServiceImpl) deleteMappingsFromCasbin(groupCasbinNames []str
938938
return nil
939939
}
940940

941-
func (impl RoleGroupServiceImpl) FetchRolesForGroups(groupNames []string) ([]*bean.RoleFilter, error) {
941+
func (impl RoleGroupServiceImpl) FetchRolesForUserRoleGroups(userRoleGroups []bean.UserRoleGroup) ([]*bean.RoleFilter, error) {
942+
groupNames := make([]string, 0)
943+
for _, userRoleGroup := range userRoleGroups {
944+
groupNames = append(groupNames, userRoleGroup.RoleGroup.Name)
945+
}
942946
if len(groupNames) == 0 {
943947
return nil, nil
944948
}

0 commit comments

Comments
 (0)