diff options
Diffstat (limited to 'backend/notes/app.bsky.feed.go')
| -rw-r--r-- | backend/notes/app.bsky.feed.go | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/backend/notes/app.bsky.feed.go b/backend/notes/app.bsky.feed.go new file mode 100644 index 0000000..b5cfd03 --- /dev/null +++ b/backend/notes/app.bsky.feed.go @@ -0,0 +1,102 @@ +package notes + +import ( + "fmt" + "llostre/backend/general" + "time" +) + +type AppBskyFeedPostRecord struct { + URI string `json:"uri"` + Value struct { + Text string `json:"text"` + CreatedAt string `json:"createdAt"` + Reply *struct { + Parent struct { + URI string `json:"uri"` + } `json:"parent"` + } `json:"reply,omitempty"` + Facets []struct { + Index struct { + ByteStart int `json:"byteStart"` + ByteEnd int `json:"byteEnd"` + } `json:"index"` + Features []struct { + Type string `json:"$type"` + URI string `json:"uri,omitempty"` + DID string `json:"did,omitempty"` + Tag string `json:"tag,omitempty"` + } `json:"features"` + } `json:"facets,omitempty"` + } `json:"value"` +} + +func NoteFromAppBskyFeedPostRecord(record AppBskyFeedPostRecord, author *Author) (*Note, error) { + if record.URI == "" { + return nil, fmt.Errorf("missing required field: uri") + } + + createdAt, err := time.Parse(time.RFC3339, record.Value.CreatedAt) + if err != nil { + return nil, fmt.Errorf("failed to parse timestamp: %w", err) + } + + var replyTo *string + if record.Value.Reply != nil { + replyTo = &record.Value.Reply.Parent.URI + } + + var facets []Facet + for _, f := range record.Value.Facets { + for _, feature := range f.Features { + var value string + var facetType string + + switch feature.Type { + case "app.bsky.richtext.facet#link": + facetType = "link" + value = feature.URI + case "app.bsky.richtext.facet#mention": + facetType = "mention" + value = feature.DID + case "app.bsky.richtext.facet#tag": + facetType = "tag" + value = feature.Tag + default: + continue + } + + facets = append(facets, Facet{ + ByteStart: f.Index.ByteStart, + ByteEnd: f.Index.ByteEnd, + Type: facetType, + Value: value, + }) + } + } + + var handle, displayName, avatarURL string + if author != nil { + handle = author.Handle + displayName = author.DisplayName + avatarURL = author.AvatarURL + } else { + handle = "handle.invalid" + displayName = "" + avatarURL = "" + } + + did, _, _, err := general.ParseURI(record.URI) + + return &Note{ + URI: record.URI, + AuthorDID: did, + AuthorHandle: handle, + AuthorName: displayName, + AvatarURL: avatarURL, + CreatedAt: createdAt, + Text: record.Value.Text, + ReplyTo: replyTo, + Facets: facets, + }, nil +} |
