···23232424func DeletePublicKeyByRkey(e Execer, did, rkey string) error {
2525 _, err := e.Exec(`
2626- delete or ignore from public_keys
2727- where did = ? and name = ? and rkey = ?`,
2626+ delete from public_keys
2727+ where did = ? and rkey = ?`,
2828 did, rkey)
2929 return err
3030}
+133
appview/ingester.go
···11+package appview
22+33+import (
44+ "context"
55+ "encoding/json"
66+ "fmt"
77+ "log"
88+99+ "github.com/bluesky-social/indigo/atproto/syntax"
1010+ "github.com/bluesky-social/jetstream/pkg/models"
1111+ tangled "tangled.sh/tangled.sh/core/api/tangled"
1212+ "tangled.sh/tangled.sh/core/appview/db"
1313+)
1414+1515+type Ingester func(ctx context.Context, e *models.Event) error
1616+1717+func Ingest(d db.DbWrapper) Ingester {
1818+ return func(ctx context.Context, e *models.Event) error {
1919+ var err error
2020+ defer func() {
2121+ eventTime := e.TimeUS
2222+ lastTimeUs := eventTime + 1
2323+ if err := d.SaveLastTimeUs(lastTimeUs); err != nil {
2424+ err = fmt.Errorf("(deferred) failed to save last time us: %w", err)
2525+ }
2626+ }()
2727+2828+ if e.Kind != models.EventKindCommit {
2929+ return nil
3030+ }
3131+3232+ switch e.Commit.Collection {
3333+ case tangled.GraphFollowNSID:
3434+ ingestFollow(&d, e)
3535+ case tangled.FeedStarNSID:
3636+ ingestStar(&d, e)
3737+ case tangled.PublicKeyNSID:
3838+ ingestPublicKey(&d, e)
3939+ }
4040+4141+ return err
4242+ }
4343+}
4444+4545+func ingestStar(d *db.DbWrapper, e *models.Event) error {
4646+ var err error
4747+ did := e.Did
4848+4949+ switch e.Commit.Operation {
5050+ case models.CommitOperationCreate, models.CommitOperationUpdate:
5151+ var subjectUri syntax.ATURI
5252+5353+ raw := json.RawMessage(e.Commit.Record)
5454+ record := tangled.FeedStar{}
5555+ err := json.Unmarshal(raw, &record)
5656+ if err != nil {
5757+ log.Println("invalid record")
5858+ return err
5959+ }
6060+6161+ subjectUri, err = syntax.ParseATURI(record.Subject)
6262+ if err != nil {
6363+ log.Println("invalid record")
6464+ return err
6565+ }
6666+ err = db.AddStar(d, did, subjectUri, e.Commit.RKey)
6767+ case models.CommitOperationDelete:
6868+ err = db.DeleteStarByRkey(d, did, e.Commit.RKey)
6969+ }
7070+7171+ if err != nil {
7272+ return fmt.Errorf("failed to %s star record: %w", e.Commit.Operation, err)
7373+ }
7474+7575+ return nil
7676+}
7777+7878+func ingestFollow(d *db.DbWrapper, e *models.Event) error {
7979+ var err error
8080+ did := e.Did
8181+8282+ switch e.Commit.Operation {
8383+ case models.CommitOperationCreate, models.CommitOperationUpdate:
8484+ raw := json.RawMessage(e.Commit.Record)
8585+ record := tangled.GraphFollow{}
8686+ err = json.Unmarshal(raw, &record)
8787+ if err != nil {
8888+ log.Println("invalid record")
8989+ return err
9090+ }
9191+9292+ subjectDid := record.Subject
9393+ err = db.AddFollow(d, did, subjectDid, e.Commit.RKey)
9494+ case models.CommitOperationDelete:
9595+ err = db.DeleteFollowByRkey(d, did, e.Commit.RKey)
9696+ }
9797+9898+ if err != nil {
9999+ return fmt.Errorf("failed to %s follow record: %w", e.Commit.Operation, err)
100100+ }
101101+102102+ return nil
103103+}
104104+105105+func ingestPublicKey(d *db.DbWrapper, e *models.Event) error {
106106+ did := e.Did
107107+ var err error
108108+109109+ switch e.Commit.Operation {
110110+ case models.CommitOperationCreate, models.CommitOperationUpdate:
111111+ log.Println("processing add of pubkey")
112112+ raw := json.RawMessage(e.Commit.Record)
113113+ record := tangled.PublicKey{}
114114+ err = json.Unmarshal(raw, &record)
115115+ if err != nil {
116116+ log.Printf("invalid record: %s", err)
117117+ return err
118118+ }
119119+120120+ name := record.Name
121121+ key := record.Key
122122+ err = db.AddPublicKey(d, did, name, key, e.Commit.RKey)
123123+ case models.CommitOperationDelete:
124124+ log.Println("processing delete of pubkey")
125125+ err = db.DeletePublicKeyByRkey(d, did, e.Commit.RKey)
126126+ }
127127+128128+ if err != nil {
129129+ return fmt.Errorf("failed to %s pubkey record: %w", e.Commit.Operation, err)
130130+ }
131131+132132+ return nil
133133+}
-70
appview/state/jetstream.go
···11-package state
22-33-import (
44- "context"
55- "encoding/json"
66- "fmt"
77- "log"
88-99- "github.com/bluesky-social/indigo/atproto/syntax"
1010- "github.com/bluesky-social/jetstream/pkg/models"
1111- tangled "tangled.sh/tangled.sh/core/api/tangled"
1212- "tangled.sh/tangled.sh/core/appview/db"
1313-)
1414-1515-type Ingester func(ctx context.Context, e *models.Event) error
1616-1717-func jetstreamIngester(d db.DbWrapper) Ingester {
1818- return func(ctx context.Context, e *models.Event) error {
1919- var err error
2020- defer func() {
2121- eventTime := e.TimeUS
2222- lastTimeUs := eventTime + 1
2323- if err := d.SaveLastTimeUs(lastTimeUs); err != nil {
2424- err = fmt.Errorf("(deferred) failed to save last time us: %w", err)
2525- }
2626- }()
2727-2828- if e.Kind != models.EventKindCommit {
2929- return nil
3030- }
3131-3232- did := e.Did
3333- raw := json.RawMessage(e.Commit.Record)
3434-3535- switch e.Commit.Collection {
3636- case tangled.GraphFollowNSID:
3737- record := tangled.GraphFollow{}
3838- err := json.Unmarshal(raw, &record)
3939- if err != nil {
4040- log.Println("invalid record")
4141- return err
4242- }
4343- err = db.AddFollow(d, did, record.Subject, e.Commit.RKey)
4444- if err != nil {
4545- return fmt.Errorf("failed to add follow to db: %w", err)
4646- }
4747- case tangled.FeedStarNSID:
4848- record := tangled.FeedStar{}
4949- err := json.Unmarshal(raw, &record)
5050- if err != nil {
5151- log.Println("invalid record")
5252- return err
5353- }
5454-5555- subjectUri, err := syntax.ParseATURI(record.Subject)
5656-5757- if err != nil {
5858- log.Println("invalid record")
5959- return err
6060- }
6161-6262- err = db.AddStar(d, did, subjectUri, e.Commit.RKey)
6363- if err != nil {
6464- return fmt.Errorf("failed to add follow to db: %w", err)
6565- }
6666- }
6767-6868- return err
6969- }
7070-}