···59 create table if not exists follows (
60 user_did text not null,
61 subject_did text not null,
62- at_uri text not null,
63 followed_at text not null default (strftime('%Y-%m-%dT%H:%M:%SZ', 'now')),
64 primary key (user_did, subject_did),
65 check (user_did <> subject_did)
···59 create table if not exists follows (
60 user_did text not null,
61 subject_did text not null,
62+ rkey text not null,
63 followed_at text not null default (strftime('%Y-%m-%dT%H:%M:%SZ', 'now')),
64 primary key (user_did, subject_did),
65 check (user_did <> subject_did)
+46-2
appview/db/follow.go
···2021// Get a follow record
22func (d *DB) GetFollow(userDid, subjectDid string) (*Follow, error) {
23- query := `select user_did, subject_did, followed_at, at_uri from follows where user_did = ? and subject_did = ?`
24 row := d.db.QueryRow(query, userDid, subjectDid)
2526 var follow Follow
···47 return err
48}
490000000000000000000000000000000000000000000050func (d *DB) GetAllFollows() ([]Follow, error) {
51 var follows []Follow
5253- rows, err := d.db.Query(`select user_did, subject_did, followed_at, at_uri from follows`)
54 if err != nil {
55 return nil, err
56 }
···2021// Get a follow record
22func (d *DB) GetFollow(userDid, subjectDid string) (*Follow, error) {
23+ query := `select user_did, subject_did, followed_at, rkey from follows where user_did = ? and subject_did = ?`
24 row := d.db.QueryRow(query, userDid, subjectDid)
2526 var follow Follow
···47 return err
48}
4950+func (d *DB) GetFollowerFollowing(did string) (int, int, error) {
51+ followers, following := 0, 0
52+ err := d.db.QueryRow(
53+ `SELECT
54+ COUNT(CASE WHEN subject_did = ? THEN 1 END) AS followers,
55+ COUNT(CASE WHEN user_did = ? THEN 1 END) AS following
56+ FROM follows;`, did, did).Scan(&followers, &following)
57+ if err != nil {
58+ return 0, 0, err
59+ }
60+ return followers, following, nil
61+}
62+63+type FollowStatus int
64+65+const (
66+ IsNotFollowing FollowStatus = iota
67+ IsFollowing
68+ IsSelf
69+)
70+71+func (s FollowStatus) String() string {
72+ switch s {
73+ case IsNotFollowing:
74+ return "IsNotFollowing"
75+ case IsFollowing:
76+ return "IsFollowing"
77+ case IsSelf:
78+ return "IsSelf"
79+ default:
80+ return "IsNotFollowing"
81+ }
82+}
83+84+func (d *DB) GetFollowStatus(userDid, subjectDid string) FollowStatus {
85+ if userDid == subjectDid {
86+ return IsSelf
87+ } else if _, err := d.GetFollow(userDid, subjectDid); err != nil {
88+ return IsNotFollowing
89+ } else {
90+ return IsFollowing
91+ }
92+}
93+94func (d *DB) GetAllFollows() ([]Follow, error) {
95 var follows []Follow
9697+ rows, err := d.db.Query(`select user_did, subject_did, followed_at, rkey from follows`)
98 if err != nil {
99 return nil, err
100 }