diff options
Diffstat (limited to 'internal/typeutils/internaltoas.go')
-rw-r--r-- | internal/typeutils/internaltoas.go | 144 |
1 files changed, 144 insertions, 0 deletions
diff --git a/internal/typeutils/internaltoas.go b/internal/typeutils/internaltoas.go index 73d274908..047d61b80 100644 --- a/internal/typeutils/internaltoas.go +++ b/internal/typeutils/internaltoas.go @@ -32,6 +32,13 @@ import ( "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" ) +// const ( +// // highestID is the highest possible ULID +// highestID = "ZZZZZZZZZZZZZZZZZZZZZZZZZZ" +// // lowestID is the lowest possible ULID +// lowestID = "00000000000000000000000000" +// ) + // Converts a gts model account into an Activity Streams person type. func (c *converter) AccountToAS(ctx context.Context, a *gtsmodel.Account) (vocab.ActivityStreamsPerson, error) { person := streams.NewActivityStreamsPerson() @@ -1013,3 +1020,140 @@ func (c *converter) StatusURIsToASRepliesPage(ctx context.Context, status *gtsmo return page, nil } + +/* + the goal is to end up with something like this: + { + "id": "https://example.org/users/whatever/outbox?page=true", + "type": "OrderedCollectionPage", + "next": "https://example.org/users/whatever/outbox?max_id=01FJC1Q0E3SSQR59TD2M1KP4V8&page=true", + "prev": "https://example.org/users/whatever/outbox?min_id=01FJC1Q0E3SSQR59TD2M1KP4V8&page=true", + "partOf": "https://example.org/users/whatever/outbox", + "orderedItems": [ + "id": "https://example.org/users/whatever/statuses/01FJC1MKPVX2VMWP2ST93Q90K7/activity", + "type": "Create", + "actor": "https://example.org/users/whatever", + "published": "2021-10-18T20:06:18Z", + "to": [ + "https://www.w3.org/ns/activitystreams#Public" + ], + "cc": [ + "https://example.org/users/whatever/followers" + ], + "object": "https://example.org/users/whatever/statuses/01FJC1MKPVX2VMWP2ST93Q90K7" + ] + } +*/ +func (c *converter) StatusesToASOutboxPage(ctx context.Context, outboxID string, maxID string, minID string, statuses []*gtsmodel.Status) (vocab.ActivityStreamsOrderedCollectionPage, error) { + page := streams.NewActivityStreamsOrderedCollectionPage() + + // .id + pageIDProp := streams.NewJSONLDIdProperty() + pageID := fmt.Sprintf("%s?page=true", outboxID) + if minID != "" { + pageID = fmt.Sprintf("%s&minID=%s", pageID, minID) + } + if maxID != "" { + pageID = fmt.Sprintf("%s&maxID=%s", pageID, maxID) + } + pageIDURI, err := url.Parse(pageID) + if err != nil { + return nil, err + } + pageIDProp.SetIRI(pageIDURI) + page.SetJSONLDId(pageIDProp) + + // .partOf + collectionIDURI, err := url.Parse(outboxID) + if err != nil { + return nil, err + } + partOfProp := streams.NewActivityStreamsPartOfProperty() + partOfProp.SetIRI(collectionIDURI) + page.SetActivityStreamsPartOf(partOfProp) + + // .orderedItems + itemsProp := streams.NewActivityStreamsOrderedItemsProperty() + var highest string + var lowest string + for _, s := range statuses { + note, err := c.StatusToAS(ctx, s) + if err != nil { + return nil, err + } + + create, err := c.WrapNoteInCreate(note, true) + if err != nil { + return nil, err + } + + itemsProp.AppendActivityStreamsCreate(create) + + if highest == "" || s.ID > highest { + highest = s.ID + } + if lowest == "" || s.ID < lowest { + lowest = s.ID + } + } + page.SetActivityStreamsOrderedItems(itemsProp) + + // .next + if lowest != "" { + nextProp := streams.NewActivityStreamsNextProperty() + nextPropIDString := fmt.Sprintf("%s?page=true&max_id=%s", outboxID, lowest) + nextPropIDURI, err := url.Parse(nextPropIDString) + if err != nil { + return nil, err + } + nextProp.SetIRI(nextPropIDURI) + page.SetActivityStreamsNext(nextProp) + } + + // .prev + if highest != "" { + prevProp := streams.NewActivityStreamsPrevProperty() + prevPropIDString := fmt.Sprintf("%s?page=true&min_id=%s", outboxID, highest) + prevPropIDURI, err := url.Parse(prevPropIDString) + if err != nil { + return nil, err + } + prevProp.SetIRI(prevPropIDURI) + page.SetActivityStreamsPrev(prevProp) + } + + return page, nil +} + +/* + we want something that looks like this: + + { + "@context": "https://www.w3.org/ns/activitystreams", + "id": "https://example.org/users/whatever/outbox", + "type": "OrderedCollection", + "first": "https://example.org/users/whatever/outbox?page=true" + } +*/ +func (c *converter) OutboxToASCollection(ctx context.Context, outboxID string) (vocab.ActivityStreamsOrderedCollection, error) { + collection := streams.NewActivityStreamsOrderedCollection() + + collectionIDProp := streams.NewJSONLDIdProperty() + outboxIDURI, err := url.Parse(outboxID) + if err != nil { + return nil, fmt.Errorf("error parsing url %s", outboxID) + } + collectionIDProp.SetIRI(outboxIDURI) + collection.SetJSONLDId(collectionIDProp) + + collectionFirstProp := streams.NewActivityStreamsFirstProperty() + collectionFirstPropID := fmt.Sprintf("%s?page=true", outboxID) + collectionFirstPropIDURI, err := url.Parse(collectionFirstPropID) + if err != nil { + return nil, fmt.Errorf("error parsing url %s", collectionFirstPropID) + } + collectionFirstProp.SetIRI(collectionFirstPropIDURI) + collection.SetActivityStreamsFirst(collectionFirstProp) + + return collection, nil +} |