From 9d870999909d533cc15fbeb8a5a41d7192473a49 Mon Sep 17 00:00:00 2001 From: Julio Capote Date: Fri, 30 Dec 2022 22:02:43 -0500 Subject: switch to storing encoded structs --- models/outbox_item.go | 36 ++++++++++++++++++++++-------------- models/persister.go | 9 ++++----- registry/registry.go | 15 ++++++++++++++- views/outbox.go | 22 +++++++++++++++------- 4 files changed, 55 insertions(+), 27 deletions(-) diff --git a/models/outbox_item.go b/models/outbox_item.go index ed74130..9950d9c 100644 --- a/models/outbox_item.go +++ b/models/outbox_item.go @@ -1,6 +1,8 @@ package models import ( + "bytes" + "encoding/gob" "fmt" "time" @@ -10,15 +12,15 @@ import ( ) type OutboxItem struct { - handler config.Handler - content []byte - id []byte - createdAt time.Time + 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} + aso := &OutboxItem{Handler: h} return aso } @@ -26,31 +28,37 @@ 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(), + 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) + 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) + keyBase := fmt.Sprintf("outboxes:%s", a.Handler.Name) return keyBase } func (a *OutboxItem) Save(txn *badger.Txn) error { - if len(a.content) == 0 { + if len(a.Content) == 0 { return fmt.Errorf("content not set") } - if len(a.id) == 0 { + if len(a.Id) == 0 { return fmt.Errorf("id not set") } - e := badger.NewEntry(a.keyName(), a.content) + 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) } diff --git a/models/persister.go b/models/persister.go index a639fc7..669480e 100644 --- a/models/persister.go +++ b/models/persister.go @@ -41,19 +41,18 @@ func (p *Persister) Count(model model) (int, error) { return count, err } -func (p *Persister) Collect(model model) ([]PersisterResult, error) { - var result []PersisterResult +func (p *Persister) Collect(model model) ([][]byte, error) { + var result [][]byte err := p.db.View(func(txn *badger.Txn) error { opts := badger.DefaultIteratorOptions - opts.PrefetchValues = false // TODO Maybe we want true here + opts.PrefetchValues = true it := txn.NewIterator(opts) defer it.Close() prefix := []byte(model.Keybase()) for it.Seek(prefix); it.ValidForPrefix(prefix); it.Next() { item := it.Item() item.Value(func(v []byte) error { - pr := PersisterResult{Key: it.Item().Key(), Value: v} - result = append(result, pr) + result = append(result, v) return nil }) } diff --git a/registry/registry.go b/registry/registry.go index aac21d4..2518d55 100644 --- a/registry/registry.go +++ b/registry/registry.go @@ -1,6 +1,8 @@ package registry import ( + "bytes" + "encoding/gob" "fmt" "git.capotej.com/capotej/communique/config" @@ -58,7 +60,18 @@ func (r *Registry) OutboxCollection(name string) (map[string]interface{}, error) if err != nil { return nil, err } - return views.RenderOutboxCollection(handler.handlerCfg.Name, r.cfg.Domain, page) + var outboxItems []models.OutboxItem + for _, v := range page { + buf := bytes.NewBuffer(v) + dec := gob.NewDecoder(buf) + var outboxItem models.OutboxItem + err = dec.Decode(&outboxItem) + if err != nil { + return nil, err + } + outboxItems = append(outboxItems, outboxItem) + } + return views.RenderOutboxCollection(handler.handlerCfg.Name, r.cfg.Domain, outboxItems) } func (r *Registry) WebfingerResource(fqn string) (*views.WebfingerResource, error) { diff --git a/views/outbox.go b/views/outbox.go index 88f88c2..7ea4ace 100644 --- a/views/outbox.go +++ b/views/outbox.go @@ -1,6 +1,8 @@ package views import ( + "net/url" + "git.capotej.com/capotej/communique/models" "git.capotej.com/capotej/communique/urls" "github.com/go-fed/activity/streams" @@ -8,7 +10,7 @@ import ( // RenderOutboxCollection takes a page of ActivityStream objects as JSON strings and concatenates them together to return an // ActivtyStreamsOrderedCollection -func RenderOutboxCollection(name, domain string, page []models.PersisterResult) (map[string]interface{}, error) { +func RenderOutboxCollection(name, domain string, page []models.OutboxItem) (map[string]interface{}, error) { id, err := urls.UrlOutboxPage(name, domain) if err != nil { return nil, err @@ -18,11 +20,12 @@ func RenderOutboxCollection(name, domain string, page []models.PersisterResult) if err != nil { return nil, err } - - result := make(map[string]interface{}) - result["id"] = id.String() - result["partOf"] = partOf.String() - result["orderedItems"] = page + publicUrl, err := url.Parse("https://www.w3.org/ns/activitystreams#Public") + if err != nil { + return nil, err + } + toProp := streams.NewActivityStreamsToProperty() + toProp.AppendIRI(publicUrl) oc := streams.NewActivityStreamsOrderedCollectionPage() @@ -33,6 +36,7 @@ func RenderOutboxCollection(name, domain string, page []models.PersisterResult) partOfProp := streams.NewActivityStreamsPartOfProperty() partOfProp.SetIRI(partOf) oc.SetActivityStreamsPartOf(partOfProp) + oc.SetActivityStreamsTo(toProp) itemsProp := streams.NewActivityStreamsOrderedItemsProperty() @@ -43,8 +47,12 @@ func RenderOutboxCollection(name, domain string, page []models.PersisterResult) note := streams.NewActivityStreamsNote() contentProp := streams.NewActivityStreamsContentProperty() - contentProp.AppendXMLSchemaString(string(v.Value)) + contentProp.AppendXMLSchemaString(string(v.Content)) note.SetActivityStreamsContent(contentProp) + + note.SetActivityStreamsTo(toProp) + // publishedProp := streams.NewActivityStreamsPublishedProperty() + // note.SetActivityStreamsPublished() obj.AppendActivityStreamsNote(note) itemsProp.AppendActivityStreamsCreate(crea) -- cgit v1.2.3