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 LabelerService struct {
13 ID string `gorm:"primaryKey"`
14
15 CreatedAt string
16 Labels []LabelerService_Label
17 Policies []LabelerService_Policy
18 ReasonTypes []LabelerService_ReasonType
19 SubjectCollections []LabelerService_SubjectCollection
20 SubjctTypes []LabelerService_SubjectType
21
22 AutoCreatedAt time.Time `gorm:"autoCreateTime"`
23 AutoUpdatedAt time.Time `gorm:"autoUpdateTime"`
24}
25
26type LabelerService_Label struct {
27 LabelerServiceID string
28 Value string
29}
30
31type LabelerService_Policy struct {
32 LabelerServiceID string
33 Definition LabelerService_PolicyDefinition `gorm:"embedded"`
34 Label *string
35}
36
37type LabelerService_PolicyDefinition struct {
38 AdultOnly *bool
39 Blurs string
40 DefaultSetting *string
41 Identifier string
42 Severity string
43}
44
45type LabelerService_ReasonType struct {
46 LabelerServiceID string
47 Value *string
48}
49
50type LabelerService_SubjectCollection struct {
51 LabelerServiceID string
52 Value string
53}
54
55type LabelerService_SubjectType struct {
56 LabelerServiceID string
57 Value *string
58}
59
60func NewLabelerService(uri syntax.ATURI, rec []byte) *LabelerService {
61 var out appbsky.LabelerService
62 if err := out.UnmarshalCBOR(bytes.NewReader(rec)); err != nil {
63 slog.Error("could not unmarshal labeler service CBOR", "err", err)
64 return nil
65 }
66
67 labeler := LabelerService{
68 CreatedAt: out.CreatedAt,
69 }
70
71 if out.ReasonTypes != nil {
72 for _, reasontype := range out.ReasonTypes {
73 labeler.ReasonTypes = append(labeler.ReasonTypes, LabelerService_ReasonType{
74 LabelerServiceID: labeler.ID,
75 Value: reasontype,
76 })
77 }
78 }
79
80 for _, collection := range out.SubjectCollections {
81 labeler.SubjectCollections = append(labeler.SubjectCollections, LabelerService_SubjectCollection{
82 LabelerServiceID: labeler.ID,
83 Value: collection,
84 })
85 }
86
87 if out.SubjectTypes != nil {
88 for _, stype := range out.SubjectTypes {
89 labeler.SubjctTypes = append(labeler.SubjctTypes, LabelerService_SubjectType{
90 LabelerServiceID: labeler.ID,
91 Value: stype,
92 })
93 }
94 }
95
96 if out.Labels != nil && out.Labels.LabelDefs_SelfLabels != nil && out.Labels.LabelDefs_SelfLabels.Values != nil {
97 for _, label := range out.Labels.LabelDefs_SelfLabels.Values {
98 labeler.Labels = append(labeler.Labels, LabelerService_Label{
99 Value: label.Val,
100 })
101 }
102 }
103
104 if out.Policies != nil && out.Policies.LabelValueDefinitions != nil && out.Policies.LabelValues != nil {
105 for idx, valdef := range out.Policies.LabelValueDefinitions {
106 policy := LabelerService_Policy{
107 LabelerServiceID: labeler.ID,
108 Definition: LabelerService_PolicyDefinition{
109 AdultOnly: valdef.AdultOnly,
110 Blurs: valdef.Blurs,
111 DefaultSetting: valdef.DefaultSetting,
112 Identifier: valdef.Identifier,
113 Severity: valdef.Severity,
114 },
115 Label: out.Policies.LabelValues[idx],
116 }
117 labeler.Policies = append(labeler.Policies, policy)
118 }
119 }
120
121 return &labeler
122}