+85
appview/db/star.go
+85
appview/db/star.go
···
1
1
package db
2
2
3
3
import (
4
+
"fmt"
4
5
"log"
6
+
"strings"
5
7
"time"
6
8
7
9
"github.com/bluesky-social/indigo/atproto/syntax"
···
91
93
} else {
92
94
return true
93
95
}
96
+
}
97
+
98
+
func GetStars(e Execer, limit int, filters ...filter) ([]Star, error) {
99
+
var conditions []string
100
+
var args []any
101
+
for _, filter := range filters {
102
+
conditions = append(conditions, filter.Condition())
103
+
args = append(args, filter.Arg()...)
104
+
}
105
+
106
+
whereClause := ""
107
+
if conditions != nil {
108
+
whereClause = " where " + strings.Join(conditions, " and ")
109
+
}
110
+
111
+
limitClause := ""
112
+
if limit != 0 {
113
+
limitClause = fmt.Sprintf(" limit %d", limit)
114
+
}
115
+
116
+
repoQuery := fmt.Sprintf(
117
+
`select starred_by_did, repo_at, created, rkey
118
+
from stars
119
+
%s
120
+
order by created desc
121
+
%s`,
122
+
whereClause,
123
+
limitClause,
124
+
)
125
+
rows, err := e.Query(repoQuery, args...)
126
+
if err != nil {
127
+
return nil, err
128
+
}
129
+
130
+
starMap := make(map[string][]Star)
131
+
for rows.Next() {
132
+
var star Star
133
+
var created string
134
+
err := rows.Scan(&star.StarredByDid, &star.RepoAt, &created, &star.Rkey)
135
+
if err != nil {
136
+
return nil, err
137
+
}
138
+
139
+
star.Created = time.Now()
140
+
if t, err := time.Parse(time.RFC3339, created); err == nil {
141
+
star.Created = t
142
+
}
143
+
144
+
repoAt := string(star.RepoAt)
145
+
starMap[repoAt] = append(starMap[repoAt], star)
146
+
}
147
+
148
+
// populate *Repo in each star
149
+
args = make([]any, len(starMap))
150
+
i := 0
151
+
for r := range starMap {
152
+
args[i] = r
153
+
i++
154
+
}
155
+
156
+
if len(args) == 0 {
157
+
return nil, nil
158
+
}
159
+
160
+
repos, err := GetRepos(e, 0, FilterIn("at_uri", args))
161
+
if err != nil {
162
+
return nil, err
163
+
}
164
+
165
+
for _, r := range repos {
166
+
if stars, ok := starMap[string(r.RepoAt())]; ok {
167
+
for i := range stars {
168
+
stars[i].Repo = &r
169
+
}
170
+
}
171
+
}
172
+
173
+
var stars []Star
174
+
for _, s := range starMap {
175
+
stars = append(stars, s...)
176
+
}
177
+
178
+
return stars, nil
94
179
}
95
180
96
181
func GetAllStars(e Execer, limit int) ([]Star, error) {