feat(http): validate dashboard cell updates (#1199)
* feat(http): validate dashboard cell updates * run formatterpull/10616/head
parent
bbe73b5cc1
commit
91dbd48258
|
@ -288,6 +288,10 @@ func (c *Client) RemoveDashboardCell(ctx context.Context, dashboardID, cellID pl
|
||||||
|
|
||||||
// UpdateDashboardCell udpates a cell on a dashboard.
|
// UpdateDashboardCell udpates a cell on a dashboard.
|
||||||
func (c *Client) UpdateDashboardCell(ctx context.Context, dashboardID, cellID platform.ID, upd platform.CellUpdate) (*platform.Cell, error) {
|
func (c *Client) UpdateDashboardCell(ctx context.Context, dashboardID, cellID platform.ID, upd platform.CellUpdate) (*platform.Cell, error) {
|
||||||
|
if err := upd.Valid(); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
var cell *platform.Cell
|
var cell *platform.Cell
|
||||||
err := c.db.Update(func(tx *bolt.Tx) error {
|
err := c.db.Update(func(tx *bolt.Tx) error {
|
||||||
d, err := c.findDashboardByID(ctx, tx, dashboardID)
|
d, err := c.findDashboardByID(ctx, tx, dashboardID)
|
||||||
|
|
|
@ -173,3 +173,12 @@ func (u CellUpdate) Apply(c *Cell) error {
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Valid returns an error if the cell update is invalid.
|
||||||
|
func (u CellUpdate) Valid() error {
|
||||||
|
if u.H == nil && u.W == nil && u.Y == nil && u.X == nil && !u.ViewID.Valid() {
|
||||||
|
return fmt.Errorf("must update at least one attribute")
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
|
@ -616,6 +616,10 @@ func decodePatchDashboardCellRequest(ctx context.Context, r *http.Request) (*pat
|
||||||
return nil, errors.MalformedDataf(err.Error())
|
return nil, errors.MalformedDataf(err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if err := req.upd.Valid(); err != nil {
|
||||||
|
return nil, errors.InvalidDataf(err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
return req, nil
|
return req, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -886,12 +890,15 @@ func (s *DashboardService) RemoveDashboardCell(ctx context.Context, dashboardID,
|
||||||
|
|
||||||
// UpdateDashboardCell replaces the dashboard cell with the provided ID.
|
// UpdateDashboardCell replaces the dashboard cell with the provided ID.
|
||||||
func (s *DashboardService) UpdateDashboardCell(ctx context.Context, dashboardID, cellID platform.ID, upd platform.CellUpdate) (*platform.Cell, error) {
|
func (s *DashboardService) UpdateDashboardCell(ctx context.Context, dashboardID, cellID platform.ID, upd platform.CellUpdate) (*platform.Cell, error) {
|
||||||
|
if err := upd.Valid(); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
u, err := newURL(s.Addr, dashboardCellIDPath(dashboardID, cellID))
|
u, err := newURL(s.Addr, dashboardCellIDPath(dashboardID, cellID))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// fixme > in case upd does not containa a valid ViewID this errors out
|
|
||||||
b, err := json.Marshal(upd)
|
b, err := json.Marshal(upd)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
|
|
@ -182,6 +182,10 @@ func (s *Service) RemoveDashboardCell(ctx context.Context, dashboardID platform.
|
||||||
|
|
||||||
// UpdateDashboardCell will remove a cell from a dashboard.
|
// UpdateDashboardCell will remove a cell from a dashboard.
|
||||||
func (s *Service) UpdateDashboardCell(ctx context.Context, dashboardID platform.ID, cellID platform.ID, upd platform.CellUpdate) (*platform.Cell, error) {
|
func (s *Service) UpdateDashboardCell(ctx context.Context, dashboardID platform.ID, cellID platform.ID, upd platform.CellUpdate) (*platform.Cell, error) {
|
||||||
|
if err := upd.Valid(); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
d, err := s.FindDashboardByID(ctx, dashboardID)
|
d, err := s.FindDashboardByID(ctx, dashboardID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
|
|
@ -1038,7 +1038,7 @@ func UpdateDashboardCell(
|
||||||
wants wants
|
wants wants
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
name: "basic remove cell",
|
name: "basic update cell",
|
||||||
fields: DashboardFields{
|
fields: DashboardFields{
|
||||||
NowFn: func() time.Time { return time.Date(2009, time.November, 10, 24, 0, 0, 0, time.UTC) },
|
NowFn: func() time.Time { return time.Date(2009, time.November, 10, 24, 0, 0, 0, time.UTC) },
|
||||||
IDGenerator: &mock.IDGenerator{
|
IDGenerator: &mock.IDGenerator{
|
||||||
|
@ -1094,6 +1094,57 @@ func UpdateDashboardCell(
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "invalid cell update",
|
||||||
|
fields: DashboardFields{
|
||||||
|
NowFn: func() time.Time { return time.Date(2009, time.November, 10, 24, 0, 0, 0, time.UTC) },
|
||||||
|
IDGenerator: &mock.IDGenerator{
|
||||||
|
IDFn: func() platform.ID {
|
||||||
|
return MustIDBase16(dashTwoID)
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Dashboards: []*platform.Dashboard{
|
||||||
|
{
|
||||||
|
ID: MustIDBase16(dashOneID),
|
||||||
|
Name: "dashboard1",
|
||||||
|
Cells: []*platform.Cell{
|
||||||
|
{
|
||||||
|
ID: MustIDBase16(dashTwoID),
|
||||||
|
ViewID: MustIDBase16(dashTwoID),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ID: MustIDBase16(dashOneID),
|
||||||
|
ViewID: MustIDBase16(dashOneID),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
args: args{
|
||||||
|
dashboardID: MustIDBase16(dashOneID),
|
||||||
|
cellID: MustIDBase16(dashTwoID),
|
||||||
|
cellUpdate: platform.CellUpdate{},
|
||||||
|
},
|
||||||
|
wants: wants{
|
||||||
|
dashboards: []*platform.Dashboard{
|
||||||
|
{
|
||||||
|
ID: MustIDBase16(dashOneID),
|
||||||
|
Name: "dashboard1",
|
||||||
|
Cells: []*platform.Cell{
|
||||||
|
{
|
||||||
|
ID: MustIDBase16(dashTwoID),
|
||||||
|
ViewID: MustIDBase16(dashTwoID),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ID: MustIDBase16(dashOneID),
|
||||||
|
ViewID: MustIDBase16(dashOneID),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
err: fmt.Errorf("must update at least one attribute"),
|
||||||
|
},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, tt := range tests {
|
for _, tt := range tests {
|
||||||
|
|
Loading…
Reference in New Issue