1package board
 2
 3import (
 4	"fmt"
 5
 6	"github.com/git-bug/git-bug/entities/identity"
 7	"github.com/git-bug/git-bug/entity"
 8	"github.com/git-bug/git-bug/entity/dag"
 9	"github.com/git-bug/git-bug/util/text"
10)
11
12var _ Operation = &SetDescriptionOperation{}
13
14// SetDescriptionOperation will change the description of a board
15type SetDescriptionOperation struct {
16	dag.OpBase
17	Description string `json:"description"`
18	Was         string `json:"was"`
19}
20
21func (op *SetDescriptionOperation) Id() entity.Id {
22	return dag.IdOperation(op, &op.OpBase)
23}
24
25func (op *SetDescriptionOperation) Validate() error {
26	if err := op.OpBase.Validate(op, SetDescriptionOp); err != nil {
27		return err
28	}
29
30	if text.Empty(op.Description) {
31		return fmt.Errorf("description is empty")
32	}
33
34	if !text.SafeOneLine(op.Description) {
35		return fmt.Errorf("description has unsafe characters")
36	}
37
38	if !text.SafeOneLine(op.Was) {
39		return fmt.Errorf("previous description has unsafe characters")
40	}
41
42	return nil
43}
44
45func (op *SetDescriptionOperation) Apply(snapshot *Snapshot) {
46	snapshot.Description = op.Description
47	snapshot.addParticipant(op.Author())
48}
49
50func NewSetDescriptionOp(author identity.Interface, unixTime int64, description string, was string) *SetDescriptionOperation {
51	return &SetDescriptionOperation{
52		OpBase:      dag.NewOpBase(SetDescriptionOp, author, unixTime),
53		Description: description,
54		Was:         was,
55	}
56}
57
58// SetDescription is a convenience function to change a board description
59func SetDescription(b ReadWrite, author identity.Interface, unixTime int64, description string, metadata map[string]string) (*SetDescriptionOperation, error) {
60	var lastDescriptionOp *SetDescriptionOperation
61	for _, op := range b.Operations() {
62		switch op := op.(type) {
63		case *SetDescriptionOperation:
64			lastDescriptionOp = op
65		}
66	}
67
68	var was string
69	if lastDescriptionOp != nil {
70		was = lastDescriptionOp.Description
71	} else {
72		was = b.FirstOp().(*CreateOperation).Description
73	}
74
75	op := NewSetDescriptionOp(author, unixTime, description, was)
76	for key, val := range metadata {
77		op.SetMetadata(key, val)
78	}
79	if err := op.Validate(); err != nil {
80		return nil, err
81	}
82
83	b.Append(op)
84	return op, nil
85}