From da8f90bfe207d90ca5289e24ed8b7a3bbcdd544a Mon Sep 17 00:00:00 2001 From: CREDO23 Date: Mon, 23 Mar 2026 17:54:43 +0200 Subject: [PATCH] feat: add Zero queries for all 6 synced tables Define named queries matching each Electric hook's data needs: - notifications.byUser (use-inbox) - documents.bySpace (use-documents, use-documents-processing) - connectors.bySpace (use-connectors-electric) - messages.byThread (use-messages-electric) - comments.byThread (use-comments-electric) - chatSession.byThread (use-chat-session-state) Also moves schema files from zero/tables/ to zero/schema/ for consistent modular folder structure. --- surfsense_web/types/zero.d.ts | 2 +- surfsense_web/zero/queries/chat.ts | 26 +++++++++++++++++++ surfsense_web/zero/queries/documents.ts | 21 +++++++++++++++ surfsense_web/zero/queries/inbox.ts | 11 ++++++++ surfsense_web/zero/queries/index.ts | 13 ++++++++++ surfsense_web/zero/{tables => schema}/chat.ts | 0 .../zero/{tables => schema}/documents.ts | 0 .../zero/{tables => schema}/inbox.ts | 0 .../zero/{schema.ts => schema/index.ts} | 6 ++--- 9 files changed, 75 insertions(+), 4 deletions(-) create mode 100644 surfsense_web/zero/queries/chat.ts create mode 100644 surfsense_web/zero/queries/documents.ts create mode 100644 surfsense_web/zero/queries/inbox.ts create mode 100644 surfsense_web/zero/queries/index.ts rename surfsense_web/zero/{tables => schema}/chat.ts (100%) rename surfsense_web/zero/{tables => schema}/documents.ts (100%) rename surfsense_web/zero/{tables => schema}/inbox.ts (100%) rename surfsense_web/zero/{schema.ts => schema/index.ts} (85%) diff --git a/surfsense_web/types/zero.d.ts b/surfsense_web/types/zero.d.ts index 5b74bce33..69c9e2402 100644 --- a/surfsense_web/types/zero.d.ts +++ b/surfsense_web/types/zero.d.ts @@ -1,4 +1,4 @@ -import type { Schema } from "@/zero/schema"; +import type { Schema } from "@/zero/schema/index"; export type Context = | { diff --git a/surfsense_web/zero/queries/chat.ts b/surfsense_web/zero/queries/chat.ts new file mode 100644 index 000000000..45ffa7ea2 --- /dev/null +++ b/surfsense_web/zero/queries/chat.ts @@ -0,0 +1,26 @@ +import { defineQuery } from "@rocicorp/zero"; +import { z } from "zod"; +import { zql } from "../schema/index"; + +export const messageQueries = { + byThread: defineQuery( + z.object({ threadId: z.number() }), + ({ args: { threadId } }) => + zql.new_chat_messages.where("threadId", threadId).orderBy("createdAt", "asc"), + ), +}; + +export const commentQueries = { + byThread: defineQuery( + z.object({ threadId: z.number() }), + ({ args: { threadId } }) => + zql.chat_comments.where("threadId", threadId).orderBy("createdAt", "asc"), + ), +}; + +export const chatSessionQueries = { + byThread: defineQuery( + z.object({ threadId: z.number() }), + ({ args: { threadId } }) => zql.chat_session_state.where("threadId", threadId).one(), + ), +}; diff --git a/surfsense_web/zero/queries/documents.ts b/surfsense_web/zero/queries/documents.ts new file mode 100644 index 000000000..aa34bf718 --- /dev/null +++ b/surfsense_web/zero/queries/documents.ts @@ -0,0 +1,21 @@ +import { defineQuery } from "@rocicorp/zero"; +import { z } from "zod"; +import { zql } from "../schema/index"; + +export const documentQueries = { + bySpace: defineQuery( + z.object({ searchSpaceId: z.number() }), + ({ args: { searchSpaceId } }) => + zql.documents.where("searchSpaceId", searchSpaceId).orderBy("createdAt", "desc"), + ), +}; + +export const connectorQueries = { + bySpace: defineQuery( + z.object({ searchSpaceId: z.number() }), + ({ args: { searchSpaceId } }) => + zql.search_source_connectors + .where("searchSpaceId", searchSpaceId) + .orderBy("createdAt", "desc"), + ), +}; diff --git a/surfsense_web/zero/queries/inbox.ts b/surfsense_web/zero/queries/inbox.ts new file mode 100644 index 000000000..6221ef345 --- /dev/null +++ b/surfsense_web/zero/queries/inbox.ts @@ -0,0 +1,11 @@ +import { defineQuery } from "@rocicorp/zero"; +import { z } from "zod"; +import { zql } from "../schema/index"; + +export const notificationQueries = { + byUser: defineQuery( + z.object({ userId: z.string() }), + ({ args: { userId } }) => + zql.notifications.where("userId", userId).orderBy("createdAt", "desc"), + ), +}; diff --git a/surfsense_web/zero/queries/index.ts b/surfsense_web/zero/queries/index.ts new file mode 100644 index 000000000..893e677c4 --- /dev/null +++ b/surfsense_web/zero/queries/index.ts @@ -0,0 +1,13 @@ +import { defineQueries } from "@rocicorp/zero"; +import { chatSessionQueries, commentQueries, messageQueries } from "./chat"; +import { connectorQueries, documentQueries } from "./documents"; +import { notificationQueries } from "./inbox"; + +export const queries = defineQueries({ + notifications: notificationQueries, + documents: documentQueries, + connectors: connectorQueries, + messages: messageQueries, + comments: commentQueries, + chatSession: chatSessionQueries, +}); diff --git a/surfsense_web/zero/tables/chat.ts b/surfsense_web/zero/schema/chat.ts similarity index 100% rename from surfsense_web/zero/tables/chat.ts rename to surfsense_web/zero/schema/chat.ts diff --git a/surfsense_web/zero/tables/documents.ts b/surfsense_web/zero/schema/documents.ts similarity index 100% rename from surfsense_web/zero/tables/documents.ts rename to surfsense_web/zero/schema/documents.ts diff --git a/surfsense_web/zero/tables/inbox.ts b/surfsense_web/zero/schema/inbox.ts similarity index 100% rename from surfsense_web/zero/tables/inbox.ts rename to surfsense_web/zero/schema/inbox.ts diff --git a/surfsense_web/zero/schema.ts b/surfsense_web/zero/schema/index.ts similarity index 85% rename from surfsense_web/zero/schema.ts rename to surfsense_web/zero/schema/index.ts index c1f7cf951..1c3e89151 100644 --- a/surfsense_web/zero/schema.ts +++ b/surfsense_web/zero/schema/index.ts @@ -1,7 +1,7 @@ import { createSchema, createBuilder, relationships } from "@rocicorp/zero"; -import { chatCommentTable, chatSessionStateTable, newChatMessageTable } from "./tables/chat"; -import { documentTable, searchSourceConnectorTable } from "./tables/documents"; -import { notificationTable } from "./tables/inbox"; +import { chatCommentTable, chatSessionStateTable, newChatMessageTable } from "./chat"; +import { documentTable, searchSourceConnectorTable } from "./documents"; +import { notificationTable } from "./inbox"; const chatCommentRelationships = relationships(chatCommentTable, ({ one }) => ({ message: one({