diff --git a/greataped/README.md b/greataped/README.md index 2e18449..1211191 100644 --- a/greataped/README.md +++ b/greataped/README.md @@ -19,6 +19,7 @@ 12. [GetFollowers](#get-followers) 13. [GetFollowing](#get-following) 14. [PostToOutbox](#post-to-outbox) +15. [GetOutbox](#get-outbox) --- @@ -212,3 +213,18 @@ Request: Result: ``` [Back to List](#apis) + +## Get Outbox +``` +Request: + string username + +Result: + string @context + string id + string type + int32 totalItems + repeated ActivityPubActivity orderedItems + string first +``` +[Back to List](#apis) diff --git a/greataped/app/commands/spi/get_outbox.go b/greataped/app/commands/spi/get_outbox.go new file mode 100644 index 0000000..aca288a --- /dev/null +++ b/greataped/app/commands/spi/get_outbox.go @@ -0,0 +1,58 @@ +package spi + +import ( + "time" + + "rail.town/infrastructure/app/activitypub" + . "rail.town/infrastructure/components/constants" + . "rail.town/infrastructure/components/contracts" +) + +func GetOutbox(x IDispatcher, username string) (IGetOutboxResult, error) { + identities := x.FilterIdentities(func(identity IIdentity) bool { + return identity.Username() == username + }) + + x.Assert(identities.HasExactlyOneItem()).Or(ERROR_USER_NOT_FOUND) + identity := identities.First() + + actor := x.Format("%s/u/%s", x.PublicUrl(), identity.Username()) + + activities := x.FilterActivityPubOutgoingActivities(func(activity IActivityPubOutgoingActivity) bool { + return activity.From() == actor && activity.To() == ACTIVITY_PUB_PUBLIC + }) + + var orderedItems ActivityPubActivities + activities.ForEach(func(outgoingActivity IActivityPubOutgoingActivity) { + published := time.Unix(0, outgoingActivity.Timestamp()).Format("2006-01-02T15:04:05Z") + + note := activitypub.NewPublicNote(actor, outgoingActivity.Content()) + noteActivity := note.Wrap(username, x.PublicUrl(), outgoingActivity.UniqueIdentifier()) + + object, _ := x.NewActivityPubObject() + object.SetContext(ACTIVITY_STREAMS) + object.SetType(ACTIVITY_PUB_NOTE) + object.SetId(note.Id) + object.SetContent(note.Content) + + activity, _ := x.NewActivityPubActivity() + activity.SetContext(ACTIVITY_STREAMS) + activity.SetType(ACTIVITY_PUB_CREATE) + activity.SetId(x.Format("%s/posts/%s", actor, outgoingActivity.UniqueIdentifier())) + activity.SetActor(actor) + activity.SetTo(noteActivity.To.([]string)) + activity.SetPublished(published) + activity.SetObject(object) + + orderedItems = append(orderedItems, activity) + }) + + return x.NewGetOutboxResult( + ACTIVITY_STREAMS, // context + x.Format("%s/outbox", actor), // id + ACTIVITY_PUB_ORDERED_COLLECTION, // type + int32(len(orderedItems)), // totalItems + orderedItems, // orderedItems + "", // first + ), nil +}