diff options
Diffstat (limited to '')
-rw-r--r-- | models/outbox_item.go | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/models/outbox_item.go b/models/outbox_item.go new file mode 100644 index 0000000..ed74130 --- /dev/null +++ b/models/outbox_item.go @@ -0,0 +1,56 @@ +package models + +import ( + "fmt" + "time" + + "git.capotej.com/capotej/communique/config" + "github.com/dgraph-io/badger/v3" + "github.com/segmentio/ksuid" +) + +type OutboxItem struct { + handler config.Handler + content []byte + id []byte + createdAt time.Time +} + +// used for lookup purposes (count, collect) +func NewOutboxItem(h config.Handler) *OutboxItem { + aso := &OutboxItem{handler: h} + return aso +} + +func CreateOutboxItem(h config.Handler, content []byte) *OutboxItem { + t := time.Now() + k, _ := ksuid.NewRandomWithTime(t) + aso := &OutboxItem{ + handler: h, + createdAt: t, + content: content, + id: k.Bytes(), + } + return aso +} + +func (a *OutboxItem) keyName() []byte { + key := fmt.Sprintf("%s:%s", a.Keybase(), a.id) + return []byte(key) +} + +func (a *OutboxItem) Keybase() string { + keyBase := fmt.Sprintf("outboxes:%s", a.handler.Name) + return keyBase +} + +func (a *OutboxItem) Save(txn *badger.Txn) error { + if len(a.content) == 0 { + return fmt.Errorf("content not set") + } + if len(a.id) == 0 { + return fmt.Errorf("id not set") + } + e := badger.NewEntry(a.keyName(), a.content) + return txn.SetEntry(e) +} |