Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
8c42564
initial commit
kripanshdevtron Aug 5, 2022
04d936c
user attributes code commit
kripanshdevtron Aug 5, 2022
23e2580
error msg wrapped
kripanshdevtron Aug 5, 2022
0afb465
get user attribute fix
kripanshdevtron Aug 5, 2022
04ee5d1
Merge branch 'main' into guided-onboarding-user-metadata
kripanshdevtron Aug 18, 2022
a7360ff
update migrator file version
kripanshdevtron Aug 18, 2022
67d6471
code review comments incorporated
kripanshdevtron Aug 18, 2022
b2ef461
refactoring needed
kripanshdevtron Aug 18, 2022
cff926e
mentioned mapping for swagger generation
kripanshdevtron Aug 18, 2022
1d851e2
Merge branch 'main' into guided-onboarding-user-metadata
kripanshdevtron Aug 18, 2022
62f8001
Merge branch 'main' into guided-onboarding-user-metadata
kripanshdevtron Aug 22, 2022
c64c525
Merge branch 'main' into guided-onboarding-user-metadata
kripanshdevtron Aug 25, 2022
d9132ac
Merge branch 'main' into guided-onboarding-user-metadata
kripanshdevtron Aug 25, 2022
120db3f
user attributes commited in EA mode also
kripanshdevtron Aug 26, 2022
7323a34
send telemetry event API exposed
kripanshdevtron Aug 28, 2022
577cabf
refactoring
kripanshdevtron Aug 28, 2022
f8e588b
telemetry API for EA mode
kripanshdevtron Aug 31, 2022
54f9abb
super admin permission removed
kripanshdevtron Aug 31, 2022
f48266b
Merge branch 'main' into guided-onboarding-user-metadata
kripanshdevtron Sep 3, 2022
2315fed
Merge branch 'main' into guided-onboarding-user-metadata
kripanshdevtron Sep 3, 2022
a36d01d
db patch file updated
kripanshdevtron Sep 3, 2022
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
8 changes: 8 additions & 0 deletions Wire.go
Original file line number Diff line number Diff line change
Expand Up @@ -729,6 +729,14 @@ func InitializeApp() (*App, error) {
app.NewPipelineStatusTimelineServiceImpl,
wire.Bind(new(app.PipelineStatusTimelineService), new(*app.PipelineStatusTimelineServiceImpl)),

router.NewUserAttributesRouterImpl,
wire.Bind(new(router.UserAttributesRouter), new(*router.UserAttributesRouterImpl)),
restHandler.NewUserAttributesRestHandlerImpl,
wire.Bind(new(restHandler.UserAttributesRestHandler), new(*restHandler.UserAttributesRestHandlerImpl)),
attributes.NewUserAttributesServiceImpl,
wire.Bind(new(attributes.UserAttributesService), new(*attributes.UserAttributesServiceImpl)),
repository.NewUserAttributesRepositoryImpl,
wire.Bind(new(repository.UserAttributesRepository), new(*repository.UserAttributesRepositoryImpl)),
pipelineConfig.NewPipelineStatusTimelineRepositoryImpl,
wire.Bind(new(pipelineConfig.PipelineStatusTimelineRepository), new(*pipelineConfig.PipelineStatusTimelineRepositoryImpl)),
)
Expand Down
49 changes: 47 additions & 2 deletions api/restHandler/TelemetryRestHandler.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,24 +18,36 @@
package restHandler

import (
"encoding/json"
"errors"
"github.com/devtron-labs/devtron/api/restHandler/common"
"github.com/devtron-labs/devtron/client/telemetry"
"github.com/devtron-labs/devtron/pkg/user"
"github.com/devtron-labs/devtron/pkg/user/casbin"
"go.uber.org/zap"
"net/http"
)

type TelemetryRestHandler interface {
GetTelemetryMetaInfo(w http.ResponseWriter, r *http.Request)
SendTelemetryData(w http.ResponseWriter, r *http.Request)
}

type TelemetryRestHandlerImpl struct {
logger *zap.SugaredLogger
telemetryEventClient telemetry.TelemetryEventClient
enforcer casbin.Enforcer
userService user.UserService
}

type TelemetryGenericEvent struct {
eventType string
eventPayload map[string]interface{}
}

func NewTelemetryRestHandlerImpl(logger *zap.SugaredLogger,
telemetryEventClient telemetry.TelemetryEventClient) *TelemetryRestHandlerImpl {
handler := &TelemetryRestHandlerImpl{logger: logger, telemetryEventClient: telemetryEventClient}
telemetryEventClient telemetry.TelemetryEventClient, enforcer casbin.Enforcer, userService user.UserService) *TelemetryRestHandlerImpl {
handler := &TelemetryRestHandlerImpl{logger: logger, telemetryEventClient: telemetryEventClient, enforcer: enforcer, userService: userService}
return handler
}

Expand All @@ -48,3 +60,36 @@ func (handler TelemetryRestHandlerImpl) GetTelemetryMetaInfo(w http.ResponseWrit
}
common.WriteJsonResp(w, nil, res, http.StatusOK)
}

func (handler TelemetryRestHandlerImpl) SendTelemetryData(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
}
decoder := json.NewDecoder(r.Body)
var payload map[string]interface{}
err = decoder.Decode(&payload)
if err != nil {
handler.logger.Errorw("request err, SendTelemetryData", "err", err, "payload", payload)
common.WriteJsonResp(w, err, nil, http.StatusBadRequest)
return
}
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
}

eventType := payload["eventType"]
eventTypeString := eventType.(string)
err = handler.telemetryEventClient.SendGenericTelemetryEvent(eventTypeString, payload)

if err != nil {
handler.logger.Errorw("service err, SendTelemetryData", "err", err)
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
return
}
common.WriteJsonResp(w, nil, "success", http.StatusOK)

}
187 changes: 187 additions & 0 deletions api/restHandler/UserAttributesRestHandler.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,187 @@
/*
* Copyright (c) 2020 Devtron Labs
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/

package restHandler

import (
"encoding/json"
"errors"
"github.com/devtron-labs/devtron/api/restHandler/common"
"github.com/devtron-labs/devtron/pkg/attributes"
"github.com/devtron-labs/devtron/pkg/user"
"github.com/devtron-labs/devtron/pkg/user/casbin"
"github.com/gorilla/mux"
"go.uber.org/zap"
"net/http"
)

type UserAttributesRestHandler interface {
AddUserAttributes(w http.ResponseWriter, r *http.Request)
UpdateUserAttributes(w http.ResponseWriter, r *http.Request)
GetUserAttribute(w http.ResponseWriter, r *http.Request)
}

type UserAttributesRestHandlerImpl struct {
logger *zap.SugaredLogger
enforcer casbin.Enforcer
userService user.UserService
userAttributesService attributes.UserAttributesService
}

func NewUserAttributesRestHandlerImpl(logger *zap.SugaredLogger, enforcer casbin.Enforcer,
userService user.UserService, userAttributesService attributes.UserAttributesService) *UserAttributesRestHandlerImpl {
userAuthHandler := &UserAttributesRestHandlerImpl{
logger: logger,
enforcer: enforcer,
userService: userService,
userAttributesService: userAttributesService,
}
return userAuthHandler
}

func (handler *UserAttributesRestHandlerImpl) AddUserAttributes(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
}
decoder := json.NewDecoder(r.Body)
var dto attributes.UserAttributesDto
err = decoder.Decode(&dto)
if err != nil {
handler.logger.Errorw("request err, AddUserAttributes", "err", err, "payload", dto)
common.WriteJsonResp(w, err, nil, http.StatusBadRequest)
return
}

dto.UserId = userId
token := r.Header.Get("token")
//if ok := handler.enforcer.Enforce(token, casbin.ResourceGlobal, casbin.ActionCreate, "*"); !ok {
// common.WriteJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden)
// return
//}
emailId, err := handler.userService.GetEmailFromToken(token)
if err != nil {
handler.logger.Errorw("request err, UpdateUserAttributes", "err", err, "payload", dto)
common.WriteJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden)
return
}
dto.EmailId = emailId

handler.logger.Infow("request payload, AddUserAttributes", "payload", dto)
resp, err := handler.userAttributesService.AddUserAttributes(&dto)
if err != nil {
handler.logger.Errorw("service err, AddUserAttributes", "err", err, "payload", dto)
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
return
}
common.WriteJsonResp(w, nil, resp, http.StatusOK)
}

// @Summary update user attributes
// @version 1.0
// @produce application/json
// @Param payload body attributes.UserAttributesDto true "Input key"
// @Success 200 {object} attributes.UserAttributesDto
// @Router /orchestrator/attributes/user/update [POST]
func (handler *UserAttributesRestHandlerImpl) UpdateUserAttributes(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
}

decoder := json.NewDecoder(r.Body)
var dto attributes.UserAttributesDto
err = decoder.Decode(&dto)
if err != nil {
handler.logger.Errorw("request err, UpdateUserAttributes", "err", err, "payload", dto)
common.WriteJsonResp(w, err, nil, http.StatusBadRequest)
return
}

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

emailId, err := handler.userService.GetEmailFromToken(token)
if err != nil {
handler.logger.Errorw("request err, UpdateUserAttributes", "err", err, "payload", dto)
common.WriteJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden)
return
}
dto.EmailId = emailId

handler.logger.Infow("request payload, UpdateUserAttributes", "payload", dto)
resp, err := handler.userAttributesService.UpdateUserAttributes(&dto)
if err != nil {
handler.logger.Errorw("service err, UpdateUserAttributes", "err", err, "payload", dto)
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
return
}
common.WriteJsonResp(w, nil, resp, http.StatusOK)
}

// @Summary get user attributes
// @version 1.0
// @produce application/json
// @Param name query string true "Input key"
// @Success 200 {object} attributes.UserAttributesDto
// @Router /orchestrator/attributes/user/get [GET]
func (handler *UserAttributesRestHandlerImpl) GetUserAttribute(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
}

vars := mux.Vars(r)
key := vars["key"]
if key == "" {
handler.logger.Errorw("request err, GetUserAttribute", "err", err, "key", key)
common.WriteJsonResp(w, err, nil, http.StatusBadRequest)
return
}

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
//}

dto := attributes.UserAttributesDto{}

emailId, err := handler.userService.GetEmailFromToken(token)
if err != nil {
handler.logger.Errorw("request err, UpdateUserAttributes", "err", err, "payload", dto)
common.WriteJsonResp(w, errors.New("unauthorized"), nil, http.StatusForbidden)
return
}
dto.EmailId = emailId
dto.Key = key

res, err := handler.userAttributesService.GetUserAttribute(&dto)
if err != nil {
handler.logger.Errorw("service err, GetAttributesById", "err", err)
common.WriteJsonResp(w, err, nil, http.StatusInternalServerError)
return
}
common.WriteJsonResp(w, nil, res, http.StatusOK)
}
7 changes: 5 additions & 2 deletions api/router/TelemetryRouter.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ import (
)

type TelemetryRouter interface {
initTelemetryRouter(router *mux.Router)
InitTelemetryRouter(router *mux.Router)
}

type TelemetryRouterImpl struct {
Expand All @@ -39,7 +39,10 @@ func NewTelemetryRouterImpl(logger *zap.SugaredLogger, handler restHandler.Telem
return router
}

func (router TelemetryRouterImpl) initTelemetryRouter(telemetryRouter *mux.Router) {
func (router TelemetryRouterImpl) InitTelemetryRouter(telemetryRouter *mux.Router) {
telemetryRouter.Path("/meta").
HandlerFunc(router.handler.GetTelemetryMetaInfo).Methods("GET")
telemetryRouter.Path("/event").
HandlerFunc(router.handler.SendTelemetryData).Methods("POST")

}
45 changes: 45 additions & 0 deletions api/router/UserAttributesRouter.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
/*
* Copyright (c) 2020 Devtron Labs
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/

package router

import (
user "github.com/devtron-labs/devtron/api/restHandler"
"github.com/gorilla/mux"
)

type UserAttributesRouter interface {
InitUserAttributesRouter(helmRouter *mux.Router)
}

type UserAttributesRouterImpl struct {
userAttributesRestHandler user.UserAttributesRestHandler
}

func NewUserAttributesRouterImpl(userAttributesRestHandler user.UserAttributesRestHandler) *UserAttributesRouterImpl {
router := &UserAttributesRouterImpl{
userAttributesRestHandler: userAttributesRestHandler,
}
return router
}

func (router UserAttributesRouterImpl) InitUserAttributesRouter(attributesRouter *mux.Router) {
attributesRouter.Path("/update").
HandlerFunc(router.userAttributesRestHandler.UpdateUserAttributes).Methods("POST")
attributesRouter.Path("/get").
HandlerFunc(router.userAttributesRestHandler.GetUserAttribute).Queries("key", "{key}").Methods("GET")
}
9 changes: 7 additions & 2 deletions api/router/router.go
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,7 @@ type MuxRouter struct {
gitOpsConfigRouter GitOpsConfigRouter
dashboardRouter dashboard.DashboardRouter
attributesRouter AttributesRouter
userAttributesRouter UserAttributesRouter
commonRouter CommonRouter
grafanaRouter GrafanaRouter
ssoLoginRouter sso.SsoLoginRouter
Expand Down Expand Up @@ -129,7 +130,7 @@ func NewMuxRouter(logger *zap.SugaredLogger, HelmRouter HelmRouter, PipelineConf
ChartRefRouter ChartRefRouter, ConfigMapRouter ConfigMapRouter, AppStoreRouter appStore.AppStoreRouter, chartRepositoryRouter chartRepo.ChartRepositoryRouter,
ReleaseMetricsRouter ReleaseMetricsRouter, deploymentGroupRouter DeploymentGroupRouter, batchOperationRouter BatchOperationRouter,
chartGroupRouter ChartGroupRouter, testSuitRouter TestSuitRouter, imageScanRouter ImageScanRouter,
policyRouter PolicyRouter, gitOpsConfigRouter GitOpsConfigRouter, dashboardRouter dashboard.DashboardRouter, attributesRouter AttributesRouter,
policyRouter PolicyRouter, gitOpsConfigRouter GitOpsConfigRouter, dashboardRouter dashboard.DashboardRouter, attributesRouter AttributesRouter, userAttributesRouter UserAttributesRouter,
commonRouter CommonRouter, grafanaRouter GrafanaRouter, ssoLoginRouter sso.SsoLoginRouter, telemetryRouter TelemetryRouter, telemetryWatcher telemetry.TelemetryEventClient, bulkUpdateRouter BulkUpdateRouter, webhookListenerRouter WebhookListenerRouter, appLabelsRouter AppLabelRouter,
coreAppRouter CoreAppRouter, helmAppRouter client.HelmAppRouter, k8sApplicationRouter k8s.K8sApplicationRouter,
pProfRouter PProfRouter, deploymentConfigRouter deployment.DeploymentConfigRouter, dashboardTelemetryRouter dashboardEvent.DashboardTelemetryRouter,
Expand Down Expand Up @@ -175,6 +176,7 @@ func NewMuxRouter(logger *zap.SugaredLogger, HelmRouter HelmRouter, PipelineConf
policyRouter: policyRouter,
gitOpsConfigRouter: gitOpsConfigRouter,
attributesRouter: attributesRouter,
userAttributesRouter: userAttributesRouter,
dashboardRouter: dashboardRouter,
commonRouter: commonRouter,
grafanaRouter: grafanaRouter,
Expand Down Expand Up @@ -322,6 +324,9 @@ func (r MuxRouter) Init() {
attributeRouter := r.Router.PathPrefix("/orchestrator/attributes").Subrouter()
r.attributesRouter.initAttributesRouter(attributeRouter)

userAttributeRouter := r.Router.PathPrefix("/orchestrator/attributes/user").Subrouter()
r.userAttributesRouter.InitUserAttributesRouter(userAttributeRouter)

dashboardRouter := r.Router.PathPrefix("/dashboard").Subrouter()
r.dashboardRouter.InitDashboardRouter(dashboardRouter)

Expand All @@ -339,7 +344,7 @@ func (r MuxRouter) Init() {
r.ssoLoginRouter.InitSsoLoginRouter(ssoLoginRouter)

telemetryRouter := r.Router.PathPrefix("/orchestrator/telemetry").Subrouter()
r.telemetryRouter.initTelemetryRouter(telemetryRouter)
r.telemetryRouter.InitTelemetryRouter(telemetryRouter)

bulkUpdateRouter := r.Router.PathPrefix("/orchestrator/batch").Subrouter()
r.bulkUpdateRouter.initBulkUpdateRouter(bulkUpdateRouter)
Expand Down
Loading