From a5a1907249d2666966c6c412f8be17e5b2c67e57 Mon Sep 17 00:00:00 2001 From: Julio Capote Date: Sun, 18 Dec 2022 22:55:34 -0500 Subject: start of outbox page --- cgi/servers.go | 1 - http/server.go | 7 +++++- persister/persister.go | 1 - registry/registry.go | 8 ++++++ resources/outbox.go | 67 ++++++++++++++++++++++++++++++++++++++++++-------- 5 files changed, 71 insertions(+), 13 deletions(-) delete mode 100644 persister/persister.go diff --git a/cgi/servers.go b/cgi/servers.go index 84d6ffe..55bc5d2 100644 --- a/cgi/servers.go +++ b/cgi/servers.go @@ -61,7 +61,6 @@ func startCGIServer(h config.Handler) { } func startTicker(h config.Handler, db *badger.DB, log *zap.SugaredLogger) { - // TODO add config for this ticker := time.NewTicker(h.Interval) done := make(chan bool) func() { diff --git a/http/server.go b/http/server.go index bec683e..5d0a689 100644 --- a/http/server.go +++ b/http/server.go @@ -61,7 +61,12 @@ func (s *Server) Start(zapWriter io.Writer) { // Outbox router.GET("/actors/:actor/outbox", func(c *gin.Context) { actorParam := c.Param("actor") - resource, _ := s.registry.Outbox(actorParam) + var resource map[string]interface{} + if c.Query("page") == "true" { + resource, _ = s.registry.OutboxPage(actorParam) + } else { + resource, _ = s.registry.Outbox(actorParam) + } if resource != nil { c.JSON(http.StatusOK, resource) } else { diff --git a/persister/persister.go b/persister/persister.go deleted file mode 100644 index 4510fcb..0000000 --- a/persister/persister.go +++ /dev/null @@ -1 +0,0 @@ -package persister diff --git a/registry/registry.go b/registry/registry.go index 8d047ff..4dbacc7 100644 --- a/registry/registry.go +++ b/registry/registry.go @@ -43,6 +43,14 @@ func (r *Registry) Outbox(name string) (map[string]interface{}, error) { return resources.RenderOutbox(handler.handlerCfg.Name, r.cfg.Domain, r.db) } +func (r *Registry) OutboxPage(name string) (map[string]interface{}, error) { + handler := r.findByName(name) + if handler == nil { + return nil, nil + } + return resources.RenderOutboxPage(handler.handlerCfg.Name, r.cfg.Domain, r.db) +} + func (r *Registry) WebfingerResource(fqn string) (*resources.WebfingerResource, error) { handler := r.findByFQN(fqn) if handler == nil { diff --git a/resources/outbox.go b/resources/outbox.go index 046ec6a..2656da4 100644 --- a/resources/outbox.go +++ b/resources/outbox.go @@ -9,35 +9,49 @@ import ( "github.com/go-fed/activity/streams" ) -func RenderOutbox(name, domain string, db *badger.DB) (map[string]interface{}, error) { - id, err := url.Parse(path.Join("https://", domain, "actors", name, "outbox")) - +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) } - first, err := url.Parse(path.Join("https://", domain, "actors", name, "outbox", "?=page=true")) + 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.NewActivityStreamsOrderedCollection() + oc := streams.NewActivityStreamsOrderedCollectionPage() idProp := streams.NewJSONLDIdProperty() idProp.Set(id) oc.SetJSONLDId(idProp) - var i int + partOfProp := streams.NewActivityStreamsPartOfProperty() + partOfProp.SetIRI(partOf) + oc.SetActivityStreamsPartOf(partOfProp) + + itemsProp := streams.NewActivityStreamsOrderedItemsProperty() + db.View(func(txn *badger.Txn) error { it := txn.NewIterator(badger.DefaultIteratorOptions) defer it.Close() - prefix := []byte("outbox:sample") + prefix := []byte("outbox:sample") // TODO for it.Seek(prefix); it.ValidForPrefix(prefix); it.Next() { item := it.Item() - // k := item.Key() + k := item.Key() err := item.Value(func(v []byte) error { - i++ - // fmt.Printf("key=%s, value=%s\n", k, v) + fmt.Printf("key=%s, value=%s\n", k, v) + crea := streams.NewActivityStreamsCreate() + obj := streams.NewActivityStreamsObjectProperty() + crea.SetActivityStreamsObject(obj) + + note := streams.NewActivityStreamsNote() + contentProp := streams.NewActivityStreamsContentProperty() + contentProp.AppendIRI(id) + note.SetActivityStreamsContent(contentProp) + obj.AppendActivityStreamsNote(note) + + itemsProp.AppendActivityStreamsCreate(crea) return nil }) if err != nil { @@ -47,6 +61,39 @@ func RenderOutbox(name, domain string, db *badger.DB) (map[string]interface{}, e return nil }) + 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 + db.View(func(txn *badger.Txn) error { + it := txn.NewIterator(badger.DefaultIteratorOptions) + defer it.Close() + prefix := []byte("outbox:sample") + for it.Seek(prefix); it.ValidForPrefix(prefix); it.Next() { + i++ + } + return nil + }) + itemsProp := streams.NewActivityStreamsTotalItemsProperty() itemsProp.Set(i) oc.SetActivityStreamsTotalItems(itemsProp) -- cgit v1.2.3