aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--models/outbox_item.go36
-rw-r--r--models/persister.go9
-rw-r--r--registry/registry.go15
-rw-r--r--views/outbox.go22
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)