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