Write on the margins of the internet. Powered by the AT Protocol.
margin.at
extension
web
atproto
comments
1package db
2
3func (db *DB) CreateLike(l *Like) error {
4 _, err := db.Exec(db.Rebind(`
5 INSERT INTO likes (uri, author_did, subject_uri, created_at, indexed_at)
6 VALUES (?, ?, ?, ?, ?)
7 ON CONFLICT(uri) DO NOTHING
8 `), l.URI, l.AuthorDID, l.SubjectURI, l.CreatedAt, l.IndexedAt)
9 return err
10}
11
12func (db *DB) DeleteLike(uri string) error {
13 _, err := db.Exec(db.Rebind(`DELETE FROM likes WHERE uri = ?`), uri)
14 return err
15}
16
17func (db *DB) GetLikesByAuthor(authorDID string) ([]Like, error) {
18 rows, err := db.Query(db.Rebind(`
19 SELECT uri, author_did, subject_uri, created_at, indexed_at
20 FROM likes
21 WHERE author_did = ?
22 ORDER BY created_at DESC
23 `), authorDID)
24 if err != nil {
25 return nil, err
26 }
27 defer rows.Close()
28
29 var likes []Like
30 for rows.Next() {
31 var l Like
32 if err := rows.Scan(&l.URI, &l.AuthorDID, &l.SubjectURI, &l.CreatedAt, &l.IndexedAt); err != nil {
33 return nil, err
34 }
35 likes = append(likes, l)
36 }
37 return likes, nil
38}
39
40func (db *DB) GetLikeCount(subjectURI string) (int, error) {
41 var count int
42 err := db.QueryRow(db.Rebind(`SELECT COUNT(*) FROM likes WHERE subject_uri = ?`), subjectURI).Scan(&count)
43 return count, err
44}
45
46func (db *DB) GetLikeByUserAndSubject(userDID, subjectURI string) (*Like, error) {
47 var like Like
48 err := db.QueryRow(db.Rebind(`
49 SELECT uri, author_did, subject_uri, created_at, indexed_at
50 FROM likes
51 WHERE author_did = ? AND subject_uri = ?
52 `), userDID, subjectURI).Scan(&like.URI, &like.AuthorDID, &like.SubjectURI, &like.CreatedAt, &like.IndexedAt)
53 if err != nil {
54 return nil, err
55 }
56 return &like, nil
57}
58
59func (db *DB) GetLikeCounts(subjectURIs []string) (map[string]int, error) {
60 if len(subjectURIs) == 0 {
61 return map[string]int{}, nil
62 }
63
64 query := db.Rebind(`
65 SELECT subject_uri, COUNT(*)
66 FROM likes
67 WHERE subject_uri IN (` + buildPlaceholders(len(subjectURIs)) + `)
68 GROUP BY subject_uri
69 `)
70
71 args := make([]interface{}, len(subjectURIs))
72 for i, uri := range subjectURIs {
73 args[i] = uri
74 }
75
76 rows, err := db.Query(query, args...)
77 if err != nil {
78 return nil, err
79 }
80 defer rows.Close()
81
82 counts := make(map[string]int)
83 for rows.Next() {
84 var uri string
85 var count int
86 if err := rows.Scan(&uri, &count); err != nil {
87 return nil, err
88 }
89 counts[uri] = count
90 }
91
92 return counts, nil
93}
94
95func (db *DB) GetViewerLikes(viewerDID string, subjectURIs []string) (map[string]bool, error) {
96 if len(subjectURIs) == 0 {
97 return map[string]bool{}, nil
98 }
99
100 query := db.Rebind(`
101 SELECT subject_uri
102 FROM likes
103 WHERE author_did = ? AND subject_uri IN (` + buildPlaceholders(len(subjectURIs)) + `)
104 `)
105
106 args := make([]interface{}, len(subjectURIs)+1)
107 args[0] = viewerDID
108 for i, uri := range subjectURIs {
109 args[i+1] = uri
110 }
111
112 rows, err := db.Query(query, args...)
113 if err != nil {
114 return nil, err
115 }
116 defer rows.Close()
117
118 likes := make(map[string]bool)
119 for rows.Next() {
120 var uri string
121 if err := rows.Scan(&uri); err != nil {
122 return nil, err
123 }
124 likes[uri] = true
125 }
126
127 return likes, nil
128}