back interdiff of round #1 and #0

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

files
appview
db
labels
models
pages
templates
repo
settings
repo
state
ERROR
appview/ingester.go

Failed to calculate interdiff for this file.

ERROR
appview/labels/labels.go

Failed to calculate interdiff for this file.

ERROR
appview/pages/pages.go

Failed to calculate interdiff for this file.

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

Failed to calculate interdiff for this file.

ERROR
appview/repo/repo.go

Failed to calculate interdiff for this file.

ERROR
appview/state/state.go

Failed to calculate interdiff for this file.

NEW
appview/db/db.go
···
-- label to subscribe to
label_at text not null,
-
unique (repo_at, label_at),
-
foreign key (label_at) references label_definitions (at_uri)
+
unique (repo_at, label_at)
);
create table if not exists migrations (
NEW
appview/db/repos.go
···
return &repo, nil
}
-
func AddRepo(e Execer, repo *models.Repo) error {
-
_, err := e.Exec(
+
func AddRepo(tx *sql.Tx, repo *models.Repo) error {
+
_, err := tx.Exec(
`insert into repos
(did, name, knot, rkey, at_uri, description, source)
values (?, ?, ?, ?, ?, ?, ?)`,
repo.Did, repo.Name, repo.Knot, repo.Rkey, repo.RepoAt().String(), repo.Description, repo.Source,
)
-
return err
+
if err != nil {
+
return fmt.Errorf("failed to insert repo: %w", err)
+
}
+
+
for _, dl := range repo.Labels {
+
if err := SubscribeLabel(tx, &models.RepoLabel{
+
RepoAt: repo.RepoAt(),
+
LabelAt: syntax.ATURI(dl),
+
}); err != nil {
+
return fmt.Errorf("failed to subscribe to label: %w", err)
+
}
+
}
+
+
return nil
}
func RemoveRepo(e Execer, did, name string) error {
NEW
appview/models/label.go
···
package models
import (
+
"context"
"crypto/sha1"
"encoding/hex"
+
"encoding/json"
"errors"
"fmt"
"slices"
"time"
+
"github.com/bluesky-social/indigo/api/atproto"
"github.com/bluesky-social/indigo/atproto/syntax"
+
"github.com/bluesky-social/indigo/xrpc"
"tangled.org/core/api/tangled"
"tangled.org/core/consts"
+
"tangled.org/core/idresolver"
)
type ConcreteType string
···
return defs
}
+
+
func FetchDefaultDefs(r *idresolver.Resolver) ([]LabelDefinition, error) {
+
resolved, err := r.ResolveIdent(context.Background(), consts.TangledDid)
+
if err != nil {
+
return nil, fmt.Errorf("failed to resolve tangled.sh DID %s: %v", consts.TangledDid, err)
+
}
+
pdsEndpoint := resolved.PDSEndpoint()
+
if pdsEndpoint == "" {
+
return nil, fmt.Errorf("no PDS endpoint found for tangled.sh DID %s", consts.TangledDid)
+
}
+
client := &xrpc.Client{
+
Host: pdsEndpoint,
+
}
+
+
var labelDefs []LabelDefinition
+
+
for _, dl := range DefaultLabelDefs() {
+
atUri := syntax.ATURI(dl)
+
parsedUri, err := syntax.ParseATURI(string(atUri))
+
if err != nil {
+
return nil, fmt.Errorf("failed to parse AT-URI %s: %v", atUri, err)
+
}
+
record, err := atproto.RepoGetRecord(
+
context.Background(),
+
client,
+
"",
+
parsedUri.Collection().String(),
+
parsedUri.Authority().String(),
+
parsedUri.RecordKey().String(),
+
)
+
if err != nil {
+
return nil, fmt.Errorf("failed to get record for %s: %v", atUri, err)
+
}
+
+
if record != nil {
+
bytes, err := record.Value.MarshalJSON()
+
if err != nil {
+
return nil, fmt.Errorf("failed to marshal record value for %s: %v", atUri, err)
+
}
+
+
raw := json.RawMessage(bytes)
+
labelRecord := tangled.LabelDefinition{}
+
err = json.Unmarshal(raw, &labelRecord)
+
if err != nil {
+
return nil, fmt.Errorf("invalid record for %s: %w", atUri, err)
+
}
+
+
labelDef, err := LabelDefinitionFromRecord(
+
parsedUri.Authority().String(),
+
parsedUri.RecordKey().String(),
+
labelRecord,
+
)
+
if err != nil {
+
return nil, fmt.Errorf("failed to create label definition from record %s: %v", atUri, err)
+
}
+
+
labelDefs = append(labelDefs, *labelDef)
+
}
+
}
+
+
return labelDefs, nil
+
}