-
-
Notifications
You must be signed in to change notification settings - Fork 10
/
aggregate.go
53 lines (43 loc) · 1010 Bytes
/
aggregate.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
package es
import (
"github.com/LordMoMA/Intelli-Mall/internal/ddd"
)
type (
Versioner interface {
Version() int
PendingVersion() int
}
aggregate struct {
ddd.Aggregate
version int
}
Aggregate interface {
ddd.Aggregate
EventCommitter
Versioner
VersionSetter
}
)
var _ Aggregate = (*aggregate)(nil)
func NewAggregate(id, name string) *aggregate {
return &aggregate{
Aggregate: ddd.NewAggregate(id, name),
version: 0,
}
}
func (a *aggregate) AddEvent(name string, payload ddd.EventPayload, options ...ddd.EventOption) {
options = append(
options,
ddd.Metadata{
ddd.AggregateVersionKey: a.PendingVersion() + 1,
},
)
a.Aggregate.AddEvent(name, payload, options...)
}
func (a *aggregate) CommitEvents() {
a.version += len(a.Events())
a.ClearEvents()
}
func (a aggregate) Version() int { return a.version }
func (a aggregate) PendingVersion() int { return a.version + len(a.Events()) }
func (a *aggregate) SetVersion(version int) { a.version = version }