diff --git a/packages/cli/src/databases/entities/User.ts b/packages/cli/src/databases/entities/User.ts index dca67a5e7c..591f26f5b7 100644 --- a/packages/cli/src/databases/entities/User.ts +++ b/packages/cli/src/databases/entities/User.ts @@ -21,7 +21,7 @@ import { Role } from './Role'; import { SharedWorkflow } from './SharedWorkflow'; import { SharedCredentials } from './SharedCredentials'; import { NoXss } from '../utils/customValidators'; -import { answersFormatter, lowerCaser } from '../utils/transformers'; +import { objectRetriever, lowerCaser } from '../utils/transformers'; export const MIN_PASSWORD_LENGTH = 8; @@ -98,7 +98,7 @@ export class User { @Column({ type: resolveDataType('json') as ColumnOptions['type'], nullable: true, - transformer: answersFormatter, + transformer: objectRetriever, }) personalizationAnswers: IPersonalizationSurveyAnswers | null; diff --git a/packages/cli/src/databases/entities/WorkflowEntity.ts b/packages/cli/src/databases/entities/WorkflowEntity.ts index f85e8625ab..069f637737 100644 --- a/packages/cli/src/databases/entities/WorkflowEntity.ts +++ b/packages/cli/src/databases/entities/WorkflowEntity.ts @@ -22,6 +22,7 @@ import * as config from '../../../config'; import { DatabaseType, IWorkflowDb } from '../..'; import { TagEntity } from './TagEntity'; import { SharedWorkflow } from './SharedWorkflow'; +import { objectRetriever } from '../utils/transformers'; function resolveDataType(dataType: string) { const dbType = config.getEnv('database.type'); @@ -95,6 +96,7 @@ export class WorkflowEntity implements IWorkflowDb { @Column({ type: resolveDataType('json') as ColumnOptions['type'], nullable: true, + transformer: objectRetriever, }) staticData?: IDataObject; diff --git a/packages/cli/src/databases/utils/transformers.ts b/packages/cli/src/databases/utils/transformers.ts index c2a9d3e0d2..e3a77fc2df 100644 --- a/packages/cli/src/databases/utils/transformers.ts +++ b/packages/cli/src/databases/utils/transformers.ts @@ -1,5 +1,4 @@ -// eslint-disable-next-line import/no-cycle -import { IPersonalizationSurveyAnswers } from '../../Interfaces'; +import { ValueTransformer } from 'typeorm'; export const idStringifier = { from: (value: number): string | number => (typeof value === 'number' ? value.toString() : value), @@ -12,14 +11,10 @@ export const lowerCaser = { }; /** - * Ensure a consistent return type for personalization answers in `User`. - * Answers currently stored as `TEXT` on Postgres. + * Unmarshal JSON as JS object. */ -export const answersFormatter = { - to: (answers: IPersonalizationSurveyAnswers): IPersonalizationSurveyAnswers => answers, - from: (answers: IPersonalizationSurveyAnswers | string): IPersonalizationSurveyAnswers => { - return typeof answers === 'string' - ? (JSON.parse(answers) as IPersonalizationSurveyAnswers) - : answers; - }, +export const objectRetriever: ValueTransformer = { + to: (value: object): object => value, + from: (value: string | object): object => + typeof value === 'string' ? (JSON.parse(value) as object) : value, }; diff --git a/packages/cli/test/integration/publicApi/workflows.test.ts b/packages/cli/test/integration/publicApi/workflows.test.ts index 27ce110908..17736af836 100644 --- a/packages/cli/test/integration/publicApi/workflows.test.ts +++ b/packages/cli/test/integration/publicApi/workflows.test.ts @@ -1160,7 +1160,7 @@ test('PUT /workflows/:id should update workflow', async () => { expect(name).toBe(payload.name); expect(connections).toEqual(payload.connections); expect(settings).toEqual(payload.settings); - expect(staticData).toEqual(payload.staticData); + expect(staticData).toMatchObject(JSON.parse(payload.staticData)); expect(nodes).toEqual(payload.nodes); expect(active).toBe(false); expect(createdAt).toBe(workflow.createdAt.toISOString()); @@ -1235,7 +1235,7 @@ test('PUT /workflows/:id should update non-owned workflow if owner', async () => expect(name).toBe(payload.name); expect(connections).toEqual(payload.connections); expect(settings).toEqual(payload.settings); - expect(staticData).toEqual(payload.staticData); + expect(staticData).toMatchObject(JSON.parse(payload.staticData)); expect(nodes).toEqual(payload.nodes); expect(active).toBe(false); expect(createdAt).toBe(workflow.createdAt.toISOString());