package resources import ( "fmt" "net/url" "path" "github.com/dgraph-io/badger/v3" "github.com/go-fed/activity/streams" ) func RenderOutboxPage(name, domain string, db *badger.DB) (map[string]interface{}, error) { id, err := url.Parse(path.Join("https://", domain, "actors", name, "outbox") + "?page=true") if err != nil { return nil, fmt.Errorf("could not partse url: %w", err) } partOf, err := url.Parse(path.Join("https://", domain, "actors", name, "outbox")) if err != nil { return nil, fmt.Errorf("could not partse url: %w", err) } oc := streams.NewActivityStreamsOrderedCollectionPage() idProp := streams.NewJSONLDIdProperty() idProp.Set(id) oc.SetJSONLDId(idProp) partOfProp := streams.NewActivityStreamsPartOfProperty() partOfProp.SetIRI(partOf) oc.SetActivityStreamsPartOf(partOfProp) itemsProp := streams.NewActivityStreamsOrderedItemsProperty() err = db.View(func(txn *badger.Txn) error { opts := badger.DefaultIteratorOptions opts.PrefetchValues = false it := txn.NewIterator(opts) defer it.Close() prefix := []byte("outbox:sample") // TODO for it.Seek(prefix); it.ValidForPrefix(prefix); it.Next() { item := it.Item() err := item.Value(func(v []byte) error { crea := streams.NewActivityStreamsCreate() obj := streams.NewActivityStreamsObjectProperty() crea.SetActivityStreamsObject(obj) note := streams.NewActivityStreamsNote() contentProp := streams.NewActivityStreamsContentProperty() contentProp.AppendXMLSchemaString(string(v)) note.SetActivityStreamsContent(contentProp) obj.AppendActivityStreamsNote(note) itemsProp.AppendActivityStreamsCreate(crea) return nil }) if err != nil { return err } } return nil }) if err != nil { return nil, err } oc.SetActivityStreamsOrderedItems(itemsProp) return streams.Serialize(oc) } func RenderOutbox(name, domain string, db *badger.DB) (map[string]interface{}, error) { id, err := url.Parse(path.Join("https://", domain, "actors", name, "outbox") + "?page=true") if err != nil { return nil, fmt.Errorf("could not partse url: %w", err) } first, err := url.Parse(path.Join("https://", domain, "actors", name, "outbox") + "?page=true") if err != nil { return nil, fmt.Errorf("could not partse url: %w", err) } oc := streams.NewActivityStreamsOrderedCollection() idProp := streams.NewJSONLDIdProperty() idProp.Set(id) oc.SetJSONLDId(idProp) var i int err = db.View(func(txn *badger.Txn) error { opts := badger.DefaultIteratorOptions opts.PrefetchValues = false it := txn.NewIterator(opts) defer it.Close() prefix := []byte("outbox:sample") // TODO for it.Seek(prefix); it.ValidForPrefix(prefix); it.Next() { i++ } return nil }) if err != nil { return nil, err } itemsProp := streams.NewActivityStreamsTotalItemsProperty() itemsProp.Set(i) oc.SetActivityStreamsTotalItems(itemsProp) ocProp := streams.NewActivityStreamsFirstProperty() ocProp.SetIRI(first) oc.SetActivityStreamsFirst(ocProp) return streams.Serialize(oc) }