1package db
2
3import (
4 "log"
5 "time"
6)
7
8type Follow struct {
9 UserDid string
10 SubjectDid string
11 FollowedAt *time.Time
12 RKey string
13}
14
15func (d *DB) AddFollow(userDid, subjectDid, rkey string) error {
16 query := `insert or ignore into follows (user_did, subject_did, rkey) values (?, ?, ?)`
17 _, err := d.db.Exec(query, userDid, subjectDid, rkey)
18 return err
19}
20
21// 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)
25
26 var follow Follow
27 var followedAt string
28 err := row.Scan(&follow.UserDid, &follow.SubjectDid, &followedAt, &follow.RKey)
29 if err != nil {
30 return nil, err
31 }
32
33 followedAtTime, err := time.Parse(time.RFC3339, followedAt)
34 if err != nil {
35 log.Println("unable to determine followed at time")
36 follow.FollowedAt = nil
37 } else {
38 follow.FollowedAt = &followedAtTime
39 }
40
41 return &follow, nil
42}
43
44// Get a follow record
45func (d *DB) DeleteFollow(userDid, subjectDid string) error {
46 _, err := d.db.Exec(`delete from follows where user_did = ? and subject_did = ?`, userDid, subjectDid)
47 return err
48}
49
50func (d *DB) GetAllFollows() ([]Follow, error) {
51 var follows []Follow
52
53 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 }
57 defer rows.Close()
58
59 for rows.Next() {
60 var follow Follow
61 var followedAt string
62 if err := rows.Scan(&follow.UserDid, &follow.SubjectDid, &followedAt, &follow.RKey); err != nil {
63 return nil, err
64 }
65
66 followedAtTime, err := time.Parse(time.RFC3339, followedAt)
67 if err != nil {
68 log.Println("unable to determine followed at time")
69 follow.FollowedAt = nil
70 } else {
71 follow.FollowedAt = &followedAtTime
72 }
73
74 follows = append(follows, follow)
75 }
76
77 if err := rows.Err(); err != nil {
78 return nil, err
79 }
80
81 return follows, nil
82}