diff options
author | 2023-02-02 16:41:02 +0100 | |
---|---|---|
committer | 2023-02-02 16:41:02 +0100 | |
commit | 271da016b91d8d575e13be03b440f970cd333ebe (patch) | |
tree | 4870baceb2266d14906f66d2c9445144fb85746b /internal/ap | |
parent | [feature] Implement `/api/v2/instance` endpoint (#1409) (diff) | |
download | gotosocial-271da016b91d8d575e13be03b440f970cd333ebe.tar.xz |
[bugfix] Read Bookwyrm Articles more thoroughly (#1410)
Diffstat (limited to 'internal/ap')
-rw-r--r-- | internal/ap/extract.go | 84 | ||||
-rw-r--r-- | internal/ap/extractattachments_test.go | 47 | ||||
-rw-r--r-- | internal/ap/interfaces.go | 1 |
3 files changed, 28 insertions, 104 deletions
diff --git a/internal/ap/extract.go b/internal/ap/extract.go index ab51b0858..f3ff6d3b2 100644 --- a/internal/ap/extract.go +++ b/internal/ap/extract.go @@ -49,21 +49,22 @@ func ExtractPreferredUsername(i WithPreferredUsername) (string, error) { return u.GetXMLSchemaString(), nil } -// ExtractName returns a string representation of an interface's name property. -func ExtractName(i WithName) (string, error) { +// ExtractName returns a string representation of an interface's name property, +// or an empty string if this is not found. +func ExtractName(i WithName) string { nameProp := i.GetActivityStreamsName() if nameProp == nil { - return "", errors.New("activityStreamsName not found") + return "" } // take the first name string we can find for iter := nameProp.Begin(); iter != nameProp.End(); iter = iter.Next() { if iter.IsXMLSchemaString() && iter.GetXMLSchemaString() != "" { - return iter.GetXMLSchemaString(), nil + return iter.GetXMLSchemaString() } } - return "", errors.New("activityStreamsName not found") + return "" } // ExtractInReplyToURI extracts the inReplyToURI property (if present) from an interface. @@ -243,23 +244,24 @@ func ExtractImageURL(i WithImage) (*url.URL, error) { } // ExtractSummary extracts the summary/content warning of an interface. -func ExtractSummary(i WithSummary) (string, error) { +// Will return an empty string if no summary was present. +func ExtractSummary(i WithSummary) string { summaryProp := i.GetActivityStreamsSummary() if summaryProp == nil || summaryProp.Len() == 0 { // no summary to speak of - return "", nil + return "" } for iter := summaryProp.Begin(); iter != summaryProp.End(); iter = iter.Next() { switch { case iter.IsIRI(): - return iter.GetIRI().String(), nil + return iter.GetIRI().String() case iter.IsXMLSchemaString(): - return iter.GetXMLSchemaString(), nil + return iter.GetXMLSchemaString() } } - return "", nil + return "" } // ExtractDiscoverable extracts the Discoverable boolean of an interface. @@ -364,36 +366,9 @@ func ExtractContent(i WithContent) string { return "" } -// ExtractAttachments returns a slice of attachments on the interface. -func ExtractAttachments(i WithAttachment) ([]*gtsmodel.MediaAttachment, error) { - attachments := []*gtsmodel.MediaAttachment{} - attachmentProp := i.GetActivityStreamsAttachment() - if attachmentProp == nil { - return attachments, nil - } - for iter := attachmentProp.Begin(); iter != attachmentProp.End(); iter = iter.Next() { - t := iter.GetType() - if t == nil { - continue - } - attachmentable, ok := t.(Attachmentable) - if !ok { - continue - } - attachment, err := ExtractAttachment(attachmentable) - if err != nil { - continue - } - attachments = append(attachments, attachment) - } - return attachments, nil -} - // ExtractAttachment returns a gts model of an attachment from an attachmentable interface. func ExtractAttachment(i Attachmentable) (*gtsmodel.MediaAttachment, error) { - attachment := >smodel.MediaAttachment{ - File: gtsmodel.File{}, - } + attachment := >smodel.MediaAttachment{} attachmentURL, err := ExtractURL(i) if err != nil { @@ -402,17 +377,12 @@ func ExtractAttachment(i Attachmentable) (*gtsmodel.MediaAttachment, error) { attachment.RemoteURL = attachmentURL.String() mediaType := i.GetActivityStreamsMediaType() - if mediaType == nil || mediaType.Get() == "" { - return nil, errors.New("no media type") + if mediaType != nil { + attachment.File.ContentType = mediaType.Get() } - attachment.File.ContentType = mediaType.Get() attachment.Type = gtsmodel.FileTypeImage - name, err := ExtractName(i) - if err == nil { - attachment.Description = name - } - + attachment.Description = ExtractName(i) attachment.Blurhash = ExtractBlurhash(i) attachment.Processing = gtsmodel.ProcessingStatusReceived @@ -470,10 +440,11 @@ func ExtractHashtag(i Hashtaggable) (*gtsmodel.Tag, error) { } tag.URL = hrefProp.GetIRI().String() - name, err := ExtractName(i) - if err != nil { - return nil, err + name := ExtractName(i) + if name == "" { + return nil, errors.New("name prop empty") } + tag.Name = strings.TrimPrefix(name, "#") return tag, nil @@ -523,9 +494,9 @@ func ExtractEmoji(i Emojiable) (*gtsmodel.Emoji, error) { emoji.URI = uri.String() emoji.Domain = uri.Host - name, err := ExtractName(i) - if err != nil { - return nil, err + name := ExtractName(i) + if name == "" { + return nil, errors.New("name prop empty") } emoji.Shortcode = strings.Trim(name, ":") @@ -586,14 +557,13 @@ func ExtractMentions(i WithTag) ([]*gtsmodel.Mention, error) { func ExtractMention(i Mentionable) (*gtsmodel.Mention, error) { mention := >smodel.Mention{} - mentionString, err := ExtractName(i) - if err != nil { - return nil, err + mentionString := ExtractName(i) + if mentionString == "" { + return nil, errors.New("name prop empty") } // just make sure the mention string is valid so we can handle it properly later on... - _, _, err = util.ExtractNamestringParts(mentionString) - if err != nil { + if _, _, err := util.ExtractNamestringParts(mentionString); err != nil { return nil, err } mention.NameString = mentionString diff --git a/internal/ap/extractattachments_test.go b/internal/ap/extractattachments_test.go index de3f2c5ba..881304405 100644 --- a/internal/ap/extractattachments_test.go +++ b/internal/ap/extractattachments_test.go @@ -30,53 +30,6 @@ type ExtractAttachmentsTestSuite struct { ExtractTestSuite } -func (suite *ExtractAttachmentsTestSuite) TestExtractAttachments() { - note := streams.NewActivityStreamsNote() - note.SetActivityStreamsAttachment(suite.attachment1) - - attachments, err := ap.ExtractAttachments(note) - suite.NoError(err) - suite.Len(attachments, 1) - - attachment1 := attachments[0] - suite.Equal("image/jpeg", attachment1.File.ContentType) - suite.Equal("https://s3-us-west-2.amazonaws.com/plushcity/media_attachments/files/106/867/380/219/163/828/original/88e8758c5f011439.jpg", attachment1.RemoteURL) - suite.Equal("It's a cute plushie.", attachment1.Description) - suite.Equal("UxQ0EkRP_4tRxtRjWBt7%hozM_ayV@oLf6WB", attachment1.Blurhash) -} - -func (suite *ExtractAttachmentsTestSuite) TestExtractNoAttachments() { - note := streams.NewActivityStreamsNote() - - attachments, err := ap.ExtractAttachments(note) - suite.NoError(err) - suite.Empty(attachments) -} - -func (suite *ExtractAttachmentsTestSuite) TestExtractAttachmentsMissingContentType() { - d1 := suite.document1 - d1.SetActivityStreamsMediaType(streams.NewActivityStreamsMediaTypeProperty()) - - a1 := streams.NewActivityStreamsAttachmentProperty() - a1.AppendActivityStreamsDocument(d1) - - note := streams.NewActivityStreamsNote() - note.SetActivityStreamsAttachment(a1) - - attachments, err := ap.ExtractAttachments(note) - suite.NoError(err) - suite.Empty(attachments) -} - -func (suite *ExtractAttachmentsTestSuite) TestExtractAttachmentMissingContentType() { - d1 := suite.document1 - d1.SetActivityStreamsMediaType(streams.NewActivityStreamsMediaTypeProperty()) - - attachment, err := ap.ExtractAttachment(d1) - suite.EqualError(err, "no media type") - suite.Nil(attachment) -} - func (suite *ExtractAttachmentsTestSuite) TestExtractAttachmentMissingURL() { d1 := suite.document1 d1.SetActivityStreamsUrl(streams.NewActivityStreamsUrlProperty()) diff --git a/internal/ap/interfaces.go b/internal/ap/interfaces.go index a538e4c2b..5bfeef642 100644 --- a/internal/ap/interfaces.go +++ b/internal/ap/interfaces.go @@ -51,6 +51,7 @@ type Statusable interface { WithTypeName WithSummary + WithName WithInReplyTo WithPublished WithURL |