forked from tangled.org/core
this repo has no description

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
+114 -8
appview
db
pages
templates
repo
pulls
+94 -7
appview/db/pulls.go
···
"database/sql"
"fmt"
"log"
"strings"
"time"
···
return pullId - 1, err
}
-
func GetPulls(e Execer, repoAt syntax.ATURI, state PullState) ([]Pull, error) {
-
var pulls []Pull
rows, err := e.Query(`
select
···
from
pulls
where
-
repo_at = ? and state = ?
-
order by
-
created desc`, repoAt, state)
if err != nil {
return nil, err
}
···
}
}
-
pulls = append(pulls, pull)
}
if err := rows.Err(); err != nil {
return nil, err
}
-
return pulls, nil
}
func GetPull(e Execer, repoAt syntax.ATURI, pullId int) (*Pull, error) {
···
"database/sql"
"fmt"
"log"
+
"sort"
"strings"
"time"
···
return pullId - 1, err
}
+
func GetPulls(e Execer, repoAt syntax.ATURI, state PullState) ([]*Pull, error) {
+
pulls := make(map[int]*Pull)
rows, err := e.Query(`
select
···
from
pulls
where
+
repo_at = ? and state = ?`, repoAt, state)
if err != nil {
return nil, err
}
···
}
}
+
pulls[pull.PullId] = &pull
}
+
// get latest round no. for each pull
+
inClause := strings.TrimSuffix(strings.Repeat("?, ", len(pulls)), ", ")
+
submissionsQuery := fmt.Sprintf(`
+
select
+
id, pull_id, round_number
+
from
+
pull_submissions
+
where
+
repo_at = ? and pull_id in (%s)
+
`, inClause)
+
+
args := make([]any, len(pulls)+1)
+
args[0] = repoAt.String()
+
idx := 1
+
for _, p := range pulls {
+
args[idx] = p.PullId
+
idx += 1
+
}
+
submissionsRows, err := e.Query(submissionsQuery, args...)
+
if err != nil {
+
return nil, err
+
}
+
defer submissionsRows.Close()
+
+
for submissionsRows.Next() {
+
var s PullSubmission
+
err := submissionsRows.Scan(
+
&s.ID,
+
&s.PullId,
+
&s.RoundNumber,
+
)
+
if err != nil {
+
return nil, err
+
}
+
+
if p, ok := pulls[s.PullId]; ok {
+
p.Submissions = make([]*PullSubmission, s.RoundNumber+1)
+
p.Submissions[s.RoundNumber] = &s
+
}
+
}
if err := rows.Err(); err != nil {
return nil, err
}
+
// get comment count on latest submission on each pull
+
inClause = strings.TrimSuffix(strings.Repeat("?, ", len(pulls)), ", ")
+
commentsQuery := fmt.Sprintf(`
+
select
+
count(id), pull_id
+
from
+
pull_comments
+
where
+
submission_id in (%s)
+
group by
+
submission_id
+
`, inClause)
+
+
args = []any{}
+
for _, p := range pulls {
+
args = append(args, p.Submissions[p.LastRoundNumber()].ID)
+
}
+
commentsRows, err := e.Query(commentsQuery, args...)
+
if err != nil {
+
return nil, err
+
}
+
defer commentsRows.Close()
+
+
for commentsRows.Next() {
+
var commentCount, pullId int
+
err := commentsRows.Scan(
+
&commentCount,
+
&pullId,
+
)
+
if err != nil {
+
return nil, err
+
}
+
if p, ok := pulls[pullId]; ok {
+
p.Submissions[p.LastRoundNumber()].Comments = make([]PullComment, commentCount)
+
}
+
}
+
if err := rows.Err(); err != nil {
+
return nil, err
+
}
+
+
orderedByDate := []*Pull{}
+
for _, p := range pulls {
+
orderedByDate = append(orderedByDate, p)
+
}
+
sort.Slice(orderedByDate, func(i, j int) bool {
+
return orderedByDate[i].Created.After(orderedByDate[j].Created)
+
})
+
+
return orderedByDate, nil
}
func GetPull(e Execer, repoAt syntax.ATURI, pullId int) (*Pull, error) {
+1 -1
appview/pages/pages.go
···
type RepoPullsParams struct {
LoggedInUser *auth.User
RepoInfo RepoInfo
-
Pulls []db.Pull
Active string
DidHandleMap map[string]string
FilteringBy db.PullState
···
type RepoPullsParams struct {
LoggedInUser *auth.User
RepoInfo RepoInfo
+
Pulls []*db.Pull
Active string
DidHandleMap map[string]string
FilteringBy db.PullState
+19
appview/pages/templates/repo/pulls/pulls.html
···
</span>
</span>
{{ end }}
</p>
</div>
{{ end }}
···
</span>
</span>
{{ end }}
+
<span class="before:content-['·']">
+
{{ $latestRound := .LastRoundNumber }}
+
{{ $lastSubmission := index .Submissions $latestRound }}
+
round
+
<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">
+
#{{ .LastRoundNumber }}
+
</span>
+
{{ $commentCount := len $lastSubmission.Comments }}
+
{{ $s := "s" }}
+
{{ if eq $commentCount 1 }}
+
{{ $s = "" }}
+
{{ end }}
+
+
{{ if eq $commentCount 0 }}
+
awaiting comments
+
{{ else }}
+
recieved {{ len $lastSubmission.Comments}} comment{{$s}}
+
{{ end }}
+
</span>
</p>
</div>
{{ end }}