appview: db: issues: add method for getting any issues a repo might have #474

merged
opened by ptr.pet targeting master from ptr.pet/core: repo-feed
Changed files
+85 -4
appview
db
issues
+84 -3
appview/db/issues.go
···
import (
"database/sql"
"fmt"
+
"strings"
"time"
"github.com/bluesky-social/indigo/atproto/syntax"
···
return ownerDid, err
}
-
func GetIssues(e Execer, repoAt syntax.ATURI, isOpen bool, page pagination.Page) ([]Issue, error) {
+
func GetIssuesPaginated(e Execer, repoAt syntax.ATURI, isOpen bool, page pagination.Page) ([]Issue, error) {
var issues []Issue
openValue := 0
if isOpen {
···
body,
open,
comment_count
-
from
+
from
numbered_issue
-
where
+
where
row_num between ? and ?`,
repoAt, openValue, page.Offset+1, page.Offset+page.Limit)
if err != nil {
···
return issues, nil
}
+
func GetIssuesWithLimit(e Execer, limit int, filters ...filter) ([]Issue, error) {
+
issues := make([]Issue, 0, limit)
+
+
var conditions []string
+
var args []any
+
for _, filter := range filters {
+
conditions = append(conditions, filter.Condition())
+
args = append(args, filter.Arg()...)
+
}
+
+
whereClause := ""
+
if conditions != nil {
+
whereClause = " where " + strings.Join(conditions, " and ")
+
}
+
limitClause := ""
+
if limit != 0 {
+
limitClause = fmt.Sprintf(" limit %d ", limit)
+
}
+
+
query := fmt.Sprintf(
+
`select
+
i.id,
+
i.owner_did,
+
i.repo_at,
+
i.issue_id,
+
i.created,
+
i.title,
+
i.body,
+
i.open
+
from
+
issues i
+
%s
+
order by
+
i.created desc
+
%s`,
+
whereClause, limitClause)
+
+
rows, err := e.Query(query, args...)
+
if err != nil {
+
return nil, err
+
}
+
defer rows.Close()
+
+
for rows.Next() {
+
var issue Issue
+
var issueCreatedAt string
+
err := rows.Scan(
+
&issue.ID,
+
&issue.OwnerDid,
+
&issue.RepoAt,
+
&issue.IssueId,
+
&issueCreatedAt,
+
&issue.Title,
+
&issue.Body,
+
&issue.Open,
+
)
+
if err != nil {
+
return nil, err
+
}
+
+
issueCreatedTime, err := time.Parse(time.RFC3339, issueCreatedAt)
+
if err != nil {
+
return nil, err
+
}
+
issue.Created = issueCreatedTime
+
+
issues = append(issues, issue)
+
}
+
+
if err := rows.Err(); err != nil {
+
return nil, err
+
}
+
+
return issues, nil
+
}
+
+
func GetIssues(e Execer, filters ...filter) ([]Issue, error) {
+
return GetIssuesWithLimit(e, 0, filters...)
+
}
+
// timeframe here is directly passed into the sql query filter, and any
// timeframe in the past should be negative; e.g.: "-3 months"
func GetIssuesByOwnerDid(e Execer, ownerDid string, timeframe string) ([]Issue, error) {
+1 -1
appview/issues/issues.go
···
return
}
-
issues, err := db.GetIssues(rp.db, f.RepoAt(), isOpen, page)
+
issues, err := db.GetIssuesPaginated(rp.db, f.RepoAt(), isOpen, page)
if err != nil {
log.Println("failed to get issues", err)
rp.pages.Notice(w, "issues", "Failed to load issues. Try again later.")