This repository has been archived on 2022-11-27. You can view files and clone it, but cannot push or open issues or pull requests.
activitypub/copy.go

228 lines
6.5 KiB
Go

package activitypub
import (
"fmt"
)
func CopyOrderedCollectionPageProperties(old, new *OrderedCollectionPage) (*OrderedCollectionPage, error) {
old.PartOf = replaceIfItem(old.PartOf, new.PartOf)
old.Next = replaceIfItem(old.Next, new.Next)
old.Prev = replaceIfItem(old.Prev, new.Prev)
oldCol, _ := ToOrderedCollection(old)
newCol, _ := ToOrderedCollection(new)
_, err := CopyOrderedCollectionProperties(oldCol, newCol)
if err != nil {
return old, err
}
return old, nil
}
func CopyCollectionPageProperties(old, new *CollectionPage) (*CollectionPage, error) {
old.PartOf = replaceIfItem(old.PartOf, new.PartOf)
old.Next = replaceIfItem(old.Next, new.Next)
old.Prev = replaceIfItem(old.Prev, new.Prev)
oldCol, _ := ToCollection(old)
newCol, _ := ToCollection(new)
_, err := CopyCollectionProperties(oldCol, newCol)
return old, err
}
func CopyOrderedCollectionProperties(old, new *OrderedCollection) (*OrderedCollection, error) {
old.First = replaceIfItem(old.First, new.First)
old.Last = replaceIfItem(old.Last, new.Last)
old.OrderedItems = replaceIfItemCollection(old.OrderedItems, new.OrderedItems)
if old.TotalItems == 0 {
old.TotalItems = new.TotalItems
}
oldOb, _ := ToObject(old)
newOb, _ := ToObject(new)
_, err := CopyObjectProperties(oldOb, newOb)
return old, err
}
func CopyCollectionProperties(old, new *Collection) (*Collection, error) {
old.First = replaceIfItem(old.First, new.First)
old.Last = replaceIfItem(old.Last, new.Last)
old.Items = replaceIfItemCollection(old.Items, new.Items)
if old.TotalItems == 0 {
old.TotalItems = new.TotalItems
}
oldOb, _ := ToObject(old)
newOb, _ := ToObject(new)
_, err := CopyObjectProperties(oldOb, newOb)
return old, err
}
// CopyObjectProperties updates the "old" object properties with "new's"
func CopyObjectProperties(old, new *Object) (*Object, error) {
old.Name = replaceIfNaturalLanguageValues(old.Name, new.Name)
old.Attachment = replaceIfItem(old.Attachment, new.Attachment)
old.AttributedTo = replaceIfItem(old.AttributedTo, new.AttributedTo)
old.Audience = replaceIfItemCollection(old.Audience, new.Audience)
old.Content = replaceIfNaturalLanguageValues(old.Content, new.Content)
old.Context = replaceIfItem(old.Context, new.Context)
if len(new.MediaType) > 0 {
old.MediaType = new.MediaType
}
if !new.EndTime.IsZero() {
old.EndTime = new.EndTime
}
old.Generator = replaceIfItem(old.Generator, new.Generator)
old.Icon = replaceIfItem(old.Icon, new.Icon)
old.Image = replaceIfItem(old.Image, new.Image)
old.InReplyTo = replaceIfItem(old.InReplyTo, new.InReplyTo)
old.Location = replaceIfItem(old.Location, new.Location)
old.Preview = replaceIfItem(old.Preview, new.Preview)
if old.Published.IsZero() && !new.Published.IsZero() {
old.Published = new.Published
}
old.Replies = replaceIfItem(old.Replies, new.Replies)
if !new.StartTime.IsZero() {
old.StartTime = new.StartTime
}
old.Summary = replaceIfNaturalLanguageValues(old.Summary, new.Summary)
old.Tag = replaceIfItemCollection(old.Tag, new.Tag)
if !new.Updated.IsZero() {
old.Updated = new.Updated
}
if new.URL != nil {
old.URL = new.URL
}
old.To = replaceIfItemCollection(old.To, new.To)
old.Bto = replaceIfItemCollection(old.Bto, new.Bto)
old.CC = replaceIfItemCollection(old.CC, new.CC)
old.BCC = replaceIfItemCollection(old.BCC, new.BCC)
if new.Duration == 0 {
old.Duration = new.Duration
}
old.Source = replaceIfSource(old.Source, new.Source)
return old, nil
}
// CopyItemProperties delegates to the correct per type functions for copying
// properties between matching Activity Objects
func CopyItemProperties(to, from Item) (Item, error) {
if to == nil {
return to, fmt.Errorf("nil object to update")
}
if from == nil {
return to, fmt.Errorf("nil object for update")
}
if !to.GetLink().Equals(from.GetLink(), false) {
return to, fmt.Errorf("object IDs don't match")
}
if to.GetType() != from.GetType() {
return to, fmt.Errorf("invalid object types for update %s(old) and %s(new)", from.GetType(), to.GetType())
}
if CollectionType == to.GetType() {
o, err := ToCollection(to)
if err != nil {
return o, err
}
n, err := ToCollection(from)
if err != nil {
return o, err
}
return CopyCollectionProperties(o, n)
}
if CollectionPageType == to.GetType() {
o, err := ToCollectionPage(to)
if err != nil {
return o, err
}
n, err := ToCollectionPage(from)
if err != nil {
return o, err
}
return CopyCollectionPageProperties(o, n)
}
if OrderedCollectionType == to.GetType() {
o, err := ToOrderedCollection(to)
if err != nil {
return o, err
}
n, err := ToOrderedCollection(from)
if err != nil {
return o, err
}
return CopyOrderedCollectionProperties(o, n)
}
if OrderedCollectionPageType == to.GetType() {
o, err := ToOrderedCollectionPage(to)
if err != nil {
return o, err
}
n, err := ToOrderedCollectionPage(from)
if err != nil {
return o, err
}
return CopyOrderedCollectionPageProperties(o, n)
}
if ActorTypes.Contains(to.GetType()) {
o, err := ToActor(to)
if err != nil {
return o, err
}
n, err := ToActor(from)
if err != nil {
return o, err
}
return UpdatePersonProperties(o, n)
}
if ObjectTypes.Contains(to.GetType()) {
o, err := ToObject(to)
if err != nil {
return o, err
}
n, err := ToObject(from)
if err != nil {
return o, err
}
return CopyObjectProperties(o, n)
}
return to, fmt.Errorf("could not process objects with type %s", to.GetType())
}
// UpdatePersonProperties
func UpdatePersonProperties(old, new *Actor) (*Actor, error) {
old.Inbox = replaceIfItem(old.Inbox, new.Inbox)
old.Outbox = replaceIfItem(old.Outbox, new.Outbox)
old.Following = replaceIfItem(old.Following, new.Following)
old.Followers = replaceIfItem(old.Followers, new.Followers)
old.Liked = replaceIfItem(old.Liked, new.Liked)
old.PreferredUsername = replaceIfNaturalLanguageValues(old.PreferredUsername, new.PreferredUsername)
oldOb, _ := ToObject(old)
newOb, _ := ToObject(new)
_, err := CopyObjectProperties(oldOb, newOb)
return old, err
}
func replaceIfItem(old, new Item) Item {
if new == nil {
return old
}
return new
}
func replaceIfItemCollection(old, new ItemCollection) ItemCollection {
if new == nil {
return old
}
return new
}
func replaceIfNaturalLanguageValues(old, new NaturalLanguageValues) NaturalLanguageValues {
if new == nil {
return old
}
return new
}
func replaceIfSource(old, new Source) Source {
if new.MediaType != old.MediaType {
return new
}
old.Content = replaceIfNaturalLanguageValues(old.Content, new.Content)
return old
}