+98
-7
appview/db/pulls.go
+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
+1
-1
appview/pages/pages.go
+19
appview/pages/templates/repo/pulls/pulls.html
+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 }}