Signed-off-by: dusk y.bera003.06@protonmail.com
+84
-3
appview/db/issues.go
+84
-3
appview/db/issues.go
···
3
3
import (
4
4
"database/sql"
5
5
"fmt"
6
+
"strings"
6
7
"time"
7
8
8
9
"github.com/bluesky-social/indigo/atproto/syntax"
···
105
106
return ownerDid, err
106
107
}
107
108
108
-
func GetIssues(e Execer, repoAt syntax.ATURI, isOpen bool, page pagination.Page) ([]Issue, error) {
109
+
func GetIssuesPaginated(e Execer, repoAt syntax.ATURI, isOpen bool, page pagination.Page) ([]Issue, error) {
109
110
var issues []Issue
110
111
openValue := 0
111
112
if isOpen {
···
145
146
body,
146
147
open,
147
148
comment_count
148
-
from
149
+
from
149
150
numbered_issue
150
-
where
151
+
where
151
152
row_num between ? and ?`,
152
153
repoAt, openValue, page.Offset+1, page.Offset+page.Limit)
153
154
if err != nil {
···
181
182
return issues, nil
182
183
}
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
+
184
265
// timeframe here is directly passed into the sql query filter, and any
185
266
// timeframe in the past should be negative; e.g.: "-3 months"
186
267
func GetIssuesByOwnerDid(e Execer, ownerDid string, timeframe string) ([]Issue, error) {
+1
-1
appview/issues/issues.go
+1
-1
appview/issues/issues.go
···
604
604
return
605
605
}
606
606
607
-
issues, err := db.GetIssues(rp.db, f.RepoAt(), isOpen, page)
607
+
issues, err := db.GetIssuesPaginated(rp.db, f.RepoAt(), isOpen, page)
608
608
if err != nil {
609
609
log.Println("failed to get issues", err)
610
610
rp.pages.Notice(w, "issues", "Failed to load issues. Try again later.")