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) }