forked from tangled.org/core
Monorepo for Tangled

appview: db/pulls: summarize rounds

include latest round number and number of comments in the latest round
in db.GetPulls. this is then displayed on the summary line on /pulls

Changed files
+118 -8
appview
db
pages
templates
repo
pulls
+98 -7
appview/db/pulls.go
··· 4 4 "database/sql" 5 5 "fmt" 6 6 "log" 7 + "sort" 7 8 "strings" 8 9 "time" 9 10 ··· 274 275 return pullId - 1, err 275 276 } 276 277 277 - func GetPulls(e Execer, repoAt syntax.ATURI, state PullState) ([]Pull, error) { 278 - var pulls []Pull 278 + func GetPulls(e Execer, repoAt syntax.ATURI, state PullState) ([]*Pull, error) { 279 + pulls := make(map[int]*Pull) 279 280 280 281 rows, err := e.Query(` 281 282 select ··· 293 294 from 294 295 pulls 295 296 where 296 - repo_at = ? and state = ? 297 - order by 298 - created desc`, repoAt, state) 297 + repo_at = ? and state = ?`, repoAt, state) 299 298 if err != nil { 300 299 return nil, err 301 300 } ··· 341 340 } 342 341 } 343 342 344 - pulls = append(pulls, pull) 343 + pulls[pull.PullId] = &pull 345 344 } 346 345 346 + // get latest round no. for each pull 347 + inClause := strings.TrimSuffix(strings.Repeat("?, ", len(pulls)), ", ") 348 + submissionsQuery := fmt.Sprintf(` 349 + select 350 + id, pull_id, round_number 351 + from 352 + pull_submissions 353 + where 354 + repo_at = ? and pull_id in (%s) 355 + `, inClause) 356 + 357 + args := make([]any, len(pulls)+1) 358 + args[0] = repoAt.String() 359 + idx := 1 360 + for _, p := range pulls { 361 + args[idx] = p.PullId 362 + idx += 1 363 + } 364 + submissionsRows, err := e.Query(submissionsQuery, args...) 365 + if err != nil { 366 + return nil, err 367 + } 368 + defer submissionsRows.Close() 369 + 370 + for submissionsRows.Next() { 371 + var s PullSubmission 372 + err := submissionsRows.Scan( 373 + &s.ID, 374 + &s.PullId, 375 + &s.RoundNumber, 376 + ) 377 + if err != nil { 378 + return nil, err 379 + } 380 + 381 + if p, ok := pulls[s.PullId]; ok { 382 + p.Submissions = make([]*PullSubmission, s.RoundNumber+1) 383 + p.Submissions[s.RoundNumber] = &s 384 + } 385 + } 347 386 if err := rows.Err(); err != nil { 348 387 return nil, err 349 388 } 350 389 351 - return pulls, nil 390 + // get comment count on latest submission on each pull 391 + inClause = strings.TrimSuffix(strings.Repeat("?, ", len(pulls)), ", ") 392 + commentsQuery := fmt.Sprintf(` 393 + select 394 + count(id), pull_id 395 + from 396 + pull_comments 397 + where 398 + submission_id in (%s) 399 + group by 400 + submission_id 401 + `, inClause) 402 + 403 + args = make([]any, len(pulls)) 404 + idx = 0 405 + for _, p := range pulls { 406 + args[idx] = p.Submissions[p.LastRoundNumber()].ID 407 + idx += 1 408 + } 409 + commentsRows, err := e.Query(commentsQuery, args...) 410 + if err != nil { 411 + return nil, err 412 + } 413 + defer commentsRows.Close() 414 + 415 + for commentsRows.Next() { 416 + var commentCount, pullId int 417 + err := commentsRows.Scan( 418 + &commentCount, 419 + &pullId, 420 + ) 421 + if err != nil { 422 + return nil, err 423 + } 424 + if p, ok := pulls[pullId]; ok { 425 + p.Submissions[p.LastRoundNumber()].Comments = make([]PullComment, commentCount) 426 + } 427 + } 428 + if err := rows.Err(); err != nil { 429 + return nil, err 430 + } 431 + 432 + orderedByDate := make([]*Pull, len(pulls)) 433 + idx = 0 434 + for _, p := range pulls { 435 + orderedByDate[idx] = p 436 + idx += 1 437 + } 438 + sort.Slice(orderedByDate, func(i, j int) bool { 439 + return orderedByDate[i].Created.After(orderedByDate[j].Created) 440 + }) 441 + 442 + return orderedByDate, nil 352 443 } 353 444 354 445 func GetPull(e Execer, repoAt syntax.ATURI, pullId int) (*Pull, error) {
+1 -1
appview/pages/pages.go
··· 649 649 type RepoPullsParams struct { 650 650 LoggedInUser *auth.User 651 651 RepoInfo RepoInfo 652 - Pulls []db.Pull 652 + Pulls []*db.Pull 653 653 Active string 654 654 DidHandleMap map[string]string 655 655 FilteringBy db.PullState
+19
appview/pages/templates/repo/pulls/pulls.html
··· 93 93 </span> 94 94 </span> 95 95 {{ end }} 96 + <span class="before:content-['·']"> 97 + {{ $latestRound := .LastRoundNumber }} 98 + {{ $lastSubmission := index .Submissions $latestRound }} 99 + round 100 + <span class="text-xs rounded bg-gray-100 dark:bg-gray-700 text-black dark:text-white font-mono px-2 mx-1/2 inline-flex items-center"> 101 + #{{ .LastRoundNumber }} 102 + </span> 103 + {{ $commentCount := len $lastSubmission.Comments }} 104 + {{ $s := "s" }} 105 + {{ if eq $commentCount 1 }} 106 + {{ $s = "" }} 107 + {{ end }} 108 + 109 + {{ if eq $commentCount 0 }} 110 + awaiting comments 111 + {{ else }} 112 + recieved {{ len $lastSubmission.Comments}} comment{{$s}} 113 + {{ end }} 114 + </span> 96 115 </p> 97 116 </div> 98 117 {{ end }}