From ac4a6d00b4289342a2978dd15f9b911333e7708f Mon Sep 17 00:00:00 2001 From: dusk Date: Tue, 12 Aug 2025 18:02:21 +0300 Subject: [PATCH] appview: db: issues: add method for getting any issues a repo might have Change-Id: osynrqqtylxwnomxuxmlktnsmztzwzrs Signed-off-by: dusk --- appview/db/issues.go | 87 ++++++++++++++++++++++++++++++++++++++-- appview/issues/issues.go | 2 +- 2 files changed, 85 insertions(+), 4 deletions(-) diff --git a/appview/db/issues.go b/appview/db/issues.go index bea2c81..3525fc4 100644 --- a/appview/db/issues.go +++ b/appview/db/issues.go @@ -3,6 +3,7 @@ package db import ( "database/sql" "fmt" + "strings" "time" "github.com/bluesky-social/indigo/atproto/syntax" @@ -105,7 +106,7 @@ func GetIssueOwnerDid(e Execer, repoAt syntax.ATURI, issueId int) (string, error 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 { @@ -145,9 +146,9 @@ func GetIssues(e Execer, repoAt syntax.ATURI, isOpen bool, page pagination.Page) 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 { @@ -181,6 +182,86 @@ func GetIssues(e Execer, repoAt syntax.ATURI, isOpen bool, page pagination.Page) 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) { diff --git a/appview/issues/issues.go b/appview/issues/issues.go index b46045f..2b6a6a3 100644 --- a/appview/issues/issues.go +++ b/appview/issues/issues.go @@ -604,7 +604,7 @@ func (rp *Issues) RepoIssues(w http.ResponseWriter, r *http.Request) { 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.") -- 2.43.0