Skip to content

feat: access manager #6377

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

Merged
merged 95 commits into from
Mar 10, 2025
Merged
Show file tree
Hide file tree
Changes from 9 commits
Commits
Show all changes
95 commits
Select commit Hold shift + click to select a range
322dce7
specs
Shivam-nagar23 Feb 10, 2025
138105a
specs
Shivam-nagar23 Feb 10, 2025
c2840c2
specs for generic api
Shivam-nagar23 Feb 11, 2025
18fbf7e
specs for generic api update
Shivam-nagar23 Feb 11, 2025
78c62db
access manager generic apis
Shivam-nagar23 Feb 12, 2025
d4e37fb
enforcements
Shivam-nagar23 Feb 12, 2025
e8ef17b
version changed to alpha1
Shivam-nagar23 Feb 12, 2025
9babb91
specs udpate
Shivam-nagar23 Feb 12, 2025
e80919b
version
Shivam-nagar23 Feb 12, 2025
2a06a3d
sql scripts
Shivam-nagar23 Feb 14, 2025
2e8d88a
role group service refactoring
Shivam-nagar23 Feb 14, 2025
a4f3e5d
role group service
Shivam-nagar23 Feb 14, 2025
355d506
sql script chnages
Shivam-nagar23 Feb 14, 2025
2e45765
sql scripts chnages
Shivam-nagar23 Feb 14, 2025
04a7385
refactoring iss
Shivam-nagar23 Feb 14, 2025
91bd157
reafctoring and rbac changes
Shivam-nagar23 Feb 17, 2025
cf99d8b
get rbac changes
Shivam-nagar23 Feb 18, 2025
8e8ec51
policy moved to bean
Shivam-nagar23 Feb 19, 2025
3dc10bb
removed unnecessary code
Shivam-nagar23 Feb 19, 2025
bc1954c
v2 routes in oss
Shivam-nagar23 Feb 19, 2025
e97436f
Merge branch 'feat-access-manager-1' into feat-access-manager-2
Shivam-nagar23 Feb 19, 2025
80392b1
Merge branch 'feat-access-manager-2' into feat-access-manager-3
Shivam-nagar23 Feb 19, 2025
24c88af
sql script chnaged
Shivam-nagar23 Feb 19, 2025
9407b53
sql script changes
Shivam-nagar23 Feb 19, 2025
431835a
sql script changeS
Shivam-nagar23 Feb 19, 2025
85ad553
fetch role group chnages
Shivam-nagar23 Feb 19, 2025
cb6ef50
set keys
Shivam-nagar23 Feb 19, 2025
fcf20cf
description update
Shivam-nagar23 Feb 19, 2025
83e0946
description update
Shivam-nagar23 Feb 19, 2025
1b16787
actuion
Shivam-nagar23 Feb 19, 2025
d30c610
Merge branch 'develop' into feat-access-manager
Shivam-nagar23 Feb 20, 2025
5a0c578
Merge branch 'feat-access-manager' into feat-access-manager-1
Shivam-nagar23 Feb 20, 2025
2c78ddb
Merge branch 'feat-access-manager-1' into feat-access-manager-2
Shivam-nagar23 Feb 20, 2025
0b59ea4
Merge branch 'feat-access-manager-2' into feat-access-manager-3
Shivam-nagar23 Feb 20, 2025
85614cd
review comments
Shivam-nagar23 Feb 20, 2025
89e86db
review comments
Shivam-nagar23 Feb 20, 2025
c3df8a0
idempotent
Shivam-nagar23 Feb 20, 2025
05155f2
hide permissions set
Shivam-nagar23 Feb 20, 2025
bef1dae
Merge pull request #6404 from devtron-labs/feat-access-manager-3
Shivam-nagar23 Feb 20, 2025
3fa8b46
Merge branch 'feat-access-manager-1' into feat-access-manager-2
Shivam-nagar23 Feb 20, 2025
118b9b5
Merge pull request #6403 from devtron-labs/feat-access-manager-2
Shivam-nagar23 Feb 20, 2025
c4bd448
Merge branch 'feat-access-manager' into feat-access-manager-1
Shivam-nagar23 Feb 20, 2025
5cda912
Merge pull request #6400 from devtron-labs/feat-access-manager-1
Shivam-nagar23 Feb 20, 2025
0309eb6
Merge branch 'develop' into feat-access-manager
Shivam-nagar23 Feb 20, 2025
ba27a06
oss ent sync
Shivam-nagar23 Feb 20, 2025
9a11c16
oss change
Shivam-nagar23 Feb 20, 2025
cce2e63
oss sync
Shivam-nagar23 Feb 20, 2025
210669b
sync
Shivam-nagar23 Feb 20, 2025
f836c4f
self register bean
Shivam-nagar23 Feb 21, 2025
5da69c8
user bean import
Shivam-nagar23 Feb 21, 2025
8b576c6
oss merge
Shivam-nagar23 Feb 21, 2025
ce3748b
signature changes
Shivam-nagar23 Feb 21, 2025
1526d6a
oss sync
Shivam-nagar23 Feb 21, 2025
4a106a9
oss refactoring
Shivam-nagar23 Feb 21, 2025
8fb2539
oss ent sync
Shivam-nagar23 Feb 21, 2025
1cf3888
final role filters to be considered
Shivam-nagar23 Feb 21, 2025
a955875
sync changes
Shivam-nagar23 Feb 21, 2025
be29ab1
audit creation oss
Shivam-nagar23 Feb 21, 2025
82a23ea
user service
Shivam-nagar23 Feb 21, 2025
1d51d6c
oss sycn
Shivam-nagar23 Feb 21, 2025
b057ed1
osse nt sync
Shivam-nagar23 Feb 21, 2025
d972d37
cluster entity
Shivam-nagar23 Feb 23, 2025
ebf3157
user service refactoring
Shivam-nagar23 Feb 23, 2025
79ceb16
oss sync
Shivam-nagar23 Feb 23, 2025
01aea38
user service refactoring
Shivam-nagar23 Feb 23, 2025
9936acd
user common service chnages
Shivam-nagar23 Feb 23, 2025
06819c4
oss sync
Shivam-nagar23 Feb 23, 2025
f5c61e9
user services chnages
Shivam-nagar23 Feb 23, 2025
1f41460
oss refactoing
Shivam-nagar23 Feb 23, 2025
4d4a835
token
Shivam-nagar23 Feb 23, 2025
42b6dee
subaction
Shivam-nagar23 Feb 23, 2025
f04bf91
oss ent sync
Shivam-nagar23 Feb 23, 2025
9da2876
update oss sync
Shivam-nagar23 Feb 23, 2025
c41bbe5
oss sync
Shivam-nagar23 Feb 23, 2025
2234c63
user service
Shivam-nagar23 Feb 23, 2025
c2fb678
user service
Shivam-nagar23 Feb 23, 2025
67b19e5
user response
Shivam-nagar23 Feb 23, 2025
34d2060
sync
Shivam-nagar23 Feb 23, 2025
a74eb7a
approver
Shivam-nagar23 Feb 23, 2025
9e2ee91
oss ent sync
Shivam-nagar23 Feb 23, 2025
e08ad15
oss
Shivam-nagar23 Feb 23, 2025
5059299
user service
Shivam-nagar23 Feb 24, 2025
84cf514
review comments
Shivam-nagar23 Feb 24, 2025
6fb8fbf
Merge pull request #6414 from devtron-labs/feat-access-manager-oss-en…
Shivam-nagar23 Feb 24, 2025
53f94cd
Merge branch 'develop' into feat-access-manager
Shivam-nagar23 Feb 24, 2025
05a1ae5
sql script chnage
Shivam-nagar23 Feb 24, 2025
3422fad
get flow
Shivam-nagar23 Feb 24, 2025
f38e973
nul data in case of unauthroised
Shivam-nagar23 Feb 25, 2025
30b758a
user admin
Shivam-nagar23 Feb 28, 2025
4489227
Merge branch 'develop' into feat-access-manager
Shivam-nagar23 Feb 28, 2025
c873624
get group policy
Shivam-nagar23 Mar 3, 2025
cf9b997
Merge branch 'develop' into feat-access-manager
Shivam-nagar23 Mar 3, 2025
0a48005
naming
Shivam-nagar23 Mar 3, 2025
ed1488e
sql scripts
Shivam-nagar23 Mar 7, 2025
915d1e0
Merge branch 'develop' into feat-access-manager
Shivam-nagar23 Mar 10, 2025
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
6 changes: 6 additions & 0 deletions Wire.go
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ import (
"github.com/devtron-labs/devtron/api/sse"
"github.com/devtron-labs/devtron/api/team"
"github.com/devtron-labs/devtron/api/terminal"
"github.com/devtron-labs/devtron/api/userResource"
util5 "github.com/devtron-labs/devtron/api/util"
webhookHelm "github.com/devtron-labs/devtron/api/webhook/helm"
"github.com/devtron-labs/devtron/cel"
Expand Down Expand Up @@ -169,6 +170,7 @@ import (
workflow3 "github.com/devtron-labs/devtron/pkg/workflow"
"github.com/devtron-labs/devtron/pkg/workflow/dag"
util2 "github.com/devtron-labs/devtron/util"
"github.com/devtron-labs/devtron/util/commonEnforcementFunctionsUtil"
cron2 "github.com/devtron-labs/devtron/util/cron"
"github.com/devtron-labs/devtron/util/rbac"
"github.com/google/wire"
Expand Down Expand Up @@ -212,6 +214,7 @@ func InitializeApp() (*App, error) {
workflow3.WorkflowWireSet,
imageTagging.WireSet,
devtronResource.DevtronResourceWireSet,
userResource.UserResourceWireSet,
policyGovernance.PolicyGovernanceWireSet,
resourceScan.ScanningResultWireSet,

Expand Down Expand Up @@ -495,6 +498,9 @@ func InitializeApp() (*App, error) {
rbac.NewEnforcerUtilImpl,
wire.Bind(new(rbac.EnforcerUtil), new(*rbac.EnforcerUtilImpl)),

commonEnforcementFunctionsUtil.NewCommonEnforcementUtilImpl,
wire.Bind(new(commonEnforcementFunctionsUtil.CommonEnforcementUtil), new(*commonEnforcementFunctionsUtil.CommonEnforcementUtilImpl)),

chartConfig.NewPipelineConfigRepository,
wire.Bind(new(chartConfig.PipelineConfigRepository), new(*chartConfig.PipelineConfigRepositoryImpl)),

Expand Down
49 changes: 8 additions & 41 deletions api/cluster/EnvironmentRestHandler.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import (
request "github.com/devtron-labs/devtron/pkg/cluster/environment"
bean2 "github.com/devtron-labs/devtron/pkg/cluster/environment/bean"
"github.com/devtron-labs/devtron/pkg/cluster/environment/read"
"github.com/devtron-labs/devtron/util/commonEnforcementFunctionsUtil"
"net/http"
"strconv"
"strings"
Expand Down Expand Up @@ -72,14 +73,16 @@ type EnvironmentRestHandlerImpl struct {
deleteService delete2.DeleteService
k8sUtil *k8s2.K8sServiceImpl
cfg *bean.Config
rbacEnforcementUtil commonEnforcementFunctionsUtil.CommonEnforcementUtil
}

type ClusterReachableResponse struct {
ClusterReachable bool `json:"clusterReachable"`
ClusterName string `json:"clusterName"`
}

func NewEnvironmentRestHandlerImpl(svc request.EnvironmentService, environmentReadService read.EnvironmentReadService, logger *zap.SugaredLogger, userService user.UserService, validator *validator.Validate, enforcer casbin.Enforcer, deleteService delete2.DeleteService, k8sUtil *k8s2.K8sServiceImpl, k8sCommonService k8s.K8sCommonService) *EnvironmentRestHandlerImpl {
func NewEnvironmentRestHandlerImpl(svc request.EnvironmentService, environmentReadService read.EnvironmentReadService, logger *zap.SugaredLogger, userService user.UserService, validator *validator.Validate, enforcer casbin.Enforcer, deleteService delete2.DeleteService, k8sUtil *k8s2.K8sServiceImpl, k8sCommonService k8s.K8sCommonService,
rbacEnforcementUtil commonEnforcementFunctionsUtil.CommonEnforcementUtil) *EnvironmentRestHandlerImpl {
cfg := &bean.Config{}
err := env.Parse(cfg)
if err != nil {
Expand All @@ -98,6 +101,7 @@ func NewEnvironmentRestHandlerImpl(svc request.EnvironmentService, environmentRe
cfg: cfg,
k8sUtil: k8sUtil,
k8sCommonService: k8sCommonService,
rbacEnforcementUtil: rbacEnforcementUtil,
}
}

Expand Down Expand Up @@ -318,29 +322,7 @@ func (impl EnvironmentRestHandlerImpl) GetEnvironmentListForAutocomplete(w http.
var grantedEnvironment = environments
start = time.Now()
if !impl.cfg.IgnoreAuthCheck {
grantedEnvironment = make([]bean2.EnvironmentBean, 0)
// RBAC enforcer applying
var envIdentifierList []string
for _, item := range environments {
envIdentifierList = append(envIdentifierList, strings.ToLower(item.EnvironmentIdentifier))
}

result := impl.enforcer.EnforceInBatch(token, casbin.ResourceGlobalEnvironment, casbin.ActionGet, envIdentifierList)
for _, item := range environments {

var hasAccess bool
EnvironmentIdentifier := item.ClusterName + "__" + item.Namespace
if item.EnvironmentIdentifier != EnvironmentIdentifier {
// fix for futuristic case
hasAccess = result[strings.ToLower(EnvironmentIdentifier)] || result[strings.ToLower(item.EnvironmentIdentifier)]
} else {
hasAccess = result[strings.ToLower(item.EnvironmentIdentifier)]
}
if hasAccess {
grantedEnvironment = append(grantedEnvironment, item)
}
}
//RBAC enforcer Ends
grantedEnvironment = impl.rbacEnforcementUtil.CheckAuthorisationForEnvAutocomplete(token, environments)
}
elapsedTime := time.Since(start)
impl.logger.Infow("Env elapsed Time for enforcer", "dbElapsedTime", dbElapsedTime, "elapsedTime",
Expand All @@ -358,7 +340,7 @@ func (impl EnvironmentRestHandlerImpl) GetCombinedEnvironmentListForDropDown(w h
token := r.Header.Get("token")
isActionUserSuperAdmin := impl.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionGet, "*")

clusters, err := impl.environmentClusterMappingsService.GetCombinedEnvironmentListForDropDown(token, isActionUserSuperAdmin, impl.CheckAuthorizationByEmailInBatchForGlobalEnvironment)
clusters, err := impl.environmentClusterMappingsService.GetCombinedEnvironmentListForDropDown(token, isActionUserSuperAdmin, impl.rbacEnforcementUtil.CheckAuthorizationByEmailInBatchForGlobalEnvironment)
if err != nil {
impl.logger.Errorw("service err, GetCombinedEnvironmentListForDropDown", "err", err)
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
Expand All @@ -370,21 +352,6 @@ func (impl EnvironmentRestHandlerImpl) GetCombinedEnvironmentListForDropDown(w h
common.WriteJsonResp(w, err, clusters, http.StatusOK)
}

func (handler EnvironmentRestHandlerImpl) CheckAuthorizationByEmailInBatchForGlobalEnvironment(token string, object []string) map[string]bool {
var objectResult map[string]bool
if len(object) > 0 {
objectResult = handler.enforcer.EnforceInBatch(token, casbin.ResourceGlobalEnvironment, casbin.ActionGet, object)
}
return objectResult
}

func (handler EnvironmentRestHandlerImpl) CheckAuthorizationForGlobalEnvironment(token string, object string) bool {
if ok := handler.enforcer.Enforce(token, casbin.ResourceGlobalEnvironment, casbin.ActionGet, object); !ok {
return false
}
return true
}

func (impl EnvironmentRestHandlerImpl) DeleteEnvironment(w http.ResponseWriter, r *http.Request) {
decoder := json.NewDecoder(r.Body)
userId, err := impl.userService.GetLoggedInUser(r)
Expand Down Expand Up @@ -446,7 +413,7 @@ func (impl EnvironmentRestHandlerImpl) GetCombinedEnvironmentListForDropDownByCl
}
}
token := r.Header.Get("token")
clusters, err := impl.environmentClusterMappingsService.GetCombinedEnvironmentListForDropDownByClusterIds(token, clusterIds, impl.CheckAuthorizationForGlobalEnvironment)
clusters, err := impl.environmentClusterMappingsService.GetCombinedEnvironmentListForDropDownByClusterIds(token, clusterIds, impl.rbacEnforcementUtil.CheckAuthorizationForGlobalEnvironment)
if err != nil {
impl.logger.Errorw("service err, GetCombinedEnvironmentListForDropDown", "err", err)
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
Expand Down
61 changes: 24 additions & 37 deletions api/restHandler/app/appInfo/AppInfoRestHandler.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ package appInfo
import (
"encoding/json"
client "github.com/devtron-labs/devtron/api/helm-app/service"
"github.com/devtron-labs/devtron/util/commonEnforcementFunctionsUtil"
"net/http"
"strconv"
"strings"
Expand Down Expand Up @@ -48,31 +49,34 @@ type AppInfoRestHandler interface {
}

type AppInfoRestHandlerImpl struct {
logger *zap.SugaredLogger
appService app.AppCrudOperationService
userAuthService user.UserService
validator *validator.Validate
enforcerUtil rbac.EnforcerUtil
enforcer casbin.Enforcer
helmAppService client.HelmAppService
enforcerUtilHelm rbac.EnforcerUtilHelm
genericNoteService genericNotes.GenericNoteService
logger *zap.SugaredLogger
appService app.AppCrudOperationService
userAuthService user.UserService
validator *validator.Validate
enforcerUtil rbac.EnforcerUtil
enforcer casbin.Enforcer
helmAppService client.HelmAppService
enforcerUtilHelm rbac.EnforcerUtilHelm
genericNoteService genericNotes.GenericNoteService
rbacEnforcementUtil commonEnforcementFunctionsUtil.CommonEnforcementUtil
}

func NewAppInfoRestHandlerImpl(logger *zap.SugaredLogger, appService app.AppCrudOperationService,
userAuthService user.UserService, validator *validator.Validate, enforcerUtil rbac.EnforcerUtil,
enforcer casbin.Enforcer, helmAppService client.HelmAppService, enforcerUtilHelm rbac.EnforcerUtilHelm,
genericNoteService genericNotes.GenericNoteService) *AppInfoRestHandlerImpl {
genericNoteService genericNotes.GenericNoteService,
rbacEnforcementUtil commonEnforcementFunctionsUtil.CommonEnforcementUtil) *AppInfoRestHandlerImpl {
handler := &AppInfoRestHandlerImpl{
logger: logger,
appService: appService,
userAuthService: userAuthService,
validator: validator,
enforcerUtil: enforcerUtil,
enforcer: enforcer,
helmAppService: helmAppService,
enforcerUtilHelm: enforcerUtilHelm,
genericNoteService: genericNoteService,
logger: logger,
appService: appService,
userAuthService: userAuthService,
validator: validator,
enforcerUtil: enforcerUtil,
enforcer: enforcer,
helmAppService: helmAppService,
enforcerUtilHelm: enforcerUtilHelm,
genericNoteService: genericNoteService,
rbacEnforcementUtil: rbacEnforcementUtil,
}
return handler
}
Expand Down Expand Up @@ -299,7 +303,6 @@ func (handler AppInfoRestHandlerImpl) GetAppListByTeamIds(w http.ResponseWriter,
return
}
token := r.Header.Get("token")
isActionUserSuperAdmin := handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionGet, "*")

appType := v.Get("appType")
handler.logger.Infow("request payload, GetAppListByTeamIds", "payload", params)
Expand All @@ -321,23 +324,7 @@ func (handler AppInfoRestHandlerImpl) GetAppListByTeamIds(w http.ResponseWriter,
}

// RBAC
for _, project := range projectWiseApps {
var accessedApps []*app.AppBean
for _, app := range project.AppList {
if isActionUserSuperAdmin {
accessedApps = append(accessedApps, app)
continue
}
object := handler.enforcerUtil.GetAppRBACNameByAppAndProjectName(project.ProjectName, app.Name)
if ok := handler.enforcer.Enforce(token, casbin.ResourceApplications, casbin.ActionGet, object); ok {
accessedApps = append(accessedApps, app)
}
}
if len(accessedApps) == 0 {
accessedApps = make([]*app.AppBean, 0)
}
project.AppList = accessedApps
}
projectWiseApps = handler.rbacEnforcementUtil.CheckAuthorisationOnApp(token, projectWiseApps)
// RBAC
common.WriteJsonResp(w, err, projectWiseApps, http.StatusOK)
}
Expand Down
7 changes: 7 additions & 0 deletions api/router/router.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ import (
"github.com/devtron-labs/devtron/api/server"
"github.com/devtron-labs/devtron/api/team"
terminal2 "github.com/devtron-labs/devtron/api/terminal"
"github.com/devtron-labs/devtron/api/userResource"
webhookHelm "github.com/devtron-labs/devtron/api/webhook/helm"
"github.com/devtron-labs/devtron/client/cron"
"github.com/devtron-labs/devtron/client/dashboard"
Expand Down Expand Up @@ -122,6 +123,7 @@ type MuxRouter struct {
fluxApplicationRouter fluxApplication2.FluxApplicationRouter
devtronResourceRouter devtronResource.DevtronResourceRouter
scanningResultRouter resourceScan.ScanningResultRouter
userResourceRouter userResource.Router
}

func NewMuxRouter(logger *zap.SugaredLogger,
Expand Down Expand Up @@ -156,6 +158,7 @@ func NewMuxRouter(logger *zap.SugaredLogger,
devtronResourceRouter devtronResource.DevtronResourceRouter,
fluxApplicationRouter fluxApplication2.FluxApplicationRouter,
scanningResultRouter resourceScan.ScanningResultRouter,
userResourceRouter userResource.Router,
) *MuxRouter {
r := &MuxRouter{
Router: mux.NewRouter(),
Expand Down Expand Up @@ -222,6 +225,7 @@ func NewMuxRouter(logger *zap.SugaredLogger,
devtronResourceRouter: devtronResourceRouter,
fluxApplicationRouter: fluxApplicationRouter,
scanningResultRouter: scanningResultRouter,
userResourceRouter: userResourceRouter,
}
return r
}
Expand Down Expand Up @@ -428,6 +432,9 @@ func (r MuxRouter) Init() {
devtronResourceRouter := r.Router.PathPrefix("/orchestrator/resource").Subrouter()
r.devtronResourceRouter.InitDevtronResourceRouter(devtronResourceRouter)

userResourcesRouter := r.Router.PathPrefix("/orchestrator/user/resource").Subrouter()
r.userResourceRouter.InitUserResourceRouter(userResourcesRouter)

infraConfigRouter := r.Router.PathPrefix("/orchestrator/infra-config").Subrouter()
r.infraConfigRouter.InitInfraConfigRouter(infraConfigRouter)

Expand Down
73 changes: 73 additions & 0 deletions api/userResource/UserResourceRestHandler.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
package userResource

import (
"encoding/json"
"github.com/devtron-labs/devtron/api/restHandler/common"
"github.com/devtron-labs/devtron/api/userResource/adapter"
apiBean "github.com/devtron-labs/devtron/api/userResource/bean"
"github.com/devtron-labs/devtron/pkg/auth/user"
"github.com/devtron-labs/devtron/pkg/userResource"
"github.com/gorilla/mux"
"go.uber.org/zap"
"net/http"
)

type RestHandler interface {
GetResourceOptions(w http.ResponseWriter, r *http.Request)
}
type RestHandlerImpl struct {
logger *zap.SugaredLogger
userService user.UserService
userResourceService userResource.UserResourceService
}

func NewUserResourceRestHandler(logger *zap.SugaredLogger,
userService user.UserService,
userResourceService userResource.UserResourceService) *RestHandlerImpl {
return &RestHandlerImpl{
logger: logger,
userService: userService,
userResourceService: userResourceService,
}
}

func (handler *RestHandlerImpl) GetResourceOptions(w http.ResponseWriter, r *http.Request) {
userId, err := handler.userService.GetLoggedInUser(r)
if userId == 0 || err != nil {
common.WriteJsonResp(w, err, "Unauthorized User", http.StatusUnauthorized)
return
}

pathParams, caughtError := decodePathParams(w, r)
if caughtError {
return
}
decoder := json.NewDecoder(r.Body)
var reqBean apiBean.ResourceOptionsReqDto
err = decoder.Decode(&reqBean)
if err != nil {
handler.logger.Errorw("error in decoding request body", "err", err, "requestBody", r.Body)
common.WriteJsonResp(w, err, nil, http.StatusBadRequest)
return
}
token := r.Header.Get("token")
// rbac enforcement is managed at service level based on entity and kind
data, err := handler.userResourceService.GetResourceOptions(r.Context(), token, &reqBean, pathParams)
if err != nil {
handler.logger.Errorw("service error, GetResourceOptions", "err", err)
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
return
}

common.WriteJsonResp(w, err, data, http.StatusOK)
return

}

func decodePathParams(w http.ResponseWriter, r *http.Request) (pathParams *apiBean.PathParams, caughtError bool) {
vars := mux.Vars(r)
kindVar := vars[apiBean.PathParamKind]
versionVar := vars[apiBean.PathParamVersion]
pathParams = adapter.BuildPathParams(kindVar, versionVar)
return pathParams, caughtError
}
23 changes: 23 additions & 0 deletions api/userResource/UserResourceRouter.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package userResource

import "github.com/gorilla/mux"

type Router interface {
InitUserResourceRouter(userResourceRouter *mux.Router)
}

type RouterImpl struct {
restHandler RestHandler
}

func NewUserResourceRouterImpl(restHandler RestHandler) *RouterImpl {
return &RouterImpl{
restHandler: restHandler,
}
}

func (router *RouterImpl) InitUserResourceRouter(userResourceRouter *mux.Router) {
userResourceRouter.Path("/options/{kind:[a-zA-Z0-9/-]+}/{version:[a-zA-Z0-9]+}").
HandlerFunc(router.restHandler.GetResourceOptions).Methods("POST")

}
12 changes: 12 additions & 0 deletions api/userResource/adapter/adapter.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package adapter

import (
"github.com/devtron-labs/devtron/api/userResource/bean"
)

func BuildPathParams(kind, version string) *bean.PathParams {
return &bean.PathParams{
Kind: kind,
Version: version,
}
}
Loading
Loading