diff --git a/packages/backend/server/migrations/20250417063749_workspace_enable_embedding/migration.sql b/packages/backend/server/migrations/20250417063749_workspace_enable_embedding/migration.sql new file mode 100644 index 0000000000..59c42efe8b --- /dev/null +++ b/packages/backend/server/migrations/20250417063749_workspace_enable_embedding/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "workspaces" ADD COLUMN "enable_doc_embedding" BOOLEAN NOT NULL DEFAULT true; diff --git a/packages/backend/server/migrations/migration_lock.toml b/packages/backend/server/migrations/migration_lock.toml index fbffa92c2b..044d57cdb0 100644 --- a/packages/backend/server/migrations/migration_lock.toml +++ b/packages/backend/server/migrations/migration_lock.toml @@ -1,3 +1,3 @@ # Please do not edit this file manually -# It should be added in your version-control system (i.e. Git) -provider = "postgresql" \ No newline at end of file +# It should be added in your version-control system (e.g., Git) +provider = "postgresql" diff --git a/packages/backend/server/schema.prisma b/packages/backend/server/schema.prisma index 59c708dcbd..274a20fe3d 100644 --- a/packages/backend/server/schema.prisma +++ b/packages/backend/server/schema.prisma @@ -104,14 +104,15 @@ model VerificationToken { } model Workspace { - id String @id @default(uuid()) @db.VarChar - public Boolean - createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz(3) + id String @id @default(uuid()) @db.VarChar + public Boolean + createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz(3) // workspace level feature flags - enableAi Boolean @default(true) @map("enable_ai") - enableUrlPreview Boolean @default(false) @map("enable_url_preview") - name String? @db.VarChar - avatarKey String? @map("avatar_key") @db.VarChar + enableAi Boolean @default(true) @map("enable_ai") + enableUrlPreview Boolean @default(false) @map("enable_url_preview") + enableDocEmbedding Boolean @default(true) @map("enable_doc_embedding") + name String? @db.VarChar + avatarKey String? @map("avatar_key") @db.VarChar features WorkspaceFeature[] docs WorkspaceDoc[] diff --git a/packages/backend/server/src/__tests__/models/workspace.spec.ts b/packages/backend/server/src/__tests__/models/workspace.spec.ts index b2f09b37bb..dd7ade1d5b 100644 --- a/packages/backend/server/src/__tests__/models/workspace.spec.ts +++ b/packages/backend/server/src/__tests__/models/workspace.spec.ts @@ -60,6 +60,7 @@ test('should update workspace', async t => { public: true, enableAi: true, enableUrlPreview: true, + enableDocEmbedding: false, }; await t.context.workspace.update(workspace.id, data); const workspace1 = await t.context.workspace.get(workspace.id); diff --git a/packages/backend/server/src/core/workspaces/types.ts b/packages/backend/server/src/core/workspaces/types.ts index 0f3b74dde1..5553733ff3 100644 --- a/packages/backend/server/src/core/workspaces/types.ts +++ b/packages/backend/server/src/core/workspaces/types.ts @@ -88,6 +88,9 @@ export class WorkspaceType extends WorkspaceFeatureType { @Field({ description: 'Enable url previous when sharing' }) enableUrlPreview!: boolean; + @Field({ description: 'Enable doc embedding' }) + enableDocEmbedding!: boolean; + @Field(() => [InviteUserType], { description: 'Members of workspace', }) @@ -133,7 +136,7 @@ export class InvitationType { @InputType() export class UpdateWorkspaceInput extends PickType( PartialType(WorkspaceType), - ['public', 'enableAi', 'enableUrlPreview'], + ['public', 'enableAi', 'enableUrlPreview', 'enableDocEmbedding'], InputType ) { @Field(() => ID) diff --git a/packages/backend/server/src/models/workspace.ts b/packages/backend/server/src/models/workspace.ts index 31ae241600..6c5a1dda91 100644 --- a/packages/backend/server/src/models/workspace.ts +++ b/packages/backend/server/src/models/workspace.ts @@ -16,7 +16,12 @@ declare global { export type { Workspace }; export type UpdateWorkspaceInput = Pick< Partial, - 'public' | 'enableAi' | 'enableUrlPreview' | 'name' | 'avatarKey' + | 'public' + | 'enableAi' + | 'enableUrlPreview' + | 'enableDocEmbedding' + | 'name' + | 'avatarKey' >; @Injectable() @@ -88,5 +93,10 @@ export class WorkspaceModel extends BaseModel { const workspace = await this.get(workspaceId); return workspace?.enableUrlPreview ?? false; } + + async allowEmbedding(workspaceId: string) { + const workspace = await this.get(workspaceId); + return workspace?.enableDocEmbedding ?? false; + } // #endregion } diff --git a/packages/backend/server/src/schema.gql b/packages/backend/server/src/schema.gql index 4be56d5aa0..f0947de82e 100644 --- a/packages/backend/server/src/schema.gql +++ b/packages/backend/server/src/schema.gql @@ -1493,6 +1493,9 @@ input UpdateWorkspaceInput { """Enable AI""" enableAi: Boolean + """Enable doc embedding""" + enableDocEmbedding: Boolean + """Enable url previous when sharing""" enableUrlPreview: Boolean id: ID! @@ -1702,6 +1705,9 @@ type WorkspaceType { """Enable AI""" enableAi: Boolean! + """Enable doc embedding""" + enableDocEmbedding: Boolean! + """Enable url previous when sharing""" enableUrlPreview: Boolean! histories(before: DateTime, guid: String!, take: Int): [DocHistoryType!]! diff --git a/packages/common/graphql/src/graphql/index.ts b/packages/common/graphql/src/graphql/index.ts index 7276f57af5..b7ecf013bb 100644 --- a/packages/common/graphql/src/graphql/index.ts +++ b/packages/common/graphql/src/graphql/index.ts @@ -1595,6 +1595,7 @@ export const getWorkspaceConfigQuery = { workspace(id: $id) { enableAi enableUrlPreview + enableDocEmbedding inviteLink { link expireTime @@ -1613,6 +1614,16 @@ export const setEnableAiMutation = { }`, }; +export const setEnableDocEmbeddingMutation = { + id: 'setEnableDocEmbeddingMutation' as const, + op: 'setEnableDocEmbedding', + query: `mutation setEnableDocEmbedding($id: ID!, $enableDocEmbedding: Boolean!) { + updateWorkspace(input: {id: $id, enableDocEmbedding: $enableDocEmbedding}) { + id + } +}`, +}; + export const setEnableUrlPreviewMutation = { id: 'setEnableUrlPreviewMutation' as const, op: 'setEnableUrlPreview', diff --git a/packages/common/graphql/src/graphql/workspace-config.gql b/packages/common/graphql/src/graphql/workspace-config.gql index ff5d366dd5..e6d1f8762a 100644 --- a/packages/common/graphql/src/graphql/workspace-config.gql +++ b/packages/common/graphql/src/graphql/workspace-config.gql @@ -2,6 +2,7 @@ query getWorkspaceConfig($id: String!) { workspace(id: $id) { enableAi enableUrlPreview + enableDocEmbedding inviteLink { link expireTime diff --git a/packages/common/graphql/src/graphql/workspace-enable-doc-embedding.gql b/packages/common/graphql/src/graphql/workspace-enable-doc-embedding.gql new file mode 100644 index 0000000000..2091a4b820 --- /dev/null +++ b/packages/common/graphql/src/graphql/workspace-enable-doc-embedding.gql @@ -0,0 +1,5 @@ +mutation setEnableDocEmbedding($id: ID!, $enableDocEmbedding: Boolean!) { + updateWorkspace(input: { id: $id, enableDocEmbedding: $enableDocEmbedding }) { + id + } +} diff --git a/packages/common/graphql/src/schema.ts b/packages/common/graphql/src/schema.ts index 6cdd2ec878..02fa89b71a 100644 --- a/packages/common/graphql/src/schema.ts +++ b/packages/common/graphql/src/schema.ts @@ -2006,6 +2006,8 @@ export interface UpdateUserSettingsInput { export interface UpdateWorkspaceInput { /** Enable AI */ enableAi?: InputMaybe; + /** Enable doc embedding */ + enableDocEmbedding?: InputMaybe; /** Enable url previous when sharing */ enableUrlPreview?: InputMaybe; id: Scalars['ID']['input']; @@ -2230,6 +2232,8 @@ export interface WorkspaceType { doc: DocType; /** Enable AI */ enableAi: Scalars['Boolean']['output']; + /** Enable doc embedding */ + enableDocEmbedding: Scalars['Boolean']['output']; /** Enable url previous when sharing */ enableUrlPreview: Scalars['Boolean']['output']; histories: Array; @@ -4107,6 +4111,7 @@ export type GetWorkspaceConfigQuery = { __typename?: 'WorkspaceType'; enableAi: boolean; enableUrlPreview: boolean; + enableDocEmbedding: boolean; inviteLink: { __typename?: 'InviteLink'; link: string; @@ -4125,6 +4130,16 @@ export type SetEnableAiMutation = { updateWorkspace: { __typename?: 'WorkspaceType'; id: string }; }; +export type SetEnableDocEmbeddingMutationVariables = Exact<{ + id: Scalars['ID']['input']; + enableDocEmbedding: Scalars['Boolean']['input']; +}>; + +export type SetEnableDocEmbeddingMutation = { + __typename?: 'Mutation'; + updateWorkspace: { __typename?: 'WorkspaceType'; id: string }; +}; + export type SetEnableUrlPreviewMutationVariables = Exact<{ id: Scalars['ID']['input']; enableUrlPreview: Scalars['Boolean']['input']; @@ -4931,6 +4946,11 @@ export type Mutations = variables: SetEnableAiMutationVariables; response: SetEnableAiMutation; } + | { + name: 'setEnableDocEmbeddingMutation'; + variables: SetEnableDocEmbeddingMutationVariables; + response: SetEnableDocEmbeddingMutation; + } | { name: 'setEnableUrlPreviewMutation'; variables: SetEnableUrlPreviewMutationVariables;