Monorepo for Tangled tangled.org

appview: add repo_did columns, migrations, and model struct fields #1138

open opened by oyster.cafe targeting master from oyster.cafe/tangled-core: master
Labels

None yet.

assignee

None yet.

Participants 2
AT URI
at://did:plc:3fwecdnvtcscjnrx2p4n7alz/sh.tangled.repo.pull/3mgprvt2ejx22
+151 -22
Diff #14
+39
appview/db/db.go
··· 1288 1288 return err 1289 1289 }) 1290 1290 1291 + orm.RunMigration(conn, logger, "add-repo-did-column", func(tx *sql.Tx) error { 1292 + _, err := tx.Exec(` 1293 + alter table repos add column repo_did text; 1294 + create unique index if not exists idx_repos_repo_did on repos(repo_did); 1295 + `) 1296 + return err 1297 + }) 1298 + 1299 + orm.RunMigration(conn, logger, "add-pds-rewrite-status", func(tx *sql.Tx) error { 1300 + _, err := tx.Exec(` 1301 + create table if not exists pds_rewrite_status ( 1302 + id integer primary key autoincrement, 1303 + user_did text not null, 1304 + repo_did text not null, 1305 + record_nsid text not null, 1306 + record_rkey text not null, 1307 + old_repo_at text not null, 1308 + status text not null default 'pending', 1309 + updated_at text not null default (strftime('%Y-%m-%dT%H:%M:%SZ', 'now')), 1310 + unique(user_did, record_nsid, record_rkey) 1311 + ); 1312 + create index if not exists idx_pds_rewrite_user on pds_rewrite_status(user_did, status); 1313 + `) 1314 + return err 1315 + }) 1316 + 1317 + orm.RunMigration(conn, logger, "add-pipelines-repo-did", func(tx *sql.Tx) error { 1318 + _, err := tx.Exec(` 1319 + alter table pipelines add column repo_did text; 1320 + create index if not exists idx_pipelines_repo_did on pipelines(repo_did); 1321 + `) 1322 + return err 1323 + }) 1324 + 1325 + orm.RunMigration(conn, logger, "migrate-knots-to-repo-dids", func(tx *sql.Tx) error { 1326 + _, err := tx.Exec(`update registrations set needs_upgrade = 1`) 1327 + return err 1328 + }) 1329 + 1291 1330 return &DB{ 1292 1331 db, 1293 1332 logger,
+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
··· 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,
+66 -13
appview/db/repos.go
··· 50 50 website, 51 51 topics, 52 52 source, 53 - spindle 53 + spindle, 54 + repo_did 54 55 from repos 55 56 %s 56 57 order by created desc ··· 67 68 for rows.Next() { 68 69 var repo models.Repo 69 70 var createdAt string 70 - var description, website, topicStr, source, spindle sql.NullString 71 + var description, website, topicStr, source, spindle, repoDid sql.NullString 71 72 72 73 err := rows.Scan( 73 74 &repo.Id, ··· 81 82 &topicStr, 82 83 &source, 83 84 &spindle, 85 + &repoDid, 84 86 ) 85 87 if err != nil { 86 88 return nil, err ··· 107 109 if spindle.Valid { 108 110 repo.Spindle = spindle.String 109 111 } 112 + if repoDid.Valid { 113 + repo.RepoDid = repoDid.String 114 + } 110 115 111 116 repo.RepoStats = &models.RepoStats{} 112 117 repoMap[repo.RepoAt()] = &repo ··· 357 362 var nullableDescription sql.NullString 358 363 var nullableWebsite sql.NullString 359 364 var nullableTopicStr sql.NullString 365 + var nullableRepoDid sql.NullString 366 + var nullableSource sql.NullString 367 + var nullableSpindle sql.NullString 360 368 361 - row := e.QueryRow(`select id, did, name, knot, created, rkey, description, website, topics from repos where at_uri = ?`, atUri) 369 + row := e.QueryRow(`select id, did, name, knot, created, rkey, description, website, topics, source, spindle, repo_did from repos where at_uri = ?`, atUri) 362 370 363 371 var createdAt string 364 - if err := row.Scan(&repo.Id, &repo.Did, &repo.Name, &repo.Knot, &createdAt, &repo.Rkey, &nullableDescription, &nullableWebsite, &nullableTopicStr); err != nil { 372 + if err := row.Scan(&repo.Id, &repo.Did, &repo.Name, &repo.Knot, &createdAt, &repo.Rkey, &nullableDescription, &nullableWebsite, &nullableTopicStr, &nullableSource, &nullableSpindle, &nullableRepoDid); err != nil { 365 373 return nil, err 366 374 } 367 375 createdAtTime, _ := time.Parse(time.RFC3339, createdAt) ··· 376 384 if nullableTopicStr.Valid { 377 385 repo.Topics = strings.Fields(nullableTopicStr.String) 378 386 } 387 + if nullableSource.Valid { 388 + repo.Source = nullableSource.String 389 + } 390 + if nullableSpindle.Valid { 391 + repo.Spindle = nullableSpindle.String 392 + } 393 + if nullableRepoDid.Valid { 394 + repo.RepoDid = nullableRepoDid.String 395 + } 379 396 380 397 return &repo, nil 381 398 } 382 399 383 400 func PutRepo(tx *sql.Tx, repo models.Repo) error { 401 + var repoDid *string 402 + if repo.RepoDid != "" { 403 + repoDid = &repo.RepoDid 404 + } 384 405 _, err := tx.Exec( 385 406 `update repos 386 - set knot = ?, description = ?, website = ?, topics = ? 407 + set knot = ?, description = ?, website = ?, topics = ?, repo_did = coalesce(?, repo_did) 387 408 where did = ? and rkey = ? 388 409 `, 389 - repo.Knot, repo.Description, repo.Website, repo.TopicStr(), repo.Did, repo.Rkey, 410 + repo.Knot, repo.Description, repo.Website, repo.TopicStr(), repoDid, repo.Did, repo.Rkey, 390 411 ) 391 412 return err 392 413 } 393 414 394 415 func AddRepo(tx *sql.Tx, repo *models.Repo) error { 416 + var repoDid *string 417 + if repo.RepoDid != "" { 418 + repoDid = &repo.RepoDid 419 + } 395 420 _, err := tx.Exec( 396 421 `insert into repos 397 - (did, name, knot, rkey, at_uri, description, website, topics, source) 398 - values (?, ?, ?, ?, ?, ?, ?, ?, ?)`, 399 - repo.Did, repo.Name, repo.Knot, repo.Rkey, repo.RepoAt().String(), repo.Description, repo.Website, repo.TopicStr(), repo.Source, 422 + (did, name, knot, rkey, at_uri, description, website, topics, source, repo_did) 423 + values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, 424 + repo.Did, repo.Name, repo.Knot, repo.Rkey, repo.RepoAt().String(), repo.Description, repo.Website, repo.TopicStr(), repo.Source, repoDid, 400 425 ) 401 426 if err != nil { 402 427 return fmt.Errorf("failed to insert repo: %w", err) ··· 436 461 if err != nil { 437 462 return nil, err 438 463 } 464 + if strings.HasPrefix(source, "did:") { 465 + return GetRepoByDid(e, source) 466 + } 439 467 return GetRepoByAtUri(e, source) 440 468 } 441 469 ··· 443 471 var repos []models.Repo 444 472 445 473 rows, err := e.Query( 446 - `select distinct r.id, r.did, r.name, r.knot, r.rkey, r.description, r.website, r.created, r.source 474 + `select distinct r.id, r.did, r.name, r.knot, r.rkey, r.description, r.website, r.created, r.source, r.repo_did 447 475 from repos r 448 476 left join collaborators c on r.at_uri = c.repo_at 449 477 where (r.did = ? or c.subject_did = ?) ··· 463 491 var nullableDescription sql.NullString 464 492 var nullableWebsite sql.NullString 465 493 var nullableSource sql.NullString 494 + var nullableRepoDid sql.NullString 466 495 467 - err := rows.Scan(&repo.Id, &repo.Did, &repo.Name, &repo.Knot, &repo.Rkey, &nullableDescription, &nullableWebsite, &createdAt, &nullableSource) 496 + err := rows.Scan(&repo.Id, &repo.Did, &repo.Name, &repo.Knot, &repo.Rkey, &nullableDescription, &nullableWebsite, &createdAt, &nullableSource, &nullableRepoDid) 468 497 if err != nil { 469 498 return nil, err 470 499 } ··· 472 501 if nullableDescription.Valid { 473 502 repo.Description = nullableDescription.String 474 503 } 504 + if nullableWebsite.Valid { 505 + repo.Website = nullableWebsite.String 506 + } 475 507 476 508 if nullableSource.Valid { 477 509 repo.Source = nullableSource.String 478 510 } 511 + if nullableRepoDid.Valid { 512 + repo.RepoDid = nullableRepoDid.String 513 + } 479 514 480 515 createdAtTime, err := time.Parse(time.RFC3339, createdAt) 481 516 if err != nil { ··· 501 536 var nullableWebsite sql.NullString 502 537 var nullableTopicStr sql.NullString 503 538 var nullableSource sql.NullString 539 + var nullableRepoDid sql.NullString 504 540 505 541 row := e.QueryRow( 506 - `select id, did, name, knot, rkey, description, website, topics, created, source 542 + `select id, did, name, knot, rkey, description, website, topics, created, source, repo_did 507 543 from repos 508 544 where did = ? and name = ? and source is not null and source != ''`, 509 545 did, name, 510 546 ) 511 547 512 - err := row.Scan(&repo.Id, &repo.Did, &repo.Name, &repo.Knot, &repo.Rkey, &nullableDescription, &nullableWebsite, &nullableTopicStr, &createdAt, &nullableSource) 548 + err := row.Scan(&repo.Id, &repo.Did, &repo.Name, &repo.Knot, &repo.Rkey, &nullableDescription, &nullableWebsite, &nullableTopicStr, &createdAt, &nullableSource, &nullableRepoDid) 513 549 if err != nil { 514 550 return nil, err 515 551 } ··· 529 565 if nullableSource.Valid { 530 566 repo.Source = nullableSource.String 531 567 } 568 + if nullableRepoDid.Valid { 569 + repo.RepoDid = nullableRepoDid.String 570 + } 532 571 533 572 createdAtTime, err := time.Parse(time.RFC3339, createdAt) 534 573 if err != nil { ··· 540 579 return &repo, nil 541 580 } 542 581 582 + func GetRepoByDid(e Execer, repoDid string) (*models.Repo, error) { 583 + return GetRepo(e, orm.FilterEq("repo_did", repoDid)) 584 + } 585 + 586 + func EnqueuePdsRewrite(e Execer, userDid, repoDid, recordNsid, recordRkey, oldRepoAt string) error { 587 + _, err := e.Exec( 588 + `INSERT OR IGNORE INTO pds_rewrite_status 589 + (user_did, repo_did, record_nsid, record_rkey, old_repo_at, status) 590 + VALUES (?, ?, ?, ?, ?, 'pending')`, 591 + userDid, repoDid, recordNsid, recordRkey, oldRepoAt, 592 + ) 593 + return err 594 + } 595 + 543 596 func UpdateDescription(e Execer, repoAt, newDescription string) error { 544 597 _, err := e.Exec( 545 598 `update repos set description = ? where at_uri = ?`, newDescription, repoAt)
+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
··· 19 19 Knot string 20 20 RepoOwner syntax.DID 21 21 RepoName string 22 + RepoDid string 22 23 TriggerId int 23 24 Sha string 24 25 Created time.Time
+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
··· 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
··· 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

16 rounds 1 comment
sign up or login to add to the discussion
1 commit
expand
appview: add repo_did to repos/stars/pipelines tables, update queries
no conflicts, ready to merge
expand 0 comments
1 commit
expand
appview: add repo_did to repos/stars/pipelines tables, update queries
expand 0 comments
1 commit
expand
appview: add repo_did to repos/stars/pipelines tables, update queries
expand 0 comments
1 commit
expand
appview: add repo_did to repos/stars/pipelines tables, update queries
expand 0 comments
1 commit
expand
appview: add repo_did to repos/stars/pipelines tables, update queries
expand 0 comments
1 commit
expand
appview: add repo_did to repos/stars/pipelines tables, update queries
expand 0 comments
1 commit
expand
appview: add repo_did to repos/stars/pipelines tables, update queries
expand 1 comment
1 commit
expand
appview: add repo_did columns, migrations, and model struct fields
expand 0 comments
1 commit
expand
appview: add repo_did columns, migrations, and model struct fields
expand 0 comments
1 commit
expand
appview: add repo_did columns, migrations, and model struct fields
expand 0 comments
1 commit
expand
appview: add repo_did columns, migrations, and model struct fields
expand 0 comments
1 commit
expand
appview: add repo_did columns, migrations, and model struct fields
expand 0 comments
1 commit
expand
appview: add repo_did columns, migrations, and model struct fields
expand 0 comments
1 commit
expand
appview: add repo_did columns, migrations, and model struct fields
expand 0 comments
1 commit
expand
appview: add repo_did columns, migrations, and model struct fields
expand 0 comments
1 commit
expand
appview: add repo_did columns, migrations, and model struct fields
expand 0 comments