diff --git a/packages/backend/server/src/models/common/copilot.ts b/packages/backend/server/src/models/common/copilot.ts index f7a3f64347..2de68f40c7 100644 --- a/packages/backend/server/src/models/common/copilot.ts +++ b/packages/backend/server/src/models/common/copilot.ts @@ -120,3 +120,15 @@ export type CopilotWorkspaceFile = CopilotWorkspaceFileMetadata & { fileId: string; createdAt: Date; }; + +export type IgnoredDoc = { + docId: string; + createdAt: Date; + // metadata + docCreatedAt: Date | undefined; + docUpdatedAt: Date | undefined; + title: string | undefined; + createdBy: string | undefined; + createdByAvatar: string | undefined; + updatedBy: string | undefined; +}; diff --git a/packages/backend/server/src/models/copilot-workspace.ts b/packages/backend/server/src/models/copilot-workspace.ts index 0c5a098b23..498e72eb5d 100644 --- a/packages/backend/server/src/models/copilot-workspace.ts +++ b/packages/backend/server/src/models/copilot-workspace.ts @@ -11,6 +11,7 @@ import type { CopilotWorkspaceFileMetadata, Embedding, FileChunkSimilarity, + IgnoredDoc, } from './common'; @Injectable() @@ -50,12 +51,13 @@ export class CopilotWorkspaceConfigModel extends BaseModel { return added.length + ignored.size; } + @Transactional() async listIgnoredDocs( workspaceId: string, options?: { includeRead?: boolean; } & PaginationInput - ): Promise<{ docId: string; createdAt: Date }[]> { + ): Promise { const row = await this.db.aiWorkspaceIgnoredDocs.findMany({ where: { workspaceId, @@ -68,7 +70,29 @@ export class CopilotWorkspaceConfigModel extends BaseModel { skip: options?.offset, take: options?.first, }); - return row; + const ids = row.map(r => ({ workspaceId, docId: r.docId })); + const docs = await this.models.doc.findMetas(ids); + const docsMap = new Map( + docs.filter(r => !!r).map(r => [`${r.workspaceId}-${r.docId}`, r]) + ); + const authors = await this.models.doc.findAuthors(ids); + const authorsMap = new Map( + authors.filter(r => !!r).map(r => [`${r.workspaceId}-${r.id}`, r]) + ); + + return row.map(r => { + const docMeta = docsMap.get(`${workspaceId}-${r.docId}`); + const docAuthor = authorsMap.get(`${workspaceId}-${r.docId}`); + return { + ...r, + docCreatedAt: docAuthor?.createdAt, + docUpdatedAt: docAuthor?.updatedAt, + title: docMeta?.title || undefined, + createdBy: docAuthor?.createdByUser?.name, + createdByAvatar: docAuthor?.createdByUser?.avatarUrl || undefined, + updatedBy: docAuthor?.updatedByUser?.name, + }; + }); } async countIgnoredDocs(workspaceId: string): Promise { diff --git a/packages/backend/server/src/models/doc.ts b/packages/backend/server/src/models/doc.ts index d5d7a19bdc..4d197bb680 100644 --- a/packages/backend/server/src/models/doc.ts +++ b/packages/backend/server/src/models/doc.ts @@ -373,6 +373,29 @@ export class DocModel extends BaseModel { }); } + async findAuthors(ids: { workspaceId: string; docId: string }[]) { + const rows = await this.db.snapshot.findMany({ + where: { + workspaceId: { in: ids.map(id => id.workspaceId) }, + id: { in: ids.map(id => id.docId) }, + }, + select: { + workspaceId: true, + id: true, + createdAt: true, + updatedAt: true, + createdByUser: { select: publicUserSelect }, + updatedByUser: { select: publicUserSelect }, + }, + }); + const resultMap = new Map( + rows.map(row => [`${row.workspaceId}-${row.id}`, row]) + ); + return ids.map( + id => resultMap.get(`${id.workspaceId}-${id.docId}`) ?? null + ); + } + async findMetas(ids: { workspaceId: string; docId: string }[]) { const rows = await this.db.workspaceDoc.findMany({ where: { diff --git a/packages/backend/server/src/plugins/copilot/workspace/types.ts b/packages/backend/server/src/plugins/copilot/workspace/types.ts index 57660c8e6e..8995b1bbf3 100644 --- a/packages/backend/server/src/plugins/copilot/workspace/types.ts +++ b/packages/backend/server/src/plugins/copilot/workspace/types.ts @@ -2,7 +2,7 @@ import { Field, ObjectType } from '@nestjs/graphql'; import { SafeIntResolver } from 'graphql-scalars'; import { Paginated } from '../../../base'; -import { CopilotWorkspaceFile } from '../../../models'; +import { CopilotWorkspaceFile, IgnoredDoc } from '../../../models'; declare global { interface Events { @@ -16,12 +16,30 @@ declare global { } @ObjectType('CopilotWorkspaceIgnoredDoc') -export class CopilotWorkspaceIgnoredDocType { +export class CopilotWorkspaceIgnoredDocType implements IgnoredDoc { @Field(() => String) docId!: string; @Field(() => Date) createdAt!: Date; + + @Field(() => Date, { nullable: true }) + docCreatedAt!: Date | undefined; + + @Field(() => Date, { nullable: true }) + docUpdatedAt!: Date | undefined; + + @Field(() => String, { nullable: true }) + title!: string | undefined; + + @Field(() => String, { nullable: true }) + createdBy!: string | undefined; + + @Field(() => String, { nullable: true }) + createdByAvatar!: string | undefined; + + @Field(() => String, { nullable: true }) + updatedBy!: string | undefined; } @ObjectType() diff --git a/packages/backend/server/src/schema.gql b/packages/backend/server/src/schema.gql index 0b8d31d15b..40b84a0662 100644 --- a/packages/backend/server/src/schema.gql +++ b/packages/backend/server/src/schema.gql @@ -295,7 +295,13 @@ type CopilotWorkspaceFileTypeEdge { type CopilotWorkspaceIgnoredDoc { createdAt: DateTime! + createdBy: String + createdByAvatar: String + docCreatedAt: DateTime docId: String! + docUpdatedAt: DateTime + title: String + updatedBy: String } type CopilotWorkspaceIgnoredDocTypeEdge { diff --git a/packages/common/graphql/src/graphql/copilot-workspace-ignored-docs-get.gql b/packages/common/graphql/src/graphql/copilot-workspace-ignored-docs-get.gql index 79a5891b30..ec43bda6fe 100644 --- a/packages/common/graphql/src/graphql/copilot-workspace-ignored-docs-get.gql +++ b/packages/common/graphql/src/graphql/copilot-workspace-ignored-docs-get.gql @@ -11,6 +11,12 @@ query getWorkspaceEmbeddingIgnoredDocs($workspaceId: String!, $pagination: Pagin node { docId createdAt + docCreatedAt + docUpdatedAt + title + createdBy + createdByAvatar + updatedBy } } } diff --git a/packages/common/graphql/src/graphql/index.ts b/packages/common/graphql/src/graphql/index.ts index f5f6944342..6534b9bda3 100644 --- a/packages/common/graphql/src/graphql/index.ts +++ b/packages/common/graphql/src/graphql/index.ts @@ -830,6 +830,12 @@ export const getWorkspaceEmbeddingIgnoredDocsQuery = { node { docId createdAt + docCreatedAt + docUpdatedAt + title + createdBy + createdByAvatar + updatedBy } } } diff --git a/packages/common/graphql/src/schema.ts b/packages/common/graphql/src/schema.ts index f19aaaa3a8..fd3ed8d0bb 100644 --- a/packages/common/graphql/src/schema.ts +++ b/packages/common/graphql/src/schema.ts @@ -399,7 +399,13 @@ export interface CopilotWorkspaceFileTypeEdge { export interface CopilotWorkspaceIgnoredDoc { __typename?: 'CopilotWorkspaceIgnoredDoc'; createdAt: Scalars['DateTime']['output']; + createdBy: Maybe; + createdByAvatar: Maybe; + docCreatedAt: Maybe; docId: Scalars['String']['output']; + docUpdatedAt: Maybe; + title: Maybe; + updatedBy: Maybe; } export interface CopilotWorkspaceIgnoredDocTypeEdge { @@ -3374,6 +3380,12 @@ export type GetWorkspaceEmbeddingIgnoredDocsQuery = { __typename?: 'CopilotWorkspaceIgnoredDoc'; docId: string; createdAt: string; + docCreatedAt: string | null; + docUpdatedAt: string | null; + title: string | null; + createdBy: string | null; + createdByAvatar: string | null; + updatedBy: string | null; }; }>; };