2018-12-03 16:07:08 +00:00
|
|
|
package platform
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
"errors"
|
2018-12-17 22:13:43 +00:00
|
|
|
"regexp"
|
2018-12-03 16:07:08 +00:00
|
|
|
)
|
|
|
|
|
2018-12-07 18:25:11 +00:00
|
|
|
// ErrLabelNotFound is the error for a missing Label.
|
|
|
|
const ErrLabelNotFound = ChronografError("label not found")
|
|
|
|
|
2018-12-18 07:59:04 +00:00
|
|
|
const (
|
|
|
|
OpFindLabels = "FindLabels"
|
|
|
|
OpCreateLabel = "CreateLabel"
|
|
|
|
OpUpdateLabel = "UpdateLabel"
|
|
|
|
OpDeleteLabel = "DeleteLabel"
|
|
|
|
)
|
|
|
|
|
2018-12-17 22:13:43 +00:00
|
|
|
var colorPattern = regexp.MustCompile(`^([A-Fa-f0-9]{6})$`)
|
|
|
|
|
2018-12-03 16:07:08 +00:00
|
|
|
type LabelService interface {
|
|
|
|
// FindLabels returns a list of labels that match a filter
|
|
|
|
FindLabels(ctx context.Context, filter LabelFilter, opt ...FindOptions) ([]*Label, error)
|
|
|
|
|
|
|
|
// CreateLabel creates a new label
|
|
|
|
CreateLabel(ctx context.Context, l *Label) error
|
|
|
|
|
2018-12-18 06:30:41 +00:00
|
|
|
// UpdateLabel updates a label with a changeset.
|
|
|
|
UpdateLabel(ctx context.Context, l *Label, upd LabelUpdate) (*Label, error)
|
2018-12-17 22:13:43 +00:00
|
|
|
|
2018-12-03 16:07:08 +00:00
|
|
|
// DeleteLabel deletes a label
|
|
|
|
DeleteLabel(ctx context.Context, l Label) error
|
|
|
|
}
|
|
|
|
|
|
|
|
type Label struct {
|
|
|
|
ResourceID ID `json:"resource_id"`
|
|
|
|
Name string `json:"name"`
|
2018-12-17 22:13:43 +00:00
|
|
|
Color string `json:"color"`
|
2018-12-03 16:07:08 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Validate returns an error if the label is invalid.
|
|
|
|
func (l *Label) Validate() error {
|
|
|
|
if !l.ResourceID.Valid() {
|
|
|
|
return errors.New("resourceID is required")
|
|
|
|
}
|
|
|
|
|
|
|
|
if l.Name == "" {
|
|
|
|
return errors.New("label name is required")
|
|
|
|
}
|
|
|
|
|
2018-12-17 22:13:43 +00:00
|
|
|
if l.Color != "" && !colorPattern.MatchString(l.Color) {
|
|
|
|
return errors.New("label color must be valid hex string")
|
|
|
|
}
|
|
|
|
|
2018-12-03 16:07:08 +00:00
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2018-12-18 06:30:41 +00:00
|
|
|
// LabelUpdate represents a changeset for a label.
|
|
|
|
// Only fields which are set are updated.
|
|
|
|
type LabelUpdate struct {
|
|
|
|
Color *string `json:"color,omitempty"`
|
|
|
|
}
|
|
|
|
|
2018-12-03 16:07:08 +00:00
|
|
|
type LabelFilter struct {
|
|
|
|
ResourceID ID
|
|
|
|
Name string
|
|
|
|
}
|