import * as TID from "@atcute/tid"; import { deleteRecord, writeCommunityBookmarkRecord, } from "../../atproto/pds.ts"; import { getAgent, type Session } from "../../atproto/session.ts"; import { deleteBookmarkByWiki, getBookmarkAtUri, upsertBookmark, } from "../../server/db/queries/index.ts"; import { parseAtUri } from "../at-uri.ts"; import { COLLECTIONS } from "../collections.ts"; import { withPdsError } from "./helpers.ts"; export async function addBookmarkAction( did: string, wikiAtUri: string, session: Session | null, ): Promise { // Idempotent: never mint a second record for an already-bookmarked wiki. if (getBookmarkAtUri(did, wikiAtUri)) return; const now = new Date().toISOString(); const tid = TID.now(); const atUri = `at://${did}/${COLLECTIONS.communityBookmark}/${tid}`; const agent = session ? getAgent(session) : null; if (agent && session) { await withPdsError("add bookmark", async () => { await writeCommunityBookmarkRecord( agent, session.did, tid, wikiAtUri, now, ); }); } upsertBookmark(did, wikiAtUri, atUri, now); } export async function deleteBookmarkAction( did: string, wikiAtUri: string, session: Session | null, ): Promise { const bookmarkAtUri = getBookmarkAtUri(did, wikiAtUri); if (!bookmarkAtUri) return; const agent = session ? getAgent(session) : null; if (agent) { const parsed = parseAtUri(bookmarkAtUri); // Legacy wiki.lichen.bookmark records are out of scope and abandoned — DB-only. if (parsed && parsed.collection !== COLLECTIONS.bookmark) { await withPdsError("remove bookmark", async () => { await deleteRecord(agent, parsed.did, parsed.collection, parsed.rkey); }); } } deleteBookmarkByWiki(did, wikiAtUri); }