Mirror of @tangled.org/core. Running on a Raspberry Pi Zero 2 (Please be gentle).
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

spindle: improve member ingestion

Signed-off-by: oppiliappan <me@oppi.li>

+121 -8
+4
appview/ingester.go
··· 387 387 if err != nil { 388 388 return fmt.Errorf("failed to update ACLs: %w", err) 389 389 } 390 + 391 + l.Info("added spindle member") 390 392 case models.CommitOperationDelete: 391 393 rkey := e.Commit.RKey 392 394 ··· 435 433 if err = i.Enforcer.E.SavePolicy(); err != nil { 436 434 return fmt.Errorf("failed to save ACLs: %w", err) 437 435 } 436 + 437 + l.Info("removed spindle member") 438 438 } 439 439 440 440 return nil
+4 -4
appview/spindles/spindles.go
··· 619 619 620 620 if string(spindles[0].Owner) != user.Did { 621 621 l.Error("unauthorized", "user", user.Did, "owner", spindles[0].Owner) 622 - s.Pages.Notice(w, noticeId, "Failed to add member, unauthorized attempt.") 622 + s.Pages.Notice(w, noticeId, "Failed to remove member, unauthorized attempt.") 623 623 return 624 624 } 625 625 626 626 member := r.FormValue("member") 627 627 if member == "" { 628 628 l.Error("empty member") 629 - s.Pages.Notice(w, noticeId, "Failed to add member, empty form.") 629 + s.Pages.Notice(w, noticeId, "Failed to remove member, empty form.") 630 630 return 631 631 } 632 632 l = l.With("member", member) ··· 634 634 memberId, err := s.IdResolver.ResolveIdent(r.Context(), member) 635 635 if err != nil { 636 636 l.Error("failed to resolve member identity to handle", "err", err) 637 - s.Pages.Notice(w, noticeId, "Failed to add member, identity resolution failed.") 637 + s.Pages.Notice(w, noticeId, "Failed to remove member, identity resolution failed.") 638 638 return 639 639 } 640 640 if memberId.Handle.IsInvalidHandle() { 641 641 l.Error("failed to resolve member identity to handle") 642 - s.Pages.Notice(w, noticeId, "Failed to add member, identity resolution failed.") 642 + s.Pages.Notice(w, noticeId, "Failed to remove member, identity resolution failed.") 643 643 return 644 644 } 645 645
+15
spindle/db/db.go
··· 45 45 unique(owner, name) 46 46 ); 47 47 48 + create table if not exists spindle_members ( 49 + -- identifiers for the record 50 + id integer primary key autoincrement, 51 + did text not null, 52 + rkey text not null, 53 + 54 + -- data 55 + instance text not null, 56 + subject text not null, 57 + created text not null default (strftime('%Y-%m-%dT%H:%M:%SZ', 'now')), 58 + 59 + -- constraints 60 + unique (did, instance, subject) 61 + ); 62 + 48 63 -- status event for a single workflow 49 64 create table if not exists events ( 50 65 rkey text not null,
+59
spindle/db/member.go
··· 1 + package db 2 + 3 + import ( 4 + "time" 5 + 6 + "github.com/bluesky-social/indigo/atproto/syntax" 7 + ) 8 + 9 + type SpindleMember struct { 10 + Id int 11 + Did syntax.DID // owner of the record 12 + Rkey string // rkey of the record 13 + Instance string 14 + Subject syntax.DID // the member being added 15 + Created time.Time 16 + } 17 + 18 + func AddSpindleMember(db *DB, member SpindleMember) error { 19 + _, err := db.Exec( 20 + `insert or ignore into spindle_members (did, rkey, instance, subject) values (?, ?, ?, ?)`, 21 + member.Did, 22 + member.Rkey, 23 + member.Instance, 24 + member.Subject, 25 + ) 26 + return err 27 + } 28 + 29 + func RemoveSpindleMember(db *DB, owner_did, rkey string) error { 30 + _, err := db.Exec( 31 + "delete from spindle_members where did = ? and rkey = ?", 32 + owner_did, 33 + rkey, 34 + ) 35 + return err 36 + } 37 + 38 + func GetSpindleMember(db *DB, did, rkey string) (*SpindleMember, error) { 39 + query := 40 + `select id, did, rkey, instance, subject, created 41 + from spindle_members 42 + where did = ? and rkey = ?` 43 + 44 + var member SpindleMember 45 + var createdAt string 46 + err := db.QueryRow(query, did, rkey).Scan( 47 + &member.Id, 48 + &member.Did, 49 + &member.Rkey, 50 + &member.Instance, 51 + &member.Subject, 52 + &createdAt, 53 + ) 54 + if err != nil { 55 + return nil, err 56 + } 57 + 58 + return &member, nil 59 + }
+39 -4
spindle/ingester.go
··· 5 5 "encoding/json" 6 6 "errors" 7 7 "fmt" 8 + "time" 8 9 9 10 "tangled.sh/tangled.sh/core/api/tangled" 10 11 "tangled.sh/tangled.sh/core/eventconsumer" 11 12 "tangled.sh/tangled.sh/core/idresolver" 12 13 "tangled.sh/tangled.sh/core/rbac" 14 + "tangled.sh/tangled.sh/core/spindle/db" 13 15 14 16 comatproto "github.com/bluesky-social/indigo/api/atproto" 15 17 "github.com/bluesky-social/indigo/atproto/identity" ··· 52 50 } 53 51 54 52 func (s *Spindle) ingestMember(_ context.Context, e *models.Event) error { 55 - did := e.Did 56 53 var err error 54 + did := e.Did 55 + rkey := e.Commit.RKey 57 56 58 57 l := s.l.With("component", "ingester", "record", tangled.SpindleMemberNSID) 59 58 ··· 69 66 } 70 67 71 68 domain := s.cfg.Server.Hostname 72 - if s.cfg.Server.Dev { 73 - domain = s.cfg.Server.ListenAddr 74 - } 75 69 recordInstance := record.Instance 76 70 77 71 if recordInstance != domain { ··· 80 80 if err != nil || !ok { 81 81 l.Error("failed to add member", "did", did, "error", err) 82 82 return fmt.Errorf("failed to enforce permissions: %w", err) 83 + } 84 + 85 + if err := db.AddSpindleMember(s.db, db.SpindleMember{ 86 + Did: syntax.DID(did), 87 + Rkey: rkey, 88 + Instance: recordInstance, 89 + Subject: syntax.DID(record.Subject), 90 + Created: time.Now(), 91 + }); err != nil { 92 + l.Error("failed to add member", "error", err) 93 + return fmt.Errorf("failed to add member: %w", err) 83 94 } 84 95 85 96 if err := s.e.AddSpindleMember(rbacDomain, record.Subject); err != nil { ··· 106 95 s.jc.AddDid(record.Subject) 107 96 108 97 return nil 98 + 99 + case models.CommitOperationDelete: 100 + record, err := db.GetSpindleMember(s.db, did, rkey) 101 + if err != nil { 102 + l.Error("failed to find member", "error", err) 103 + return fmt.Errorf("failed to find member: %w", err) 104 + } 105 + 106 + if err := db.RemoveSpindleMember(s.db, did, rkey); err != nil { 107 + l.Error("failed to remove member", "error", err) 108 + return fmt.Errorf("failed to remove member: %w", err) 109 + } 110 + 111 + if err := s.e.RemoveSpindleMember(rbacDomain, record.Subject.String()); err != nil { 112 + l.Error("failed to add member", "error", err) 113 + return fmt.Errorf("failed to add member: %w", err) 114 + } 115 + l.Info("added member from firehose", "member", record.Subject) 116 + 117 + if err := s.db.RemoveDid(record.Subject.String()); err != nil { 118 + l.Error("failed to add did", "error", err) 119 + return fmt.Errorf("failed to add did: %w", err) 120 + } 121 + s.jc.RemoveDid(record.Subject.String()) 109 122 110 123 } 111 124 return nil