This repository has no description
0

Configure Feed

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

core / appview / migration / migrate_add_repo_did.go
4.2 kB 151 lines
1package migration 2 3import ( 4 "context" 5 "fmt" 6 "strings" 7 8 comatproto "github.com/bluesky-social/indigo/api/atproto" 9 "github.com/bluesky-social/indigo/atproto/atclient" 10 "github.com/bluesky-social/indigo/atproto/syntax" 11 lexutil "github.com/bluesky-social/indigo/lex/util" 12 "tangled.org/core/api/tangled" 13 "tangled.org/core/appview/db" 14) 15 16func (s *Migration) migrateAddRepoDid(ctx context.Context, client *atclient.APIClient, did syntax.DID, record syntax.ATURI) error { 17 // TODO: use agnostic.RepoGetRecord instead 18 ex, err := comatproto.RepoGetRecord(ctx, client, "", record.Collection().String(), did.String(), record.RecordKey().String()) 19 if err != nil { 20 return fmt.Errorf("pds: %w", err) 21 } 22 23 val := ex.Value.Val 24 25 switch record.Collection() { 26 case tangled.RepoNSID: 27 rec, ok := val.(*tangled.Repo) 28 if !ok { 29 return fmt.Errorf("unexpected type for repo record") 30 } 31 repo, err := db.GetRepoByAtUri(s.db, record.String()) 32 if err != nil { 33 return fmt.Errorf("db: failed to query repo: %w", err) 34 } 35 rec.RepoDid = &repo.RepoDid 36 37 case tangled.RepoIssueNSID: 38 rec, ok := val.(*tangled.RepoIssue) 39 if !ok { 40 return fmt.Errorf("unexpected type for issue record") 41 } 42 if rec.Repo != nil { 43 repoAt := *rec.Repo 44 repo, err := db.GetRepoByAtUri(s.db, repoAt) 45 if err != nil { 46 return fmt.Errorf("db: failed to query repo: %w", err) 47 } 48 rec.RepoDid = &repo.RepoDid 49 } 50 51 case tangled.RepoPullNSID: 52 rec, ok := val.(*tangled.RepoPull) 53 if !ok { 54 return fmt.Errorf("unexpected type for pull record") 55 } 56 if rec.Target != nil && rec.Target.Repo != nil { 57 repoAt := *rec.Target.Repo 58 repo, err := db.GetRepoByAtUri(s.db, repoAt) 59 if err != nil { 60 return fmt.Errorf("db: failed to query repo: %w", err) 61 } 62 rec.Target.RepoDid = &repo.RepoDid 63 } 64 if rec.Source != nil && rec.Source.Repo != nil { 65 repoAt := *rec.Source.Repo 66 repo, err := db.GetRepoByAtUri(s.db, repoAt) 67 if err != nil { 68 return fmt.Errorf("db: failed to query repo: %w", err) 69 } 70 rec.Source.RepoDid = &repo.RepoDid 71 } 72 73 case tangled.RepoCollaboratorNSID: 74 rec, ok := val.(*tangled.RepoCollaborator) 75 if !ok { 76 return fmt.Errorf("unexpected type for collaborator record") 77 } 78 if rec.Repo != nil { 79 repoAt := *rec.Repo 80 repo, err := db.GetRepoByAtUri(s.db, repoAt) 81 if err != nil { 82 return fmt.Errorf("db: failed to query repo: %w", err) 83 } 84 rec.RepoDid = &repo.RepoDid 85 } 86 87 case tangled.RepoArtifactNSID: 88 rec, ok := val.(*tangled.RepoArtifact) 89 if !ok { 90 return fmt.Errorf("unexpected type for artifact record") 91 } 92 if rec.Repo != nil { 93 repoAt := *rec.Repo 94 repo, err := db.GetRepoByAtUri(s.db, repoAt) 95 if err != nil { 96 return fmt.Errorf("db: failed to query repo: %w", err) 97 } 98 rec.RepoDid = &repo.RepoDid 99 } 100 101 case tangled.FeedStarNSID: 102 rec, ok := val.(*tangled.FeedStar) 103 if !ok { 104 return fmt.Errorf("unexpected type for star record") 105 } 106 if rec.Subject != nil { 107 repoAt := *rec.Subject 108 repo, err := db.GetRepoByAtUri(s.db, repoAt) 109 if err != nil { 110 return fmt.Errorf("db: failed to query repo: %w", err) 111 } 112 rec.SubjectDid = &repo.RepoDid 113 } 114 115 case tangled.ActorProfileNSID: 116 rec, ok := val.(*tangled.ActorProfile) 117 if !ok { 118 return fmt.Errorf("unexpected type for profile record") 119 } 120 rewritten := make([]string, 0, len(rec.PinnedRepositories)) 121 for _, pin := range rec.PinnedRepositories { 122 if strings.HasPrefix(pin, "did:") { 123 rewritten = append(rewritten, pin) 124 continue 125 } 126 repo, repoErr := db.GetRepoByAtUri(s.db, pin) 127 if repoErr != nil || repo.RepoDid == "" { 128 rewritten = append(rewritten, pin) 129 continue 130 } 131 rewritten = append(rewritten, repo.RepoDid) 132 } 133 rec.PinnedRepositories = rewritten 134 135 default: 136 return fmt.Errorf("unexpected collection: '%s'", record.Collection()) 137 } 138 139 _, err = comatproto.RepoPutRecord(ctx, client, &comatproto.RepoPutRecord_Input{ 140 Repo: did.String(), 141 Collection: record.Collection().String(), 142 Rkey: record.RecordKey().String(), 143 SwapRecord: ex.Cid, 144 Record: &lexutil.LexiconTypeDecoder{Val: val}, 145 }) 146 if err != nil { 147 return fmt.Errorf("put record: %w", err) 148 } 149 150 return nil 151}