forked from
tangled.org/core
fork
Configure Feed
Select the types of activity you want to include in your feed.
this repo has no description
fork
Configure Feed
Select the types of activity you want to include in your feed.
1package db
2
3import (
4 "log"
5 "time"
6
7 "github.com/bluesky-social/indigo/atproto/syntax"
8)
9
10type Star struct {
11 StarredByDid string
12 RepoAt syntax.ATURI
13 Created time.Time
14 Rkey string
15
16 // optionally, populate this when querying for reverse mappings
17 Repo *Repo
18}
19
20func (star *Star) ResolveRepo(e Execer) error {
21 if star.Repo != nil {
22 return nil
23 }
24
25 repo, err := GetRepoByAtUri(e, star.RepoAt.String())
26 if err != nil {
27 return err
28 }
29
30 star.Repo = repo
31 return nil
32}
33
34func AddStar(e Execer, starredByDid string, repoAt syntax.ATURI, rkey string) error {
35 query := `insert or ignore into stars (starred_by_did, repo_at, rkey) values (?, ?, ?)`
36 _, err := e.Exec(query, starredByDid, repoAt, rkey)
37 return err
38}
39
40// Get a star record
41func GetStar(e Execer, starredByDid string, repoAt syntax.ATURI) (*Star, error) {
42 query := `
43 select starred_by_did, repo_at, created, rkey
44 from stars
45 where starred_by_did = ? and repo_at = ?`
46 row := e.QueryRow(query, starredByDid, repoAt)
47
48 var star Star
49 var created string
50 err := row.Scan(&star.StarredByDid, &star.RepoAt, &created, &star.Rkey)
51 if err != nil {
52 return nil, err
53 }
54
55 createdAtTime, err := time.Parse(time.RFC3339, created)
56 if err != nil {
57 log.Println("unable to determine followed at time")
58 star.Created = time.Now()
59 } else {
60 star.Created = createdAtTime
61 }
62
63 return &star, nil
64}
65
66// Remove a star
67func DeleteStar(e Execer, starredByDid string, repoAt syntax.ATURI) error {
68 _, err := e.Exec(`delete from stars where starred_by_did = ? and repo_at = ?`, starredByDid, repoAt)
69 return err
70}
71
72func GetStarCount(e Execer, repoAt syntax.ATURI) (int, error) {
73 stars := 0
74 err := e.QueryRow(
75 `select count(starred_by_did) from stars where repo_at = ?`, repoAt).Scan(&stars)
76 if err != nil {
77 return 0, err
78 }
79 return stars, nil
80}
81
82func GetStarStatus(e Execer, userDid string, repoAt syntax.ATURI) bool {
83 if _, err := GetStar(e, userDid, repoAt); err != nil {
84 return false
85 } else {
86 return true
87 }
88}
89
90func GetAllStars(e Execer, limit int) ([]Star, error) {
91 var stars []Star
92
93 rows, err := e.Query(`
94 select
95 s.starred_by_did,
96 s.repo_at,
97 s.rkey,
98 s.created,
99 r.did,
100 r.name,
101 r.knot,
102 r.rkey,
103 r.created,
104 r.at_uri
105 from stars s
106 join repos r on s.repo_at = r.at_uri
107 `)
108
109 if err != nil {
110 return nil, err
111 }
112 defer rows.Close()
113
114 for rows.Next() {
115 var star Star
116 var repo Repo
117 var starCreatedAt, repoCreatedAt string
118
119 if err := rows.Scan(
120 &star.StarredByDid,
121 &star.RepoAt,
122 &star.Rkey,
123 &starCreatedAt,
124 &repo.Did,
125 &repo.Name,
126 &repo.Knot,
127 &repo.Rkey,
128 &repoCreatedAt,
129 &repo.AtUri,
130 ); err != nil {
131 return nil, err
132 }
133
134 star.Created, err = time.Parse(time.RFC3339, starCreatedAt)
135 if err != nil {
136 star.Created = time.Now()
137 }
138 repo.Created, err = time.Parse(time.RFC3339, repoCreatedAt)
139 if err != nil {
140 repo.Created = time.Now()
141 }
142 star.Repo = &repo
143
144 stars = append(stars, star)
145 }
146
147 if err := rows.Err(); err != nil {
148 return nil, err
149 }
150
151 return stars, nil
152}