aboutsummaryrefslogtreecommitdiff
path: root/models/outbox_item.go
diff options
context:
space:
mode:
Diffstat (limited to 'models/outbox_item.go')
-rw-r--r--models/outbox_item.go56
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)
+}