blob: c9c88e5f1047aabcd8b2ea05ab54df7fb1912e6e [file] [log] [blame]
package ignore
import (
"context"
"net/url"
"time"
"go.skia.org/infra/go/skerr"
)
// Store is an interface for a database that saves ignore rules.
type Store interface {
// Create adds a new rule to the ignore store. The ID will be set if this call is successful.
Create(context.Context, *Rule) error
// List returns all ignore rules in the ignore store.
List(context.Context) ([]*Rule, error)
// Update sets a Rule. TODO(kjlubick) this API is strange - why do we need an id *and* a rule?
Update(ctx context.Context, id string, rule *Rule) error
// Delete removes a Rule from the store. The return value is the number of
// records that were deleted (either 0 or 1).
Delete(ctx context.Context, id string) (int, error)
}
// Rule defines a single ignore rule, matching zero or more traces based on
// Query.
type Rule struct {
ID string
Name string
UpdatedBy string
Expires time.Time
Query string
Note string
}
// toQuery makes a slice of url.Values from the given slice of Rules.
func toQuery(ignores []*Rule) ([]url.Values, error) {
var ret []url.Values
for _, ignore := range ignores {
v, err := url.ParseQuery(ignore.Query)
if err != nil {
return nil, skerr.Wrapf(err, "invalid ignore rule id %q; query %q", ignore.ID, ignore.Query)
}
ret = append(ret, v)
}
return ret, nil
}
// NewRule creates a new ignore rule with the given data.
func NewRule(createdByUser string, expires time.Time, queryStr string, note string) *Rule {
return &Rule{
Name: createdByUser,
UpdatedBy: createdByUser,
Expires: expires,
Query: queryStr,
Note: note,
}
}