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.

appview: make default label defs configurable

hard-coded labels make hard to setup local sandboxed environment as the
appview won't run until we fill all 5 definitions under TangledDid.

so make them configurable with `TANGLED_LABEL_DEFAULTS` which is a list
of aturis delimitted by , character

we can have any number/kind of default labels but gfi is required for
`/good-first-issue` page

Signed-off-by: Seongmin Lee <git@boltless.me>

authored by

Seongmin Lee and committed by
Tangled
cab269fb 41091062

+39 -54
+6
appview/config/config.go
··· 80 80 TurnstileSecretKey string `env:"TURNSTILE_SECRET_KEY"` 81 81 } 82 82 83 + type LabelConfig struct { 84 + DefaultLabelDefs []string `env:"DEFAULTS, default=at://did:plc:wshs7t2adsemcrrd4snkeqli/sh.tangled.label.definition/wontfix,at://did:plc:wshs7t2adsemcrrd4snkeqli/sh.tangled.label.definition/good-first-issue,at://did:plc:wshs7t2adsemcrrd4snkeqli/sh.tangled.label.definition/duplicate,at://did:plc:wshs7t2adsemcrrd4snkeqli/sh.tangled.label.definition/documentation,at://did:plc:wshs7t2adsemcrrd4snkeqli/sh.tangled.label.definition/assignee"` // delimiter=, 85 + GoodFirstIssue string `env:"GFI, default=at://did:plc:wshs7t2adsemcrrd4snkeqli/sh.tangled.label.definition/good-first-issue"` 86 + } 87 + 83 88 func (cfg RedisConfig) ToURL() string { 84 89 u := &url.URL{ 85 90 Scheme: "redis", ··· 112 107 Redis RedisConfig `env:",prefix=TANGLED_REDIS_"` 113 108 Pds PdsConfig `env:",prefix=TANGLED_PDS_"` 114 109 Cloudflare Cloudflare `env:",prefix=TANGLED_CLOUDFLARE_"` 110 + Label LabelConfig `env:",prefix=TANGLED_LABEL_"` 115 111 } 116 112 117 113 func LoadConfig(ctx context.Context) (*Config, error) {
+25 -43
appview/models/label.go
··· 14 14 "github.com/bluesky-social/indigo/atproto/syntax" 15 15 "github.com/bluesky-social/indigo/xrpc" 16 16 "tangled.org/core/api/tangled" 17 - "tangled.org/core/consts" 18 17 "tangled.org/core/idresolver" 19 18 ) 20 19 ··· 460 461 return result 461 462 } 462 463 463 - var ( 464 - LabelWontfix = fmt.Sprintf("at://%s/%s/%s", consts.TangledDid, tangled.LabelDefinitionNSID, "wontfix") 465 - LabelDuplicate = fmt.Sprintf("at://%s/%s/%s", consts.TangledDid, tangled.LabelDefinitionNSID, "duplicate") 466 - LabelAssignee = fmt.Sprintf("at://%s/%s/%s", consts.TangledDid, tangled.LabelDefinitionNSID, "assignee") 467 - LabelGoodFirstIssue = fmt.Sprintf("at://%s/%s/%s", consts.TangledDid, tangled.LabelDefinitionNSID, "good-first-issue") 468 - LabelDocumentation = fmt.Sprintf("at://%s/%s/%s", consts.TangledDid, tangled.LabelDefinitionNSID, "documentation") 469 - ) 470 - 471 - func DefaultLabelDefs() []string { 472 - return []string{ 473 - LabelWontfix, 474 - LabelDuplicate, 475 - LabelAssignee, 476 - LabelGoodFirstIssue, 477 - LabelDocumentation, 478 - } 479 - } 480 - 481 - func FetchDefaultDefs(r *idresolver.Resolver) ([]LabelDefinition, error) { 482 - resolved, err := r.ResolveIdent(context.Background(), consts.TangledDid) 483 - if err != nil { 484 - return nil, fmt.Errorf("failed to resolve tangled.sh DID %s: %v", consts.TangledDid, err) 485 - } 486 - pdsEndpoint := resolved.PDSEndpoint() 487 - if pdsEndpoint == "" { 488 - return nil, fmt.Errorf("no PDS endpoint found for tangled.sh DID %s", consts.TangledDid) 489 - } 490 - client := &xrpc.Client{ 491 - Host: pdsEndpoint, 492 - } 493 - 464 + func FetchLabelDefs(r *idresolver.Resolver, aturis []string) ([]LabelDefinition, error) { 494 465 var labelDefs []LabelDefinition 466 + ctx := context.Background() 495 467 496 - for _, dl := range DefaultLabelDefs() { 497 - atUri := syntax.ATURI(dl) 498 - parsedUri, err := syntax.ParseATURI(string(atUri)) 468 + for _, dl := range aturis { 469 + atUri, err := syntax.ParseATURI(dl) 499 470 if err != nil { 500 - return nil, fmt.Errorf("failed to parse AT-URI %s: %v", atUri, err) 471 + return nil, fmt.Errorf("failed to parse AT-URI %s: %v", dl, err) 501 472 } 473 + if atUri.Collection() != tangled.LabelDefinitionNSID { 474 + return nil, fmt.Errorf("expected AT-URI pointing %s collection: %s", tangled.LabelDefinitionNSID, atUri) 475 + } 476 + 477 + owner, err := r.ResolveIdent(ctx, atUri.Authority().String()) 478 + if err != nil { 479 + return nil, fmt.Errorf("failed to resolve default label owner DID %s: %v", atUri.Authority(), err) 480 + } 481 + 482 + xrpcc := xrpc.Client{ 483 + Host: owner.PDSEndpoint(), 484 + } 485 + 502 486 record, err := atproto.RepoGetRecord( 503 - context.Background(), 504 - client, 487 + ctx, 488 + &xrpcc, 505 489 "", 506 - parsedUri.Collection().String(), 507 - parsedUri.Authority().String(), 508 - parsedUri.RecordKey().String(), 490 + atUri.Collection().String(), 491 + atUri.Authority().String(), 492 + atUri.RecordKey().String(), 509 493 ) 510 494 if err != nil { 511 495 return nil, fmt.Errorf("failed to get record for %s: %v", atUri, err) ··· 508 526 } 509 527 510 528 labelDef, err := LabelDefinitionFromRecord( 511 - parsedUri.Authority().String(), 512 - parsedUri.RecordKey().String(), 529 + atUri.Authority().String(), 530 + atUri.RecordKey().String(), 513 531 labelRecord, 514 532 ) 515 533 if err != nil {
+2 -2
appview/repo/repo.go
··· 1968 1968 return 1969 1969 } 1970 1970 1971 - defaultLabels, err := db.GetLabelDefinitions(rp.db, db.FilterIn("at_uri", models.DefaultLabelDefs())) 1971 + defaultLabels, err := db.GetLabelDefinitions(rp.db, db.FilterIn("at_uri", rp.config.Label.DefaultLabelDefs)) 1972 1972 if err != nil { 1973 1973 l.Error("failed to fetch labels", "err", err) 1974 1974 rp.pages.Error503(w) ··· 2247 2247 Source: sourceAt, 2248 2248 Description: f.Repo.Description, 2249 2249 Created: time.Now(), 2250 - Labels: models.DefaultLabelDefs(), 2250 + Labels: rp.config.Label.DefaultLabelDefs, 2251 2251 } 2252 2252 record := repo.AsRecord() 2253 2253
+1 -3
appview/state/gfi.go
··· 1 1 package state 2 2 3 3 import ( 4 - "fmt" 5 4 "log" 6 5 "net/http" 7 6 "sort" 8 7 9 8 "github.com/bluesky-social/indigo/atproto/syntax" 10 - "tangled.org/core/api/tangled" 11 9 "tangled.org/core/appview/db" 12 10 "tangled.org/core/appview/models" 13 11 "tangled.org/core/appview/pages" ··· 18 20 19 21 page := pagination.FromContext(r.Context()) 20 22 21 - goodFirstIssueLabel := fmt.Sprintf("at://%s/%s/%s", consts.TangledDid, tangled.LabelDefinitionNSID, "good-first-issue") 23 + goodFirstIssueLabel := s.config.Label.GoodFirstIssue 22 24 23 25 gfiLabelDef, err := db.GetLabelDefinition(s.db, db.FilterEq("at_uri", goodFirstIssueLabel)) 24 26 if err != nil {
+5 -6
appview/state/state.go
··· 129 129 return nil, fmt.Errorf("failed to create jetstream client: %w", err) 130 130 } 131 131 132 - if err := BackfillDefaultDefs(d, res); err != nil { 132 + if err := BackfillDefaultDefs(d, res, config.Label.DefaultLabelDefs); err != nil { 133 133 return nil, fmt.Errorf("failed to backfill default label defs: %w", err) 134 134 } 135 135 ··· 294 294 return 295 295 } 296 296 297 - gfiLabel, err := db.GetLabelDefinition(s.db, db.FilterEq("at_uri", models.LabelGoodFirstIssue)) 297 + gfiLabel, err := db.GetLabelDefinition(s.db, db.FilterEq("at_uri", s.config.Label.GoodFirstIssue)) 298 298 if err != nil { 299 299 // non-fatal 300 300 } ··· 517 517 Rkey: rkey, 518 518 Description: description, 519 519 Created: time.Now(), 520 - Labels: models.DefaultLabelDefs(), 520 + Labels: s.config.Label.DefaultLabelDefs, 521 521 } 522 522 record := repo.AsRecord() 523 523 ··· 659 659 return err 660 660 } 661 661 662 - func BackfillDefaultDefs(e db.Execer, r *idresolver.Resolver) error { 663 - defaults := models.DefaultLabelDefs() 662 + func BackfillDefaultDefs(e db.Execer, r *idresolver.Resolver, defaults []string) error { 664 663 defaultLabels, err := db.GetLabelDefinitions(e, db.FilterIn("at_uri", defaults)) 665 664 if err != nil { 666 665 return err ··· 669 670 return nil 670 671 } 671 672 672 - labelDefs, err := models.FetchDefaultDefs(r) 673 + labelDefs, err := models.FetchLabelDefs(r, defaults) 673 674 if err != nil { 674 675 return err 675 676 }