activitypub

A fork of go-ap/activitypub to make it easier to implement extensions

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
  28. 28
  29. 29
  30. 30
  31. 31
  32. 32
  33. 33
  34. 34
  35. 35
  36. 36
  37. 37
  38. 38
  39. 39
  40. 40
  41. 41
  42. 42
  43. 43
  44. 44
  45. 45
  46. 46
  47. 47
  48. 48
  49. 49
  50. 50
  51. 51
  52. 52
  53. 53
  54. 54
  55. 55
  56. 56
  57. 57
  58. 58
  59. 59
  60. 60
  61. 61
  62. 62
  63. 63
  64. 64
  65. 65
  66. 66
  67. 67
  68. 68
  69. 69
  70. 70
  71. 71
  72. 72
  73. 73
  74. 74
  75. 75
  76. 76
  77. 77
  78. 78
  79. 79
  80. 80
  81. 81
  82. 82
  83. 83
  84. 84
  85. 85
  86. 86
  87. 87
  88. 88
  89. 89
  90. 90
  91. 91
  92. 92
  93. 93
  94. 94
  95. 95
  96. 96
  97. 97
  98. 98
  99. 99
  100. 100
  101. 101
  102. 102
  103. 103
  104. 104
  105. 105
  106. 106
  107. 107
  108. 108
  109. 109
  110. 110
  111. 111
  112. 112
  113. 113
  114. 114
  115. 115
  116. 116
  117. 117
  118. 118
  119. 119
  120. 120
  121. 121
  122. 122
  123. 123
  124. 124
  125. 125
  126. 126
  127. 127
package activitypub

// FlattenActivityProperties flattens the Activity's properties from Object type to IRI
func FlattenActivityProperties(act *Activity) *Activity {
	OnIntransitiveActivity(act, func(in *IntransitiveActivity) error {
		FlattenIntransitiveActivityProperties(in)
		return nil
	})
	act.Object = FlattenToIRI(act.Object)
	return act
}

// FlattenIntransitiveActivityProperties flattens the Activity's properties from Object type to IRI
func FlattenIntransitiveActivityProperties(act *IntransitiveActivity) *IntransitiveActivity {
	act.Actor = FlattenToIRI(act.Actor)
	act.Target = FlattenToIRI(act.Target)
	act.Result = FlattenToIRI(act.Result)
	act.Origin = FlattenToIRI(act.Origin)
	act.Result = FlattenToIRI(act.Result)
	act.Instrument = FlattenToIRI(act.Instrument)
	OnObject(act, func(o *Object) error {
		o = FlattenObjectProperties(o)
		return nil
	})
	return act
}

// FlattenItemCollection flattens an Item Collection to their respective IRIs
func FlattenItemCollection(col ItemCollection) ItemCollection {
	if col == nil {
		return col
	}
	for k, it := range ItemCollectionDeduplication(&col) {
		if iri := it.GetLink(); iri != "" {
			col[k] = iri
		}
	}
	return col
}

// FlattenCollection flattens a Collection's objects to their respective IRIs
func FlattenCollection(col *Collection) *Collection {
	if col == nil {
		return col
	}
	col.Items = FlattenItemCollection(col.Items)

	return col
}

// FlattenOrderedCollection flattens an OrderedCollection's objects to their respective IRIs
func FlattenOrderedCollection(col *OrderedCollection) *OrderedCollection {
	if col == nil {
		return col
	}
	col.OrderedItems = FlattenItemCollection(col.OrderedItems)

	return col
}

// FlattenActorProperties flattens the Actor's properties from Object types to IRI
func FlattenActorProperties(a *Actor) *Actor {
	OnObject(a, func(o *Object) error {
		o = FlattenObjectProperties(o)
		return nil
	})
	return a
}

// FlattenObjectProperties flattens the Object's properties from Object types to IRI
func FlattenObjectProperties(o *Object) *Object {
	o.Replies = Flatten(o.Replies)
	o.Shares = Flatten(o.Shares)
	o.Likes = Flatten(o.Likes)
	o.AttributedTo = Flatten(o.AttributedTo)
	o.To = FlattenItemCollection(o.To)
	o.Bto = FlattenItemCollection(o.Bto)
	o.CC = FlattenItemCollection(o.CC)
	o.BCC = FlattenItemCollection(o.BCC)
	o.Audience = FlattenItemCollection(o.Audience)
	//o.Tag = FlattenItemCollection(o.Tag)
	return o
}

// FlattenProperties flattens the Item's properties from Object types to IRI
func FlattenProperties(it Item) Item {
	typ := it.GetType()
	if IntransitiveActivityTypes.Contains(typ) {
		OnIntransitiveActivity(it, func(a *IntransitiveActivity) error {
			a = FlattenIntransitiveActivityProperties(a)
			return nil
		})
	} else if ActivityTypes.Contains(typ) {
		OnActivity(it, func(a *Activity) error {
			a = FlattenActivityProperties(a)
			return nil
		})
	}
	if ActorTypes.Contains(typ) {
		OnActor(it, func(a *Actor) error {
			a = FlattenActorProperties(a)
			return nil
		})
	}
	if ObjectTypes.Contains(typ) {
		OnObject(it, func(o *Object) error {
			o = FlattenObjectProperties(o)
			return nil
		})
	}
	return it
}

// Flatten checks if Item can be flattened to an IRI or array of IRIs and returns it if so
func Flatten(it Item) Item {
	if IsNil(it) {
		return nil
	}
	if it.IsCollection() {
		OnCollectionIntf(it, func(c CollectionInterface) error {
			it = FlattenItemCollection(c.Collection()).Normalize()
			return nil
		})
		return it
	}
	return it.GetLink()
}