Signed-off-by: Lewis lewis@tangled.org
+152
-24
Diff
round #11
+39
appview/db/db.go
+39
appview/db/db.go
···
1287
1287
return err
1288
1288
})
1289
1289
1290
+
orm.RunMigration(conn, logger, "add-repo-did-column", func(tx *sql.Tx) error {
1291
+
_, err := tx.Exec(`
1292
+
alter table repos add column repo_did text;
1293
+
create unique index if not exists idx_repos_repo_did on repos(repo_did);
1294
+
`)
1295
+
return err
1296
+
})
1297
+
1298
+
orm.RunMigration(conn, logger, "add-pds-rewrite-status", func(tx *sql.Tx) error {
1299
+
_, err := tx.Exec(`
1300
+
create table if not exists pds_rewrite_status (
1301
+
id integer primary key autoincrement,
1302
+
user_did text not null,
1303
+
repo_did text not null,
1304
+
record_nsid text not null,
1305
+
record_rkey text not null,
1306
+
old_repo_at text not null,
1307
+
status text not null default 'pending',
1308
+
updated_at text not null default (strftime('%Y-%m-%dT%H:%M:%SZ', 'now')),
1309
+
unique(user_did, record_nsid, record_rkey)
1310
+
);
1311
+
create index if not exists idx_pds_rewrite_user on pds_rewrite_status(user_did, status);
1312
+
`)
1313
+
return err
1314
+
})
1315
+
1316
+
orm.RunMigration(conn, logger, "add-pipelines-repo-did", func(tx *sql.Tx) error {
1317
+
_, err := tx.Exec(`
1318
+
alter table pipelines add column repo_did text;
1319
+
create index if not exists idx_pipelines_repo_did on pipelines(repo_did);
1320
+
`)
1321
+
return err
1322
+
})
1323
+
1324
+
orm.RunMigration(conn, logger, "migrate-knots-to-repo-dids", func(tx *sql.Tx) error {
1325
+
_, err := tx.Exec(`update registrations set needs_upgrade = 1`)
1326
+
return err
1327
+
})
1328
+
1290
1329
return &DB{
1291
1330
db,
1292
1331
logger,
+21
-2
appview/db/pipeline.go
+21
-2
appview/db/pipeline.go
···
1
1
package db
2
2
3
3
import (
4
+
"database/sql"
4
5
"fmt"
5
6
"slices"
6
7
"strings"
···
26
27
whereClause = " where " + strings.Join(conditions, " and ")
27
28
}
28
29
29
-
query := fmt.Sprintf(`select id, rkey, knot, repo_owner, repo_name, sha, created from pipelines %s`, whereClause)
30
+
query := fmt.Sprintf(`select id, rkey, knot, repo_owner, repo_name, sha, created, repo_did from pipelines %s`, whereClause)
30
31
31
32
rows, err := e.Query(query, args...)
32
33
···
38
39
for rows.Next() {
39
40
var pipeline models.Pipeline
40
41
var createdAt string
42
+
var repoDid sql.NullString
41
43
err = rows.Scan(
42
44
&pipeline.Id,
43
45
&pipeline.Rkey,
···
46
48
&pipeline.RepoName,
47
49
&pipeline.Sha,
48
50
&createdAt,
51
+
&repoDid,
49
52
)
50
53
if err != nil {
51
54
return nil, err
···
54
57
if t, err := time.Parse(time.RFC3339, createdAt); err == nil {
55
58
pipeline.Created = t
56
59
}
60
+
if repoDid.Valid {
61
+
pipeline.RepoDid = repoDid.String
62
+
}
57
63
58
64
pipelines = append(pipelines, pipeline)
59
65
}
···
66
72
}
67
73
68
74
func AddPipeline(e Execer, pipeline models.Pipeline) error {
75
+
var repoDid *string
76
+
if pipeline.RepoDid != "" {
77
+
repoDid = &pipeline.RepoDid
78
+
}
79
+
69
80
args := []any{
70
81
pipeline.Rkey,
71
82
pipeline.Knot,
···
73
84
pipeline.RepoName,
74
85
pipeline.TriggerId,
75
86
pipeline.Sha,
87
+
repoDid,
76
88
}
77
89
78
90
placeholders := make([]string, len(args))
···
87
99
repo_owner,
88
100
repo_name,
89
101
trigger_id,
90
-
sha
102
+
sha,
103
+
repo_did
91
104
) values (%s)
92
105
`, strings.Join(placeholders, ","))
93
106
···
195
208
p.repo_name,
196
209
p.sha,
197
210
p.created,
211
+
p.repo_did,
198
212
t.id,
199
213
t.kind,
200
214
t.push_ref,
···
224
238
var p models.Pipeline
225
239
var t models.Trigger
226
240
var created string
241
+
var repoDid sql.NullString
227
242
228
243
err := rows.Scan(
229
244
&p.Id,
···
233
248
&p.RepoName,
234
249
&p.Sha,
235
250
&created,
251
+
&repoDid,
236
252
&p.TriggerId,
237
253
&t.Kind,
238
254
&t.PushRef,
···
251
267
if err != nil {
252
268
return nil, fmt.Errorf("invalid pipeline created timestamp %q: %w", created, err)
253
269
}
270
+
if repoDid.Valid {
271
+
p.RepoDid = repoDid.String
272
+
}
254
273
255
274
t.Id = p.TriggerId
256
275
p.Trigger = &t
+1
-1
appview/db/pulls.go
+1
-1
appview/db/pulls.go
···
614
614
615
615
func SetPullState(e Execer, repoAt syntax.ATURI, pullId int, pullState models.PullState) error {
616
616
_, err := e.Exec(
617
-
`update pulls set state = ? where repo_at = ? and pull_id = ? and (state <> ? or state <> ?)`,
617
+
`update pulls set state = ? where repo_at = ? and pull_id = ? and (state <> ? and state <> ?)`,
618
618
pullState,
619
619
repoAt,
620
620
pullId,
+67
-15
appview/db/repos.go
+67
-15
appview/db/repos.go
···
46
46
website,
47
47
topics,
48
48
source,
49
-
spindle
49
+
spindle,
50
+
repo_did
50
51
from
51
52
repos r
52
53
%s
···
64
65
for rows.Next() {
65
66
var repo models.Repo
66
67
var createdAt string
67
-
var description, website, topicStr, source, spindle sql.NullString
68
+
var description, website, topicStr, source, spindle, repoDid sql.NullString
68
69
69
70
err := rows.Scan(
70
71
&repo.Id,
···
78
79
&topicStr,
79
80
&source,
80
81
&spindle,
82
+
&repoDid,
81
83
)
82
84
if err != nil {
83
85
return nil, fmt.Errorf("failed to execute repo query: %w ", err)
···
101
103
if spindle.Valid {
102
104
repo.Spindle = spindle.String
103
105
}
106
+
if repoDid.Valid {
107
+
repo.RepoDid = repoDid.String
108
+
}
104
109
105
110
repo.RepoStats = &models.RepoStats{}
106
111
repoMap[repo.RepoAt()] = &repo
···
185
190
}
186
191
187
192
starCountQuery := fmt.Sprintf(
188
-
`select
189
-
subject_at, count(1)
193
+
`select subject_at, count(1)
190
194
from stars
191
195
where subject_at in (%s)
192
196
group by subject_at`,
···
352
356
var nullableDescription sql.NullString
353
357
var nullableWebsite sql.NullString
354
358
var nullableTopicStr sql.NullString
359
+
var nullableRepoDid sql.NullString
360
+
var nullableSource sql.NullString
361
+
var nullableSpindle sql.NullString
355
362
356
-
row := e.QueryRow(`select id, did, name, knot, created, rkey, description, website, topics from repos where at_uri = ?`, atUri)
363
+
row := e.QueryRow(`select id, did, name, knot, created, rkey, description, website, topics, source, spindle, repo_did from repos where at_uri = ?`, atUri)
357
364
358
365
var createdAt string
359
-
if err := row.Scan(&repo.Id, &repo.Did, &repo.Name, &repo.Knot, &createdAt, &repo.Rkey, &nullableDescription, &nullableWebsite, &nullableTopicStr); err != nil {
366
+
if err := row.Scan(&repo.Id, &repo.Did, &repo.Name, &repo.Knot, &createdAt, &repo.Rkey, &nullableDescription, &nullableWebsite, &nullableTopicStr, &nullableSource, &nullableSpindle, &nullableRepoDid); err != nil {
360
367
return nil, err
361
368
}
362
369
createdAtTime, _ := time.Parse(time.RFC3339, createdAt)
···
371
378
if nullableTopicStr.Valid {
372
379
repo.Topics = strings.Fields(nullableTopicStr.String)
373
380
}
381
+
if nullableSource.Valid {
382
+
repo.Source = nullableSource.String
383
+
}
384
+
if nullableSpindle.Valid {
385
+
repo.Spindle = nullableSpindle.String
386
+
}
387
+
if nullableRepoDid.Valid {
388
+
repo.RepoDid = nullableRepoDid.String
389
+
}
374
390
375
391
return &repo, nil
376
392
}
377
393
378
394
func PutRepo(tx *sql.Tx, repo models.Repo) error {
395
+
var repoDid *string
396
+
if repo.RepoDid != "" {
397
+
repoDid = &repo.RepoDid
398
+
}
379
399
_, err := tx.Exec(
380
400
`update repos
381
-
set knot = ?, description = ?, website = ?, topics = ?
401
+
set knot = ?, description = ?, website = ?, topics = ?, repo_did = coalesce(?, repo_did)
382
402
where did = ? and rkey = ?
383
403
`,
384
-
repo.Knot, repo.Description, repo.Website, repo.TopicStr(), repo.Did, repo.Rkey,
404
+
repo.Knot, repo.Description, repo.Website, repo.TopicStr(), repoDid, repo.Did, repo.Rkey,
385
405
)
386
406
return err
387
407
}
388
408
389
409
func AddRepo(tx *sql.Tx, repo *models.Repo) error {
410
+
var repoDid *string
411
+
if repo.RepoDid != "" {
412
+
repoDid = &repo.RepoDid
413
+
}
390
414
_, err := tx.Exec(
391
415
`insert into repos
392
-
(did, name, knot, rkey, at_uri, description, website, topics, source)
393
-
values (?, ?, ?, ?, ?, ?, ?, ?, ?)`,
394
-
repo.Did, repo.Name, repo.Knot, repo.Rkey, repo.RepoAt().String(), repo.Description, repo.Website, repo.TopicStr(), repo.Source,
416
+
(did, name, knot, rkey, at_uri, description, website, topics, source, repo_did)
417
+
values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
418
+
repo.Did, repo.Name, repo.Knot, repo.Rkey, repo.RepoAt().String(), repo.Description, repo.Website, repo.TopicStr(), repo.Source, repoDid,
395
419
)
396
420
if err != nil {
397
421
return fmt.Errorf("failed to insert repo: %w", err)
···
431
455
if err != nil {
432
456
return nil, err
433
457
}
458
+
if strings.HasPrefix(source, "did:") {
459
+
return GetRepoByDid(e, source)
460
+
}
434
461
return GetRepoByAtUri(e, source)
435
462
}
436
463
···
438
465
var repos []models.Repo
439
466
440
467
rows, err := e.Query(
441
-
`select distinct r.id, r.did, r.name, r.knot, r.rkey, r.description, r.website, r.created, r.source
468
+
`select distinct r.id, r.did, r.name, r.knot, r.rkey, r.description, r.website, r.created, r.source, r.repo_did
442
469
from repos r
443
470
left join collaborators c on r.at_uri = c.repo_at
444
471
where (r.did = ? or c.subject_did = ?)
···
458
485
var nullableDescription sql.NullString
459
486
var nullableWebsite sql.NullString
460
487
var nullableSource sql.NullString
488
+
var nullableRepoDid sql.NullString
461
489
462
-
err := rows.Scan(&repo.Id, &repo.Did, &repo.Name, &repo.Knot, &repo.Rkey, &nullableDescription, &nullableWebsite, &createdAt, &nullableSource)
490
+
err := rows.Scan(&repo.Id, &repo.Did, &repo.Name, &repo.Knot, &repo.Rkey, &nullableDescription, &nullableWebsite, &createdAt, &nullableSource, &nullableRepoDid)
463
491
if err != nil {
464
492
return nil, err
465
493
}
···
467
495
if nullableDescription.Valid {
468
496
repo.Description = nullableDescription.String
469
497
}
498
+
if nullableWebsite.Valid {
499
+
repo.Website = nullableWebsite.String
500
+
}
470
501
471
502
if nullableSource.Valid {
472
503
repo.Source = nullableSource.String
473
504
}
505
+
if nullableRepoDid.Valid {
506
+
repo.RepoDid = nullableRepoDid.String
507
+
}
474
508
475
509
createdAtTime, err := time.Parse(time.RFC3339, createdAt)
476
510
if err != nil {
···
496
530
var nullableWebsite sql.NullString
497
531
var nullableTopicStr sql.NullString
498
532
var nullableSource sql.NullString
533
+
var nullableRepoDid sql.NullString
499
534
500
535
row := e.QueryRow(
501
-
`select id, did, name, knot, rkey, description, website, topics, created, source
536
+
`select id, did, name, knot, rkey, description, website, topics, created, source, repo_did
502
537
from repos
503
538
where did = ? and name = ? and source is not null and source != ''`,
504
539
did, name,
505
540
)
506
541
507
-
err := row.Scan(&repo.Id, &repo.Did, &repo.Name, &repo.Knot, &repo.Rkey, &nullableDescription, &nullableWebsite, &nullableTopicStr, &createdAt, &nullableSource)
542
+
err := row.Scan(&repo.Id, &repo.Did, &repo.Name, &repo.Knot, &repo.Rkey, &nullableDescription, &nullableWebsite, &nullableTopicStr, &createdAt, &nullableSource, &nullableRepoDid)
508
543
if err != nil {
509
544
return nil, err
510
545
}
···
524
559
if nullableSource.Valid {
525
560
repo.Source = nullableSource.String
526
561
}
562
+
if nullableRepoDid.Valid {
563
+
repo.RepoDid = nullableRepoDid.String
564
+
}
527
565
528
566
createdAtTime, err := time.Parse(time.RFC3339, createdAt)
529
567
if err != nil {
···
535
573
return &repo, nil
536
574
}
537
575
576
+
func GetRepoByDid(e Execer, repoDid string) (*models.Repo, error) {
577
+
return GetRepo(e, orm.FilterEq("repo_did", repoDid))
578
+
}
579
+
580
+
func EnqueuePdsRewrite(e Execer, userDid, repoDid, recordNsid, recordRkey, oldRepoAt string) error {
581
+
_, err := e.Exec(
582
+
`INSERT OR IGNORE INTO pds_rewrite_status
583
+
(user_did, repo_did, record_nsid, record_rkey, old_repo_at, status)
584
+
VALUES (?, ?, ?, ?, ?, 'pending')`,
585
+
userDid, repoDid, recordNsid, recordRkey, oldRepoAt,
586
+
)
587
+
return err
588
+
}
589
+
538
590
func UpdateDescription(e Execer, repoAt, newDescription string) error {
539
591
_, err := e.Exec(
540
592
`update repos set description = ? where at_uri = ?`, newDescription, repoAt)
+8
-2
appview/models/issue.go
+8
-2
appview/models/issue.go
···
44
44
for i, uri := range i.References {
45
45
references[i] = string(uri)
46
46
}
47
+
repoAtStr := i.RepoAt.String()
47
48
return tangled.RepoIssue{
48
-
Repo: i.RepoAt.String(),
49
+
Repo: &repoAtStr,
49
50
Title: i.Title,
50
51
Body: &i.Body,
51
52
Mentions: mentions,
···
161
162
body = *record.Body
162
163
}
163
164
165
+
var repoAt syntax.ATURI
166
+
if record.Repo != nil {
167
+
repoAt = syntax.ATURI(*record.Repo)
168
+
}
169
+
164
170
return Issue{
165
-
RepoAt: syntax.ATURI(record.Repo),
171
+
RepoAt: repoAt,
166
172
Did: did,
167
173
Rkey: rkey,
168
174
Created: created,
+1
appview/models/pipeline.go
+1
appview/models/pipeline.go
+2
-1
appview/models/pull.go
+2
-1
appview/models/pull.go
···
104
104
references[i] = string(uri)
105
105
}
106
106
107
+
targetRepoStr := p.RepoAt.String()
107
108
record := tangled.RepoPull{
108
109
Title: p.Title,
109
110
Body: &p.Body,
···
111
112
References: references,
112
113
CreatedAt: p.Created.Format(time.RFC3339),
113
114
Target: &tangled.RepoPull_Target{
114
-
Repo: p.RepoAt.String(),
115
+
Repo: &targetRepoStr,
115
116
Branch: p.TargetBranch,
116
117
},
117
118
Source: source,
+11
-1
appview/models/repo.go
+11
-1
appview/models/repo.go
···
22
22
Topics []string
23
23
Spindle string
24
24
Labels []string
25
+
RepoDid string
25
26
26
27
// optionally, populate this when querying for reverse mappings
27
28
RepoStats *RepoStats
···
49
50
website = &r.Website
50
51
}
51
52
53
+
var repoDid *string
54
+
if r.RepoDid != "" {
55
+
repoDid = &r.RepoDid
56
+
}
57
+
52
58
return tangled.Repo{
53
59
Knot: r.Knot,
54
60
Name: r.Name,
···
59
65
Source: source,
60
66
Spindle: spindle,
61
67
Labels: r.Labels,
68
+
RepoDid: repoDid,
62
69
}
63
70
}
64
71
···
66
73
return syntax.ATURI(fmt.Sprintf("at://%s/%s/%s", r.Did, tangled.RepoNSID, r.Rkey))
67
74
}
68
75
69
-
func (r Repo) DidSlashRepo() string {
76
+
func (r Repo) RepoIdentifier() string {
77
+
if r.RepoDid != "" {
78
+
return r.RepoDid
79
+
}
70
80
p, _ := securejoin.SecureJoin(r.Did, r.Name)
71
81
return p
72
82
}
+2
-2
appview/pages/funcmap.go
+2
-2
appview/pages/funcmap.go
···
80
80
"ownerSlashRepo": func(repo *models.Repo) string {
81
81
ownerId, err := p.resolver.ResolveIdent(context.Background(), repo.Did)
82
82
if err != nil {
83
-
return repo.DidSlashRepo()
83
+
return repo.RepoIdentifier()
84
84
}
85
85
handle := ownerId.Handle
86
86
if handle != "" && !handle.IsInvalidHandle() {
87
87
return string(handle) + "/" + repo.Name
88
88
}
89
-
return repo.DidSlashRepo()
89
+
return repo.RepoIdentifier()
90
90
},
91
91
"truncateAt30": func(s string) string {
92
92
if len(s) <= 30 {
History
12 rounds
1 comment
oyster.cafe
submitted
#11
1 commit
expand
collapse
appview: add repo_did to repos/stars/pipelines tables, update queries
Signed-off-by: Lewis <lewis@tangled.org>
merge conflicts detected
expand
collapse
expand
collapse
- go.mod:34
- go.sum:339
expand 0 comments
oyster.cafe
submitted
#10
1 commit
expand
collapse
appview: add repo_did to repos/stars/pipelines tables, update queries
Signed-off-by: Lewis <lewis@tangled.org>
expand 0 comments
oyster.cafe
submitted
#9
1 commit
expand
collapse
appview: add repo_did to repos/stars/pipelines tables, update queries
Signed-off-by: Lewis <lewis@tangled.org>
expand 1 comment
oyster.cafe
submitted
#8
1 commit
expand
collapse
appview: add repo_did columns, migrations, and model struct fields
Signed-off-by: Lewis <lewis@tangled.org>
expand 0 comments
oyster.cafe
submitted
#7
1 commit
expand
collapse
appview: add repo_did columns, migrations, and model struct fields
Signed-off-by: Lewis <lewis@tangled.org>
expand 0 comments
oyster.cafe
submitted
#6
1 commit
expand
collapse
appview: add repo_did columns, migrations, and model struct fields
Signed-off-by: Lewis <lewis@tangled.org>
expand 0 comments
oyster.cafe
submitted
#5
1 commit
expand
collapse
appview: add repo_did columns, migrations, and model struct fields
Signed-off-by: Lewis <lewis@tangled.org>
expand 0 comments
oyster.cafe
submitted
#4
1 commit
expand
collapse
appview: add repo_did columns, migrations, and model struct fields
Signed-off-by: Lewis <lewis@tangled.org>
expand 0 comments
oyster.cafe
submitted
#3
1 commit
expand
collapse
appview: add repo_did columns, migrations, and model struct fields
Signed-off-by: Lewis <lewis@tangled.org>
expand 0 comments
oyster.cafe
submitted
#2
1 commit
expand
collapse
appview: add repo_did columns, migrations, and model struct fields
Signed-off-by: Lewis <lewis@tangled.org>
expand 0 comments
oyster.cafe
submitted
#1
1 commit
expand
collapse
appview: add repo_did columns, migrations, and model struct fields
Signed-off-by: Lewis <lewis@tangled.org>
expand 0 comments
oyster.cafe
submitted
#0
1 commit
expand
collapse
appview: add repo_did columns, migrations, and model struct fields
Signed-off-by: Lewis <lewis@tangled.org>
appview/db/star.go:69was there an issue here?appview/strings/strings.go:152seems to be a typo.GetStarCountreceives 2 arguments