an app.bsky.* indexer
1package models
2
3import (
4 "bytes"
5 "log/slog"
6 "time"
7
8 appbsky "github.com/bluesky-social/indigo/api/bsky"
9 "github.com/bluesky-social/indigo/atproto/syntax"
10)
11
12type ActorStatus struct {
13 ID string `gorm:"primaryKey"`
14
15 CreatedAt string
16 DurationMinutes *int64
17 Embed *ActorStatus_Embed `gorm:"embedded;embeddedPrefix:embed_"`
18 Status string
19
20 AutoCreatedAt time.Time `gorm:"autoCreateTime"`
21 AutoUpdatedAt time.Time `gorm:"autoUpdateTime"`
22}
23
24type ActorStatus_Embed struct {
25 Description string
26 Title string
27 Uri string
28}
29
30func NewActorStatus(uri syntax.ATURI, rec []byte) *ActorStatus {
31 var out appbsky.ActorStatus
32 if err := out.UnmarshalCBOR(bytes.NewReader(rec)); err != nil {
33 slog.Error("could not unmarshal actor status CBOR", "err", err)
34 return nil
35 }
36
37 status := ActorStatus{
38 ID: string(uri),
39 CreatedAt: out.CreatedAt,
40 DurationMinutes: out.DurationMinutes,
41 Status: out.Status,
42 }
43
44 if out.Embed != nil && out.Embed.EmbedExternal != nil && out.Embed.EmbedExternal.External != nil {
45 status.Embed = &ActorStatus_Embed{
46 Description: out.Embed.EmbedExternal.External.Description,
47 Title: out.Embed.EmbedExternal.External.Title,
48 Uri: out.Embed.EmbedExternal.External.Uri,
49 }
50 }
51
52 return &status
53}