forked from tangled.org/core
Monorepo for Tangled

appview: ingester: gate artifact ingestion to repo:push

thanks @cinny.bun.how on bluesky.

Changed files
+21 -4
appview
+6
appview/db/repos.go
··· 6 "time" 7 8 "github.com/bluesky-social/indigo/atproto/syntax" 9 "tangled.sh/tangled.sh/core/api/tangled" 10 ) 11 ··· 27 28 func (r Repo) RepoAt() syntax.ATURI { 29 return syntax.ATURI(fmt.Sprintf("at://%s/%s/%s", r.Did, tangled.RepoNSID, r.Rkey)) 30 } 31 32 func GetAllRepos(e Execer, limit int) ([]Repo, error) {
··· 6 "time" 7 8 "github.com/bluesky-social/indigo/atproto/syntax" 9 + securejoin "github.com/cyphar/filepath-securejoin" 10 "tangled.sh/tangled.sh/core/api/tangled" 11 ) 12 ··· 28 29 func (r Repo) RepoAt() syntax.ATURI { 30 return syntax.ATURI(fmt.Sprintf("at://%s/%s/%s", r.Did, tangled.RepoNSID, r.Rkey)) 31 + } 32 + 33 + func (r Repo) DidSlashRepo() string { 34 + p, _ := securejoin.SecureJoin(r.Did, r.Name) 35 + return p 36 } 37 38 func GetAllRepos(e Execer, limit int) ([]Repo, error) {
+14 -3
appview/ingester.go
··· 13 "github.com/ipfs/go-cid" 14 "tangled.sh/tangled.sh/core/api/tangled" 15 "tangled.sh/tangled.sh/core/appview/db" 16 ) 17 18 type Ingester func(ctx context.Context, e *models.Event) error 19 20 - func Ingest(d db.DbWrapper) Ingester { 21 return func(ctx context.Context, e *models.Event) error { 22 var err error 23 defer func() { ··· 40 case tangled.PublicKeyNSID: 41 ingestPublicKey(&d, e) 42 case tangled.RepoArtifactNSID: 43 - ingestArtifact(&d, e) 44 case tangled.ActorProfileNSID: 45 ingestProfile(&d, e) 46 } ··· 139 return nil 140 } 141 142 - func ingestArtifact(d *db.DbWrapper, e *models.Event) error { 143 did := e.Did 144 var err error 145 ··· 155 156 repoAt, err := syntax.ParseATURI(record.Repo) 157 if err != nil { 158 return err 159 } 160
··· 13 "github.com/ipfs/go-cid" 14 "tangled.sh/tangled.sh/core/api/tangled" 15 "tangled.sh/tangled.sh/core/appview/db" 16 + "tangled.sh/tangled.sh/core/rbac" 17 ) 18 19 type Ingester func(ctx context.Context, e *models.Event) error 20 21 + func Ingest(d db.DbWrapper, enforcer *rbac.Enforcer) Ingester { 22 return func(ctx context.Context, e *models.Event) error { 23 var err error 24 defer func() { ··· 41 case tangled.PublicKeyNSID: 42 ingestPublicKey(&d, e) 43 case tangled.RepoArtifactNSID: 44 + ingestArtifact(&d, e, enforcer) 45 case tangled.ActorProfileNSID: 46 ingestProfile(&d, e) 47 } ··· 140 return nil 141 } 142 143 + func ingestArtifact(d *db.DbWrapper, e *models.Event, enforcer *rbac.Enforcer) error { 144 did := e.Did 145 var err error 146 ··· 156 157 repoAt, err := syntax.ParseATURI(record.Repo) 158 if err != nil { 159 + return err 160 + } 161 + 162 + repo, err := db.GetRepoByAtUri(d, repoAt.String()) 163 + if err != nil { 164 + return err 165 + } 166 + 167 + ok, err := enforcer.E.Enforce(did, repo.Knot, repo.DidSlashRepo(), "repo:push") 168 + if err != nil || !ok { 169 return err 170 } 171
+1 -1
appview/state/state.go
··· 76 if err != nil { 77 return nil, fmt.Errorf("failed to create jetstream client: %w", err) 78 } 79 - err = jc.StartJetstream(context.Background(), appview.Ingest(wrapper)) 80 if err != nil { 81 return nil, fmt.Errorf("failed to start jetstream watcher: %w", err) 82 }
··· 76 if err != nil { 77 return nil, fmt.Errorf("failed to create jetstream client: %w", err) 78 } 79 + err = jc.StartJetstream(context.Background(), appview.Ingest(wrapper, enforcer)) 80 if err != nil { 81 return nil, fmt.Errorf("failed to start jetstream watcher: %w", err) 82 }