This repository has no description
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}