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.
This commit is contained in:
CREDO23 2026-03-23 17:54:43 +02:00
parent af2bd744fb
commit da8f90bfe2
9 changed files with 75 additions and 4 deletions

View file

@ -0,0 +1,34 @@
import { table, string, number, json } from "@rocicorp/zero";
export const newChatMessageTable = table("new_chat_messages")
.columns({
id: number(),
role: string(),
content: json(),
threadId: number().from("thread_id"),
authorId: string().optional().from("author_id"),
createdAt: number().from("created_at"),
})
.primaryKey("id");
export const chatCommentTable = table("chat_comments")
.columns({
id: number(),
messageId: number().from("message_id"),
threadId: number().from("thread_id"),
parentId: number().optional().from("parent_id"),
authorId: string().optional().from("author_id"),
content: string(),
createdAt: number().from("created_at"),
updatedAt: number().from("updated_at"),
})
.primaryKey("id");
export const chatSessionStateTable = table("chat_session_state")
.columns({
id: number(),
threadId: number().from("thread_id"),
aiRespondingToUserId: string().optional().from("ai_responding_to_user_id"),
updatedAt: number().from("updated_at"),
})
.primaryKey("id");

View file

@ -0,0 +1,31 @@
import { table, string, number, boolean, json } from "@rocicorp/zero";
export const documentTable = table("documents")
.columns({
id: number(),
title: string(),
documentType: string().from("document_type"),
searchSpaceId: number().from("search_space_id"),
createdById: string().optional().from("created_by_id"),
status: json(),
createdAt: number().from("created_at"),
})
.primaryKey("id");
export const searchSourceConnectorTable = table("search_source_connectors")
.columns({
id: number(),
name: string(),
connectorType: string().from("connector_type"),
isIndexable: boolean().from("is_indexable"),
lastIndexedAt: number().optional().from("last_indexed_at"),
config: json(),
enableSummary: boolean().from("enable_summary"),
periodicIndexingEnabled: boolean().from("periodic_indexing_enabled"),
indexingFrequencyMinutes: number().optional().from("indexing_frequency_minutes"),
nextScheduledAt: number().optional().from("next_scheduled_at"),
searchSpaceId: number().from("search_space_id"),
userId: string().from("user_id"),
createdAt: number().from("created_at"),
})
.primaryKey("id");

View file

@ -0,0 +1,16 @@
import { table, string, number, boolean, json } from "@rocicorp/zero";
export const notificationTable = table("notifications")
.columns({
id: number(),
userId: string().from("user_id"),
searchSpaceId: number().optional().from("search_space_id"),
type: string(),
title: string(),
message: string(),
read: boolean(),
metadata: json().optional(),
createdAt: number().from("created_at"),
updatedAt: number().optional().from("updated_at"),
})
.primaryKey("id");

View file

@ -0,0 +1,41 @@
import { createSchema, createBuilder, relationships } from "@rocicorp/zero";
import { chatCommentTable, chatSessionStateTable, newChatMessageTable } from "./chat";
import { documentTable, searchSourceConnectorTable } from "./documents";
import { notificationTable } from "./inbox";
const chatCommentRelationships = relationships(chatCommentTable, ({ one }) => ({
message: one({
sourceField: ["messageId"],
destSchema: newChatMessageTable,
destField: ["id"],
}),
parent: one({
sourceField: ["parentId"],
destSchema: chatCommentTable,
destField: ["id"],
}),
}));
const newChatMessageRelationships = relationships(newChatMessageTable, ({ many }) => ({
comments: many({
sourceField: ["id"],
destSchema: chatCommentTable,
destField: ["messageId"],
}),
}));
export const schema = createSchema({
tables: [
notificationTable,
documentTable,
searchSourceConnectorTable,
newChatMessageTable,
chatCommentTable,
chatSessionStateTable,
],
relationships: [chatCommentRelationships, newChatMessageRelationships],
});
export type Schema = typeof schema;
export const zql = createBuilder(schema);