appview: db: replace Issue.IssueAt to Issue.Rkey #498

merged
opened by boltless.me targeting master from boltless.me/core: push-pltwsolxxvnt

Replace Issue.IssueAt to Issue.Rkey. issue_at column still exist, but not used and will be removed in future.

Remove db.SetIssueAt() in flavor of Rkey. Create rkey before adding to DB, and save same rkey to PDS. This is safe as tx is will be dropped when ctx is canceled with error.

Signed-off-by: Seongmin Lee boltlessengineer@proton.me

Changed files
+39 -30
appview
db
issues
pages
templates
repo
issues
+11
appview/db/db.go
··· 655 655 return err 656 656 }) 657 657 658 + runMigration(db, "add-rkey-to-issues", func(tx *sql.Tx) error { 659 + _, err := tx.Exec(` 660 + alter table issues add column rkey text not null default ''; 661 + 662 + -- get last url section from issue_at and save to rkey column 663 + update issues 664 + set rkey = replace(issue_at, rtrim(issue_at, replace(issue_at, '/', '')), ''); 665 + `) 666 + return err 667 + }) 668 + 658 669 return &DB{db}, nil 659 670 } 660 671
+19 -14
appview/db/issues.go
··· 2 2 3 3 import ( 4 4 "database/sql" 5 + "fmt" 5 6 "time" 6 7 7 8 "github.com/bluesky-social/indigo/atproto/syntax" 9 + "tangled.sh/tangled.sh/core/api/tangled" 8 10 "tangled.sh/tangled.sh/core/appview/pagination" 9 11 ) 10 12 ··· 13 15 RepoAt syntax.ATURI 14 16 OwnerDid string 15 17 IssueId int 16 - IssueAt string 18 + Rkey string 17 19 Created time.Time 18 20 Title string 19 21 Body string ··· 42 44 Edited *time.Time 43 45 } 44 46 47 + func (i *Issue) AtUri() syntax.ATURI { 48 + return syntax.ATURI(fmt.Sprintf("at://%s/%s/%s", i.OwnerDid, tangled.RepoIssueNSID, i.Rkey)) 49 + } 50 + 45 51 func NewIssue(tx *sql.Tx, issue *Issue) error { 46 52 defer tx.Rollback() 47 53 ··· 67 73 issue.IssueId = nextId 68 74 69 75 res, err := tx.Exec(` 70 - insert into issues (repo_at, owner_did, issue_id, title, body) 71 - values (?, ?, ?, ?, ?) 72 - `, issue.RepoAt, issue.OwnerDid, issue.IssueId, issue.Title, issue.Body) 76 + insert into issues (repo_at, owner_did, rkey, issue_at, issue_id, title, body) 77 + values (?, ?, ?, ?, ?, ?, ?) 78 + `, issue.RepoAt, issue.OwnerDid, issue.Rkey, issue.AtUri(), issue.IssueId, issue.Title, issue.Body) 73 79 if err != nil { 74 80 return err 75 81 } ··· 87 93 return nil 88 94 } 89 95 90 - func SetIssueAt(e Execer, repoAt syntax.ATURI, issueId int, issueAt string) error { 91 - _, err := e.Exec(`update issues set issue_at = ? where repo_at = ? and issue_id = ?`, issueAt, repoAt, issueId) 92 - return err 93 - } 94 - 95 96 func GetIssueAt(e Execer, repoAt syntax.ATURI, issueId int) (string, error) { 96 97 var issueAt string 97 98 err := e.QueryRow(`select issue_at from issues where repo_at = ? and issue_id = ?`, repoAt, issueId).Scan(&issueAt) ··· 117 118 select 118 119 i.id, 119 120 i.owner_did, 121 + i.rkey, 120 122 i.issue_id, 121 123 i.created, 122 124 i.title, ··· 136 138 select 137 139 id, 138 140 owner_did, 141 + rkey, 139 142 issue_id, 140 143 created, 141 144 title, ··· 156 159 var issue Issue 157 160 var createdAt string 158 161 var metadata IssueMetadata 159 - err := rows.Scan(&issue.ID, &issue.OwnerDid, &issue.IssueId, &createdAt, &issue.Title, &issue.Body, &issue.Open, &metadata.CommentCount) 162 + err := rows.Scan(&issue.ID, &issue.OwnerDid, &issue.Rkey, &issue.IssueId, &createdAt, &issue.Title, &issue.Body, &issue.Open, &metadata.CommentCount) 160 163 if err != nil { 161 164 return nil, err 162 165 } ··· 187 190 `select 188 191 i.id, 189 192 i.owner_did, 193 + i.rkey, 190 194 i.repo_at, 191 195 i.issue_id, 192 196 i.created, ··· 219 223 err := rows.Scan( 220 224 &issue.ID, 221 225 &issue.OwnerDid, 226 + &issue.Rkey, 222 227 &issue.RepoAt, 223 228 &issue.IssueId, 224 229 &issueCreatedAt, ··· 262 267 } 263 268 264 269 func GetIssue(e Execer, repoAt syntax.ATURI, issueId int) (*Issue, error) { 265 - query := `select id, owner_did, created, title, body, open from issues where repo_at = ? and issue_id = ?` 270 + query := `select id, owner_did, rkey, created, title, body, open from issues where repo_at = ? and issue_id = ?` 266 271 row := e.QueryRow(query, repoAt, issueId) 267 272 268 273 var issue Issue 269 274 var createdAt string 270 - err := row.Scan(&issue.ID, &issue.OwnerDid, &createdAt, &issue.Title, &issue.Body, &issue.Open) 275 + err := row.Scan(&issue.ID, &issue.OwnerDid, &issue.Rkey, &createdAt, &issue.Title, &issue.Body, &issue.Open) 271 276 if err != nil { 272 277 return nil, err 273 278 } ··· 282 287 } 283 288 284 289 func GetIssueWithComments(e Execer, repoAt syntax.ATURI, issueId int) (*Issue, []Comment, error) { 285 - query := `select id, owner_did, issue_id, created, title, body, open, issue_at from issues where repo_at = ? and issue_id = ?` 290 + query := `select id, owner_did, rkey, issue_id, created, title, body, open from issues where repo_at = ? and issue_id = ?` 286 291 row := e.QueryRow(query, repoAt, issueId) 287 292 288 293 var issue Issue 289 294 var createdAt string 290 - err := row.Scan(&issue.ID, &issue.OwnerDid, &issue.IssueId, &createdAt, &issue.Title, &issue.Body, &issue.Open, &issue.IssueAt) 295 + err := row.Scan(&issue.ID, &issue.OwnerDid, &issue.Rkey, &issue.IssueId, &createdAt, &issue.Title, &issue.Body, &issue.Open) 291 296 if err != nil { 292 297 return nil, nil, err 293 298 }
+7 -14
appview/issues/issues.go
··· 11 11 12 12 comatproto "github.com/bluesky-social/indigo/api/atproto" 13 13 "github.com/bluesky-social/indigo/atproto/data" 14 - "github.com/bluesky-social/indigo/atproto/syntax" 15 14 lexutil "github.com/bluesky-social/indigo/lex/util" 16 15 "github.com/go-chi/chi/v5" 17 16 ··· 80 79 return 81 80 } 82 81 83 - reactionCountMap, err := db.GetReactionCountMap(rp.db, syntax.ATURI(issue.IssueAt)) 82 + reactionCountMap, err := db.GetReactionCountMap(rp.db, issue.AtUri()) 84 83 if err != nil { 85 84 log.Println("failed to get issue reactions") 86 85 rp.pages.Notice(w, "issues", "Failed to load issue. Try again later.") ··· 88 87 89 88 userReactions := map[db.ReactionKind]bool{} 90 89 if user != nil { 91 - userReactions = db.GetReactionStatusMap(rp.db, user.Did, syntax.ATURI(issue.IssueAt)) 90 + userReactions = db.GetReactionStatusMap(rp.db, user.Did, issue.AtUri()) 92 91 } 93 92 94 93 issueOwnerIdent, err := rp.idResolver.ResolveIdent(r.Context(), issue.OwnerDid) ··· 99 98 rp.pages.RepoSingleIssue(w, pages.RepoSingleIssueParams{ 100 99 LoggedInUser: user, 101 100 RepoInfo: f.RepoInfo(user), 102 - Issue: *issue, 101 + Issue: issue, 103 102 Comments: comments, 104 103 105 104 IssueOwnerHandle: issueOwnerIdent.Handle.String(), ··· 159 158 Rkey: tid.TID(), 160 159 Record: &lexutil.LexiconTypeDecoder{ 161 160 Val: &tangled.RepoIssueState{ 162 - Issue: issue.IssueAt, 161 + Issue: issue.AtUri().String(), 163 162 State: closed, 164 163 }, 165 164 }, ··· 651 650 652 651 issue := &db.Issue{ 653 652 RepoAt: f.RepoAt, 653 + Rkey: tid.TID(), 654 654 Title: title, 655 655 Body: body, 656 656 OwnerDid: user.Did, ··· 669 669 return 670 670 } 671 671 atUri := f.RepoAt.String() 672 - resp, err := client.RepoPutRecord(r.Context(), &comatproto.RepoPutRecord_Input{ 672 + _, err = client.RepoPutRecord(r.Context(), &comatproto.RepoPutRecord_Input{ 673 673 Collection: tangled.RepoIssueNSID, 674 674 Repo: user.Did, 675 - Rkey: tid.TID(), 675 + Rkey: issue.Rkey, 676 676 Record: &lexutil.LexiconTypeDecoder{ 677 677 Val: &tangled.RepoIssue{ 678 678 Repo: atUri, ··· 689 689 return 690 690 } 691 691 692 - err = db.SetIssueAt(rp.db, f.RepoAt, issue.IssueId, resp.Uri) 693 - if err != nil { 694 - log.Println("failed to set issue at", err) 695 - rp.pages.Notice(w, "issues", "Failed to create issue.") 696 - return 697 - } 698 - 699 692 rp.notifier.NewIssue(r.Context(), issue) 700 693 701 694 rp.pages.HxLocation(w, fmt.Sprintf("/%s/issues/%d", f.OwnerSlashRepo(), issue.IssueId))
+1 -1
appview/pages/pages.go
··· 788 788 LoggedInUser *oauth.User 789 789 RepoInfo repoinfo.RepoInfo 790 790 Active string 791 - Issue db.Issue 791 + Issue *db.Issue 792 792 Comments []db.Comment 793 793 IssueOwnerHandle string 794 794
+1 -1
appview/pages/templates/repo/issues/issue.html
··· 54 54 "Kind" $kind 55 55 "Count" (index $.Reactions $kind) 56 56 "IsReacted" (index $.UserReacted $kind) 57 - "ThreadAt" $.Issue.IssueAt) 57 + "ThreadAt" $.Issue.AtUri) 58 58 }} 59 59 {{ end }} 60 60 </div>