···11+-- +goose Up
22+CREATE TABLE IF NOT EXISTS community_bookmark_refs (
33+ note_uri TEXT PRIMARY KEY,
44+ community_uri TEXT NOT NULL
55+);
66+77+-- +goose Down
88+DROP TABLE IF EXISTS community_bookmark_refs;
+24-20
backend/internal/db/queries_notes.go
···7575 return true, nil
7676}
77777878-func (db *DB) GetCommunityBookmarkURI(authorDID, targetHash string) (string, error) {
7878+func (db *DB) SaveCommunityBookmarkRef(noteURI, communityURI string) error {
7979+ _, err := db.Exec(`
8080+ INSERT INTO community_bookmark_refs (note_uri, community_uri)
8181+ VALUES ($1, $2)
8282+ ON CONFLICT (note_uri) DO UPDATE SET community_uri = EXCLUDED.community_uri
8383+ `, noteURI, communityURI)
8484+ return err
8585+}
8686+8787+func (db *DB) GetCommunityBookmarkURI(noteURI string) (string, error) {
7988 var uri string
8089 err := db.QueryRow(`
8181- SELECT uri FROM notes
8282- WHERE author_did = $1
8383- AND target_hash = $2
8484- AND uri LIKE 'at://%/community.lexicon.bookmarks.bookmark/%'
8585- LIMIT 1
8686- `, authorDID, targetHash).Scan(&uri)
9090+ SELECT community_uri FROM community_bookmark_refs WHERE note_uri = $1
9191+ `, noteURI).Scan(&uri)
8792 if err == sql.ErrNoRows {
8893 return "", nil
8994 }
9095 return uri, err
9196}
92979898+func (db *DB) DeleteCommunityBookmarkRef(noteURI string) error {
9999+ _, err := db.Exec(`DELETE FROM community_bookmark_refs WHERE note_uri = $1`, noteURI)
100100+ return err
101101+}
102102+93103func (db *DB) CommunityBookmarkExists(authorDID, targetHash, tagsJSON string) (bool, error) {
9494- query := `
9595- SELECT 1 FROM notes
9696- WHERE author_did = $1
9797- AND target_hash = $2
9898- AND uri LIKE 'at://%/community.lexicon.bookmarks.bookmark/%'
9999- AND COALESCE(tags_json, '[]') = COALESCE($3, '[]')
100100- LIMIT 1
101101- `
102102- normalized := tagsJSON
103103- if normalized == "" {
104104- normalized = "[]"
105105- }
106104 var dummy int
107107- err := db.QueryRow(query, authorDID, targetHash, normalized).Scan(&dummy)
105105+ err := db.QueryRow(`
106106+ SELECT 1 FROM community_bookmark_refs cbr
107107+ JOIN notes n ON n.uri = cbr.note_uri
108108+ WHERE n.author_did = $1
109109+ AND n.target_hash = $2
110110+ LIMIT 1
111111+ `, authorDID, targetHash).Scan(&dummy)
108112 if err == sql.ErrNoRows {
109113 return false, nil
110114 }