···112112 next_issue_id integer not null default 1113113 );114114115115+ create table if not exists stars (116116+ id integer primary key autoincrement,117117+ starred_by_did text not null,118118+ repo_at text not null,119119+ rkey text not null,120120+ created text not null default (strftime('%Y-%m-%dT%H:%M:%SZ', 'now')),121121+ foreign key (repo_at) references repos(at_uri) on delete cascade,122122+ unique(starred_by_did, repo_at)123123+ );124124+115125 `)116126 if err != nil {117127 return nil, err
+11-6
appview/db/follow.go
···99 UserDid string1010 SubjectDid string1111 FollowedAt time.Time1212- RKey string1212+ Rkey string1313}14141515func AddFollow(e Execer, userDid, subjectDid, rkey string) error {···25252626 var follow Follow2727 var followedAt string2828- err := row.Scan(&follow.UserDid, &follow.SubjectDid, &followedAt, &follow.RKey)2828+ err := row.Scan(&follow.UserDid, &follow.SubjectDid, &followedAt, &follow.Rkey)2929 if err != nil {3030 return nil, err3131 }···4141 return &follow, nil4242}43434444-// Get a follow record4444+// Remove a follow4545func DeleteFollow(e Execer, userDid, subjectDid string) error {4646 _, err := e.Exec(`delete from follows where user_did = ? and subject_did = ?`, userDid, subjectDid)4747 return err···9191 }9292}93939494-func GetAllFollows(e Execer) ([]Follow, error) {9494+func GetAllFollows(e Execer, limit int) ([]Follow, error) {9595 var follows []Follow96969797- rows, err := e.Query(`select user_did, subject_did, followed_at, rkey from follows`)9797+ rows, err := e.Query(`9898+ select user_did, subject_did, followed_at, rkey9999+ from follows100100+ order by followed_at desc101101+ limit ?`, limit,102102+ )98103 if err != nil {99104 return nil, err100105 }···108103 for rows.Next() {109104 var follow Follow110105 var followedAt string111111- if err := rows.Scan(&follow.UserDid, &follow.SubjectDid, &followedAt, &follow.RKey); err != nil {106106+ if err := rows.Scan(&follow.UserDid, &follow.SubjectDid, &followedAt, &follow.Rkey); err != nil {112107 return nil, err113108 }114109
+37-12
appview/db/issues.go
···33import (44 "database/sql"55 "time"66+77+ "github.com/bluesky-social/indigo/atproto/syntax"68)79810type Issue struct {99- RepoAt string1111+ RepoAt syntax.ATURI1012 OwnerDid string1113 IssueId int1214 IssueAt string···20182119type Comment struct {2220 OwnerDid string2323- RepoAt string2121+ RepoAt syntax.ATURI2422 CommentAt string2523 Issue int2624 CommentId int···6765 return nil6866}69677070-func SetIssueAt(e Execer, repoAt string, issueId int, issueAt string) error {6868+func SetIssueAt(e Execer, repoAt syntax.ATURI, issueId int, issueAt string) error {7169 _, err := e.Exec(`update issues set issue_at = ? where repo_at = ? and issue_id = ?`, issueAt, repoAt, issueId)7270 return err7371}74727575-func GetIssueAt(e Execer, repoAt string, issueId int) (string, error) {7373+func GetIssueAt(e Execer, repoAt syntax.ATURI, issueId int) (string, error) {7674 var issueAt string7775 err := e.QueryRow(`select issue_at from issues where repo_at = ? and issue_id = ?`, repoAt, issueId).Scan(&issueAt)7876 return issueAt, err7977}80788181-func GetIssueId(e Execer, repoAt string) (int, error) {7979+func GetIssueId(e Execer, repoAt syntax.ATURI) (int, error) {8280 var issueId int8381 err := e.QueryRow(`select next_issue_id from repo_issue_seqs where repo_at = ?`, repoAt).Scan(&issueId)8482 return issueId - 1, err8583}86848787-func GetIssueOwnerDid(e Execer, repoAt string, issueId int) (string, error) {8585+func GetIssueOwnerDid(e Execer, repoAt syntax.ATURI, issueId int) (string, error) {8886 var ownerDid string8987 err := e.QueryRow(`select owner_did from issues where repo_at = ? and issue_id = ?`, repoAt, issueId).Scan(&ownerDid)9088 return ownerDid, err9189}92909393-func GetIssues(e Execer, repoAt string) ([]Issue, error) {9191+func GetIssues(e Execer, repoAt syntax.ATURI) ([]Issue, error) {9492 var issues []Issue95939694 rows, err := e.Query(`select owner_did, issue_id, created, title, body, open from issues where repo_at = ? order by created desc`, repoAt)···123121 return issues, nil124122}125123126126-func GetIssue(e Execer, repoAt string, issueId int) (*Issue, error) {124124+func GetIssue(e Execer, repoAt syntax.ATURI, issueId int) (*Issue, error) {127125 query := `select owner_did, created, title, body, open from issues where repo_at = ? and issue_id = ?`128126 row := e.QueryRow(query, repoAt, issueId)129127···143141 return &issue, nil144142}145143146146-func GetIssueWithComments(e Execer, repoAt string, issueId int) (*Issue, []Comment, error) {144144+func GetIssueWithComments(e Execer, repoAt syntax.ATURI, issueId int) (*Issue, []Comment, error) {147145 query := `select owner_did, issue_id, created, title, body, open from issues where repo_at = ? and issue_id = ?`148146 row := e.QueryRow(query, repoAt, issueId)149147···182180 return err183181}184182185185-func GetComments(e Execer, repoAt string, issueId int) ([]Comment, error) {183183+func GetComments(e Execer, repoAt syntax.ATURI, issueId int) ([]Comment, error) {186184 var comments []Comment187185188186 rows, err := e.Query(`select owner_did, issue_id, comment_id, comment_at, body, created from comments where repo_at = ? and issue_id = ? order by created asc`, repoAt, issueId)···218216 return comments, nil219217}220218221221-func CloseIssue(e Execer, repoAt string, issueId int) error {219219+func CloseIssue(e Execer, repoAt syntax.ATURI, issueId int) error {222220 _, err := e.Exec(`update issues set open = 0 where repo_at = ? and issue_id = ?`, repoAt, issueId)223221 return err224222}225223226226-func ReopenIssue(e Execer, repoAt string, issueId int) error {224224+func ReopenIssue(e Execer, repoAt syntax.ATURI, issueId int) error {227225 _, err := e.Exec(`update issues set open = 1 where repo_at = ? and issue_id = ?`, repoAt, issueId)228226 return err227227+}228228+229229+type IssueCount struct {230230+ Open int231231+ Closed int232232+}233233+234234+func GetIssueCount(e Execer, repoAt syntax.ATURI) (IssueCount, error) {235235+ row := e.QueryRow(`236236+ select237237+ count(case when open = 1 then 1 end) as open_count,238238+ count(case when open = 0 then 1 end) as closed_count239239+ from issues240240+ where repo_at = ?`,241241+ repoAt,242242+ )243243+244244+ var count IssueCount245245+ if err := row.Scan(&count.Open, &count.Closed); err != nil {246246+ return IssueCount{0, 0}, err247247+ }248248+249249+ return count, nil229250}