+67
-40
appview/db/follow.go
+67
-40
appview/db/follow.go
···
1
package db
2
3
import (
4
"log"
5
"time"
6
)
7
···
56
func GetFollowerFollowingCount(e Execer, did string) (int, int, error) {
57
followers, following := 0, 0
58
err := e.QueryRow(
59
-
`SELECT
60
COUNT(CASE WHEN subject_did = ? THEN 1 END) AS followers,
61
COUNT(CASE WHEN user_did = ? THEN 1 END) AS following
62
FROM follows;`, did, did).Scan(&followers, &following)
···
66
return followers, following, nil
67
}
68
69
type FollowStatus int
70
71
const (
···
96
return IsFollowing
97
}
98
}
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
package db
2
3
import (
4
+
"fmt"
5
"log"
6
+
"strings"
7
"time"
8
)
9
···
58
func GetFollowerFollowingCount(e Execer, did string) (int, int, error) {
59
followers, following := 0, 0
60
err := e.QueryRow(
61
+
`SELECT
62
COUNT(CASE WHEN subject_did = ? THEN 1 END) AS followers,
63
COUNT(CASE WHEN user_did = ? THEN 1 END) AS following
64
FROM follows;`, did, did).Scan(&followers, &following)
···
68
return followers, following, nil
69
}
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
+
135
type FollowStatus int
136
137
const (
···
162
return IsFollowing
163
}
164
}
+1
-1
appview/db/timeline.go
+1
-1
appview/db/timeline.go