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
package activitypub

import (
	"time"

	as "github.com/go-ap/activitystreams"
)

// CreateActivity is the type for a create activity message
type CreateActivity struct {
	Activity  *as.Create        `jsonld:"activity"`
	Published time.Time         `jsonld:"published"`
	To        as.ItemCollection `jsonld:"to,omitempty,collapsible"`
	CC        as.ItemCollection `jsonld:"cc,omitempty,collapsible"`
}

func loadActorWithInboxObject(a as.Item, o as.Item) as.Item {
	typ := a.GetType()
	switch typ {
	case as.ApplicationType:
		var app as.Application
		app, _ = a.(as.Application)
		var inbox *as.OrderedCollection
		if app.Inbox == nil {
			inbox = InboxNew()
		} else {
			inbox = app.Inbox.(*as.OrderedCollection)
		}
		inbox.Append(o)
		app.Inbox = inbox
		return app
	case as.GroupType:
		var grp as.Group
		grp, _ = a.(as.Group)
		var inbox *as.OrderedCollection
		if grp.Inbox == nil {
			inbox = InboxNew()
		} else {
			inbox = grp.Inbox.(*as.OrderedCollection)
		}
		inbox.Append(o)
		grp.Inbox = inbox
		return grp
	case as.OrganizationType:
		var org as.Organization
		org, _ = a.(as.Organization)
		var inbox *as.OrderedCollection
		if org.Inbox == nil {
			inbox = InboxNew()
		} else {
			inbox = org.Inbox.(*as.OrderedCollection)
		}
		inbox.Append(o)
		org.Inbox = inbox
		return org
	case as.PersonType:
		var pers as.Person
		pers, _ = a.(as.Person)
		var inbox *as.OrderedCollection
		if pers.Inbox == nil {
			inbox = InboxNew()
		} else {
			inbox = pers.Inbox.(*as.OrderedCollection)
		}
		inbox.Append(o)
		pers.Inbox = inbox
		return pers
	case as.ServiceType:
		var serv as.Service
		serv, _ = a.(as.Service)
		var inbox *as.OrderedCollection
		if serv.Inbox == nil {
			inbox = InboxNew()
		} else {
			inbox = serv.Inbox.(*as.OrderedCollection)
		}
		inbox.Append(o)
		serv.Inbox = inbox
		return serv
	default:
		actor, _ := a.(as.Actor)
		var inbox *as.OrderedCollection
		if actor.Inbox == nil {
			inbox = InboxNew()
		} else {
			inbox = actor.Inbox.(*as.OrderedCollection)
		}
		inbox.Append(o)
		actor.Inbox = inbox
		return actor
	}
}

// CreateActivityNew initializes a new CreateActivity message
func CreateActivityNew(id as.ObjectID, a as.Item, o as.Item) CreateActivity {
	act := as.CreateNew(id, o)

	if a != nil {
		if a.IsObject() {
			act.Actor = loadActorWithInboxObject(a, o)
		}
		if a.IsLink() {
			act.Actor = a
		}
	}

	act.RecipientsDeduplication()

	c := CreateActivity{
		Activity:  act,
		Published: time.Now(),
	}

	return c
}