import { getDb } from "../index.ts"; import { WIKI_NOT_MODERATED } from "./moderation.ts"; import { WIKI_WITH_COUNTS, type WikiWithNoteCount } from "./wiki.ts"; export function upsertBookmark( did: string, wikiAtUri: string, atUri: string, createdAt: string, ): void { const db = getDb(); db.run( `INSERT INTO bookmarks (did, wiki_at_uri, at_uri, created_at) VALUES (?, ?, ?, ?) ON CONFLICT(did, wiki_at_uri) DO UPDATE SET at_uri = excluded.at_uri`, [did, wikiAtUri, atUri, createdAt], ); } export function deleteBookmarkByUri(atUri: string): void { const db = getDb(); db.run("DELETE FROM bookmarks WHERE at_uri = ?", [atUri]); } export function getBookmarkAtUri( did: string, wikiAtUri: string, ): string | null { const db = getDb(); const row = db .query("SELECT at_uri FROM bookmarks WHERE did = ? AND wiki_at_uri = ?") .get(did, wikiAtUri) as { at_uri: string } | null; return row?.at_uri ?? null; } export function deleteBookmarkByWiki(did: string, wikiAtUri: string): void { const db = getDb(); db.run("DELETE FROM bookmarks WHERE did = ? AND wiki_at_uri = ?", [ did, wikiAtUri, ]); } export function isBookmarked(did: string, wikiAtUri: string): boolean { const db = getDb(); const row = db .query("SELECT 1 FROM bookmarks WHERE did = ? AND wiki_at_uri = ?") .get(did, wikiAtUri); return row !== null; } export function getBookmarksForUser(did: string): WikiWithNoteCount[] { const db = getDb(); return db .query( `${WIKI_WITH_COUNTS} JOIN bookmarks b ON b.wiki_at_uri = w.at_uri WHERE b.did = ? AND ${WIKI_NOT_MODERATED} GROUP BY w.at_uri ORDER BY b.created_at DESC`, ) .all(did) as WikiWithNoteCount[]; }