package models import ( "bytes" "log/slog" "time" appbsky "github.com/bluesky-social/indigo/api/bsky" "github.com/bluesky-social/indigo/atproto/syntax" ) type LabelerService struct { ID string `gorm:"primaryKey"` CreatedAt string Labels []LabelerService_Label Policies []LabelerService_Policy ReasonTypes []LabelerService_ReasonType SubjectCollections []LabelerService_SubjectCollection SubjctTypes []LabelerService_SubjectType AutoCreatedAt time.Time `gorm:"autoCreateTime"` AutoUpdatedAt time.Time `gorm:"autoUpdateTime"` } type LabelerService_Label struct { LabelerServiceID string Value string } type LabelerService_Policy struct { LabelerServiceID string Definition LabelerService_PolicyDefinition `gorm:"embedded"` Label *string } type LabelerService_PolicyDefinition struct { AdultOnly *bool Blurs string DefaultSetting *string Identifier string Severity string } type LabelerService_ReasonType struct { LabelerServiceID string Value *string } type LabelerService_SubjectCollection struct { LabelerServiceID string Value string } type LabelerService_SubjectType struct { LabelerServiceID string Value *string } func NewLabelerService(uri syntax.ATURI, rec []byte) *LabelerService { var out appbsky.LabelerService if err := out.UnmarshalCBOR(bytes.NewReader(rec)); err != nil { slog.Error("could not unmarshal labeler service CBOR", "err", err) return nil } labeler := LabelerService{ ID: string(uri), CreatedAt: out.CreatedAt, } if out.ReasonTypes != nil { for _, reasontype := range out.ReasonTypes { labeler.ReasonTypes = append(labeler.ReasonTypes, LabelerService_ReasonType{ LabelerServiceID: labeler.ID, Value: reasontype, }) } } for _, collection := range out.SubjectCollections { labeler.SubjectCollections = append(labeler.SubjectCollections, LabelerService_SubjectCollection{ LabelerServiceID: labeler.ID, Value: collection, }) } if out.SubjectTypes != nil { for _, stype := range out.SubjectTypes { labeler.SubjctTypes = append(labeler.SubjctTypes, LabelerService_SubjectType{ LabelerServiceID: labeler.ID, Value: stype, }) } } if out.Labels != nil && out.Labels.LabelDefs_SelfLabels != nil && out.Labels.LabelDefs_SelfLabels.Values != nil { for _, label := range out.Labels.LabelDefs_SelfLabels.Values { labeler.Labels = append(labeler.Labels, LabelerService_Label{ Value: label.Val, }) } } if out.Policies != nil && out.Policies.LabelValueDefinitions != nil && out.Policies.LabelValues != nil { for idx, valdef := range out.Policies.LabelValueDefinitions { policy := LabelerService_Policy{ LabelerServiceID: labeler.ID, Definition: LabelerService_PolicyDefinition{ AdultOnly: valdef.AdultOnly, Blurs: valdef.Blurs, DefaultSetting: valdef.DefaultSetting, Identifier: valdef.Identifier, Severity: valdef.Severity, }, Label: out.Policies.LabelValues[idx], } labeler.Policies = append(labeler.Policies, policy) } } return &labeler }