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

merged
opened by ptr.pet targeting master from ptr.pet/core: followers-following-list
Changed files
+68 -41
appview
+67 -40
appview/db/follow.go
···
package db
import (
+
"fmt"
"log"
+
"strings"
"time"
)
···
func GetFollowerFollowingCount(e Execer, did string) (int, int, error) {
followers, following := 0, 0
err := e.QueryRow(
-
`SELECT
+
`SELECT
COUNT(CASE WHEN subject_did = ? THEN 1 END) AS followers,
COUNT(CASE WHEN user_did = ? THEN 1 END) AS following
FROM follows;`, did, did).Scan(&followers, &following)
···
return followers, following, nil
}
+
func GetFollows(e Execer, limit int, filters ...filter) ([]Follow, error) {
+
var follows []Follow
+
+
var conditions []string
+
var args []any
+
for _, filter := range filters {
+
conditions = append(conditions, filter.Condition())
+
args = append(args, filter.Arg()...)
+
}
+
+
whereClause := ""
+
if conditions != nil {
+
whereClause = " where " + strings.Join(conditions, " and ")
+
}
+
limitClause := ""
+
if limit > 0 {
+
limitClause = " limit ?"
+
args = append(args, limit)
+
}
+
+
query := fmt.Sprintf(
+
`select user_did, subject_did, followed_at, rkey
+
from follows
+
%s
+
order by followed_at desc
+
%s
+
`, whereClause, limitClause)
+
+
rows, err := e.Query(query, args...)
+
if err != nil {
+
return nil, err
+
}
+
for rows.Next() {
+
var follow Follow
+
var followedAt string
+
err := rows.Scan(
+
&follow.UserDid,
+
&follow.SubjectDid,
+
&followedAt,
+
&follow.Rkey,
+
)
+
if err != nil {
+
return nil, err
+
}
+
followedAtTime, err := time.Parse(time.RFC3339, followedAt)
+
if err != nil {
+
log.Println("unable to determine followed at time")
+
follow.FollowedAt = time.Now()
+
} else {
+
follow.FollowedAt = followedAtTime
+
}
+
follows = append(follows, follow)
+
}
+
return follows, nil
+
}
+
+
func GetFollowers(e Execer, did string) ([]Follow, error) {
+
return GetFollows(e, 0, FilterEq("subject_did", did))
+
}
+
+
func GetFollowing(e Execer, did string) ([]Follow, error) {
+
return GetFollows(e, 0, FilterEq("user_did", did))
+
}
+
type FollowStatus int
const (
···
return IsFollowing
}
}
-
-
func GetAllFollows(e Execer, limit int) ([]Follow, error) {
-
var follows []Follow
-
-
rows, err := e.Query(`
-
select user_did, subject_did, followed_at, rkey
-
from follows
-
order by followed_at desc
-
limit ?`, limit,
-
)
-
if err != nil {
-
return nil, err
-
}
-
defer rows.Close()
-
-
for rows.Next() {
-
var follow Follow
-
var followedAt string
-
if err := rows.Scan(&follow.UserDid, &follow.SubjectDid, &followedAt, &follow.Rkey); err != nil {
-
return nil, err
-
}
-
-
followedAtTime, err := time.Parse(time.RFC3339, followedAt)
-
if err != nil {
-
log.Println("unable to determine followed at time")
-
follow.FollowedAt = time.Now()
-
} else {
-
follow.FollowedAt = followedAtTime
-
}
-
-
follows = append(follows, follow)
-
}
-
-
if err := rows.Err(); err != nil {
-
return nil, err
-
}
-
-
return follows, nil
-
}
+1 -1
appview/db/timeline.go
···
}
func getTimelineFollows(e Execer) ([]TimelineEvent, error) {
-
follows, err := GetAllFollows(e, Limit)
+
follows, err := GetFollows(e, Limit)
if err != nil {
return nil, err
}