From d73a2533b1f861d7089e81399ab2af22619709e2 Mon Sep 17 00:00:00 2001 From: sid597 Date: Sun, 22 Jun 2025 15:49:18 +0530 Subject: [PATCH 1/3] get all dg nodes since --- .../src/utils/getAllDiscourseNodesSince.ts | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 apps/roam/src/utils/getAllDiscourseNodesSince.ts diff --git a/apps/roam/src/utils/getAllDiscourseNodesSince.ts b/apps/roam/src/utils/getAllDiscourseNodesSince.ts new file mode 100644 index 000000000..e116e6fd3 --- /dev/null +++ b/apps/roam/src/utils/getAllDiscourseNodesSince.ts @@ -0,0 +1,40 @@ +import isDiscourseNode from "./isDiscourseNode"; + +type RoamEntityFromQuery = { + uid: string; + title?: string; + createTime?: number; + editTime?: number; + userUuid?: string; + username?: string; +}; + +export const getAllDiscourseNodesSince = async ( + since: string, +): Promise => { + const roamAlpha = (window as any).roamAlphaAPI; + const sinceMs = new Date(since).getTime(); + + const query = `[:find ?uid ?create-time ?edit-time ?user-uuid ?username ?title + :keys uid createTime editTime userUuid username title + :in $ ?since + :where + [?e :node/title ?title] + [?e :block/uid ?uid] + [?e :create/user ?user-id] + [?user-id :user/uid ?user-uuid] + [?user-id :user/display-name ?username] + [?e :create/time ?create-time] + [?e :edit/time ?edit-time] + [(> ?edit-time ?since)]]`; + + const result = roamAlpha.data.q(query, sinceMs) as RoamEntityFromQuery[]; + + return result.filter( + (entity) => + entity.uid && + isDiscourseNode(entity.uid) && + entity.title && + entity.title.trim() !== "", + ); +}; From 8fc0618bb32e1832d0baf951b5717719fcfe93b1 Mon Sep 17 00:00:00 2001 From: sid597 Date: Sun, 22 Jun 2025 16:01:41 +0530 Subject: [PATCH 2/3] fix the return type --- .../src/utils/getAllDiscourseNodesSince.ts | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/apps/roam/src/utils/getAllDiscourseNodesSince.ts b/apps/roam/src/utils/getAllDiscourseNodesSince.ts index e116e6fd3..d4c439367 100644 --- a/apps/roam/src/utils/getAllDiscourseNodesSince.ts +++ b/apps/roam/src/utils/getAllDiscourseNodesSince.ts @@ -1,22 +1,22 @@ import isDiscourseNode from "./isDiscourseNode"; -type RoamEntityFromQuery = { - uid: string; - title?: string; - createTime?: number; - editTime?: number; - userUuid?: string; - username?: string; +export type DiscourseGraphContent = { + author_local_id: string; + source_local_id: string; + scale: string; + created: string; + last_modified: string; + text: string; }; export const getAllDiscourseNodesSince = async ( since: string, -): Promise => { +): Promise => { const roamAlpha = (window as any).roamAlphaAPI; const sinceMs = new Date(since).getTime(); const query = `[:find ?uid ?create-time ?edit-time ?user-uuid ?username ?title - :keys uid createTime editTime userUuid username title + :keys source_local_id created last_modified author_local_id author_name text :in $ ?since :where [?e :node/title ?title] @@ -28,13 +28,13 @@ export const getAllDiscourseNodesSince = async ( [?e :edit/time ?edit-time] [(> ?edit-time ?since)]]`; - const result = roamAlpha.data.q(query, sinceMs) as RoamEntityFromQuery[]; + const result = roamAlpha.data.q(query, sinceMs) as DiscourseGraphContent[]; return result.filter( (entity) => - entity.uid && - isDiscourseNode(entity.uid) && - entity.title && - entity.title.trim() !== "", + entity.source_local_id && + isDiscourseNode(entity.source_local_id) && + entity.text && + entity.text.trim() !== "", ); }; From a41ac4410519d1fc86ee5acebf1fdb9679caed97 Mon Sep 17 00:00:00 2001 From: sid597 Date: Thu, 26 Jun 2025 17:06:16 +0530 Subject: [PATCH 3/3] address review --- .../src/utils/getAllDiscourseNodesSince.ts | 36 +++++++++++-------- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/apps/roam/src/utils/getAllDiscourseNodesSince.ts b/apps/roam/src/utils/getAllDiscourseNodesSince.ts index d4c439367..b474f224e 100644 --- a/apps/roam/src/utils/getAllDiscourseNodesSince.ts +++ b/apps/roam/src/utils/getAllDiscourseNodesSince.ts @@ -1,18 +1,20 @@ -import isDiscourseNode from "./isDiscourseNode"; +import getDiscourseNodes from "./getDiscourseNodes"; +import findDiscourseNode from "./findDiscourseNode"; -export type DiscourseGraphContent = { +type RoamDiscourseNodeData = { author_local_id: string; source_local_id: string; - scale: string; created: string; last_modified: string; + author_name: string; text: string; }; +type ISODateString = string; + export const getAllDiscourseNodesSince = async ( - since: string, -): Promise => { - const roamAlpha = (window as any).roamAlphaAPI; + since: ISODateString, +): Promise => { const sinceMs = new Date(since).getTime(); const query = `[:find ?uid ?create-time ?edit-time ?user-uuid ?username ?title @@ -28,13 +30,19 @@ export const getAllDiscourseNodesSince = async ( [?e :edit/time ?edit-time] [(> ?edit-time ?since)]]`; - const result = roamAlpha.data.q(query, sinceMs) as DiscourseGraphContent[]; + // @ts-ignore - backend to be added to roamjs-components + const result = (await window.roamAlphaAPI.data.backend.q( + query, + sinceMs, + )) as unknown[][] as RoamDiscourseNodeData[]; + + const discourseNodes = getDiscourseNodes(); - return result.filter( - (entity) => - entity.source_local_id && - isDiscourseNode(entity.source_local_id) && - entity.text && - entity.text.trim() !== "", - ); + return result.filter((entity) => { + if (!entity.source_local_id) return false; + const node = findDiscourseNode(entity.source_local_id, discourseNodes); + if (!node) return false; + if (node.backedBy === "default") return false; + return Boolean(entity.text && entity.text.trim() !== ""); + }); };