chore: do not allow deleting more than one panel on update request (#3703)

This commit is contained in:
Srikanth Chekuri 2023-10-10 13:07:20 +00:00 committed by GitHub
parent a84a70df14
commit 2c96512a8a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -147,8 +147,9 @@ func CreateDashboard(data map[string]interface{}, fm interfaces.FeatureLookup) (
return nil, &model.ApiError{Typ: model.ErrorExec, Err: err} return nil, &model.ApiError{Typ: model.ErrorExec, Err: err}
} }
if countTraceAndLogsPanel(data) > 0 { newCount, _ := countTraceAndLogsPanel(data)
fErr := checkFeatureUsage(fm, countTraceAndLogsPanel(data)) if newCount > 0 {
fErr := checkFeatureUsage(fm, newCount)
if fErr != nil { if fErr != nil {
return nil, fErr return nil, fErr
} }
@ -168,7 +169,7 @@ func CreateDashboard(data map[string]interface{}, fm interfaces.FeatureLookup) (
} }
dash.Id = int(lastInsertId) dash.Id = int(lastInsertId)
traceAndLogsPanelUsage := countTraceAndLogsPanel(data) traceAndLogsPanelUsage, _ := countTraceAndLogsPanel(data)
if traceAndLogsPanelUsage > 0 { if traceAndLogsPanelUsage > 0 {
updateFeatureUsage(fm, traceAndLogsPanelUsage) updateFeatureUsage(fm, traceAndLogsPanelUsage)
} }
@ -213,7 +214,7 @@ func DeleteDashboard(uuid string, fm interfaces.FeatureLookup) *model.ApiError {
return &model.ApiError{Typ: model.ErrorNotFound, Err: fmt.Errorf("no dashboard found with uuid: %s", uuid)} return &model.ApiError{Typ: model.ErrorNotFound, Err: fmt.Errorf("no dashboard found with uuid: %s", uuid)}
} }
traceAndLogsPanelUsage := countTraceAndLogsPanel(dashboard.Data) traceAndLogsPanelUsage, _ := countTraceAndLogsPanel(dashboard.Data)
if traceAndLogsPanelUsage > 0 { if traceAndLogsPanelUsage > 0 {
updateFeatureUsage(fm, -traceAndLogsPanelUsage) updateFeatureUsage(fm, -traceAndLogsPanelUsage)
} }
@ -248,8 +249,8 @@ func UpdateDashboard(uuid string, data map[string]interface{}, fm interfaces.Fea
} }
// check if the count of trace and logs QB panel has changed, if yes, then check feature flag count // check if the count of trace and logs QB panel has changed, if yes, then check feature flag count
existingCount := countTraceAndLogsPanel(dashboard.Data) existingCount, existingTotal := countTraceAndLogsPanel(dashboard.Data)
newCount := countTraceAndLogsPanel(data) newCount, newTotal := countTraceAndLogsPanel(data)
if newCount > existingCount { if newCount > existingCount {
err := checkFeatureUsage(fm, newCount-existingCount) err := checkFeatureUsage(fm, newCount-existingCount)
if err != nil { if err != nil {
@ -257,6 +258,12 @@ func UpdateDashboard(uuid string, data map[string]interface{}, fm interfaces.Fea
} }
} }
if existingTotal > newTotal && existingTotal-newTotal > 1 {
// if the total count of panels has reduced by more than 1,
// return error
return nil, model.BadRequest(fmt.Errorf("deleting more than one panel is not supported"))
}
dashboard.UpdatedAt = time.Now() dashboard.UpdatedAt = time.Now()
dashboard.Data = data dashboard.Data = data
@ -588,8 +595,9 @@ func TransformGrafanaJSONToSignoz(grafanaJSON model.GrafanaJSON) model.Dashboard
return toReturn return toReturn
} }
func countTraceAndLogsPanel(data map[string]interface{}) int64 { func countTraceAndLogsPanel(data map[string]interface{}) (int64, int64) {
count := int64(0) count := int64(0)
totalPanels := int64(0)
if data != nil && data["widgets"] != nil { if data != nil && data["widgets"] != nil {
widgets, ok := data["widgets"].(interface{}) widgets, ok := data["widgets"].(interface{})
if ok { if ok {
@ -598,6 +606,7 @@ func countTraceAndLogsPanel(data map[string]interface{}) int64 {
for _, widget := range data { for _, widget := range data {
sData, ok := widget.(map[string]interface{}) sData, ok := widget.(map[string]interface{})
if ok && sData["query"] != nil { if ok && sData["query"] != nil {
totalPanels++
query, ok := sData["query"].(interface{}).(map[string]interface{}) query, ok := sData["query"].(interface{}).(map[string]interface{})
if ok && query["queryType"] == "builder" && query["builder"] != nil { if ok && query["queryType"] == "builder" && query["builder"] != nil {
builderData, ok := query["builder"].(interface{}).(map[string]interface{}) builderData, ok := query["builder"].(interface{}).(map[string]interface{})
@ -620,5 +629,5 @@ func countTraceAndLogsPanel(data map[string]interface{}) int64 {
} }
} }
} }
return count return count, totalPanels
} }