forked from tangled.org/core
Monorepo for Tangled

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

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

authored by ptr.pet and committed by Tangled d1f3d357 634c03e1

Changed files
+68 -41
appview
+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 ··· 56 58 func GetFollowerFollowingCount(e Execer, did string) (int, int, error) { 57 59 followers, following := 0, 0 58 60 err := e.QueryRow( 59 - `SELECT 61 + `SELECT 60 62 COUNT(CASE WHEN subject_did = ? THEN 1 END) AS followers, 61 63 COUNT(CASE WHEN user_did = ? THEN 1 END) AS following 62 64 FROM follows;`, did, did).Scan(&followers, &following) ··· 66 68 return followers, following, nil 67 69 } 68 70 71 + func GetFollows(e Execer, limit int, filters ...filter) ([]Follow, error) { 72 + var follows []Follow 73 + 74 + var conditions []string 75 + var args []any 76 + for _, filter := range filters { 77 + conditions = append(conditions, filter.Condition()) 78 + args = append(args, filter.Arg()...) 79 + } 80 + 81 + whereClause := "" 82 + if conditions != nil { 83 + whereClause = " where " + strings.Join(conditions, " and ") 84 + } 85 + limitClause := "" 86 + if limit > 0 { 87 + limitClause = " limit ?" 88 + args = append(args, limit) 89 + } 90 + 91 + query := fmt.Sprintf( 92 + `select user_did, subject_did, followed_at, rkey 93 + from follows 94 + %s 95 + order by followed_at desc 96 + %s 97 + `, whereClause, limitClause) 98 + 99 + rows, err := e.Query(query, args...) 100 + if err != nil { 101 + return nil, err 102 + } 103 + for rows.Next() { 104 + var follow Follow 105 + var followedAt string 106 + err := rows.Scan( 107 + &follow.UserDid, 108 + &follow.SubjectDid, 109 + &followedAt, 110 + &follow.Rkey, 111 + ) 112 + if err != nil { 113 + return nil, err 114 + } 115 + followedAtTime, err := time.Parse(time.RFC3339, followedAt) 116 + if err != nil { 117 + log.Println("unable to determine followed at time") 118 + follow.FollowedAt = time.Now() 119 + } else { 120 + follow.FollowedAt = followedAtTime 121 + } 122 + follows = append(follows, follow) 123 + } 124 + return follows, nil 125 + } 126 + 127 + func GetFollowers(e Execer, did string) ([]Follow, error) { 128 + return GetFollows(e, 0, FilterEq("subject_did", did)) 129 + } 130 + 131 + func GetFollowing(e Execer, did string) ([]Follow, error) { 132 + return GetFollows(e, 0, FilterEq("user_did", did)) 133 + } 134 + 69 135 type FollowStatus int 70 136 71 137 const ( ··· 96 162 return IsFollowing 97 163 } 98 164 } 99 - 100 - func GetAllFollows(e Execer, limit int) ([]Follow, error) { 101 - var follows []Follow 102 - 103 - rows, err := e.Query(` 104 - select user_did, subject_did, followed_at, rkey 105 - from follows 106 - order by followed_at desc 107 - limit ?`, limit, 108 - ) 109 - if err != nil { 110 - return nil, err 111 - } 112 - defer rows.Close() 113 - 114 - for rows.Next() { 115 - var follow Follow 116 - var followedAt string 117 - if err := rows.Scan(&follow.UserDid, &follow.SubjectDid, &followedAt, &follow.Rkey); err != nil { 118 - return nil, err 119 - } 120 - 121 - followedAtTime, err := time.Parse(time.RFC3339, followedAt) 122 - if err != nil { 123 - log.Println("unable to determine followed at time") 124 - follow.FollowedAt = time.Now() 125 - } else { 126 - follow.FollowedAt = followedAtTime 127 - } 128 - 129 - follows = append(follows, follow) 130 - } 131 - 132 - if err := rows.Err(); err != nil { 133 - return nil, err 134 - } 135 - 136 - return follows, nil 137 - }
+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 }