aboutsummaryrefslogtreecommitdiff
path: root/backend/notes/app.bsky.feed.go
diff options
context:
space:
mode:
Diffstat (limited to 'backend/notes/app.bsky.feed.go')
-rw-r--r--backend/notes/app.bsky.feed.go102
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
+}