Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: active inactive user phase 2 #4624

Merged
merged 68 commits into from
Feb 20, 2024
Merged
Show file tree
Hide file tree
Changes from 65 commits
Commits
Show all changes
68 commits
Select commit Hold shift + click to select a range
ebedf11
listing user and group changes
Shivam-nagar23 Jan 25, 2024
a628719
default value chnage
Shivam-nagar23 Jan 25, 2024
d54de55
group listing optimisation
Shivam-nagar23 Jan 25, 2024
a4baf56
wire_gen
Shivam-nagar23 Jan 25, 2024
08465d3
order by in group
Shivam-nagar23 Jan 25, 2024
2854bf0
Merge branch 'main' into feat-active-inactive-user-phase-1
Shivam-nagar23 Jan 27, 2024
37ffe40
default values
Shivam-nagar23 Jan 29, 2024
a68c624
discard
Shivam-nagar23 Jan 29, 2024
e3c482d
updated on
Shivam-nagar23 Jan 29, 2024
defe28f
case insensitive
Shivam-nagar23 Jan 29, 2024
000a883
Merge branch 'main' into feat-active-inactive-user-phase-1
Shivam-nagar23 Jan 29, 2024
eac977e
script number change
Shivam-nagar23 Jan 29, 2024
8801233
specs
Shivam-nagar23 Jan 29, 2024
b50f89c
review chnages
Shivam-nagar23 Jan 30, 2024
1cce3af
sql update
Shivam-nagar23 Jan 30, 2024
1febba6
id for user
Shivam-nagar23 Jan 30, 2024
6603a0a
Merge branch 'main' into feat-active-inactive-user-phase-1
Shivam-nagar23 Jan 31, 2024
046f47a
script number chnage
Shivam-nagar23 Jan 31, 2024
a93a59d
review comments-1
Shivam-nagar23 Jan 31, 2024
00cd1d5
review comments
Shivam-nagar23 Jan 31, 2024
befeca7
review comments
Shivam-nagar23 Jan 31, 2024
5ef0552
rest handler remove methods
Shivam-nagar23 Jan 31, 2024
5920a87
validation for delete
Shivam-nagar23 Jan 31, 2024
79ea449
delete user handling
Shivam-nagar23 Jan 31, 2024
47e0656
review comments
Shivam-nagar23 Feb 1, 2024
d1ad254
review comments
Shivam-nagar23 Feb 1, 2024
9b2c4fa
bulk delete user and permission group
Shivam-nagar23 Feb 2, 2024
9e26f82
legacy code fix from loop in query to bulk query
Shivam-nagar23 Feb 2, 2024
c2c5fb5
Merge branch 'main' into feat-active-inactive-user-phase-1
Shivam-nagar23 Feb 5, 2024
4448c9e
export csv filters support
Shivam-nagar23 Feb 5, 2024
cde92a2
Revert "export csv filters support"
Shivam-nagar23 Feb 5, 2024
3861eb1
export csv filters
Shivam-nagar23 Feb 5, 2024
7f6baec
Merge branch 'main' into feat-active-inactive-user-phase-2
Shivam-nagar23 Feb 5, 2024
37968ec
Merge branch 'feat-active-inactive-user-phase-1' into feat-active-ina…
Shivam-nagar23 Feb 5, 2024
d61c150
bulk delete support with filters
Shivam-nagar23 Feb 5, 2024
5be6cb7
validation
Shivam-nagar23 Feb 5, 2024
af0e9b1
method break
Shivam-nagar23 Feb 5, 2024
f5b1ddf
refactor the method
Shivam-nagar23 Feb 5, 2024
a5ba2f8
condition
Shivam-nagar23 Feb 5, 2024
8c6c574
open api specs
Shivam-nagar23 Feb 5, 2024
3b3496f
Merge branch 'main' into feat-active-inactive-user-phase-1
Shivam-nagar23 Feb 5, 2024
c4d455c
specs
Shivam-nagar23 Feb 5, 2024
feee76e
Merge branch 'main' into feat-active-inactive-user-phase-1
Shivam-nagar23 Feb 5, 2024
a61f732
Merge branch 'main' into feat-active-inactive-user-phase-1
Shivam-nagar23 Feb 6, 2024
1ebee74
refactoring filters in bulk delete rolegroup
Shivam-nagar23 Feb 6, 2024
8ee364a
comments
Shivam-nagar23 Feb 6, 2024
cbd5400
comments
Shivam-nagar23 Feb 6, 2024
72ed56e
Merge branch 'feat-active-inactive-user-phase-1' into feat-active-ina…
Shivam-nagar23 Feb 6, 2024
2c6f3b7
main-merge
Shivam-nagar23 Feb 6, 2024
9dd58b6
Merge branch 'main' into feat-active-inactive-user-phase-1
Shivam-nagar23 Feb 7, 2024
5200661
Merge branch 'feat-active-inactive-user-phase-1' into feat-active-ina…
Shivam-nagar23 Feb 7, 2024
8ddfef6
main-merge
Shivam-nagar23 Feb 8, 2024
9e14845
group listing
Shivam-nagar23 Feb 9, 2024
0a8a53e
Merge branch 'main' into feat-active-inactive-user-phase-2
Shivam-nagar23 Feb 12, 2024
0e50351
review comments
Shivam-nagar23 Feb 12, 2024
154bf61
review comments
Shivam-nagar23 Feb 12, 2024
0e64fad
review comments
Shivam-nagar23 Feb 12, 2024
35cc304
review comments
Shivam-nagar23 Feb 12, 2024
82e63cc
user delete self-review
Shivam-nagar23 Feb 12, 2024
8977bcb
error handling
Shivam-nagar23 Feb 12, 2024
250535e
Merge branch 'main' into feat-active-inactive-user-phase-2
Shivam-nagar23 Feb 13, 2024
2ca1bec
renaming helpers
Shivam-nagar23 Feb 14, 2024
7b6feb6
commets
Shivam-nagar23 Feb 14, 2024
e19fba8
checks and renaming
Shivam-nagar23 Feb 14, 2024
f71dd4f
Merge branch 'main' into feat-active-inactive-user-phase-2
Shivam-nagar23 Feb 19, 2024
2ab83cf
main-merge
Shivam-nagar23 Feb 19, 2024
5a0b311
Merge branch 'main' into feat-active-inactive-user-phase-2
Shivam-nagar23 Feb 19, 2024
bbc53f3
Merge branch 'main' into feat-active-inactive-user-phase-2
Shivam-nagar23 Feb 20, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
104 changes: 100 additions & 4 deletions api/auth/user/UserRestHandler.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,12 +46,14 @@ type UserRestHandler interface {
GetById(w http.ResponseWriter, r *http.Request)
GetAll(w http.ResponseWriter, r *http.Request)
DeleteUser(w http.ResponseWriter, r *http.Request)
BulkDeleteUsers(w http.ResponseWriter, r *http.Request)
FetchRoleGroupById(w http.ResponseWriter, r *http.Request)
CreateRoleGroup(w http.ResponseWriter, r *http.Request)
UpdateRoleGroup(w http.ResponseWriter, r *http.Request)
FetchRoleGroups(w http.ResponseWriter, r *http.Request)
FetchRoleGroupsByName(w http.ResponseWriter, r *http.Request)
DeleteRoleGroup(w http.ResponseWriter, r *http.Request)
BulkDeleteRoleGroups(w http.ResponseWriter, r *http.Request)
CheckUserRoles(w http.ResponseWriter, r *http.Request)
SyncOrchestratorToCasbin(w http.ResponseWriter, r *http.Request)
UpdateTriggerPolicyForTerminalAccess(w http.ResponseWriter, r *http.Request)
Expand Down Expand Up @@ -356,7 +358,7 @@ func (handler UserRestHandlerImpl) GetAll(w http.ResponseWriter, r *http.Request
common.WriteJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden)
return
}
req := &bean.FetchListingRequest{}
req := &bean.ListingRequest{}
err = decoder.Decode(req, r.URL.Query())
if err != nil {
handler.logger.Errorw("request err, GetAll", "err", err, "payload", req)
Expand Down Expand Up @@ -427,8 +429,8 @@ func (handler UserRestHandlerImpl) DeleteUser(w http.ResponseWriter, r *http.Req
}
//RBAC enforcer Ends
//validation
validated := helper.CheckIfUserDevtronManaged(int32(id))
if !validated {
validated := helper.IsSystemOrAdminUser(int32(id))
if validated {
err = &util.ApiError{Code: "400", HttpStatusCode: 400, UserMessage: "cannot delete system or admin user"}
handler.logger.Errorw("request err, DeleteUser, validation failed", "id", id, "err", err)
common.WriteJsonResp(w, err, nil, http.StatusBadRequest)
Expand All @@ -445,6 +447,56 @@ func (handler UserRestHandlerImpl) DeleteUser(w http.ResponseWriter, r *http.Req
common.WriteJsonResp(w, err, res, http.StatusOK)
}

func (handler UserRestHandlerImpl) BulkDeleteUsers(w http.ResponseWriter, r *http.Request) {
userId, err := handler.userService.GetLoggedInUser(r)
Shivam-nagar23 marked this conversation as resolved.
Show resolved Hide resolved
if userId == 0 || err != nil {
common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized)
return
}
decoder := json.NewDecoder(r.Body)
// request decoding
var request *bean.BulkDeleteRequest
err = decoder.Decode(&request)
kartik-579 marked this conversation as resolved.
Show resolved Hide resolved
if err != nil {
handler.logger.Errorw("request err, BulkDeleteUsers", "payload", request, "err", err)
common.WriteJsonResp(w, err, nil, http.StatusBadRequest)
return
}
handler.logger.Debugw("request payload, BulkDeleteUsers", "payload", request)
// setting logged in user Id for audit logs
request.LoggedInUserId = userId

// validations for system and admin user
err = helper.CheckValidationForAdminAndSystemUserId(request.Ids)
if err != nil {
handler.logger.Errorw("request err, BulkDeleteUsers, validation failed", "payload", request, "err", err)
common.WriteJsonResp(w, err, nil, http.StatusBadRequest)
return
}

// RBAC enforcer applying
token := r.Header.Get("token")
if ok := handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionGet, "*"); !ok {
common.WriteJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden)
return
}
// struct validation
err = handler.validator.Struct(request)
if err != nil {
handler.logger.Errorw("validation err, BulkDeleteUsers", "payload", request, "err", err)
common.WriteJsonResp(w, err, nil, http.StatusBadRequest)
return
}
// service call
res, err := handler.userService.BulkDeleteUsers(request)
if err != nil {
handler.logger.Errorw("service err, BulkDeleteUsers", "payload", request, "err", err)
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
return
}
common.WriteJsonResp(w, nil, res, http.StatusOK)
}

func (handler UserRestHandlerImpl) FetchRoleGroupById(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
/* #nosec */
Expand Down Expand Up @@ -677,7 +729,7 @@ func (handler UserRestHandlerImpl) FetchRoleGroups(w http.ResponseWriter, r *htt
return
}

req := &bean.FetchListingRequest{}
req := &bean.ListingRequest{}
err = decoder.Decode(req, r.URL.Query())
if err != nil {
handler.logger.Errorw("request err, FetchRoleGroups", "err", err, "payload", req)
Expand Down Expand Up @@ -770,6 +822,50 @@ func (handler UserRestHandlerImpl) DeleteRoleGroup(w http.ResponseWriter, r *htt
common.WriteJsonResp(w, err, res, http.StatusOK)
}

func (handler UserRestHandlerImpl) BulkDeleteRoleGroups(w http.ResponseWriter, r *http.Request) {
userId, err := handler.userService.GetLoggedInUser(r)
Shivam-nagar23 marked this conversation as resolved.
Show resolved Hide resolved
if userId == 0 || err != nil {
common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized)
return
}
decoder := json.NewDecoder(r.Body)
// request decoding
var request *bean.BulkDeleteRequest
err = decoder.Decode(&request)
kartik-579 marked this conversation as resolved.
Show resolved Hide resolved
if err != nil {
handler.logger.Errorw("request err, BulkDeleteRoleGroups", "payload", request, "err", err)
common.WriteJsonResp(w, err, nil, http.StatusBadRequest)
return
}
handler.logger.Debugw("request payload, BulkDeleteRoleGroups", "payload", request)
// setting logged in user Id for audit logs
request.LoggedInUserId = userId

// struct validation
err = handler.validator.Struct(request)
Shivam-nagar23 marked this conversation as resolved.
Show resolved Hide resolved
if err != nil {
handler.logger.Errorw("validation err, BulkDeleteRoleGroups", "payload", request, "err", err)
common.WriteJsonResp(w, err, nil, http.StatusBadRequest)
return
}

// RBAC enforcer applying
token := r.Header.Get("token")
if ok := handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionGet, "*"); !ok {
common.WriteJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden)
return
}

// service call
res, err := handler.roleGroupService.BulkDeleteRoleGroups(request)
if err != nil {
handler.logger.Errorw("service err, BulkDeleteRoleGroups", "payload", request, "err", err)
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
return
}
common.WriteJsonResp(w, nil, res, http.StatusOK)
}

func (handler UserRestHandlerImpl) CheckUserRoles(w http.ResponseWriter, r *http.Request) {
userId, err := handler.userService.GetLoggedInUser(r)
if userId == 0 || err != nil {
Expand Down
4 changes: 4 additions & 0 deletions api/auth/user/UserRouter.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,8 @@ func (router UserRouterImpl) InitUserRouter(userAuthRouter *mux.Router) {
HandlerFunc(router.userRestHandler.GetAll).Methods("GET")
userAuthRouter.Path("").
HandlerFunc(router.userRestHandler.UpdateUser).Methods("PUT")
userAuthRouter.Path("/bulk").
HandlerFunc(router.userRestHandler.BulkDeleteUsers).Methods("DELETE")
userAuthRouter.Path("/{id}").
HandlerFunc(router.userRestHandler.DeleteUser).Methods("DELETE")

Expand All @@ -60,6 +62,8 @@ func (router UserRouterImpl) InitUserRouter(userAuthRouter *mux.Router) {
userAuthRouter.Path("/role/group/search").
Queries("name", "{name}").
HandlerFunc(router.userRestHandler.FetchRoleGroupsByName).Methods("GET")
userAuthRouter.Path("/role/group/bulk").
HandlerFunc(router.userRestHandler.BulkDeleteRoleGroups).Methods("DELETE")
userAuthRouter.Path("/role/group/{id}").
HandlerFunc(router.userRestHandler.DeleteRoleGroup).Methods("DELETE")

Expand Down
2 changes: 0 additions & 2 deletions api/auth/user/wire_user.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,13 @@ import (
"github.com/devtron-labs/devtron/pkg/auth/authorisation/casbin"
user2 "github.com/devtron-labs/devtron/pkg/auth/user"
repository2 "github.com/devtron-labs/devtron/pkg/auth/user/repository"
"github.com/devtron-labs/devtron/pkg/auth/user/repository/helper"
"github.com/google/wire"
)

//depends on sql,validate,logger

var UserWireSet = wire.NewSet(
UserAuditWireSet,
helper.NewUserRepositoryQueryBuilder,
NewUserAuthRouterImpl,
wire.Bind(new(UserAuthRouter), new(*UserAuthRouterImpl)),
NewUserAuthHandlerImpl,
Expand Down
8 changes: 7 additions & 1 deletion api/bean/UserRequest.go
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,7 @@ type RoleGroupListingResponse struct {
TotalCount int `json:"totalCount"`
}

type FetchListingRequest struct {
type ListingRequest struct {
SearchKey string `json:"searchKey"`
SortOrder bean.SortOrder `json:"sortOrder"`
SortBy bean.SortBy `json:"sortBy"`
Expand All @@ -139,3 +139,9 @@ type FetchListingRequest struct {
ShowAll bool `json:"showAll"`
CountCheck bool `json:"-"`
}

type BulkDeleteRequest struct {
Ids []int32 `json:"ids"`
ListingRequest *ListingRequest `json:"listingRequest,omitempty"`
LoggedInUserId int32 `json:"-"`
}
6 changes: 2 additions & 4 deletions cmd/external-app/wire_gen.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading