Monorepo for Tangled tangled.org

appview/db: API to get stars with links to repos

Signed-off-by: oppiliappan <me@oppi.li>

oppi.li 423886f3 e590d819

verified
Changed files
+85
appview
db
+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) {