package models import ( "bytes" "encoding/gob" "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") } var network bytes.Buffer enc := gob.NewEncoder(&network) err := enc.Encode(a) if err != nil { return fmt.Errorf("could not encode outbox item: %w", err) } e := badger.NewEntry(a.keyName(), network.Bytes()) return txn.SetEntry(e) }