package notes import ( "fmt" "strings" "time" ) type AppBskyFeedPostNote struct { URI string `json:"uri"` AuthorDID string `json:"authorDid"` AuthorHandle string `json:"authorHandle"` Text string `json:"text"` CreatedAt time.Time `json:"createdAt"` ReplyTo *string `json:"replyTo,omitempty"` } 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"` } `json:"value"` } func (bp *AppBskyFeedPostNote) GetID() string { return bp.URI } func (bp *AppBskyFeedPostNote) GetAuthorDID() string { return bp.AuthorDID } func (bp *AppBskyFeedPostNote) GetAuthorHandle() string { return bp.AuthorHandle } func (bp *AppBskyFeedPostNote) GetTimestamp() time.Time { return bp.CreatedAt } func (bp *AppBskyFeedPostNote) GetReplyTo() *string { return bp.ReplyTo } func AppBskyFeedPostFromRecord(record AppBskyFeedPostRecord) (*AppBskyFeedPostNote, 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 } parts := strings.Split(record.URI, "/") // at://DID/collection/rkey did := parts[2] return &AppBskyFeedPostNote{ URI: record.URI, AuthorDID: did, AuthorHandle: "author_handle", // wip CreatedAt: createdAt, Text: record.Value.Text, ReplyTo: replyTo, }, nil }