op_set_description.go

 1package board
 2
 3import (
 4	"fmt"
 5
 6	"github.com/MichaelMure/git-bug/entities/identity"
 7	"github.com/MichaelMure/git-bug/entity"
 8	"github.com/MichaelMure/git-bug/entity/dag"
 9	"github.com/MichaelMure/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.addActor(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 *Board, author identity.Interface, unixTime int64, description 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	if err := op.Validate(); err != nil {
77		return nil, err
78	}
79
80	b.Append(op)
81	return op, nil
82}