an app.bsky.* indexer

add LabelerService

Changed files
+107 -1
cmd
monarch
models
+9
cmd/monarch/handlers.go
···
&models.GraphListitem{},
&models.GraphStarterpack{},
&models.GraphVerification{},
+
&models.LabelerService{},
+
&models.LabelerService_Label{},
+
&models.LabelerService_Policy{},
}
for _, migration := range migrations {
store.AutoMigrate(migration)
···
verification := models.NewGraphVerification(uri, *rec)
if err := hs.store.Where(models.GraphVerification{ID: string(uri)}).Assign(verification).FirstOrCreate(&models.GraphVerification{}).Error; err != nil {
return fmt.Errorf("error upserting graph verification: %w", err)
+
}
+
+
case syntax.NSID("app.bsky.labeler.service"):
+
labeler := models.NewLabelerService(uri, *rec)
+
if err := hs.store.Where(models.LabelerService{ID: string(uri)}).Assign(labeler).FirstOrCreate(&models.LabelerService{}).Error; err != nil {
+
return fmt.Errorf("error upserting labeler service: %w", err)
}
}
+97
models/labeler_service.go
···
+
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 []*string
+
SubjectCollections []string
+
SubjctTypes []*string
+
+
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
+
Label *string
+
}
+
+
type LabelerService_PolicyDefinition struct {
+
AdultOnly *bool
+
Blurs string
+
DefaultSetting *string
+
Identifier string
+
Severity 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{
+
CreatedAt: out.CreatedAt,
+
}
+
+
if out.ReasonTypes != nil {
+
for _, reasontype := range out.ReasonTypes {
+
labeler.ReasonTypes = append(labeler.ReasonTypes, reasontype)
+
}
+
}
+
+
for _, collection := range out.SubjectCollections {
+
labeler.SubjectCollections = append(labeler.SubjectCollections, collection)
+
}
+
+
if out.SubjectTypes != nil {
+
for _, stype := range out.SubjectTypes {
+
labeler.SubjctTypes = append(labeler.SubjctTypes, 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{
+
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
+
}
+1 -1
models/models.go
···
// - [X] GraphListitem *
// - [X] GraphStarterpack *
// - [X] GraphVerification *
-
// - [ ] LabelerService *
+
// - [X] LabelerService *
// - [ ] ActorDeclaration
// - [ ] LexiconSchema *