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
+152 -24
Diff #11
+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
··· 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,
+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
··· 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

12 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
merge conflicts detected
expand
  • go.mod:34
  • go.sum:339
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