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, profile *general.Profile) (*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 } did, _, _, err := general.ParseURI(record.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 profile != nil { handle = profile.Handle displayName = profile.DisplayName avatarURL = profile.AvatarURL } else { handle = "handle.invalid" displayName = "" avatarURL = "" } return &Note{ URI: record.URI, AuthorDID: did, AuthorHandle: handle, AuthorName: displayName, AvatarURL: avatarURL, CreatedAt: createdAt, Text: record.Value.Text, ReplyTo: replyTo, Facets: facets, }, nil }