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
+65 -1
appview
+65 -1
appview/db/follow.go
···
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 GetFollowers(e Execer, did string) ([]Follow, error) {
+
var followers []Follow
+
rows, err := e.Query(`
+
select user_did, subject_did, followed_at, rkey from follows where subject_did = ?
+
`, did)
+
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
+
}
+
followers = append(followers, follow)
+
}
+
return followers, nil
+
}
+
+
func GetFollowing(e Execer, did string) ([]Follow, error) {
+
var following []Follow
+
rows, err := e.Query(`
+
select user_did, subject_did, followed_at, rkey from follows where user_did = ?
+
`, did)
+
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
+
}
+
following = append(following, follow)
+
}
+
return following, nil
+
}
+
type FollowStatus int
const (