feat: implement ensure_publication for zero_publication management

- Added the ensure_publication function to create and verify the zero_publication if it is missing, ensuring idempotency during database initialization.
- Integrated ensure_publication into the create_db_and_tables function to prevent zero-cache crash loops on startup.
- Introduced a self-check script to validate the ensure_publication functionality on a create_all-bootstrapped database.
- Updated various components to reflect the transition from search space to workspace, including adjustments in imports and routing paths.
This commit is contained in:
DESKTOP-RTLN3BA\$punk 2026-07-05 23:17:13 -07:00
parent 7562bc78ee
commit a64c8205fe
164 changed files with 626 additions and 506 deletions

View file

@ -4,7 +4,7 @@ import { zql } from "../schema/index";
import { constrainToAllowedSpaces } from "./authz";
// Mirrors chat byThread: client passes the parent id, the REST route still
// authorizes via `automation_id -> search_space`. No search_space_id on the
// authorizes via `automation_id -> search_space`. No workspace_id on the
// table by design.
export const automationRunQueries = {
byAutomation: defineQuery(

View file

@ -3,7 +3,7 @@ import { json, number, string, table } from "@rocicorp/zero";
export const automationTable = table("automations")
.columns({
id: number(),
searchSpaceId: number().from("search_space_id"),
searchSpaceId: number().from("workspace_id"),
})
.primaryKey("id");

View file

@ -23,7 +23,7 @@ export const newChatMessageTable = table("new_chat_messages")
export const newChatThreadTable = table("new_chat_threads")
.columns({
id: number(),
searchSpaceId: number().from("search_space_id"),
searchSpaceId: number().from("workspace_id"),
})
.primaryKey("id");

View file

@ -5,7 +5,7 @@ export const documentTable = table("documents")
id: number(),
title: string(),
documentType: string().from("document_type"),
searchSpaceId: number().from("search_space_id"),
searchSpaceId: number().from("workspace_id"),
folderId: number().optional().from("folder_id"),
createdById: string().optional().from("created_by_id"),
status: json(),
@ -24,7 +24,7 @@ export const searchSourceConnectorTable = table("search_source_connectors")
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"),
searchSpaceId: number().from("workspace_id"),
userId: string().from("user_id"),
createdAt: number().from("created_at"),
})

View file

@ -6,7 +6,7 @@ export const folderTable = table("folders")
name: string(),
position: string(),
parentId: number().optional().from("parent_id"),
searchSpaceId: number().from("search_space_id"),
searchSpaceId: number().from("workspace_id"),
createdById: string().optional().from("created_by_id"),
createdAt: number().from("created_at"),
updatedAt: number().from("updated_at"),

View file

@ -4,7 +4,7 @@ export const notificationTable = table("notifications")
.columns({
id: number(),
userId: string().from("user_id"),
searchSpaceId: number().optional().from("search_space_id"),
searchSpaceId: number().optional().from("workspace_id"),
type: string(),
title: string(),
message: string(),

View file

@ -12,7 +12,7 @@ export const podcastTable = table("podcasts")
specVersion: number().from("spec_version"),
durationSeconds: number().optional().from("duration_seconds"),
error: string().optional(),
searchSpaceId: number().from("search_space_id"),
searchSpaceId: number().from("workspace_id"),
threadId: number().optional().from("thread_id"),
createdAt: number().from("created_at"),
})