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

@ -1,11 +1,11 @@
import type { APIRequestContext } from "@playwright/test";
import { authHeaders, BACKEND_URL } from "../helpers/api/auth";
import type { SearchSpaceFixtures } from "./search-space.fixture";
import type { SearchSpaceFixtures } from "./workspace.fixture";
export type ChatThreadRow = {
id: number;
title: string;
search_space_id: number;
workspace_id: number;
visibility: string;
created_by_id: string | null;
created_at: string;
@ -29,7 +29,7 @@ export const chatThreadFixtures = {
headers: authHeaders(apiToken),
data: {
title: "e2e-drive-journey",
search_space_id: searchSpace.id,
workspace_id: searchSpace.id,
visibility: "PRIVATE",
},
});

View file

@ -1,5 +1,5 @@
import { type ConnectorRow, deleteConnector, runClickupOAuth } from "../../helpers/api/connectors";
import { searchSpaceFixtures } from "../search-space.fixture";
import { searchSpaceFixtures } from "../workspace.fixture";
export type ClickupFixtures = {
/**

View file

@ -1,5 +1,5 @@
import { type ConnectorRow, deleteConnector, runComposioOAuth } from "../../helpers/api/connectors";
import { searchSpaceFixtures } from "../search-space.fixture";
import { searchSpaceFixtures } from "../workspace.fixture";
export type ComposioCalendarFixtures = {
/**

View file

@ -1,5 +1,5 @@
import { type ConnectorRow, deleteConnector, runComposioOAuth } from "../../helpers/api/connectors";
import { searchSpaceFixtures } from "../search-space.fixture";
import { searchSpaceFixtures } from "../workspace.fixture";
export type ComposioDriveFixtures = {
/**

View file

@ -1,5 +1,5 @@
import { type ConnectorRow, deleteConnector, runComposioOAuth } from "../../helpers/api/connectors";
import { searchSpaceFixtures } from "../search-space.fixture";
import { searchSpaceFixtures } from "../workspace.fixture";
export type ComposioGmailFixtures = {
/**

View file

@ -3,7 +3,7 @@ import {
deleteConnector,
runConfluenceOAuth,
} from "../../helpers/api/connectors";
import { searchSpaceFixtures } from "../search-space.fixture";
import { searchSpaceFixtures } from "../workspace.fixture";
export type ConfluenceFixtures = {
/**

View file

@ -1,5 +1,5 @@
import { type ConnectorRow, deleteConnector, runJiraOAuth } from "../../helpers/api/connectors";
import { searchSpaceFixtures } from "../search-space.fixture";
import { searchSpaceFixtures } from "../workspace.fixture";
export type JiraFixtures = {
/**

View file

@ -1,5 +1,5 @@
import { type ConnectorRow, deleteConnector, runLinearOAuth } from "../../helpers/api/connectors";
import { searchSpaceFixtures } from "../search-space.fixture";
import { searchSpaceFixtures } from "../workspace.fixture";
export type LinearFixtures = {
/**

View file

@ -3,7 +3,7 @@ import {
deleteConnector,
runNativeGoogleCalendarOAuth,
} from "../../helpers/api/connectors";
import { searchSpaceFixtures } from "../search-space.fixture";
import { searchSpaceFixtures } from "../workspace.fixture";
export type NativeCalendarFixtures = {
/**

View file

@ -3,7 +3,7 @@ import {
deleteConnector,
runNativeGoogleDriveOAuth,
} from "../../helpers/api/connectors";
import { searchSpaceFixtures } from "../search-space.fixture";
import { searchSpaceFixtures } from "../workspace.fixture";
export type NativeDriveFixtures = {
/**

View file

@ -3,7 +3,7 @@ import {
deleteConnector,
runNativeDropboxOAuth,
} from "../../helpers/api/connectors";
import { searchSpaceFixtures } from "../search-space.fixture";
import { searchSpaceFixtures } from "../workspace.fixture";
export type NativeDropboxFixtures = {
/**

View file

@ -3,7 +3,7 @@ import {
deleteConnector,
runNativeGoogleGmailOAuth,
} from "../../helpers/api/connectors";
import { searchSpaceFixtures } from "../search-space.fixture";
import { searchSpaceFixtures } from "../workspace.fixture";
export type NativeGmailFixtures = {
/**

View file

@ -3,7 +3,7 @@ import {
deleteConnector,
runNativeOneDriveOAuth,
} from "../../helpers/api/connectors";
import { searchSpaceFixtures } from "../search-space.fixture";
import { searchSpaceFixtures } from "../workspace.fixture";
export type NativeOneDriveFixtures = {
/**

View file

@ -1,5 +1,5 @@
import { type ConnectorRow, deleteConnector, runNotionOAuth } from "../../helpers/api/connectors";
import { searchSpaceFixtures } from "../search-space.fixture";
import { searchSpaceFixtures } from "../workspace.fixture";
export type NotionFixtures = {
/**

View file

@ -1,5 +1,5 @@
import { type ConnectorRow, deleteConnector, runSlackOAuth } from "../../helpers/api/connectors";
import { searchSpaceFixtures } from "../search-space.fixture";
import { searchSpaceFixtures } from "../workspace.fixture";
export type SlackFixtures = {
/**

View file

@ -59,7 +59,7 @@ export { nativeGmailFixtures } from "./connectors/native-gmail.fixture";
export { nativeOneDriveFixtures } from "./connectors/native-onedrive.fixture";
export { notionFixtures } from "./connectors/notion.fixture";
export { slackFixtures } from "./connectors/slack.fixture";
export { searchSpaceFixtures } from "./search-space.fixture";
export { searchSpaceFixtures } from "./workspace.fixture";
import { type ChatThreadFixtures, chatThreadFixtures } from "./chat-thread.fixture";
import { clickupFixtures } from "./connectors/clickup.fixture";
@ -76,7 +76,7 @@ import { nativeGmailFixtures } from "./connectors/native-gmail.fixture";
import { nativeOneDriveFixtures } from "./connectors/native-onedrive.fixture";
import { notionFixtures } from "./connectors/notion.fixture";
import { slackFixtures } from "./connectors/slack.fixture";
import { searchSpaceFixtures } from "./search-space.fixture";
import { searchSpaceFixtures } from "./workspace.fixture";
/** Default `test` for specs that just need auth + a clean search space. */
export const test = searchSpaceFixtures;

View file

@ -6,7 +6,7 @@ import {
createSearchSpace,
deleteSearchSpace,
type SearchSpaceRow,
} from "../helpers/api/search-spaces";
} from "../helpers/api/workspaces";
import { uniqueSearchSpaceName } from "../helpers/canary";
export type SearchSpaceFixtures = {

View file

@ -24,7 +24,7 @@ export async function streamChatToCompletion(
headers: authHeaders(token),
data: {
chat_id: args.threadId,
search_space_id: args.searchSpaceId,
workspace_id: args.searchSpaceId,
user_query: args.query,
},
});

View file

@ -16,7 +16,7 @@ export async function listConnectors(
searchSpaceId: number
): Promise<ConnectorRow[]> {
const response = await request.get(
`${BACKEND_URL}/api/v1/search-source-connectors?search_space_id=${searchSpaceId}`,
`${BACKEND_URL}/api/v1/search-source-connectors?workspace_id=${searchSpaceId}`,
{ headers: authHeaders(token) }
);
if (!response.ok()) {
@ -115,7 +115,7 @@ export async function triggerIndex(
body: IndexBody
): Promise<{ ok: true }> {
const response = await request.post(
`${BACKEND_URL}/api/v1/search-source-connectors/${connectorId}/index?search_space_id=${searchSpaceId}`,
`${BACKEND_URL}/api/v1/search-source-connectors/${connectorId}/index?workspace_id=${searchSpaceId}`,
{ headers: authHeaders(token), data: body }
);
if (!response.ok()) {
@ -134,7 +134,7 @@ export async function triggerIndexExpectDisabled(
body: IndexBody = {}
): Promise<{ indexing_started: false; message?: string }> {
const response = await request.post(
`${BACKEND_URL}/api/v1/search-source-connectors/${connectorId}/index?search_space_id=${searchSpaceId}`,
`${BACKEND_URL}/api/v1/search-source-connectors/${connectorId}/index?workspace_id=${searchSpaceId}`,
{ headers: authHeaders(token), data: body }
);
if (!response.ok()) {

View file

@ -21,7 +21,7 @@ export async function listDocuments(
limit = 100
): Promise<DocumentRow[]> {
const response = await request.get(
`${BACKEND_URL}/api/v1/documents?search_space_id=${searchSpaceId}&limit=${limit}`,
`${BACKEND_URL}/api/v1/documents?workspace_id=${searchSpaceId}&limit=${limit}`,
{ headers: authHeaders(token) }
);
if (!response.ok()) {
@ -55,7 +55,7 @@ export async function getEditorContent(
documentId: number
): Promise<EditorContent> {
const response = await request.get(
`${BACKEND_URL}/api/v1/search-spaces/${searchSpaceId}/documents/${documentId}/editor-content`,
`${BACKEND_URL}/api/v1/workspaces/${searchSpaceId}/documents/${documentId}/editor-content`,
{ headers: authHeaders(token) }
);
if (!response.ok()) {

View file

@ -13,7 +13,7 @@ export async function createSearchSpace(
name: string,
description = "E2E test search space"
): Promise<SearchSpaceRow> {
const response = await request.post(`${BACKEND_URL}/api/v1/searchspaces`, {
const response = await request.post(`${BACKEND_URL}/api/v1/workspaces`, {
headers: authHeaders(token),
data: { name, description },
});
@ -28,7 +28,7 @@ export async function deleteSearchSpace(
token: string,
id: number
): Promise<void> {
const response = await request.delete(`${BACKEND_URL}/api/v1/searchspaces/${id}`, {
const response = await request.delete(`${BACKEND_URL}/api/v1/workspaces/${id}`, {
headers: authHeaders(token),
});
if (!response.ok() && response.status() !== 404) {

View file

@ -12,7 +12,7 @@ test.describe("Smoke", () => {
headers: authHeaders(apiToken),
data: {
title: "e2e-chat-stream-smoke",
search_space_id: searchSpace.id,
workspace_id: searchSpace.id,
visibility: "PRIVATE",
},
});