From e75e03eb12d7c4ca5f8c1cd33e5e69968ff5a0f6 Mon Sep 17 00:00:00 2001 From: Lewis Date: Mon, 11 May 2026 13:28:58 +0300 Subject: [PATCH] appview: small fixes Lewis: May this revision serve well! --- appview/db/db.go | 5 ++ appview/migration/migrate_add_repo_did.go | 64 ++++++++++++++++++++++- 2 files changed, 68 insertions(+), 1 deletion(-) diff --git a/appview/db/db.go b/appview/db/db.go index ba0ed3cd..6f34436d 100644 --- a/appview/db/db.go +++ b/appview/db/db.go @@ -1956,6 +1956,11 @@ func Make(ctx context.Context, dbPath string) (*DB, error) { return err }) + orm.RunMigration(conn, logger, "drop-ghost-comments-table", func(tx *sql.Tx) error { + _, err := tx.Exec(`DROP TABLE IF EXISTS comments`) + return err + }) + return &DB{ db, logger, diff --git a/appview/migration/migrate_add_repo_did.go b/appview/migration/migrate_add_repo_did.go index 80622037..1efdfea3 100644 --- a/appview/migration/migrate_add_repo_did.go +++ b/appview/migration/migrate_add_repo_did.go @@ -5,6 +5,7 @@ import ( "encoding/json" "fmt" "strings" + "time" comatproto "github.com/bluesky-social/indigo/api/atproto" "github.com/bluesky-social/indigo/atproto/atclient" @@ -14,6 +15,36 @@ import ( "tangled.org/core/appview/db" ) +func (s *Migration) ensureCreatedAt(ctx context.Context, client *atclient.APIClient, did syntax.DID, record syntax.ATURI, current string) (string, error) { + if t, err := time.Parse(time.RFC3339, current); err == nil { + return t.UTC().Format(time.RFC3339), nil + } + var raw struct { + Value struct { + CreatedAt *string `json:"createdAt,omitempty"` + AddedAt *string `json:"addedAt,omitempty"` + } `json:"value"` + } + params := map[string]any{ + "collection": record.Collection().String(), + "repo": did.String(), + "rkey": record.RecordKey().String(), + } + if err := client.LexDo(ctx, lexutil.Query, "", "com.atproto.repo.getRecord", params, nil, &raw); err != nil { + return "", fmt.Errorf("ensure createdAt: get record: %w", err) + } + for _, cand := range []*string{raw.Value.CreatedAt, raw.Value.AddedAt} { + if cand == nil || *cand == "" { + continue + } + if t, err := time.Parse(time.RFC3339, *cand); err == nil { + return t.UTC().Format(time.RFC3339), nil + } + } + s.logger.Warn("createdAt unparseable, defaulting to now", "record", record.String()) + return time.Now().UTC().Format(time.RFC3339), nil +} + func (s *Migration) migrateAddRepoDid(ctx context.Context, client *atclient.APIClient, did syntax.DID, record syntax.ATURI) error { if record.Collection().String() == tangled.FeedStarNSID { return s.migrateAddRepoDidStar(ctx, client, did, record) @@ -37,6 +68,10 @@ func (s *Migration) migrateAddRepoDid(ctx context.Context, client *atclient.APIC return fmt.Errorf("db: failed to query repo: %w", err) } rec.RepoDid = &repo.RepoDid + rec.CreatedAt, err = s.ensureCreatedAt(ctx, client, did, record, rec.CreatedAt) + if err != nil { + return err + } case tangled.RepoIssueNSID: rec, ok := val.(*tangled.RepoIssue) @@ -51,6 +86,10 @@ func (s *Migration) migrateAddRepoDid(ctx context.Context, client *atclient.APIC return fmt.Errorf("db: failed to query repo by at_uri %q: %w", rec.Repo, err) } rec.Repo = repo.RepoDid + rec.CreatedAt, err = s.ensureCreatedAt(ctx, client, did, record, rec.CreatedAt) + if err != nil { + return err + } case tangled.RepoPullNSID: rec, ok := val.(*tangled.RepoPull) @@ -73,6 +112,10 @@ func (s *Migration) migrateAddRepoDid(ctx context.Context, client *atclient.APIC rec.Source.Repo = &sourceRepo.RepoDid } } + rec.CreatedAt, err = s.ensureCreatedAt(ctx, client, did, record, rec.CreatedAt) + if err != nil { + return err + } case tangled.RepoCollaboratorNSID: rec, ok := val.(*tangled.RepoCollaborator) @@ -87,6 +130,10 @@ func (s *Migration) migrateAddRepoDid(ctx context.Context, client *atclient.APIC return fmt.Errorf("db: failed to query repo by at_uri %q: %w", rec.Repo, err) } rec.Repo = repo.RepoDid + rec.CreatedAt, err = s.ensureCreatedAt(ctx, client, did, record, rec.CreatedAt) + if err != nil { + return err + } case tangled.RepoArtifactNSID: rec, ok := val.(*tangled.RepoArtifact) @@ -100,6 +147,10 @@ func (s *Migration) migrateAddRepoDid(ctx context.Context, client *atclient.APIC } rec.RepoDid = &repo.RepoDid } + rec.CreatedAt, err = s.ensureCreatedAt(ctx, client, did, record, rec.CreatedAt) + if err != nil { + return err + } case tangled.ActorProfileNSID: rec, ok := val.(*tangled.ActorProfile) @@ -156,6 +207,7 @@ func (s *Migration) migrateAddRepoDidStar(ctx context.Context, client *atclient. var legacy struct { CreatedAt string `json:"createdAt"` + AddedAt string `json:"addedAt"` Subject *string `json:"subject,omitempty"` } if err := json.Unmarshal(raw.Value, &legacy); err != nil { @@ -173,8 +225,18 @@ func (s *Migration) migrateAddRepoDidStar(ctx context.Context, client *atclient. return fmt.Errorf("repo has no repoDid: %s", *legacy.Subject) } + createdAt := legacy.CreatedAt + if t, err := time.Parse(time.RFC3339, createdAt); err == nil { + createdAt = t.UTC().Format(time.RFC3339) + } else if t, err := time.Parse(time.RFC3339, legacy.AddedAt); err == nil { + createdAt = t.UTC().Format(time.RFC3339) + } else { + s.logger.Warn("star createdAt unparseable, defaulting to now", "record", record.String()) + createdAt = time.Now().UTC().Format(time.RFC3339) + } + newRecord := &tangled.FeedStar{ - CreatedAt: legacy.CreatedAt, + CreatedAt: createdAt, Subject: &tangled.FeedStar_Subject{ FeedStar_Repo: &tangled.FeedStar_Repo{Did: repo.RepoDid}, }, -- 2.51.2