package views import ( "net/url" "git.capotej.com/capotej/communique/models" "git.capotej.com/capotej/communique/urls" "github.com/go-fed/activity/streams" ) // 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.OutboxItem) (map[string]interface{}, error) { id, err := urls.UrlOutboxPage(name, domain) if err != nil { return nil, err } partOf, err := urls.UrlOutbox(name, domain) if err != nil { return nil, err } 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() idProp := streams.NewJSONLDIdProperty() idProp.Set(id) oc.SetJSONLDId(idProp) partOfProp := streams.NewActivityStreamsPartOfProperty() partOfProp.SetIRI(partOf) oc.SetActivityStreamsPartOf(partOfProp) itemsProp := streams.NewActivityStreamsOrderedItemsProperty() for _, v := range page { publishedProp := streams.NewActivityStreamsPublishedProperty() publishedProp.Set(v.CreatedAt) crea := streams.NewActivityStreamsCreate() obj := streams.NewActivityStreamsObjectProperty() creaIdProp := streams.NewJSONLDIdProperty() activityUrl, err := urls.UrlActivity(name, domain, string(v.Id)) if err != nil { return nil, err } creaIdProp.Set(activityUrl) crea.SetJSONLDId(creaIdProp) crea.SetActivityStreamsObject(obj) crea.SetActivityStreamsTo(toProp) crea.SetActivityStreamsPublished(publishedProp) actorUrl, err := urls.UrlProfile(name, domain) if err != nil { return nil, err } actorProp := streams.NewActivityStreamsActorProperty() actorProp.AppendIRI(actorUrl) crea.SetActivityStreamsActor(actorProp) noteUrl, err := urls.UrlNote(name, domain, string(v.Id)) if err != nil { return nil, err } note := streams.NewActivityStreamsNote() noteIdProp := streams.NewJSONLDIdProperty() noteIdProp.Set(noteUrl) note.SetJSONLDId(noteIdProp) contentProp := streams.NewActivityStreamsContentProperty() contentProp.AppendXMLSchemaString(string(v.Content)) note.SetActivityStreamsContent(contentProp) attrProp := streams.NewActivityStreamsAttributedToProperty() attrProp.AppendIRI(actorUrl) note.SetActivityStreamsAttributedTo(attrProp) summaryProp := streams.NewActivityStreamsSummaryProperty() summaryProp.AppendXMLSchemaString("") note.SetActivityStreamsSummary(summaryProp) noteUrlProp := streams.NewActivityStreamsUrlProperty() noteUrlProp.AppendIRI(noteUrl) note.SetActivityStreamsUrl(noteUrlProp) note.SetActivityStreamsTo(toProp) note.SetActivityStreamsPublished(publishedProp) obj.AppendActivityStreamsNote(note) itemsProp.AppendActivityStreamsCreate(crea) } oc.SetActivityStreamsOrderedItems(itemsProp) return streams.Serialize(oc) } func RenderOutbox(name, domain string, totalItems int) (map[string]interface{}, error) { id, err := urls.UrlOutbox(name, domain) if err != nil { return nil, err } first, err := urls.UrlOutboxPage(name, domain) if err != nil { return nil, err } oc := streams.NewActivityStreamsOrderedCollection() idProp := streams.NewJSONLDIdProperty() idProp.Set(id) oc.SetJSONLDId(idProp) itemsProp := streams.NewActivityStreamsTotalItemsProperty() itemsProp.Set(totalItems) oc.SetActivityStreamsTotalItems(itemsProp) ocProp := streams.NewActivityStreamsFirstProperty() ocProp.SetIRI(first) oc.SetActivityStreamsFirst(ocProp) return streams.Serialize(oc) }