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

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

Signed-off-by: dusk <y.bera003.06@protonmail.com>

authored by ptr.pet and committed by Tangled b3ce5aec 3f7f0cfd

Changed files
+85 -4
appview
db
issues
+84 -3
appview/db/issues.go
··· 3 import ( 4 "database/sql" 5 "fmt" 6 "time" 7 8 "github.com/bluesky-social/indigo/atproto/syntax" ··· 105 return ownerDid, err 106 } 107 108 - func GetIssues(e Execer, repoAt syntax.ATURI, isOpen bool, page pagination.Page) ([]Issue, error) { 109 var issues []Issue 110 openValue := 0 111 if isOpen { ··· 145 body, 146 open, 147 comment_count 148 - from 149 numbered_issue 150 - where 151 row_num between ? and ?`, 152 repoAt, openValue, page.Offset+1, page.Offset+page.Limit) 153 if err != nil { ··· 179 } 180 181 return issues, nil 182 } 183 184 // timeframe here is directly passed into the sql query filter, and any
··· 3 import ( 4 "database/sql" 5 "fmt" 6 + "strings" 7 "time" 8 9 "github.com/bluesky-social/indigo/atproto/syntax" ··· 106 return ownerDid, err 107 } 108 109 + func GetIssuesPaginated(e Execer, repoAt syntax.ATURI, isOpen bool, page pagination.Page) ([]Issue, error) { 110 var issues []Issue 111 openValue := 0 112 if isOpen { ··· 146 body, 147 open, 148 comment_count 149 + from 150 numbered_issue 151 + where 152 row_num between ? and ?`, 153 repoAt, openValue, page.Offset+1, page.Offset+page.Limit) 154 if err != nil { ··· 180 } 181 182 return issues, nil 183 + } 184 + 185 + func GetIssuesWithLimit(e Execer, limit int, filters ...filter) ([]Issue, error) { 186 + issues := make([]Issue, 0, limit) 187 + 188 + var conditions []string 189 + var args []any 190 + for _, filter := range filters { 191 + conditions = append(conditions, filter.Condition()) 192 + args = append(args, filter.Arg()...) 193 + } 194 + 195 + whereClause := "" 196 + if conditions != nil { 197 + whereClause = " where " + strings.Join(conditions, " and ") 198 + } 199 + limitClause := "" 200 + if limit != 0 { 201 + limitClause = fmt.Sprintf(" limit %d ", limit) 202 + } 203 + 204 + query := fmt.Sprintf( 205 + `select 206 + i.id, 207 + i.owner_did, 208 + i.repo_at, 209 + i.issue_id, 210 + i.created, 211 + i.title, 212 + i.body, 213 + i.open 214 + from 215 + issues i 216 + %s 217 + order by 218 + i.created desc 219 + %s`, 220 + whereClause, limitClause) 221 + 222 + rows, err := e.Query(query, args...) 223 + if err != nil { 224 + return nil, err 225 + } 226 + defer rows.Close() 227 + 228 + for rows.Next() { 229 + var issue Issue 230 + var issueCreatedAt string 231 + err := rows.Scan( 232 + &issue.ID, 233 + &issue.OwnerDid, 234 + &issue.RepoAt, 235 + &issue.IssueId, 236 + &issueCreatedAt, 237 + &issue.Title, 238 + &issue.Body, 239 + &issue.Open, 240 + ) 241 + if err != nil { 242 + return nil, err 243 + } 244 + 245 + issueCreatedTime, err := time.Parse(time.RFC3339, issueCreatedAt) 246 + if err != nil { 247 + return nil, err 248 + } 249 + issue.Created = issueCreatedTime 250 + 251 + issues = append(issues, issue) 252 + } 253 + 254 + if err := rows.Err(); err != nil { 255 + return nil, err 256 + } 257 + 258 + return issues, nil 259 + } 260 + 261 + func GetIssues(e Execer, filters ...filter) ([]Issue, error) { 262 + return GetIssuesWithLimit(e, 0, filters...) 263 } 264 265 // timeframe here is directly passed into the sql query filter, and any
+1 -1
appview/issues/issues.go
··· 604 return 605 } 606 607 - issues, err := db.GetIssues(rp.db, f.RepoAt(), isOpen, page) 608 if err != nil { 609 log.Println("failed to get issues", err) 610 rp.pages.Notice(w, "issues", "Failed to load issues. Try again later.")
··· 604 return 605 } 606 607 + issues, err := db.GetIssuesPaginated(rp.db, f.RepoAt(), isOpen, page) 608 if err != nil { 609 log.Println("failed to get issues", err) 610 rp.pages.Notice(w, "issues", "Failed to load issues. Try again later.")