···5959 create table if not exists follows (
6060 user_did text not null,
6161 subject_did text not null,
6262- at_uri text not null,
6262+ rkey text not null,
6363 followed_at text not null default (strftime('%Y-%m-%dT%H:%M:%SZ', 'now')),
6464 primary key (user_did, subject_did),
6565 check (user_did <> subject_did)
+46-2
appview/db/follow.go
···20202121// Get a follow record
2222func (d *DB) GetFollow(userDid, subjectDid string) (*Follow, error) {
2323- query := `select user_did, subject_did, followed_at, at_uri from follows where user_did = ? and subject_did = ?`
2323+ query := `select user_did, subject_did, followed_at, rkey from follows where user_did = ? and subject_did = ?`
2424 row := d.db.QueryRow(query, userDid, subjectDid)
25252626 var follow Follow
···4747 return err
4848}
49495050+func (d *DB) GetFollowerFollowing(did string) (int, int, error) {
5151+ followers, following := 0, 0
5252+ err := d.db.QueryRow(
5353+ `SELECT
5454+ COUNT(CASE WHEN subject_did = ? THEN 1 END) AS followers,
5555+ COUNT(CASE WHEN user_did = ? THEN 1 END) AS following
5656+ FROM follows;`, did, did).Scan(&followers, &following)
5757+ if err != nil {
5858+ return 0, 0, err
5959+ }
6060+ return followers, following, nil
6161+}
6262+6363+type FollowStatus int
6464+6565+const (
6666+ IsNotFollowing FollowStatus = iota
6767+ IsFollowing
6868+ IsSelf
6969+)
7070+7171+func (s FollowStatus) String() string {
7272+ switch s {
7373+ case IsNotFollowing:
7474+ return "IsNotFollowing"
7575+ case IsFollowing:
7676+ return "IsFollowing"
7777+ case IsSelf:
7878+ return "IsSelf"
7979+ default:
8080+ return "IsNotFollowing"
8181+ }
8282+}
8383+8484+func (d *DB) GetFollowStatus(userDid, subjectDid string) FollowStatus {
8585+ if userDid == subjectDid {
8686+ return IsSelf
8787+ } else if _, err := d.GetFollow(userDid, subjectDid); err != nil {
8888+ return IsNotFollowing
8989+ } else {
9090+ return IsFollowing
9191+ }
9292+}
9393+5094func (d *DB) GetAllFollows() ([]Follow, error) {
5195 var follows []Follow
52965353- rows, err := d.db.Query(`select user_did, subject_did, followed_at, at_uri from follows`)
9797+ rows, err := d.db.Query(`select user_did, subject_did, followed_at, rkey from follows`)
5498 if err != nil {
5599 return nil, err
56100 }
+19-17
appview/db/repos.go
···99 Did string
1010 Name string
1111 Knot string
1212- Created *time.Time
1312 Rkey string
1313+ Created *time.Time
1414}
15151616func (d *DB) GetAllRepos() ([]Repo, error) {
1717 var repos []Repo
18181919- rows, err := d.db.Query(`select did, name, knot, created from repos`)
1919+ rows, err := d.db.Query(`select * from repos`)
2020 if err != nil {
2121 return nil, err
2222 }
2323 defer rows.Close()
24242525 for rows.Next() {
2626- repo, err := scanRepo(rows)
2626+ var repo Repo
2727+ err := scanRepo(rows, &repo.Did, &repo.Name, &repo.Knot, &repo.Rkey, repo.Created)
2728 if err != nil {
2829 return nil, err
2930 }
3030- repos = append(repos, *repo)
3131+ repos = append(repos, repo)
3132 }
32333334 if err := rows.Err(); err != nil {
···4748 defer rows.Close()
48494950 for rows.Next() {
5050- repo, err := scanRepo(rows)
5151+ var repo Repo
5252+ err := scanRepo(rows, &repo.Did, &repo.Name, &repo.Knot, &repo.Rkey, repo.Created)
5153 if err != nil {
5254 return nil, err
5355 }
5454- repos = append(repos, *repo)
5656+ repos = append(repos, repo)
5557 }
56585759 if err := rows.Err(); err != nil {
···9799func (d *DB) CollaboratingIn(collaborator string) ([]Repo, error) {
98100 var repos []Repo
99101100100- rows, err := d.db.Query(`select r.* from repos r join collaborators c on r.id = c.repo where c.did = ?;`, collaborator)
102102+ rows, err := d.db.Query(`select r.did, r.name, r.knot, r.rkey, r.created from repos r join collaborators c on r.id = c.repo where c.did = ?;`, collaborator)
101103 if err != nil {
102104 return nil, err
103105 }
104106 defer rows.Close()
105107106108 for rows.Next() {
107107- repo, err := scanRepo(rows)
109109+ var repo Repo
110110+ err := scanRepo(rows, &repo.Did, &repo.Name, &repo.Knot, &repo.Rkey, repo.Created)
108111 if err != nil {
109112 return nil, err
110113 }
111111- repos = append(repos, *repo)
114114+ repos = append(repos, repo)
112115 }
113116114117 if err := rows.Err(); err != nil {
···118121 return repos, nil
119122}
120123121121-func scanRepo(rows *sql.Rows) (*Repo, error) {
122122- var repo Repo
124124+func scanRepo(rows *sql.Rows, did, name, knot, rkey *string, created *time.Time) error {
123125 var createdAt string
124124- if err := rows.Scan(&repo.Did, &repo.Name, &repo.Knot, &createdAt); err != nil {
125125- return nil, err
126126+ if err := rows.Scan(did, name, knot, rkey, &createdAt); err != nil {
127127+ return err
126128 }
127129128130 createdAtTime, err := time.Parse(time.RFC3339, createdAt)
129131 if err != nil {
130132 now := time.Now()
131131- repo.Created = &now
133133+ created = &now
134134+ } else {
135135+ created = &createdAtTime
132136 }
133137134134- repo.Created = &createdAtTime
135135-136136- return &repo, nil
138138+ return nil
137139}