···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 record2222func (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 err4848}49495050+func (d *DB) GetFollowerFollowing(did string) (int, int, error) {5151+ followers, following := 0, 05252+ 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 following5656+ FROM follows;`, did, did).Scan(&followers, &following)5757+ if err != nil {5858+ return 0, 0, err5959+ }6060+ return followers, following, nil6161+}6262+6363+type FollowStatus int6464+6565+const (6666+ IsNotFollowing FollowStatus = iota6767+ IsFollowing6868+ IsSelf6969+)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 IsSelf8787+ } else if _, err := d.GetFollow(userDid, subjectDid); err != nil {8888+ return IsNotFollowing8989+ } else {9090+ return IsFollowing9191+ }9292+}9393+5094func (d *DB) GetAllFollows() ([]Follow, error) {5195 var follows []Follow52965353- 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, err56100 }
+19-17
appview/db/repos.go
···99 Did string1010 Name string1111 Knot string1212- Created *time.Time1312 Rkey string1313+ Created *time.Time1414}15151616func (d *DB) GetAllRepos() ([]Repo, error) {1717 var repos []Repo18181919- 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, err2222 }2323 defer rows.Close()24242525 for rows.Next() {2626- repo, err := scanRepo(rows)2626+ var repo Repo2727+ err := scanRepo(rows, &repo.Did, &repo.Name, &repo.Knot, &repo.Rkey, repo.Created)2728 if err != nil {2829 return nil, err2930 }3030- repos = append(repos, *repo)3131+ repos = append(repos, repo)3132 }32333334 if err := rows.Err(); err != nil {···4847 defer rows.Close()49485049 for rows.Next() {5151- repo, err := scanRepo(rows)5050+ var repo Repo5151+ err := scanRepo(rows, &repo.Did, &repo.Name, &repo.Knot, &repo.Rkey, repo.Created)5252 if err != nil {5353 return nil, err5454 }5555- repos = append(repos, *repo)5555+ repos = append(repos, repo)5656 }57575858 if err := rows.Err(); err != nil {···9997func (d *DB) CollaboratingIn(collaborator string) ([]Repo, error) {10098 var repos []Repo10199102102- rows, err := d.db.Query(`select r.* from repos r join collaborators c on r.id = c.repo where c.did = ?;`, collaborator)100100+ 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)103101 if err != nil {104102 return nil, err105103 }106104 defer rows.Close()107105108106 for rows.Next() {109109- repo, err := scanRepo(rows)107107+ var repo Repo108108+ err := scanRepo(rows, &repo.Did, &repo.Name, &repo.Knot, &repo.Rkey, repo.Created)110109 if err != nil {111110 return nil, err112111 }113113- repos = append(repos, *repo)112112+ repos = append(repos, repo)114113 }115114116115 if err := rows.Err(); err != nil {···121118 return repos, nil122119}123120124124-func scanRepo(rows *sql.Rows) (*Repo, error) {125125- var repo Repo121121+func scanRepo(rows *sql.Rows, did, name, knot, rkey *string, created *time.Time) error {126122 var createdAt string127127- if err := rows.Scan(&repo.Did, &repo.Name, &repo.Knot, &createdAt); err != nil {128128- return nil, err123123+ if err := rows.Scan(did, name, knot, rkey, &createdAt); err != nil {124124+ return err129125 }130126131127 createdAtTime, err := time.Parse(time.RFC3339, createdAt)132128 if err != nil {133129 now := time.Now()134134- repo.Created = &now130130+ created = &now131131+ } else {132132+ created = &createdAtTime135133 }136134137137- repo.Created = &createdAtTime138138-139139- return &repo, nil135135+ return nil140136}