Monorepo for Tangled tangled.org

appview/labels: add "subscribe all" button for default labels #597

merged opened by oppi.li targeting master from push-lxxtrqtnnoxy

quickly subscribe to all default labels.

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

Labels

None yet.

assignee

None yet.

Participants 1
AT URI
at://did:plc:qfpnj4og54vl56wngdriaxug/sh.tangled.repo.pull/3lzlsf4d5rm22
+117 -5
Interdiff #0 #1
appview/ingester.go

This file has not been changed.

appview/labels/labels.go

This file has not been changed.

appview/pages/pages.go

This file has not been changed.

appview/pages/templates/repo/settings/general.html

This file has not been changed.

+1
appview/repo/repo.go
··· 2191 2191 Source: sourceAt, 2192 2192 Description: existingRepo.Description, 2193 2193 Created: time.Now(), 2194 + Labels: models.DefaultLabelDefs(), 2194 2195 } 2195 2196 record := repo.AsRecord() 2196 2197
+32
appview/state/state.go
··· 118 118 return nil, fmt.Errorf("failed to create jetstream client: %w", err) 119 119 } 120 120 121 + if err := db.BackfillDefaultDefs(d, res); err != nil { 122 + return nil, fmt.Errorf("failed to backfill default label defs: %w", err) 123 + } 124 + 121 125 ingester := appview.Ingester{ 122 126 Db: wrapper, 123 127 Enforcer: enforcer, ··· 441 445 Rkey: rkey, 442 446 Description: description, 443 447 Created: time.Now(), 448 + Labels: models.DefaultLabelDefs(), 444 449 } 445 450 record := repo.AsRecord() 446 451 ··· 580 585 581 586 }) 582 587 return err 588 + } 589 + 590 + func BackfillDefaultDefs(e db.Execer, r *idresolver.Resolver) error { 591 + defaults := models.DefaultLabelDefs() 592 + defaultLabels, err := db.GetLabelDefinitions(e, db.FilterIn("at_uri", defaults)) 593 + if err != nil { 594 + return err 595 + } 596 + // already present 597 + if len(defaultLabels) == len(defaults) { 598 + return nil 599 + } 600 + 601 + labelDefs, err := models.FetchDefaultDefs(r) 602 + if err != nil { 603 + return err 604 + } 605 + 606 + // Insert each label definition to the database 607 + for _, labelDef := range labelDefs { 608 + _, err = db.AddLabelDefinition(e, &labelDef) 609 + if err != nil { 610 + return fmt.Errorf("failed to add label definition %s: %v", labelDef.Name, err) 611 + } 612 + } 613 + 614 + return nil 583 615 }
+1 -2
appview/db/db.go
··· 527 527 -- label to subscribe to 528 528 label_at text not null, 529 529 530 - unique (repo_at, label_at), 531 - foreign key (label_at) references label_definitions (at_uri) 530 + unique (repo_at, label_at) 532 531 ); 533 532 534 533 create table if not exists migrations (
+16 -3
appview/db/repos.go
··· 345 345 return &repo, nil 346 346 } 347 347 348 - func AddRepo(e Execer, repo *models.Repo) error { 349 - _, err := e.Exec( 348 + func AddRepo(tx *sql.Tx, repo *models.Repo) error { 349 + _, err := tx.Exec( 350 350 `insert into repos 351 351 (did, name, knot, rkey, at_uri, description, source) 352 352 values (?, ?, ?, ?, ?, ?, ?)`, 353 353 repo.Did, repo.Name, repo.Knot, repo.Rkey, repo.RepoAt().String(), repo.Description, repo.Source, 354 354 ) 355 - return err 355 + if err != nil { 356 + return fmt.Errorf("failed to insert repo: %w", err) 357 + } 358 + 359 + for _, dl := range repo.Labels { 360 + if err := SubscribeLabel(tx, &models.RepoLabel{ 361 + RepoAt: repo.RepoAt(), 362 + LabelAt: syntax.ATURI(dl), 363 + }); err != nil { 364 + return fmt.Errorf("failed to subscribe to label: %w", err) 365 + } 366 + } 367 + 368 + return nil 356 369 } 357 370 358 371 func RemoveRepo(e Execer, did, name string) error {
+67
appview/models/label.go
··· 1 1 package models 2 2 3 3 import ( 4 + "context" 4 5 "crypto/sha1" 5 6 "encoding/hex" 7 + "encoding/json" 6 8 "errors" 7 9 "fmt" 8 10 "slices" 9 11 "time" 10 12 13 + "github.com/bluesky-social/indigo/api/atproto" 11 14 "github.com/bluesky-social/indigo/atproto/syntax" 15 + "github.com/bluesky-social/indigo/xrpc" 12 16 "tangled.org/core/api/tangled" 13 17 "tangled.org/core/consts" 18 + "tangled.org/core/idresolver" 14 19 ) 15 20 16 21 type ConcreteType string ··· 471 476 472 477 return defs 473 478 } 479 + 480 + func FetchDefaultDefs(r *idresolver.Resolver) ([]LabelDefinition, error) { 481 + resolved, err := r.ResolveIdent(context.Background(), consts.TangledDid) 482 + if err != nil { 483 + return nil, fmt.Errorf("failed to resolve tangled.sh DID %s: %v", consts.TangledDid, err) 484 + } 485 + pdsEndpoint := resolved.PDSEndpoint() 486 + if pdsEndpoint == "" { 487 + return nil, fmt.Errorf("no PDS endpoint found for tangled.sh DID %s", consts.TangledDid) 488 + } 489 + client := &xrpc.Client{ 490 + Host: pdsEndpoint, 491 + } 492 + 493 + var labelDefs []LabelDefinition 494 + 495 + for _, dl := range DefaultLabelDefs() { 496 + atUri := syntax.ATURI(dl) 497 + parsedUri, err := syntax.ParseATURI(string(atUri)) 498 + if err != nil { 499 + return nil, fmt.Errorf("failed to parse AT-URI %s: %v", atUri, err) 500 + } 501 + record, err := atproto.RepoGetRecord( 502 + context.Background(), 503 + client, 504 + "", 505 + parsedUri.Collection().String(), 506 + parsedUri.Authority().String(), 507 + parsedUri.RecordKey().String(), 508 + ) 509 + if err != nil { 510 + return nil, fmt.Errorf("failed to get record for %s: %v", atUri, err) 511 + } 512 + 513 + if record != nil { 514 + bytes, err := record.Value.MarshalJSON() 515 + if err != nil { 516 + return nil, fmt.Errorf("failed to marshal record value for %s: %v", atUri, err) 517 + } 518 + 519 + raw := json.RawMessage(bytes) 520 + labelRecord := tangled.LabelDefinition{} 521 + err = json.Unmarshal(raw, &labelRecord) 522 + if err != nil { 523 + return nil, fmt.Errorf("invalid record for %s: %w", atUri, err) 524 + } 525 + 526 + labelDef, err := LabelDefinitionFromRecord( 527 + parsedUri.Authority().String(), 528 + parsedUri.RecordKey().String(), 529 + labelRecord, 530 + ) 531 + if err != nil { 532 + return nil, fmt.Errorf("failed to create label definition from record %s: %v", atUri, err) 533 + } 534 + 535 + labelDefs = append(labelDefs, *labelDef) 536 + } 537 + } 538 + 539 + return labelDefs, nil 540 + }

History

2 rounds 0 comments
sign up or login to add to the discussion
oppi.li submitted #1
1 commit
expand
appview/labels: add "subscribe all" button for default labels
expand 0 comments
pull request successfully merged
oppi.li submitted #0
1 commit
expand
appview/labels: add "subscribe all" button for default labels
expand 0 comments