Monorepo for Tangled
0

Configure Feed

Select the types of activity you want to include in your feed.

appview: small fixes

Lewis: May this revision serve well! <lewis@tangled.org>

author
Lewis
committer
Tangled
date (May 12, 2026, 11:59 AM +0300) commit e75e03eb parent 4c5a28f5 change-id nuokqrzl
+68 -1
+5
appview/db/db.go
··· 1956 1956 return err 1957 1957 }) 1958 1958 1959 + orm.RunMigration(conn, logger, "drop-ghost-comments-table", func(tx *sql.Tx) error { 1960 + _, err := tx.Exec(`DROP TABLE IF EXISTS comments`) 1961 + return err 1962 + }) 1963 + 1959 1964 return &DB{ 1960 1965 db, 1961 1966 logger,
+63 -1
appview/migration/migrate_add_repo_did.go
··· 5 5 "encoding/json" 6 6 "fmt" 7 7 "strings" 8 + "time" 8 9 9 10 comatproto "github.com/bluesky-social/indigo/api/atproto" 10 11 "github.com/bluesky-social/indigo/atproto/atclient" ··· 14 15 "tangled.org/core/appview/db" 15 16 ) 16 17 18 + func (s *Migration) ensureCreatedAt(ctx context.Context, client *atclient.APIClient, did syntax.DID, record syntax.ATURI, current string) (string, error) { 19 + if t, err := time.Parse(time.RFC3339, current); err == nil { 20 + return t.UTC().Format(time.RFC3339), nil 21 + } 22 + var raw struct { 23 + Value struct { 24 + CreatedAt *string `json:"createdAt,omitempty"` 25 + AddedAt *string `json:"addedAt,omitempty"` 26 + } `json:"value"` 27 + } 28 + params := map[string]any{ 29 + "collection": record.Collection().String(), 30 + "repo": did.String(), 31 + "rkey": record.RecordKey().String(), 32 + } 33 + if err := client.LexDo(ctx, lexutil.Query, "", "com.atproto.repo.getRecord", params, nil, &raw); err != nil { 34 + return "", fmt.Errorf("ensure createdAt: get record: %w", err) 35 + } 36 + for _, cand := range []*string{raw.Value.CreatedAt, raw.Value.AddedAt} { 37 + if cand == nil || *cand == "" { 38 + continue 39 + } 40 + if t, err := time.Parse(time.RFC3339, *cand); err == nil { 41 + return t.UTC().Format(time.RFC3339), nil 42 + } 43 + } 44 + s.logger.Warn("createdAt unparseable, defaulting to now", "record", record.String()) 45 + return time.Now().UTC().Format(time.RFC3339), nil 46 + } 47 + 17 48 func (s *Migration) migrateAddRepoDid(ctx context.Context, client *atclient.APIClient, did syntax.DID, record syntax.ATURI) error { 18 49 if record.Collection().String() == tangled.FeedStarNSID { 19 50 return s.migrateAddRepoDidStar(ctx, client, did, record) ··· 37 68 return fmt.Errorf("db: failed to query repo: %w", err) 38 69 } 39 70 rec.RepoDid = &repo.RepoDid 71 + rec.CreatedAt, err = s.ensureCreatedAt(ctx, client, did, record, rec.CreatedAt) 72 + if err != nil { 73 + return err 74 + } 40 75 41 76 case tangled.RepoIssueNSID: 42 77 rec, ok := val.(*tangled.RepoIssue) ··· 51 86 return fmt.Errorf("db: failed to query repo by at_uri %q: %w", rec.Repo, err) 52 87 } 53 88 rec.Repo = repo.RepoDid 89 + rec.CreatedAt, err = s.ensureCreatedAt(ctx, client, did, record, rec.CreatedAt) 90 + if err != nil { 91 + return err 92 + } 54 93 55 94 case tangled.RepoPullNSID: 56 95 rec, ok := val.(*tangled.RepoPull) ··· 73 112 rec.Source.Repo = &sourceRepo.RepoDid 74 113 } 75 114 } 115 + rec.CreatedAt, err = s.ensureCreatedAt(ctx, client, did, record, rec.CreatedAt) 116 + if err != nil { 117 + return err 118 + } 76 119 77 120 case tangled.RepoCollaboratorNSID: 78 121 rec, ok := val.(*tangled.RepoCollaborator) ··· 87 130 return fmt.Errorf("db: failed to query repo by at_uri %q: %w", rec.Repo, err) 88 131 } 89 132 rec.Repo = repo.RepoDid 133 + rec.CreatedAt, err = s.ensureCreatedAt(ctx, client, did, record, rec.CreatedAt) 134 + if err != nil { 135 + return err 136 + } 90 137 91 138 case tangled.RepoArtifactNSID: 92 139 rec, ok := val.(*tangled.RepoArtifact) ··· 100 147 } 101 148 rec.RepoDid = &repo.RepoDid 102 149 } 150 + rec.CreatedAt, err = s.ensureCreatedAt(ctx, client, did, record, rec.CreatedAt) 151 + if err != nil { 152 + return err 153 + } 103 154 104 155 case tangled.ActorProfileNSID: 105 156 rec, ok := val.(*tangled.ActorProfile) ··· 156 207 157 208 var legacy struct { 158 209 CreatedAt string `json:"createdAt"` 210 + AddedAt string `json:"addedAt"` 159 211 Subject *string `json:"subject,omitempty"` 160 212 } 161 213 if err := json.Unmarshal(raw.Value, &legacy); err != nil { ··· 173 225 return fmt.Errorf("repo has no repoDid: %s", *legacy.Subject) 174 226 } 175 227 228 + createdAt := legacy.CreatedAt 229 + if t, err := time.Parse(time.RFC3339, createdAt); err == nil { 230 + createdAt = t.UTC().Format(time.RFC3339) 231 + } else if t, err := time.Parse(time.RFC3339, legacy.AddedAt); err == nil { 232 + createdAt = t.UTC().Format(time.RFC3339) 233 + } else { 234 + s.logger.Warn("star createdAt unparseable, defaulting to now", "record", record.String()) 235 + createdAt = time.Now().UTC().Format(time.RFC3339) 236 + } 237 + 176 238 newRecord := &tangled.FeedStar{ 177 - CreatedAt: legacy.CreatedAt, 239 + CreatedAt: createdAt, 178 240 Subject: &tangled.FeedStar_Subject{ 179 241 FeedStar_Repo: &tangled.FeedStar_Repo{Did: repo.RepoDid}, 180 242 },