an app.bsky.* indexer

different approach

Changed files
+24 -25
cmd
monarch
+24 -25
cmd/monarch/handlers.go
···
"bytes"
"context"
"encoding/json"
-
"errors"
"fmt"
"io"
···
}
var validCollections = map[syntax.NSID]bool{
-
syntax.NSID("app.bsky.actor.profile"): true,
-
syntax.NSID("app.bsky.feed.generator"): true,
-
syntax.NSID("app.bsky.labeler.service"): true,
+
syntax.NSID("app.bsky.actor.profile"): true,
+
// syntax.NSID("app.bsky.feed.generator"): true,
+
// syntax.NSID("app.bsky.labeler.service"): true,
}
type bskycbor interface {
UnmarshalCBOR(io.Reader) error
}
+
func ActorProfile(data *[]byte) ([]byte, error) {
+
var (
+
model appbsky.ActorProfile
+
body []byte
+
err error
+
)
+
if err := model.UnmarshalCBOR(bytes.NewBuffer(*data)); err != nil {
+
return body, fmt.Errorf("error cbor unmarshaling: %w", err)
+
}
+
body, err = json.Marshal(model)
+
if err != nil {
+
return body, fmt.Errorf("error json unmarshaling: %w", err)
+
}
+
return body, err
+
}
+
func (hs *HandlerService) HandleUpsert(ctx context.Context, repo string, rev string, path string, rec *[]byte, cid *cid.Cid, action Action) error {
uri, err := syntax.ParseATURI(fmt.Sprintf("at://%s/%s", repo, path))
if err != nil {
return fmt.Errorf("error parsing at-uri: %w", err)
}
-
ok := validCollections[uri.Collection()]
+
_, ok := validCollections[uri.Collection()]
if !ok {
return nil
}
-
var out any
+
var body []byte
switch uri.Collection() {
case syntax.NSID("app.bsky.actor.profile"):
-
out = appbsky.ActorProfile{}
-
case syntax.NSID("app.bsky.feed.generator"):
-
out = appbsky.FeedGenerator{}
-
case syntax.NSID("app.bsky.labeler.service"):
-
out = appbsky.LabelerService{}
-
}
-
-
model, ok := out.(bskycbor)
-
if !ok {
-
return errors.New("collection model cannot unmarshal CBOR")
-
}
-
-
if err := model.UnmarshalCBOR(bytes.NewReader(*rec)); err != nil {
-
return fmt.Errorf("error cbor unmarshaling: %w", err)
-
}
-
-
body, err := json.Marshal(model)
-
if err != nil {
-
return fmt.Errorf("error json marshaling: %w", err)
+
if body, err = ActorProfile(rec); err != nil {
+
return fmt.Errorf("error parsing actor profile: %w", err)
+
}
}
switch action {