Write on the margins of the internet. Powered by the AT Protocol. margin.at
extension web atproto comments
at ui-refactor 128 lines 3.0 kB view raw
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}