summaryrefslogtreecommitdiff
path: root/internal/ap
diff options
context:
space:
mode:
Diffstat (limited to 'internal/ap')
-rw-r--r--internal/ap/activitystreams.go9
-rw-r--r--internal/ap/extract.go9
-rw-r--r--internal/ap/interfaces.go11
-rw-r--r--internal/ap/resolve_test.go50
-rw-r--r--internal/ap/serialize.go4
5 files changed, 74 insertions, 9 deletions
diff --git a/internal/ap/activitystreams.go b/internal/ap/activitystreams.go
index a185edabe..0d1bc62c9 100644
--- a/internal/ap/activitystreams.go
+++ b/internal/ap/activitystreams.go
@@ -98,10 +98,17 @@ const (
// that we don't *yet* know what type of Object something is.
ObjectUnknown = "Unknown"
- // Extensions and unofficial additions.
+ /* Extensions and unofficial additions */
+
+ /* GtS stuff */
+
ObjectLikeApproval = "LikeApproval"
ObjectReplyApproval = "ReplyApproval"
ObjectAnnounceApproval = "AnnounceApproval"
+
+ /* Funkwhale stuff */
+
+ ObjectAlbum = "Album"
)
// isActivity returns whether AS type name is of an Activity (NOT IntransitiveActivity).
diff --git a/internal/ap/extract.go b/internal/ap/extract.go
index 20f8eb98a..d454d69f6 100644
--- a/internal/ap/extract.go
+++ b/internal/ap/extract.go
@@ -1078,7 +1078,14 @@ func ExtractInteractionPolicy(
statusable Statusable,
owner *gtsmodel.Account,
) *gtsmodel.InteractionPolicy {
- policyProp := statusable.GetGoToSocialInteractionPolicy()
+ ipa, ok := statusable.(InteractionPolicyAware)
+ if !ok {
+ // Not a type with interaction
+ // policy properties settable.
+ return nil
+ }
+
+ policyProp := ipa.GetGoToSocialInteractionPolicy()
if policyProp == nil || policyProp.Len() != 1 {
return nil
}
diff --git a/internal/ap/interfaces.go b/internal/ap/interfaces.go
index 0fd982eb8..4c91c57f6 100644
--- a/internal/ap/interfaces.go
+++ b/internal/ap/interfaces.go
@@ -76,7 +76,8 @@ func IsStatusable(typeName string) bool {
ObjectEvent,
ObjectPlace,
ObjectProfile,
- ActivityQuestion:
+ ActivityQuestion,
+ ObjectAlbum:
return true
default:
return false
@@ -226,11 +227,13 @@ type Statusable interface {
WithTo
WithCc
WithSensitive
- WithConversation
WithContent
WithAttachment
WithTag
WithReplies
+}
+
+type InteractionPolicyAware interface {
WithInteractionPolicy
WithApprovedBy
}
@@ -589,10 +592,6 @@ type WithSensitive interface {
SetActivityStreamsSensitive(vocab.ActivityStreamsSensitiveProperty)
}
-// WithConversation ...
-type WithConversation interface { // TODO
-}
-
// WithContent represents an activity with ActivityStreamsContentProperty
type WithContent interface {
GetActivityStreamsContent() vocab.ActivityStreamsContentProperty
diff --git a/internal/ap/resolve_test.go b/internal/ap/resolve_test.go
index aaf90ab0a..b70dba77b 100644
--- a/internal/ap/resolve_test.go
+++ b/internal/ap/resolve_test.go
@@ -80,6 +80,56 @@ func (suite *ResolveTestSuite) TestResolveNonAPJSONAsAccountable() {
suite.Nil(accountable)
}
+func (suite *ResolveTestSuite) TestResolveBandwagonAlbumAsStatusable() {
+ b := []byte(`{
+ "@context": [
+ "https://www.w3.org/ns/activitystreams",
+ "https://w3id.org/security/v1",
+ {
+ "discoverable": "toot:discoverable",
+ "indexable": "toot:indexable",
+ "toot": "https://joinmastodon.org/ns#"
+ },
+ "https://funkwhale.audio/ns"
+ ],
+ "artists": [
+ {
+ "id": "https://bandwagon.fm/@67a0a0808121f77ed3466870",
+ "name": "Luka Prinčič",
+ "type": "Artist"
+ }
+ ],
+ "attachment": [
+ {
+ "mediaType": "image/webp",
+ "name": "image",
+ "type": "Document",
+ "url": "https://bandwagon.fm/67a0a219f050061c8b4ce427/attachments/67a0a21bf050061c8b4ce429"
+ }
+ ],
+ "attributedTo": "https://bandwagon.fm/@67a0a0808121f77ed3466870",
+ "content": "... a transgenre mutation, a fluid entity, jagged pop, electro-funk, techno-cabaret, a schlager, and soft alternative, queer to the core, satire and tragedy, sharp and fun indulgence for the dance of bodies and brains, activism and hedonism, which would all like to steal your attention.\r\n\r\nDRAGX̶FUNK is pronounced /dɹæɡɑːfʌŋk/.\r\n\r\n---\r\n\r\n## Buy digital\r\n💳 [Stripe](https://buy.stripe.com/6oE8x52iG1Kq5pKeV3)\r\n\r\n---\r\n\r\n## Buy dl/merch\r\n🎵 [Bandcamp](https://lukaprincic.bandcamp.com/album/dragx-funk) \r\n\r\n---\r\n\r\n## More:\r\n🌐 [prin.lu](https://prin.lu/music/241205_dragx-funk/) \r\n👉 [kamizdat.si](https://kamizdat.si/releases/dragx-funk-2/)\r\n",
+ "context": "https://bandwagon.fm/67a0a219f050061c8b4ce427",
+ "id": "https://bandwagon.fm/67a0a219f050061c8b4ce427",
+ "library": "https://bandwagon.fm/67a0a219f050061c8b4ce427/pub/children",
+ "license": "CC-BY-NC-SA",
+ "name": "DRAGX̶FUNK",
+ "published": "2025-03-17T11:40:53Z",
+ "to": [
+ "https://www.w3.org/ns/activitystreams#Public"
+ ],
+ "tracks": "https://bandwagon.fm/67a0a219f050061c8b4ce427/pub/children",
+ "type": "Album",
+ "url": "https://bandwagon.fm/67a0a219f050061c8b4ce427"
+}`)
+
+ statusable, err := ap.ResolveStatusable(
+ context.Background(), io.NopCloser(bytes.NewReader(b)),
+ )
+ suite.NoError(err)
+ suite.NotNil(statusable)
+}
+
func TestResolveTestSuite(t *testing.T) {
suite.Run(t, &ResolveTestSuite{})
}
diff --git a/internal/ap/serialize.go b/internal/ap/serialize.go
index f1dc095f6..65ba69ba1 100644
--- a/internal/ap/serialize.go
+++ b/internal/ap/serialize.go
@@ -153,7 +153,9 @@ func serializeStatusable(t vocab.Type, includeContext bool) (map[string]interfac
NormalizeOutgoingAttachmentProp(statusable, data)
NormalizeOutgoingContentProp(statusable, data)
- NormalizeOutgoingInteractionPolicyProp(statusable, data)
+ if ipa, ok := statusable.(InteractionPolicyAware); ok {
+ NormalizeOutgoingInteractionPolicyProp(ipa, data)
+ }
return data, nil
}