Mirror of @tangled.org/core. Running on a Raspberry Pi Zero 2 (Please be gentle).
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

appview: db: follow: add GetFollowers and GetFollowing functions to fetch Follows

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

authored by

dusk and committed by
Tangled
d1f3d357 634c03e1

+68 -41
+67 -40
appview/db/follow.go
··· 1 1 package db 2 2 3 3 import ( 4 + "fmt" 4 5 "log" 6 + "strings" 5 7 "time" 6 8 ) 7 9 ··· 58 56 func GetFollowerFollowingCount(e Execer, did string) (int, int, error) { 59 57 followers, following := 0, 0 60 58 err := e.QueryRow( 61 - `SELECT 59 + `SELECT 62 60 COUNT(CASE WHEN subject_did = ? THEN 1 END) AS followers, 63 61 COUNT(CASE WHEN user_did = ? THEN 1 END) AS following 64 62 FROM follows;`, did, did).Scan(&followers, &following) ··· 66 64 return 0, 0, err 67 65 } 68 66 return followers, following, nil 67 + } 68 + 69 + func GetFollows(e Execer, limit int, filters ...filter) ([]Follow, error) { 70 + var follows []Follow 71 + 72 + var conditions []string 73 + var args []any 74 + for _, filter := range filters { 75 + conditions = append(conditions, filter.Condition()) 76 + args = append(args, filter.Arg()...) 77 + } 78 + 79 + whereClause := "" 80 + if conditions != nil { 81 + whereClause = " where " + strings.Join(conditions, " and ") 82 + } 83 + limitClause := "" 84 + if limit > 0 { 85 + limitClause = " limit ?" 86 + args = append(args, limit) 87 + } 88 + 89 + query := fmt.Sprintf( 90 + `select user_did, subject_did, followed_at, rkey 91 + from follows 92 + %s 93 + order by followed_at desc 94 + %s 95 + `, whereClause, limitClause) 96 + 97 + rows, err := e.Query(query, args...) 98 + if err != nil { 99 + return nil, err 100 + } 101 + for rows.Next() { 102 + var follow Follow 103 + var followedAt string 104 + err := rows.Scan( 105 + &follow.UserDid, 106 + &follow.SubjectDid, 107 + &followedAt, 108 + &follow.Rkey, 109 + ) 110 + if err != nil { 111 + return nil, err 112 + } 113 + followedAtTime, err := time.Parse(time.RFC3339, followedAt) 114 + if err != nil { 115 + log.Println("unable to determine followed at time") 116 + follow.FollowedAt = time.Now() 117 + } else { 118 + follow.FollowedAt = followedAtTime 119 + } 120 + follows = append(follows, follow) 121 + } 122 + return follows, nil 123 + } 124 + 125 + func GetFollowers(e Execer, did string) ([]Follow, error) { 126 + return GetFollows(e, 0, FilterEq("subject_did", did)) 127 + } 128 + 129 + func GetFollowing(e Execer, did string) ([]Follow, error) { 130 + return GetFollows(e, 0, FilterEq("user_did", did)) 69 131 } 70 132 71 133 type FollowStatus int ··· 161 95 } else { 162 96 return IsFollowing 163 97 } 164 - } 165 - 166 - func GetAllFollows(e Execer, limit int) ([]Follow, error) { 167 - var follows []Follow 168 - 169 - rows, err := e.Query(` 170 - select user_did, subject_did, followed_at, rkey 171 - from follows 172 - order by followed_at desc 173 - limit ?`, limit, 174 - ) 175 - if err != nil { 176 - return nil, err 177 - } 178 - defer rows.Close() 179 - 180 - for rows.Next() { 181 - var follow Follow 182 - var followedAt string 183 - if err := rows.Scan(&follow.UserDid, &follow.SubjectDid, &followedAt, &follow.Rkey); err != nil { 184 - return nil, err 185 - } 186 - 187 - followedAtTime, err := time.Parse(time.RFC3339, followedAt) 188 - if err != nil { 189 - log.Println("unable to determine followed at time") 190 - follow.FollowedAt = time.Now() 191 - } else { 192 - follow.FollowedAt = followedAtTime 193 - } 194 - 195 - follows = append(follows, follow) 196 - } 197 - 198 - if err := rows.Err(); err != nil { 199 - return nil, err 200 - } 201 - 202 - return follows, nil 203 98 }
+1 -1
appview/db/timeline.go
··· 137 137 } 138 138 139 139 func getTimelineFollows(e Execer) ([]TimelineEvent, error) { 140 - follows, err := GetAllFollows(e, Limit) 140 + follows, err := GetFollows(e, Limit) 141 141 if err != nil { 142 142 return nil, err 143 143 }