From 9b5873e4f5507b1b1bc00e43fefde342a67adfa2 Mon Sep 17 00:00:00 2001 From: Kristaps Fabians Geikins Date: Tue, 19 Nov 2024 13:58:40 +0000 Subject: [PATCH] feat(server): SmartTextEditorValue.attachments multiregion support (#3513) --- packages/server/codegen.yml | 2 +- .../server/modules/comments/graph/resolvers/comments.ts | 9 +++++---- packages/server/modules/core/graph/generated/graphql.ts | 6 +++--- packages/server/modules/core/graph/resolvers/common.ts | 7 +++++-- .../modules/core/services/richTextEditorService.ts | 9 ++++++++- 5 files changed, 22 insertions(+), 11 deletions(-) diff --git a/packages/server/codegen.yml b/packages/server/codegen.yml index 172f2fb06..8aa726e4f 100644 --- a/packages/server/codegen.yml +++ b/packages/server/codegen.yml @@ -65,7 +65,7 @@ generates: PendingWorkspaceCollaborator: '@/modules/workspacesCore/helpers/graphTypes#PendingWorkspaceCollaboratorGraphQLReturn' WorkspaceCollaborator: '@/modules/workspacesCore/helpers/graphTypes#WorkspaceCollaboratorGraphQLReturn' Webhook: '@/modules/webhooks/helpers/graphTypes#WebhookGraphQLReturn' - SmartTextEditorValue: '@/modules/core/services/richTextEditorService#SmartTextEditorValueSchema' + SmartTextEditorValue: '@/modules/core/services/richTextEditorService#SmartTextEditorValueGraphQLReturn' BlobMetadata: '@/modules/blobstorage/domain/types#BlobStorageItem' ServerWorkspacesInfo: '@/modules/core/helpers/graphTypes#GraphQLEmptyReturn' ActivityCollection: '@/modules/activitystream/helpers/graphTypes#ActivityCollectionGraphQLReturn' diff --git a/packages/server/modules/comments/graph/resolvers/comments.ts b/packages/server/modules/comments/graph/resolvers/comments.ts index 165bfa335..6a2bc8d57 100644 --- a/packages/server/modules/comments/graph/resolvers/comments.ts +++ b/packages/server/modules/comments/graph/resolvers/comments.ts @@ -223,13 +223,14 @@ export = { */ text(parent) { const commentText = parent?.text || '' - return ensureCommentSchema(commentText as SmartTextEditorValueSchema) + return { + ...ensureCommentSchema(commentText), + projectId: parent.streamId + } }, rawText(parent) { - const { doc } = ensureCommentSchema( - (parent.text as SmartTextEditorValueSchema) || '' - ) + const { doc } = ensureCommentSchema(parent.text || '') return documentToBasicString(doc) }, async hasParent(parent) { diff --git a/packages/server/modules/core/graph/generated/graphql.ts b/packages/server/modules/core/graph/generated/graphql.ts index 02e90f662..1faf1dc87 100644 --- a/packages/server/modules/core/graph/generated/graphql.ts +++ b/packages/server/modules/core/graph/generated/graphql.ts @@ -8,7 +8,7 @@ import { AutomateFunctionGraphQLReturn, AutomateFunctionReleaseGraphQLReturn, Au import { WorkspaceGraphQLReturn, WorkspaceBillingGraphQLReturn, WorkspaceSsoGraphQLReturn, WorkspaceMutationsGraphQLReturn, WorkspaceInviteMutationsGraphQLReturn, WorkspaceProjectMutationsGraphQLReturn, PendingWorkspaceCollaboratorGraphQLReturn, WorkspaceCollaboratorGraphQLReturn, ProjectRoleGraphQLReturn } from '@/modules/workspacesCore/helpers/graphTypes'; import { WorkspaceBillingMutationsGraphQLReturn } from '@/modules/gatekeeper/helpers/graphTypes'; import { WebhookGraphQLReturn } from '@/modules/webhooks/helpers/graphTypes'; -import { SmartTextEditorValueSchema } from '@/modules/core/services/richTextEditorService'; +import { SmartTextEditorValueGraphQLReturn } from '@/modules/core/services/richTextEditorService'; import { BlobStorageItem } from '@/modules/blobstorage/domain/types'; import { ActivityCollectionGraphQLReturn } from '@/modules/activitystream/helpers/graphTypes'; import { ServerAppGraphQLReturn, ServerAppListItemGraphQLReturn } from '@/modules/auth/helpers/graphTypes'; @@ -4723,7 +4723,7 @@ export type ResolversTypes = { ServerWorkspacesInfo: ResolverTypeWrapper; SessionPaymentStatus: SessionPaymentStatus; SetPrimaryUserEmailInput: SetPrimaryUserEmailInput; - SmartTextEditorValue: ResolverTypeWrapper; + SmartTextEditorValue: ResolverTypeWrapper; SortDirection: SortDirection; Stream: ResolverTypeWrapper; StreamAccessRequest: ResolverTypeWrapper; @@ -4988,7 +4988,7 @@ export type ResolversParentTypes = { ServerStats: GraphQLEmptyReturn; ServerWorkspacesInfo: GraphQLEmptyReturn; SetPrimaryUserEmailInput: SetPrimaryUserEmailInput; - SmartTextEditorValue: SmartTextEditorValueSchema; + SmartTextEditorValue: SmartTextEditorValueGraphQLReturn; Stream: StreamGraphQLReturn; StreamAccessRequest: StreamAccessRequestGraphQLReturn; StreamCollaborator: StreamCollaboratorGraphQLReturn; diff --git a/packages/server/modules/core/graph/resolvers/common.ts b/packages/server/modules/core/graph/resolvers/common.ts index 54ec015e2..ad63dbf99 100644 --- a/packages/server/modules/core/graph/resolvers/common.ts +++ b/packages/server/modules/core/graph/resolvers/common.ts @@ -1,16 +1,19 @@ -import { db } from '@/db/knex' +import { mainDb } from '@/db/knex' import { getBlobsFactory } from '@/modules/blobstorage/repositories' import { Resolvers } from '@/modules/core/graph/generated/graphql' +import { getProjectDbClient } from '@/modules/multiregion/dbSelector' import { isNonNullable } from '@speckle/shared' import { keyBy } from 'lodash' export = { SmartTextEditorValue: { async attachments(parent) { - const { blobIds } = parent + const { blobIds, projectId } = parent if (!blobIds) return null + const db = projectId ? await getProjectDbClient({ projectId }) : mainDb const blobs = await getBlobsFactory({ db })({ blobIds }) + const blobsById = keyBy(blobs, (b) => b.id) return blobIds.map((blobId) => blobsById[blobId] || null).filter(isNonNullable) } diff --git a/packages/server/modules/core/services/richTextEditorService.ts b/packages/server/modules/core/services/richTextEditorService.ts index 12e770b36..6eb4a77c8 100644 --- a/packages/server/modules/core/services/richTextEditorService.ts +++ b/packages/server/modules/core/services/richTextEditorService.ts @@ -1,6 +1,6 @@ import { JSONContent } from '@tiptap/core' import { isString, isObjectLike, get, has } from 'lodash' -import { RichTextEditor } from '@speckle/shared' +import { MaybeNullOrUndefined, RichTextEditor } from '@speckle/shared' const { isDocEmpty, documentToBasicString, convertBasicStringToDocument } = RichTextEditor @@ -13,6 +13,13 @@ export type SmartTextEditorValueSchema = { blobIds?: string[] } +export type SmartTextEditorValueGraphQLReturn = SmartTextEditorValueSchema & { + /** + * We need to know the project ID to be able to fetch the blobs + */ + projectId: MaybeNullOrUndefined +} + export function isTextEditorDoc(value: unknown): value is JSONContent { return !isString(value) && isObjectLike(value) && get(value, 'type') === 'doc' }