···112 next_issue_id integer not null default 1
113 );
114115+ create table if not exists stars (
116+ id integer primary key autoincrement,
117+ starred_by_did text not null,
118+ repo_at text not null,
119+ rkey text not null,
120+ created text not null default (strftime('%Y-%m-%dT%H:%M:%SZ', 'now')),
121+ foreign key (repo_at) references repos(at_uri) on delete cascade,
122+ unique(starred_by_did, repo_at)
123+ );
124+125 `)
126 if err != nil {
127 return nil, err
+11-6
appview/db/follow.go
···9 UserDid string
10 SubjectDid string
11 FollowedAt time.Time
12- RKey string
13}
1415func AddFollow(e Execer, userDid, subjectDid, rkey string) error {
···2526 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 }
···41 return &follow, nil
42}
4344-// Get a follow record
45func DeleteFollow(e Execer, userDid, subjectDid string) error {
46 _, err := e.Exec(`delete from follows where user_did = ? and subject_did = ?`, userDid, subjectDid)
47 return err
···91 }
92}
9394-func GetAllFollows(e Execer) ([]Follow, error) {
95 var follows []Follow
9697- rows, err := e.Query(`select user_did, subject_did, followed_at, rkey from follows`)
0000098 if err != nil {
99 return nil, err
100 }
···103 for rows.Next() {
104 var follow Follow
105 var followedAt string
106- if err := rows.Scan(&follow.UserDid, &follow.SubjectDid, &followedAt, &follow.RKey); err != nil {
107 return nil, err
108 }
109