@webiny/migrations 5.40.4 → 5.40.5-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -8,7 +8,6 @@ interface LastEvaluatedKey {
8
8
  GSI1_SK: string;
9
9
  }
10
10
  interface IndexSettings {
11
- number_of_replicas: number;
12
11
  refresh_interval: `${number}s`;
13
12
  }
14
13
  interface FormSubmissionsDataMigrationCheckpoint {
@@ -1 +1 @@
1
- {"version":3,"names":["_dataMigration","require","_utils","_ioc","_utils2","_createFormSubmissionEntity","_createFormSubmissionDdbEsEntity","MultiStepForms_5_38_0_002","constructor","table","esTable","elasticsearchClient","formSubmissionEntity","createFormSubmissionEntity","formSubmissionDdbEsEntity","createFormSubmissionDdbEsEntity","getId","getDescription","shouldExecute","logger","forEachTenantLocale","callback","tenantId","localeCode","indexNameParams","tenant","locale","type","isHeadlessCmsModel","indexExists","esGetIndexExist","info","esRecords","esQueryAll","index","esGetIndexName","body","query","bool","filter","term","must_not","exists","field","size","length","execute","context","migrationStatus","checkpoint","lastEvaluatedKey","usingKey","JSON","stringify","debug","ddbScanWithCallback","entity","options","filters","attr","eq","startKey","undefined","limit","scanResults","items","primaryTableRecordsToWrite","ddbEsTableRecordsToRead","ddbEsTableRecordsToWrite","scanResult","form","steps","Array","isArray","layout","title","push","putBatch","getBatch","indexes","settings","fetchOriginalElasticsearchSettings","disableElasticsearchIndexing","ddbEsTableRecords","batchReadAll","ddbEsTableRecord","data","batchWriteAll","trace","executeWithRetry","onFailedAttempt","error","attemptNumber","message","PK","runningOutOfTime","createCheckpointAndExit","createCheckpoint","restoreOriginalElasticsearchSettings","indexSettings","exports","makeInjectable","inject","PrimaryDynamoTableSymbol","ElasticsearchDynamoTableSymbol","ElasticsearchClientSymbol"],"sources":["index.ts"],"sourcesContent":["import { Table } from \"@webiny/db-dynamodb/toolbox\";\nimport {\n DataMigration,\n DataMigrationContext,\n ElasticsearchClientSymbol,\n ElasticsearchDynamoTableSymbol,\n PrimaryDynamoTableSymbol\n} from \"@webiny/data-migration\";\nimport {\n batchReadAll,\n BatchReadItem,\n batchWriteAll,\n BatchWriteItem,\n ddbScanWithCallback,\n disableElasticsearchIndexing,\n esGetIndexExist,\n esGetIndexName,\n esQueryAll,\n fetchOriginalElasticsearchSettings,\n forEachTenantLocale,\n restoreOriginalElasticsearchSettings\n} from \"~/utils\";\nimport { FbForm, FbFormSubmission } from \"../types\";\nimport { inject, makeInjectable } from \"@webiny/ioc\";\nimport { Client } from \"@elastic/elasticsearch\";\nimport { executeWithRetry } from \"@webiny/utils\";\nimport { createFormSubmissionEntity } from \"~/migrations/5.38.0/002/entities/createFormSubmissionEntity\";\nimport { createFormSubmissionDdbEsEntity } from \"~/migrations/5.38.0/002/entities/createFormSubmissionDdbEsEntity\";\n\ninterface LastEvaluatedKey {\n PK: string;\n SK: string;\n GSI1_PK: string;\n GSI1_SK: string;\n}\n\ninterface IndexSettings {\n number_of_replicas: number;\n refresh_interval: `${number}s`;\n}\n\ninterface FormSubmissionsDataMigrationCheckpoint {\n lastEvaluatedKey?: LastEvaluatedKey | boolean;\n indexes: {\n [index: string]: IndexSettings | null;\n };\n}\n\nexport class MultiStepForms_5_38_0_002 implements DataMigration {\n private readonly table: Table<string, string, string>;\n private readonly esTable: Table<string, string, string>;\n private readonly formSubmissionEntity: ReturnType<typeof createFormSubmissionEntity>;\n private readonly formSubmissionDdbEsEntity: ReturnType<typeof createFormSubmissionDdbEsEntity>;\n private readonly elasticsearchClient: Client;\n\n constructor(\n table: Table<string, string, string>,\n esTable: Table<string, string, string>,\n elasticsearchClient: Client\n ) {\n this.table = table;\n this.esTable = esTable;\n this.formSubmissionEntity = createFormSubmissionEntity(table);\n this.formSubmissionDdbEsEntity = createFormSubmissionDdbEsEntity(esTable);\n this.elasticsearchClient = elasticsearchClient;\n }\n\n getId() {\n return \"5.38.0-002\";\n }\n\n getDescription() {\n return \"Convert forms to multi-step forms (form submissions).\";\n }\n\n async shouldExecute({ logger }: DataMigrationContext): Promise<boolean> {\n let shouldExecute = false;\n\n await forEachTenantLocale({\n table: this.table,\n logger,\n callback: async ({ tenantId, localeCode }) => {\n const indexNameParams = {\n tenant: tenantId,\n locale: localeCode,\n type: \"form-builder\",\n isHeadlessCmsModel: false\n };\n\n const indexExists = await esGetIndexExist({\n elasticsearchClient: this.elasticsearchClient,\n ...indexNameParams\n });\n\n if (!indexExists) {\n logger.info(\n `No Elasticsearch index found for folders in tenant \"${tenantId}\" and locale \"${localeCode}\"; skipping.`\n );\n\n // Continue with next locale.\n return true;\n }\n\n const esRecords = await esQueryAll<FbForm>({\n elasticsearchClient: this.elasticsearchClient,\n index: esGetIndexName(indexNameParams),\n body: {\n query: {\n bool: {\n filter: [{ term: { \"__type.keyword\": \"fb.submission\" } }],\n must_not: {\n exists: {\n field: \"form.steps\"\n }\n }\n }\n },\n size: 1\n }\n });\n\n if (esRecords.length) {\n shouldExecute = true;\n return false;\n }\n\n return true;\n }\n });\n\n return shouldExecute;\n }\n\n async execute({\n logger,\n ...context\n }: DataMigrationContext<FormSubmissionsDataMigrationCheckpoint>): Promise<void> {\n const migrationStatus =\n context.checkpoint || ({} as FormSubmissionsDataMigrationCheckpoint);\n\n if (migrationStatus.lastEvaluatedKey === true) {\n logger.info(`Migration completed, no need to start again.`);\n return;\n }\n\n let usingKey = \"\";\n if (migrationStatus?.lastEvaluatedKey) {\n usingKey = JSON.stringify(migrationStatus.lastEvaluatedKey);\n }\n\n logger.debug(`Scanning DynamoDB table... ${usingKey}`);\n\n await ddbScanWithCallback<FbFormSubmission>(\n {\n entity: this.formSubmissionEntity,\n options: {\n filters: [\n {\n attr: \"TYPE\",\n eq: \"fb.formSubmission\"\n }\n ],\n startKey: migrationStatus.lastEvaluatedKey || undefined,\n limit: 500\n }\n },\n async scanResults => {\n logger.debug(`Processing ${scanResults.items.length} items...`);\n const primaryTableRecordsToWrite: BatchWriteItem[] = [];\n const ddbEsTableRecordsToRead: BatchReadItem[] = [];\n const ddbEsTableRecordsToWrite: BatchWriteItem[] = [];\n\n // First, let's prepare a list of records to write to the primary table.\n for (const scanResult of scanResults.items) {\n if (scanResult.form.steps) {\n continue;\n }\n\n // If no steps are defined, we need to create a single step.\n scanResult.form.steps = [];\n\n if (Array.isArray(scanResult.form.layout)) {\n // If layout is an array, we need to create a single step with all the fields.\n scanResult.form.steps = [\n { title: \"Step 1\", layout: scanResult.form.layout }\n ];\n delete scanResult.form.layout;\n }\n\n primaryTableRecordsToWrite.push(this.formSubmissionEntity.putBatch(scanResult));\n ddbEsTableRecordsToRead.push(\n this.formSubmissionDdbEsEntity.getBatch(scanResult)\n );\n\n const index = esGetIndexName({\n tenant: scanResult.tenant,\n locale: scanResult.locale,\n type: \"form-builder\",\n isHeadlessCmsModel: false\n });\n\n // Check for the elasticsearch index settings\n if (!migrationStatus.indexes || migrationStatus.indexes[index] === undefined) {\n // We need to fetch the index settings first\n const settings = await fetchOriginalElasticsearchSettings({\n index,\n logger,\n elasticsearchClient: this.elasticsearchClient\n });\n\n // ... add it to the checkpoint...\n migrationStatus.indexes = {\n ...migrationStatus.indexes,\n [index]: settings\n };\n\n // and then set not to index\n await disableElasticsearchIndexing({\n elasticsearchClient: this.elasticsearchClient,\n index,\n logger\n });\n }\n }\n\n // Second, let's prepare a list of records to write to the DDB-ES table.\n const ddbEsTableRecords = await batchReadAll({\n table: this.esTable,\n items: ddbEsTableRecordsToRead\n });\n\n for (const ddbEsTableRecord of ddbEsTableRecords) {\n if (!ddbEsTableRecord.data || !ddbEsTableRecord.data.form) {\n continue;\n }\n\n if (ddbEsTableRecord.data.form.steps) {\n continue;\n }\n\n // If no steps are defined, we need to create a single step.\n ddbEsTableRecord.data.form.steps = [];\n\n if (Array.isArray(ddbEsTableRecord.data.form.layout)) {\n // If layout is an array, we need to create a single step with all the fields.\n ddbEsTableRecord.data.form.steps = [\n { title: \"Step 1\", layout: ddbEsTableRecord.data.form.layout }\n ];\n delete ddbEsTableRecord.data.form.layout;\n }\n\n ddbEsTableRecordsToWrite.push(\n this.formSubmissionDdbEsEntity.putBatch(ddbEsTableRecord)\n );\n }\n\n {\n // 1. Update DynamoDB records (primary table).\n const execute = () => {\n return batchWriteAll({\n table: this.formSubmissionEntity.table,\n items: primaryTableRecordsToWrite\n });\n };\n\n logger.trace(\"Storing the DynamoDB records (primary table)...\");\n await executeWithRetry(execute, {\n onFailedAttempt: error => {\n logger.error(`\"batchWriteAll\" attempt #${error.attemptNumber} failed.`);\n logger.error(error.message);\n }\n });\n\n logger.trace(\"...stored.\");\n }\n\n {\n // 2. Update DynamoDB records (DDB-ES table).\n const execute = () => {\n return batchWriteAll({\n table: this.formSubmissionDdbEsEntity.table,\n items: ddbEsTableRecordsToWrite\n });\n };\n\n logger.trace(\"Storing the DynamoDB records (DynamoDB-ES table)...\");\n await executeWithRetry(execute, {\n onFailedAttempt: error => {\n logger.error(`\"batchWriteAll\" attempt #${error.attemptNumber} failed.`);\n logger.error(error.message);\n }\n });\n\n logger.trace(\"...stored.\");\n }\n\n // Update checkpoint after every batch\n migrationStatus.lastEvaluatedKey = scanResults.lastEvaluatedKey?.PK\n ? (scanResults.lastEvaluatedKey as unknown as LastEvaluatedKey)\n : true;\n\n // Check if we should store checkpoint and exit.\n if (context.runningOutOfTime()) {\n await context.createCheckpointAndExit(migrationStatus);\n } else {\n await context.createCheckpoint(migrationStatus);\n }\n }\n );\n\n /**\n * This is the end of the migration.\n */\n await restoreOriginalElasticsearchSettings({\n indexSettings: migrationStatus.indexes,\n logger,\n elasticsearchClient: this.elasticsearchClient\n });\n\n migrationStatus.lastEvaluatedKey = true;\n migrationStatus.indexes = {};\n context.createCheckpoint(migrationStatus);\n }\n}\n\nmakeInjectable(MultiStepForms_5_38_0_002, [\n inject(PrimaryDynamoTableSymbol),\n inject(ElasticsearchDynamoTableSymbol),\n inject(ElasticsearchClientSymbol)\n]);\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_dataMigration","require","_utils","_ioc","_utils2","_createFormSubmissionEntity","_createFormSubmissionDdbEsEntity","MultiStepForms_5_38_0_002","constructor","table","esTable","elasticsearchClient","formSubmissionEntity","createFormSubmissionEntity","formSubmissionDdbEsEntity","createFormSubmissionDdbEsEntity","getId","getDescription","shouldExecute","logger","forEachTenantLocale","callback","tenantId","localeCode","indexNameParams","tenant","locale","type","isHeadlessCmsModel","indexExists","esGetIndexExist","info","esRecords","esQueryAll","index","esGetIndexName","body","query","bool","filter","term","must_not","exists","field","size","length","execute","context","migrationStatus","checkpoint","lastEvaluatedKey","usingKey","JSON","stringify","debug","ddbScanWithCallback","entity","options","filters","attr","eq","startKey","undefined","limit","scanResults","items","primaryTableRecordsToWrite","ddbEsTableRecordsToRead","ddbEsTableRecordsToWrite","scanResult","form","steps","Array","isArray","layout","title","push","putBatch","getBatch","indexes","settings","fetchOriginalElasticsearchSettings","disableElasticsearchIndexing","ddbEsTableRecords","batchReadAll","ddbEsTableRecord","data","batchWriteAll","trace","executeWithRetry","onFailedAttempt","error","attemptNumber","message","PK","runningOutOfTime","createCheckpointAndExit","createCheckpoint","restoreOriginalElasticsearchSettings","indexSettings","exports","makeInjectable","inject","PrimaryDynamoTableSymbol","ElasticsearchDynamoTableSymbol","ElasticsearchClientSymbol"],"sources":["index.ts"],"sourcesContent":["import { Table } from \"@webiny/db-dynamodb/toolbox\";\nimport {\n DataMigration,\n DataMigrationContext,\n ElasticsearchClientSymbol,\n ElasticsearchDynamoTableSymbol,\n PrimaryDynamoTableSymbol\n} from \"@webiny/data-migration\";\nimport {\n batchReadAll,\n BatchReadItem,\n batchWriteAll,\n BatchWriteItem,\n ddbScanWithCallback,\n disableElasticsearchIndexing,\n esGetIndexExist,\n esGetIndexName,\n esQueryAll,\n fetchOriginalElasticsearchSettings,\n forEachTenantLocale,\n restoreOriginalElasticsearchSettings\n} from \"~/utils\";\nimport { FbForm, FbFormSubmission } from \"../types\";\nimport { inject, makeInjectable } from \"@webiny/ioc\";\nimport { Client } from \"@elastic/elasticsearch\";\nimport { executeWithRetry } from \"@webiny/utils\";\nimport { createFormSubmissionEntity } from \"~/migrations/5.38.0/002/entities/createFormSubmissionEntity\";\nimport { createFormSubmissionDdbEsEntity } from \"~/migrations/5.38.0/002/entities/createFormSubmissionDdbEsEntity\";\n\ninterface LastEvaluatedKey {\n PK: string;\n SK: string;\n GSI1_PK: string;\n GSI1_SK: string;\n}\n\ninterface IndexSettings {\n refresh_interval: `${number}s`;\n}\n\ninterface FormSubmissionsDataMigrationCheckpoint {\n lastEvaluatedKey?: LastEvaluatedKey | boolean;\n indexes: {\n [index: string]: IndexSettings | null;\n };\n}\n\nexport class MultiStepForms_5_38_0_002 implements DataMigration {\n private readonly table: Table<string, string, string>;\n private readonly esTable: Table<string, string, string>;\n private readonly formSubmissionEntity: ReturnType<typeof createFormSubmissionEntity>;\n private readonly formSubmissionDdbEsEntity: ReturnType<typeof createFormSubmissionDdbEsEntity>;\n private readonly elasticsearchClient: Client;\n\n constructor(\n table: Table<string, string, string>,\n esTable: Table<string, string, string>,\n elasticsearchClient: Client\n ) {\n this.table = table;\n this.esTable = esTable;\n this.formSubmissionEntity = createFormSubmissionEntity(table);\n this.formSubmissionDdbEsEntity = createFormSubmissionDdbEsEntity(esTable);\n this.elasticsearchClient = elasticsearchClient;\n }\n\n getId() {\n return \"5.38.0-002\";\n }\n\n getDescription() {\n return \"Convert forms to multi-step forms (form submissions).\";\n }\n\n async shouldExecute({ logger }: DataMigrationContext): Promise<boolean> {\n let shouldExecute = false;\n\n await forEachTenantLocale({\n table: this.table,\n logger,\n callback: async ({ tenantId, localeCode }) => {\n const indexNameParams = {\n tenant: tenantId,\n locale: localeCode,\n type: \"form-builder\",\n isHeadlessCmsModel: false\n };\n\n const indexExists = await esGetIndexExist({\n elasticsearchClient: this.elasticsearchClient,\n ...indexNameParams\n });\n\n if (!indexExists) {\n logger.info(\n `No Elasticsearch index found for folders in tenant \"${tenantId}\" and locale \"${localeCode}\"; skipping.`\n );\n\n // Continue with next locale.\n return true;\n }\n\n const esRecords = await esQueryAll<FbForm>({\n elasticsearchClient: this.elasticsearchClient,\n index: esGetIndexName(indexNameParams),\n body: {\n query: {\n bool: {\n filter: [{ term: { \"__type.keyword\": \"fb.submission\" } }],\n must_not: {\n exists: {\n field: \"form.steps\"\n }\n }\n }\n },\n size: 1\n }\n });\n\n if (esRecords.length) {\n shouldExecute = true;\n return false;\n }\n\n return true;\n }\n });\n\n return shouldExecute;\n }\n\n async execute({\n logger,\n ...context\n }: DataMigrationContext<FormSubmissionsDataMigrationCheckpoint>): Promise<void> {\n const migrationStatus =\n context.checkpoint || ({} as FormSubmissionsDataMigrationCheckpoint);\n\n if (migrationStatus.lastEvaluatedKey === true) {\n logger.info(`Migration completed, no need to start again.`);\n return;\n }\n\n let usingKey = \"\";\n if (migrationStatus?.lastEvaluatedKey) {\n usingKey = JSON.stringify(migrationStatus.lastEvaluatedKey);\n }\n\n logger.debug(`Scanning DynamoDB table... ${usingKey}`);\n\n await ddbScanWithCallback<FbFormSubmission>(\n {\n entity: this.formSubmissionEntity,\n options: {\n filters: [\n {\n attr: \"TYPE\",\n eq: \"fb.formSubmission\"\n }\n ],\n startKey: migrationStatus.lastEvaluatedKey || undefined,\n limit: 500\n }\n },\n async scanResults => {\n logger.debug(`Processing ${scanResults.items.length} items...`);\n const primaryTableRecordsToWrite: BatchWriteItem[] = [];\n const ddbEsTableRecordsToRead: BatchReadItem[] = [];\n const ddbEsTableRecordsToWrite: BatchWriteItem[] = [];\n\n // First, let's prepare a list of records to write to the primary table.\n for (const scanResult of scanResults.items) {\n if (scanResult.form.steps) {\n continue;\n }\n\n // If no steps are defined, we need to create a single step.\n scanResult.form.steps = [];\n\n if (Array.isArray(scanResult.form.layout)) {\n // If layout is an array, we need to create a single step with all the fields.\n scanResult.form.steps = [\n { title: \"Step 1\", layout: scanResult.form.layout }\n ];\n delete scanResult.form.layout;\n }\n\n primaryTableRecordsToWrite.push(this.formSubmissionEntity.putBatch(scanResult));\n ddbEsTableRecordsToRead.push(\n this.formSubmissionDdbEsEntity.getBatch(scanResult)\n );\n\n const index = esGetIndexName({\n tenant: scanResult.tenant,\n locale: scanResult.locale,\n type: \"form-builder\",\n isHeadlessCmsModel: false\n });\n\n // Check for the elasticsearch index settings\n if (!migrationStatus.indexes || migrationStatus.indexes[index] === undefined) {\n // We need to fetch the index settings first\n const settings = await fetchOriginalElasticsearchSettings({\n index,\n logger,\n elasticsearchClient: this.elasticsearchClient\n });\n\n // ... add it to the checkpoint...\n migrationStatus.indexes = {\n ...migrationStatus.indexes,\n [index]: settings\n };\n\n // and then set not to index\n await disableElasticsearchIndexing({\n elasticsearchClient: this.elasticsearchClient,\n index,\n logger\n });\n }\n }\n\n // Second, let's prepare a list of records to write to the DDB-ES table.\n const ddbEsTableRecords = await batchReadAll({\n table: this.esTable,\n items: ddbEsTableRecordsToRead\n });\n\n for (const ddbEsTableRecord of ddbEsTableRecords) {\n if (!ddbEsTableRecord.data || !ddbEsTableRecord.data.form) {\n continue;\n }\n\n if (ddbEsTableRecord.data.form.steps) {\n continue;\n }\n\n // If no steps are defined, we need to create a single step.\n ddbEsTableRecord.data.form.steps = [];\n\n if (Array.isArray(ddbEsTableRecord.data.form.layout)) {\n // If layout is an array, we need to create a single step with all the fields.\n ddbEsTableRecord.data.form.steps = [\n { title: \"Step 1\", layout: ddbEsTableRecord.data.form.layout }\n ];\n delete ddbEsTableRecord.data.form.layout;\n }\n\n ddbEsTableRecordsToWrite.push(\n this.formSubmissionDdbEsEntity.putBatch(ddbEsTableRecord)\n );\n }\n\n {\n // 1. Update DynamoDB records (primary table).\n const execute = () => {\n return batchWriteAll({\n table: this.formSubmissionEntity.table,\n items: primaryTableRecordsToWrite\n });\n };\n\n logger.trace(\"Storing the DynamoDB records (primary table)...\");\n await executeWithRetry(execute, {\n onFailedAttempt: error => {\n logger.error(`\"batchWriteAll\" attempt #${error.attemptNumber} failed.`);\n logger.error(error.message);\n }\n });\n\n logger.trace(\"...stored.\");\n }\n\n {\n // 2. Update DynamoDB records (DDB-ES table).\n const execute = () => {\n return batchWriteAll({\n table: this.formSubmissionDdbEsEntity.table,\n items: ddbEsTableRecordsToWrite\n });\n };\n\n logger.trace(\"Storing the DynamoDB records (DynamoDB-ES table)...\");\n await executeWithRetry(execute, {\n onFailedAttempt: error => {\n logger.error(`\"batchWriteAll\" attempt #${error.attemptNumber} failed.`);\n logger.error(error.message);\n }\n });\n\n logger.trace(\"...stored.\");\n }\n\n // Update checkpoint after every batch\n migrationStatus.lastEvaluatedKey = scanResults.lastEvaluatedKey?.PK\n ? (scanResults.lastEvaluatedKey as unknown as LastEvaluatedKey)\n : true;\n\n // Check if we should store checkpoint and exit.\n if (context.runningOutOfTime()) {\n await context.createCheckpointAndExit(migrationStatus);\n } else {\n await context.createCheckpoint(migrationStatus);\n }\n }\n );\n\n /**\n * This is the end of the migration.\n */\n await restoreOriginalElasticsearchSettings({\n indexSettings: migrationStatus.indexes,\n logger,\n elasticsearchClient: this.elasticsearchClient\n });\n\n migrationStatus.lastEvaluatedKey = true;\n migrationStatus.indexes = {};\n context.createCheckpoint(migrationStatus);\n }\n}\n\nmakeInjectable(MultiStepForms_5_38_0_002, [\n inject(PrimaryDynamoTableSymbol),\n inject(ElasticsearchDynamoTableSymbol),\n inject(ElasticsearchClientSymbol)\n]);\n"],"mappings":"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","ignoreList":[]}
@@ -8,7 +8,6 @@ interface LastEvaluatedKey {
8
8
  GSI1_SK: string;
9
9
  }
10
10
  interface IndexSettings {
11
- number_of_replicas: number;
12
11
  refresh_interval: `${number}s`;
13
12
  }
14
13
  interface CmsEntriesRootFolderDataMigrationCheckpoint {
@@ -1 +1 @@
1
- {"version":3,"names":["_dataMigration","require","_utils","_ioc","_utils2","_createEntryEntity","_getDecompressedData","_getCompressedData","_assignNewMetaFields","_fixTypeFieldValue","_isMigratedEntry","_getOldestRevisionCreatedOn","_getFirstLastPublishedOn","CmsEntriesInitNewMetaFields_5_39_0_001","constructor","table","esTable","elasticsearchClient","ddbEntryEntity","createDdbEntryEntity","ddbEsEntryEntity","createDdbEsEntryEntity","getId","getDescription","shouldExecute","logger","result","scan","entity","options","filters","attr","eq","limit","items","length","info","error","Error","item","data","getDecompressedData","isMigratedEntry","execute","context","migrationStatus","checkpoint","lastEvaluatedKey","restoreOriginalElasticsearchSettings","indexSettings","indexes","usingKey","JSON","stringify","debug","ddbScanWithCallback","startKey","undefined","ddbItems","ddbEsItems","ddbEsGetItems","index","esGetIndexName","tenant","locale","type","modelId","isHeadlessCmsModel","settings","fetchOriginalElasticsearchSettings","disableElasticsearchIndexing","createdOn","getOldestRevisionCreatedOn","entry","entryEntity","firstLastPublishedOnByFields","getFirstLastPublishedOnBy","assignNewMetaFields","fixTypeFieldValue","push","putBatch","entryId","getBatch","PK","SK","status","locked","esRecords","batchReadAll","Object","values","esRecord","decompressedData","trace","forceExecute","compressedData","getCompressedData","batchWriteAll","executeDdbEs","executeWithRetry","onFailedAttempt","attemptNumber","message","runningOutOfTime","createCheckpointAndExit","createCheckpoint","exports","makeInjectable","inject","PrimaryDynamoTableSymbol","ElasticsearchDynamoTableSymbol","ElasticsearchClientSymbol"],"sources":["index.ts"],"sourcesContent":["import { Table } from \"@webiny/db-dynamodb/toolbox\";\nimport {\n DataMigration,\n DataMigrationContext,\n ElasticsearchClientSymbol,\n ElasticsearchDynamoTableSymbol,\n PrimaryDynamoTableSymbol\n} from \"@webiny/data-migration\";\nimport {\n batchReadAll,\n BatchReadItem,\n batchWriteAll,\n BatchWriteItem,\n ddbScanWithCallback,\n disableElasticsearchIndexing,\n esGetIndexName,\n fetchOriginalElasticsearchSettings,\n restoreOriginalElasticsearchSettings,\n scan\n} from \"~/utils\";\nimport { inject, makeInjectable } from \"@webiny/ioc\";\nimport { Client } from \"@elastic/elasticsearch\";\nimport { executeWithRetry } from \"@webiny/utils\";\nimport { createDdbEntryEntity, createDdbEsEntryEntity } from \"../entities/createEntryEntity\";\nimport { CmsEntry } from \"../types\";\nimport { getDecompressedData } from \"../utils/getDecompressedData\";\nimport { getCompressedData } from \"../utils/getCompressedData\";\nimport { assignNewMetaFields } from \"../utils/assignNewMetaFields\";\nimport { fixTypeFieldValue } from \"../utils/fixTypeFieldValue\";\nimport { isMigratedEntry } from \"../utils/isMigratedEntry\";\nimport { getOldestRevisionCreatedOn } from \"../utils/getOldestRevisionCreatedOn\";\nimport { getFirstLastPublishedOnBy } from \"~/migrations/5.39.0/001/utils/getFirstLastPublishedOn\";\n\ninterface LastEvaluatedKey {\n PK: string;\n SK: string;\n GSI1_PK: string;\n GSI1_SK: string;\n}\n\ninterface IndexSettings {\n number_of_replicas: number;\n refresh_interval: `${number}s`;\n}\n\ninterface CmsEntriesRootFolderDataMigrationCheckpoint {\n lastEvaluatedKey?: LastEvaluatedKey | boolean;\n indexes: {\n [index: string]: IndexSettings | null;\n };\n}\n\ninterface DynamoDbElasticsearchRecord {\n PK: string;\n SK: string;\n data: string;\n}\n\nexport class CmsEntriesInitNewMetaFields_5_39_0_001 implements DataMigration {\n private readonly elasticsearchClient: Client;\n private readonly ddbEntryEntity: ReturnType<typeof createDdbEntryEntity>;\n private readonly ddbEsEntryEntity: ReturnType<typeof createDdbEsEntryEntity>;\n\n public constructor(\n table: Table<string, string, string>,\n esTable: Table<string, string, string>,\n elasticsearchClient: Client\n ) {\n this.elasticsearchClient = elasticsearchClient;\n this.ddbEntryEntity = createDdbEntryEntity(table);\n this.ddbEsEntryEntity = createDdbEsEntryEntity(esTable);\n }\n\n getId() {\n return \"5.39.0-001\";\n }\n\n getDescription() {\n return \"Write new revision and entry-level on/by meta fields.\";\n }\n\n async shouldExecute({ logger }: DataMigrationContext): Promise<boolean> {\n const result = await scan<DynamoDbElasticsearchRecord>({\n entity: this.ddbEsEntryEntity,\n options: {\n filters: [\n {\n attr: \"_et\",\n eq: \"CmsEntriesElasticsearch\"\n }\n ],\n limit: 100\n }\n });\n\n if (result.items.length === 0) {\n logger.info(`No CMS entries found in the system; skipping migration.`);\n return false;\n } else if (result.error) {\n logger.error(result.error);\n throw new Error(result.error);\n }\n\n for (const item of result.items) {\n const data = await getDecompressedData<CmsEntry>(item.data);\n if (!data) {\n continue;\n }\n\n if (!isMigratedEntry(data)) {\n return true;\n }\n }\n logger.info(`CMS entries already upgraded. skipping...`);\n return false;\n }\n\n async execute({\n logger,\n ...context\n }: DataMigrationContext<CmsEntriesRootFolderDataMigrationCheckpoint>): Promise<void> {\n const migrationStatus =\n context.checkpoint || ({} as CmsEntriesRootFolderDataMigrationCheckpoint);\n\n if (migrationStatus.lastEvaluatedKey === true) {\n await restoreOriginalElasticsearchSettings({\n indexSettings: migrationStatus.indexes,\n logger,\n elasticsearchClient: this.elasticsearchClient\n });\n logger.info(`Migration completed, no need to start again.`);\n return;\n }\n\n let usingKey = \"\";\n if (migrationStatus?.lastEvaluatedKey) {\n usingKey = JSON.stringify(migrationStatus.lastEvaluatedKey);\n }\n\n logger.debug(`Scanning DynamoDB Elasticsearch table... ${usingKey}`);\n await ddbScanWithCallback<CmsEntry>(\n {\n entity: this.ddbEntryEntity,\n options: {\n filters: [\n {\n attr: \"_et\",\n eq: \"CmsEntries\"\n }\n ],\n startKey: migrationStatus.lastEvaluatedKey || undefined,\n limit: 100\n }\n },\n async result => {\n logger.debug(`Processing ${result.items.length} items...`);\n const ddbItems: BatchWriteItem[] = [];\n const ddbEsItems: BatchWriteItem[] = [];\n\n const ddbEsGetItems: Record<string, BatchReadItem> = {};\n /**\n * Update the DynamoDB part of the records.\n */\n for (const item of result.items) {\n const index = esGetIndexName({\n tenant: item.tenant,\n locale: item.locale,\n type: item.modelId,\n isHeadlessCmsModel: true\n });\n\n // Check for the elasticsearch index settings\n if (!migrationStatus.indexes || migrationStatus.indexes[index] === undefined) {\n // We need to fetch the index settings first\n const settings = await fetchOriginalElasticsearchSettings({\n index,\n logger,\n elasticsearchClient: this.elasticsearchClient\n });\n\n // ... add it to the checkpoint...\n migrationStatus.indexes = {\n ...migrationStatus.indexes,\n [index]: settings\n };\n // and then set not to index\n await disableElasticsearchIndexing({\n elasticsearchClient: this.elasticsearchClient,\n index,\n logger\n });\n }\n\n // Get the oldest revision's `createdOn` value. We use that to set the entry-level `createdOn` value.\n const createdOn = await getOldestRevisionCreatedOn({\n entry: item,\n entryEntity: this.ddbEntryEntity\n });\n\n const firstLastPublishedOnByFields = await getFirstLastPublishedOnBy({\n entry: item,\n entryEntity: this.ddbEntryEntity\n });\n\n assignNewMetaFields(item, {\n createdOn,\n ...firstLastPublishedOnByFields\n });\n\n // Fixes the value of the `TYPE` field, if it's not valid.\n fixTypeFieldValue(item);\n\n ddbItems.push(this.ddbEntryEntity.putBatch(item));\n\n /**\n * Prepare the loading of DynamoDB Elasticsearch part of the records.\n */\n if (ddbEsGetItems[`${item.entryId}:L`]) {\n continue;\n }\n\n ddbEsGetItems[`${item.entryId}:L`] = this.ddbEsEntryEntity.getBatch({\n PK: item.PK,\n SK: \"L\"\n });\n\n if (item.status === \"published\" || !!item.locked) {\n ddbEsGetItems[`${item.entryId}:P`] = this.ddbEsEntryEntity.getBatch({\n PK: item.PK,\n SK: \"P\"\n });\n }\n }\n\n /**\n * Get all the records from DynamoDB Elasticsearch.\n */\n const esRecords = await batchReadAll<DynamoDbElasticsearchRecord>({\n table: this.ddbEsEntryEntity.table,\n items: Object.values(ddbEsGetItems)\n });\n\n for (const esRecord of esRecords) {\n const decompressedData = await getDecompressedData<CmsEntry>(esRecord.data);\n if (!decompressedData) {\n logger.trace(\n `Skipping record \"${esRecord.PK}\" as it is not a valid CMS entry...`\n );\n continue;\n }\n\n if (isMigratedEntry(decompressedData)) {\n const forceExecute = context.forceExecute;\n if (!forceExecute) {\n logger.trace(\n `Skipping record \"${decompressedData.entryId}\" as it already has meta fields defined...`\n );\n continue;\n }\n }\n\n // Get the oldest revision's `createdOn` value. We use that to set the entry-level `createdOn` value.\n const createdOn = await getOldestRevisionCreatedOn({\n entry: { ...decompressedData, PK: esRecord.PK },\n entryEntity: this.ddbEntryEntity\n });\n\n const firstLastPublishedOnByFields = await getFirstLastPublishedOnBy({\n entry: { ...decompressedData, PK: esRecord.PK },\n entryEntity: this.ddbEntryEntity\n });\n\n assignNewMetaFields(decompressedData, {\n createdOn,\n ...firstLastPublishedOnByFields\n });\n\n const compressedData = await getCompressedData(decompressedData);\n\n ddbEsItems.push(\n this.ddbEsEntryEntity.putBatch({\n ...esRecord,\n data: compressedData\n })\n );\n }\n\n const execute = () => {\n return batchWriteAll({\n table: this.ddbEntryEntity.table,\n items: ddbItems\n });\n };\n\n const executeDdbEs = () => {\n return batchWriteAll({\n table: this.ddbEsEntryEntity.table,\n items: ddbEsItems\n });\n };\n\n logger.trace(\"Storing the DynamoDB records...\");\n await executeWithRetry(execute, {\n onFailedAttempt: error => {\n logger.error(\n `\"batchWriteAll\" attempt #${error.attemptNumber} failed: ${error.message}`\n );\n }\n });\n logger.trace(\"...stored.\");\n\n logger.trace(\"Storing the DynamoDB Elasticsearch records...\");\n await executeWithRetry(executeDdbEs, {\n onFailedAttempt: error => {\n logger.error(\n `\"batchWriteAll ddb + es\" attempt #${error.attemptNumber} failed: ${error.message}`\n );\n }\n });\n logger.trace(\"...stored.\");\n\n // Update checkpoint after every batch\n migrationStatus.lastEvaluatedKey = result.lastEvaluatedKey?.PK\n ? (result.lastEvaluatedKey as unknown as LastEvaluatedKey)\n : true;\n\n // Check if we should store checkpoint and exit.\n if (context.runningOutOfTime()) {\n await context.createCheckpointAndExit(migrationStatus);\n } else {\n await context.createCheckpoint(migrationStatus);\n }\n }\n );\n\n /**\n * This is the end of the migration.\n */\n await restoreOriginalElasticsearchSettings({\n indexSettings: migrationStatus.indexes,\n logger,\n elasticsearchClient: this.elasticsearchClient\n });\n\n migrationStatus.lastEvaluatedKey = true;\n migrationStatus.indexes = {};\n context.createCheckpoint(migrationStatus);\n }\n}\n\nmakeInjectable(CmsEntriesInitNewMetaFields_5_39_0_001, [\n inject(PrimaryDynamoTableSymbol),\n inject(ElasticsearchDynamoTableSymbol),\n inject(ElasticsearchClientSymbol)\n]);\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_dataMigration","require","_utils","_ioc","_utils2","_createEntryEntity","_getDecompressedData","_getCompressedData","_assignNewMetaFields","_fixTypeFieldValue","_isMigratedEntry","_getOldestRevisionCreatedOn","_getFirstLastPublishedOn","CmsEntriesInitNewMetaFields_5_39_0_001","constructor","table","esTable","elasticsearchClient","ddbEntryEntity","createDdbEntryEntity","ddbEsEntryEntity","createDdbEsEntryEntity","getId","getDescription","shouldExecute","logger","result","scan","entity","options","filters","attr","eq","limit","items","length","info","error","Error","item","data","getDecompressedData","isMigratedEntry","execute","context","migrationStatus","checkpoint","lastEvaluatedKey","restoreOriginalElasticsearchSettings","indexSettings","indexes","usingKey","JSON","stringify","debug","ddbScanWithCallback","startKey","undefined","ddbItems","ddbEsItems","ddbEsGetItems","index","esGetIndexName","tenant","locale","type","modelId","isHeadlessCmsModel","settings","fetchOriginalElasticsearchSettings","disableElasticsearchIndexing","createdOn","getOldestRevisionCreatedOn","entry","entryEntity","firstLastPublishedOnByFields","getFirstLastPublishedOnBy","assignNewMetaFields","fixTypeFieldValue","push","putBatch","entryId","getBatch","PK","SK","status","locked","esRecords","batchReadAll","Object","values","esRecord","decompressedData","trace","forceExecute","compressedData","getCompressedData","batchWriteAll","executeDdbEs","executeWithRetry","onFailedAttempt","attemptNumber","message","runningOutOfTime","createCheckpointAndExit","createCheckpoint","exports","makeInjectable","inject","PrimaryDynamoTableSymbol","ElasticsearchDynamoTableSymbol","ElasticsearchClientSymbol"],"sources":["index.ts"],"sourcesContent":["import { Table } from \"@webiny/db-dynamodb/toolbox\";\nimport {\n DataMigration,\n DataMigrationContext,\n ElasticsearchClientSymbol,\n ElasticsearchDynamoTableSymbol,\n PrimaryDynamoTableSymbol\n} from \"@webiny/data-migration\";\nimport {\n batchReadAll,\n BatchReadItem,\n batchWriteAll,\n BatchWriteItem,\n ddbScanWithCallback,\n disableElasticsearchIndexing,\n esGetIndexName,\n fetchOriginalElasticsearchSettings,\n restoreOriginalElasticsearchSettings,\n scan\n} from \"~/utils\";\nimport { inject, makeInjectable } from \"@webiny/ioc\";\nimport { Client } from \"@elastic/elasticsearch\";\nimport { executeWithRetry } from \"@webiny/utils\";\nimport { createDdbEntryEntity, createDdbEsEntryEntity } from \"../entities/createEntryEntity\";\nimport { CmsEntry } from \"../types\";\nimport { getDecompressedData } from \"../utils/getDecompressedData\";\nimport { getCompressedData } from \"../utils/getCompressedData\";\nimport { assignNewMetaFields } from \"../utils/assignNewMetaFields\";\nimport { fixTypeFieldValue } from \"../utils/fixTypeFieldValue\";\nimport { isMigratedEntry } from \"../utils/isMigratedEntry\";\nimport { getOldestRevisionCreatedOn } from \"../utils/getOldestRevisionCreatedOn\";\nimport { getFirstLastPublishedOnBy } from \"~/migrations/5.39.0/001/utils/getFirstLastPublishedOn\";\n\ninterface LastEvaluatedKey {\n PK: string;\n SK: string;\n GSI1_PK: string;\n GSI1_SK: string;\n}\n\ninterface IndexSettings {\n refresh_interval: `${number}s`;\n}\n\ninterface CmsEntriesRootFolderDataMigrationCheckpoint {\n lastEvaluatedKey?: LastEvaluatedKey | boolean;\n indexes: {\n [index: string]: IndexSettings | null;\n };\n}\n\ninterface DynamoDbElasticsearchRecord {\n PK: string;\n SK: string;\n data: string;\n}\n\nexport class CmsEntriesInitNewMetaFields_5_39_0_001 implements DataMigration {\n private readonly elasticsearchClient: Client;\n private readonly ddbEntryEntity: ReturnType<typeof createDdbEntryEntity>;\n private readonly ddbEsEntryEntity: ReturnType<typeof createDdbEsEntryEntity>;\n\n public constructor(\n table: Table<string, string, string>,\n esTable: Table<string, string, string>,\n elasticsearchClient: Client\n ) {\n this.elasticsearchClient = elasticsearchClient;\n this.ddbEntryEntity = createDdbEntryEntity(table);\n this.ddbEsEntryEntity = createDdbEsEntryEntity(esTable);\n }\n\n getId() {\n return \"5.39.0-001\";\n }\n\n getDescription() {\n return \"Write new revision and entry-level on/by meta fields.\";\n }\n\n async shouldExecute({ logger }: DataMigrationContext): Promise<boolean> {\n const result = await scan<DynamoDbElasticsearchRecord>({\n entity: this.ddbEsEntryEntity,\n options: {\n filters: [\n {\n attr: \"_et\",\n eq: \"CmsEntriesElasticsearch\"\n }\n ],\n limit: 100\n }\n });\n\n if (result.items.length === 0) {\n logger.info(`No CMS entries found in the system; skipping migration.`);\n return false;\n } else if (result.error) {\n logger.error(result.error);\n throw new Error(result.error);\n }\n\n for (const item of result.items) {\n const data = await getDecompressedData<CmsEntry>(item.data);\n if (!data) {\n continue;\n }\n\n if (!isMigratedEntry(data)) {\n return true;\n }\n }\n logger.info(`CMS entries already upgraded. skipping...`);\n return false;\n }\n\n async execute({\n logger,\n ...context\n }: DataMigrationContext<CmsEntriesRootFolderDataMigrationCheckpoint>): Promise<void> {\n const migrationStatus =\n context.checkpoint || ({} as CmsEntriesRootFolderDataMigrationCheckpoint);\n\n if (migrationStatus.lastEvaluatedKey === true) {\n await restoreOriginalElasticsearchSettings({\n indexSettings: migrationStatus.indexes,\n logger,\n elasticsearchClient: this.elasticsearchClient\n });\n logger.info(`Migration completed, no need to start again.`);\n return;\n }\n\n let usingKey = \"\";\n if (migrationStatus?.lastEvaluatedKey) {\n usingKey = JSON.stringify(migrationStatus.lastEvaluatedKey);\n }\n\n logger.debug(`Scanning DynamoDB Elasticsearch table... ${usingKey}`);\n await ddbScanWithCallback<CmsEntry>(\n {\n entity: this.ddbEntryEntity,\n options: {\n filters: [\n {\n attr: \"_et\",\n eq: \"CmsEntries\"\n }\n ],\n startKey: migrationStatus.lastEvaluatedKey || undefined,\n limit: 100\n }\n },\n async result => {\n logger.debug(`Processing ${result.items.length} items...`);\n const ddbItems: BatchWriteItem[] = [];\n const ddbEsItems: BatchWriteItem[] = [];\n\n const ddbEsGetItems: Record<string, BatchReadItem> = {};\n /**\n * Update the DynamoDB part of the records.\n */\n for (const item of result.items) {\n const index = esGetIndexName({\n tenant: item.tenant,\n locale: item.locale,\n type: item.modelId,\n isHeadlessCmsModel: true\n });\n\n // Check for the elasticsearch index settings\n if (!migrationStatus.indexes || migrationStatus.indexes[index] === undefined) {\n // We need to fetch the index settings first\n const settings = await fetchOriginalElasticsearchSettings({\n index,\n logger,\n elasticsearchClient: this.elasticsearchClient\n });\n\n // ... add it to the checkpoint...\n migrationStatus.indexes = {\n ...migrationStatus.indexes,\n [index]: settings\n };\n // and then set not to index\n await disableElasticsearchIndexing({\n elasticsearchClient: this.elasticsearchClient,\n index,\n logger\n });\n }\n\n // Get the oldest revision's `createdOn` value. We use that to set the entry-level `createdOn` value.\n const createdOn = await getOldestRevisionCreatedOn({\n entry: item,\n entryEntity: this.ddbEntryEntity\n });\n\n const firstLastPublishedOnByFields = await getFirstLastPublishedOnBy({\n entry: item,\n entryEntity: this.ddbEntryEntity\n });\n\n assignNewMetaFields(item, {\n createdOn,\n ...firstLastPublishedOnByFields\n });\n\n // Fixes the value of the `TYPE` field, if it's not valid.\n fixTypeFieldValue(item);\n\n ddbItems.push(this.ddbEntryEntity.putBatch(item));\n\n /**\n * Prepare the loading of DynamoDB Elasticsearch part of the records.\n */\n if (ddbEsGetItems[`${item.entryId}:L`]) {\n continue;\n }\n\n ddbEsGetItems[`${item.entryId}:L`] = this.ddbEsEntryEntity.getBatch({\n PK: item.PK,\n SK: \"L\"\n });\n\n if (item.status === \"published\" || !!item.locked) {\n ddbEsGetItems[`${item.entryId}:P`] = this.ddbEsEntryEntity.getBatch({\n PK: item.PK,\n SK: \"P\"\n });\n }\n }\n\n /**\n * Get all the records from DynamoDB Elasticsearch.\n */\n const esRecords = await batchReadAll<DynamoDbElasticsearchRecord>({\n table: this.ddbEsEntryEntity.table,\n items: Object.values(ddbEsGetItems)\n });\n\n for (const esRecord of esRecords) {\n const decompressedData = await getDecompressedData<CmsEntry>(esRecord.data);\n if (!decompressedData) {\n logger.trace(\n `Skipping record \"${esRecord.PK}\" as it is not a valid CMS entry...`\n );\n continue;\n }\n\n if (isMigratedEntry(decompressedData)) {\n const forceExecute = context.forceExecute;\n if (!forceExecute) {\n logger.trace(\n `Skipping record \"${decompressedData.entryId}\" as it already has meta fields defined...`\n );\n continue;\n }\n }\n\n // Get the oldest revision's `createdOn` value. We use that to set the entry-level `createdOn` value.\n const createdOn = await getOldestRevisionCreatedOn({\n entry: { ...decompressedData, PK: esRecord.PK },\n entryEntity: this.ddbEntryEntity\n });\n\n const firstLastPublishedOnByFields = await getFirstLastPublishedOnBy({\n entry: { ...decompressedData, PK: esRecord.PK },\n entryEntity: this.ddbEntryEntity\n });\n\n assignNewMetaFields(decompressedData, {\n createdOn,\n ...firstLastPublishedOnByFields\n });\n\n const compressedData = await getCompressedData(decompressedData);\n\n ddbEsItems.push(\n this.ddbEsEntryEntity.putBatch({\n ...esRecord,\n data: compressedData\n })\n );\n }\n\n const execute = () => {\n return batchWriteAll({\n table: this.ddbEntryEntity.table,\n items: ddbItems\n });\n };\n\n const executeDdbEs = () => {\n return batchWriteAll({\n table: this.ddbEsEntryEntity.table,\n items: ddbEsItems\n });\n };\n\n logger.trace(\"Storing the DynamoDB records...\");\n await executeWithRetry(execute, {\n onFailedAttempt: error => {\n logger.error(\n `\"batchWriteAll\" attempt #${error.attemptNumber} failed: ${error.message}`\n );\n }\n });\n logger.trace(\"...stored.\");\n\n logger.trace(\"Storing the DynamoDB Elasticsearch records...\");\n await executeWithRetry(executeDdbEs, {\n onFailedAttempt: error => {\n logger.error(\n `\"batchWriteAll ddb + es\" attempt #${error.attemptNumber} failed: ${error.message}`\n );\n }\n });\n logger.trace(\"...stored.\");\n\n // Update checkpoint after every batch\n migrationStatus.lastEvaluatedKey = result.lastEvaluatedKey?.PK\n ? (result.lastEvaluatedKey as unknown as LastEvaluatedKey)\n : true;\n\n // Check if we should store checkpoint and exit.\n if (context.runningOutOfTime()) {\n await context.createCheckpointAndExit(migrationStatus);\n } else {\n await context.createCheckpoint(migrationStatus);\n }\n }\n );\n\n /**\n * This is the end of the migration.\n */\n await restoreOriginalElasticsearchSettings({\n indexSettings: migrationStatus.indexes,\n logger,\n elasticsearchClient: this.elasticsearchClient\n });\n\n migrationStatus.lastEvaluatedKey = true;\n migrationStatus.indexes = {};\n context.createCheckpoint(migrationStatus);\n }\n}\n\nmakeInjectable(CmsEntriesInitNewMetaFields_5_39_0_001, [\n inject(PrimaryDynamoTableSymbol),\n inject(ElasticsearchDynamoTableSymbol),\n inject(ElasticsearchClientSymbol)\n]);\n"],"mappings":"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","ignoreList":[]}
@@ -8,7 +8,6 @@ interface LastEvaluatedKey {
8
8
  GSI1_SK: string;
9
9
  }
10
10
  interface IndexSettings {
11
- number_of_replicas: number;
12
11
  refresh_interval: `${number}s`;
13
12
  }
14
13
  interface CmsEntriesRootFolderDataMigrationCheckpoint {
@@ -1 +1 @@
1
- {"version":3,"names":["_dataMigration","require","_utils","_ioc","_utils2","_createEntryEntity","_getDecompressedData","_getCompressedData","_assignNewMetaFields","_fixTypeFieldValue","_isMigratedEntry","_getOldestRevisionCreatedOn","_getFirstLastPublishedOn","_hasValidTypeFieldValue","CmsEntriesInitNewMetaFields_5_39_2_001","constructor","table","esTable","elasticsearchClient","ddbEntryEntity","createDdbEntryEntity","ddbEsEntryEntity","createDdbEsEntryEntity","getId","getDescription","shouldExecute","logger","ddbScanWithCallback","entity","options","attributes","filters","attr","eq","limit","result","error","Error","item","items","hasValidTypeFieldValue","info","execute","context","migrationStatus","checkpoint","lastEvaluatedKey","restoreOriginalElasticsearchSettings","indexSettings","indexes","usingKey","JSON","stringify","debug","startKey","undefined","length","ddbItems","ddbEsItems","ddbEsGetItems","isMigratedEntry","index","esGetIndexName","tenant","locale","type","modelId","isHeadlessCmsModel","settings","fetchOriginalElasticsearchSettings","disableElasticsearchIndexing","createdOn","getOldestRevisionCreatedOn","entry","entryEntity","firstLastPublishedOnByFields","getFirstLastPublishedOnBy","assignNewMetaFields","fixTypeFieldValue","push","putBatch","entryId","getBatch","PK","SK","status","locked","esRecords","batchReadAll","Object","values","esRecord","decompressedData","getDecompressedData","data","trace","forceExecute","compressedData","getCompressedData","batchWriteAll","executeDdbEs","executeWithRetry","onFailedAttempt","attemptNumber","message","runningOutOfTime","createCheckpointAndExit","createCheckpoint","exports","makeInjectable","inject","PrimaryDynamoTableSymbol","ElasticsearchDynamoTableSymbol","ElasticsearchClientSymbol"],"sources":["index.ts"],"sourcesContent":["import { Table } from \"@webiny/db-dynamodb/toolbox\";\nimport {\n DataMigration,\n DataMigrationContext,\n ElasticsearchClientSymbol,\n ElasticsearchDynamoTableSymbol,\n PrimaryDynamoTableSymbol\n} from \"@webiny/data-migration\";\nimport {\n batchReadAll,\n BatchReadItem,\n batchWriteAll,\n BatchWriteItem,\n ddbScanWithCallback,\n disableElasticsearchIndexing,\n esGetIndexName,\n fetchOriginalElasticsearchSettings,\n restoreOriginalElasticsearchSettings\n} from \"~/utils\";\nimport { inject, makeInjectable } from \"@webiny/ioc\";\nimport { Client } from \"@elastic/elasticsearch\";\nimport { executeWithRetry } from \"@webiny/utils\";\nimport {\n createDdbEntryEntity,\n createDdbEsEntryEntity\n} from \"~/migrations/5.39.0/001/entities/createEntryEntity\";\nimport { CmsEntry } from \"~/migrations/5.39.0/001/types\";\nimport { getDecompressedData } from \"~/migrations/5.39.0/001/utils/getDecompressedData\";\nimport { getCompressedData } from \"~/migrations/5.39.0/001/utils/getCompressedData\";\nimport { assignNewMetaFields } from \"~/migrations/5.39.0/001/utils/assignNewMetaFields\";\nimport { fixTypeFieldValue } from \"~/migrations/5.39.0/001/utils/fixTypeFieldValue\";\nimport { isMigratedEntry } from \"~/migrations/5.39.0/001/utils/isMigratedEntry\";\nimport { getOldestRevisionCreatedOn } from \"~/migrations/5.39.0/001/utils/getOldestRevisionCreatedOn\";\nimport { getFirstLastPublishedOnBy } from \"~/migrations/5.39.0/001/utils/getFirstLastPublishedOn\";\nimport { hasValidTypeFieldValue } from \"~/migrations/5.39.0/001/utils/hasValidTypeFieldValue\";\nimport { ScanDbItem } from \"@webiny/db-dynamodb\";\n\ninterface LastEvaluatedKey {\n PK: string;\n SK: string;\n GSI1_PK: string;\n GSI1_SK: string;\n}\n\ninterface IndexSettings {\n number_of_replicas: number;\n refresh_interval: `${number}s`;\n}\n\ninterface CmsEntriesRootFolderDataMigrationCheckpoint {\n lastEvaluatedKey?: LastEvaluatedKey | boolean;\n indexes: {\n [index: string]: IndexSettings | null;\n };\n}\n\ninterface DynamoDbElasticsearchRecord {\n PK: string;\n SK: string;\n data: string;\n}\n\nexport class CmsEntriesInitNewMetaFields_5_39_2_001 implements DataMigration {\n private readonly elasticsearchClient: Client;\n private readonly ddbEntryEntity: ReturnType<typeof createDdbEntryEntity>;\n private readonly ddbEsEntryEntity: ReturnType<typeof createDdbEsEntryEntity>;\n\n public constructor(\n table: Table<string, string, string>,\n esTable: Table<string, string, string>,\n elasticsearchClient: Client\n ) {\n this.elasticsearchClient = elasticsearchClient;\n this.ddbEntryEntity = createDdbEntryEntity(table);\n this.ddbEsEntryEntity = createDdbEsEntryEntity(esTable);\n }\n\n getId() {\n return \"5.39.2-001\";\n }\n\n getDescription() {\n return \"Write new revision and entry-level on/by meta fields (second pass).\";\n }\n\n async shouldExecute({ logger }: DataMigrationContext): Promise<boolean> {\n let shouldExecute = false;\n\n await ddbScanWithCallback<ScanDbItem<CmsEntry>>(\n {\n entity: this.ddbEntryEntity,\n options: {\n attributes: [\"TYPE\", \"SK\"],\n filters: [\n {\n attr: \"_et\",\n eq: \"CmsEntries\"\n }\n ],\n limit: 100\n }\n },\n async result => {\n if (result.error) {\n logger.error(result.error);\n throw new Error(result.error);\n }\n\n for (const item of result.items) {\n if (!hasValidTypeFieldValue(item)) {\n shouldExecute = true;\n\n // Stop further scanning.\n return false;\n }\n }\n\n // Continue further scanning.\n return true;\n }\n );\n\n if (shouldExecute) {\n return true;\n }\n\n logger.info(`CMS entries already upgraded. Skipping...`);\n return false;\n }\n\n async execute({\n logger,\n ...context\n }: DataMigrationContext<CmsEntriesRootFolderDataMigrationCheckpoint>): Promise<void> {\n const migrationStatus =\n context.checkpoint || ({} as CmsEntriesRootFolderDataMigrationCheckpoint);\n\n if (migrationStatus.lastEvaluatedKey === true) {\n await restoreOriginalElasticsearchSettings({\n indexSettings: migrationStatus.indexes,\n logger,\n elasticsearchClient: this.elasticsearchClient\n });\n logger.info(`Migration completed, no need to start again.`);\n return;\n }\n\n let usingKey = \"\";\n if (migrationStatus?.lastEvaluatedKey) {\n usingKey = JSON.stringify(migrationStatus.lastEvaluatedKey);\n }\n\n logger.debug(`Scanning DynamoDB Elasticsearch table... ${usingKey}`);\n await ddbScanWithCallback<CmsEntry>(\n {\n entity: this.ddbEntryEntity,\n options: {\n filters: [\n {\n attr: \"_et\",\n eq: \"CmsEntries\"\n }\n ],\n startKey: migrationStatus.lastEvaluatedKey || undefined,\n limit: 100\n }\n },\n async result => {\n logger.debug(`Processing ${result.items.length} items...`);\n const ddbItems: BatchWriteItem[] = [];\n const ddbEsItems: BatchWriteItem[] = [];\n\n const ddbEsGetItems: Record<string, BatchReadItem> = {};\n /**\n * Update the DynamoDB part of the records.\n */\n for (const item of result.items) {\n if (hasValidTypeFieldValue(item) && isMigratedEntry(item)) {\n continue;\n }\n\n const index = esGetIndexName({\n tenant: item.tenant,\n locale: item.locale,\n type: item.modelId,\n isHeadlessCmsModel: true\n });\n\n // Check for the elasticsearch index settings\n if (!migrationStatus.indexes || migrationStatus.indexes[index] === undefined) {\n // We need to fetch the index settings first\n const settings = await fetchOriginalElasticsearchSettings({\n index,\n logger,\n elasticsearchClient: this.elasticsearchClient\n });\n\n // ... add it to the checkpoint...\n migrationStatus.indexes = {\n ...migrationStatus.indexes,\n [index]: settings\n };\n // and then set not to index\n await disableElasticsearchIndexing({\n elasticsearchClient: this.elasticsearchClient,\n index,\n logger\n });\n }\n\n if (!isMigratedEntry(item)) {\n // Get the oldest revision's `createdOn` value. We use that to set the entry-level `createdOn` value.\n const createdOn = await getOldestRevisionCreatedOn({\n entry: item,\n entryEntity: this.ddbEntryEntity\n });\n\n const firstLastPublishedOnByFields = await getFirstLastPublishedOnBy({\n entry: item,\n entryEntity: this.ddbEntryEntity\n });\n\n assignNewMetaFields(item, {\n createdOn,\n ...firstLastPublishedOnByFields\n });\n }\n\n // Fixes the value of the `TYPE` field, if it's not valid.\n fixTypeFieldValue(item);\n\n ddbItems.push(this.ddbEntryEntity.putBatch(item));\n\n /**\n * Prepare the loading of DynamoDB Elasticsearch part of the records.\n */\n if (ddbEsGetItems[`${item.entryId}:L`]) {\n continue;\n }\n\n ddbEsGetItems[`${item.entryId}:L`] = this.ddbEsEntryEntity.getBatch({\n PK: item.PK,\n SK: \"L\"\n });\n\n if (item.status === \"published\" || !!item.locked) {\n ddbEsGetItems[`${item.entryId}:P`] = this.ddbEsEntryEntity.getBatch({\n PK: item.PK,\n SK: \"P\"\n });\n }\n }\n\n /**\n * Get all the records from DynamoDB Elasticsearch.\n */\n const esRecords = await batchReadAll<DynamoDbElasticsearchRecord>({\n table: this.ddbEsEntryEntity.table,\n items: Object.values(ddbEsGetItems)\n });\n\n for (const esRecord of esRecords) {\n const decompressedData = await getDecompressedData<CmsEntry>(esRecord.data);\n if (!decompressedData) {\n logger.trace(\n `Skipping record \"${esRecord.PK}\" as it is not a valid CMS entry...`\n );\n continue;\n }\n\n if (isMigratedEntry(decompressedData)) {\n const forceExecute = context.forceExecute;\n if (!forceExecute) {\n logger.trace(\n `Skipping record \"${decompressedData.entryId}\" as it already has meta fields defined...`\n );\n continue;\n }\n }\n\n // Get the oldest revision's `createdOn` value. We use that to set the entry-level `createdOn` value.\n const createdOn = await getOldestRevisionCreatedOn({\n entry: { ...decompressedData, PK: esRecord.PK },\n entryEntity: this.ddbEntryEntity\n });\n\n const firstLastPublishedOnByFields = await getFirstLastPublishedOnBy({\n entry: { ...decompressedData, PK: esRecord.PK },\n entryEntity: this.ddbEntryEntity\n });\n\n assignNewMetaFields(decompressedData, {\n createdOn,\n ...firstLastPublishedOnByFields\n });\n\n const compressedData = await getCompressedData(decompressedData);\n\n ddbEsItems.push(\n this.ddbEsEntryEntity.putBatch({\n ...esRecord,\n data: compressedData\n })\n );\n }\n\n const execute = () => {\n return batchWriteAll({\n table: this.ddbEntryEntity.table,\n items: ddbItems\n });\n };\n\n const executeDdbEs = () => {\n return batchWriteAll({\n table: this.ddbEsEntryEntity.table,\n items: ddbEsItems\n });\n };\n\n logger.trace(\"Storing the DynamoDB records...\");\n await executeWithRetry(execute, {\n onFailedAttempt: error => {\n logger.error(\n `\"batchWriteAll\" attempt #${error.attemptNumber} failed: ${error.message}`\n );\n }\n });\n logger.trace(\"...stored.\");\n\n logger.trace(\"Storing the DynamoDB Elasticsearch records...\");\n await executeWithRetry(executeDdbEs, {\n onFailedAttempt: error => {\n logger.error(\n `\"batchWriteAll ddb + es\" attempt #${error.attemptNumber} failed: ${error.message}`\n );\n }\n });\n logger.trace(\"...stored.\");\n\n // Update checkpoint after every batch\n migrationStatus.lastEvaluatedKey = result.lastEvaluatedKey?.PK\n ? (result.lastEvaluatedKey as unknown as LastEvaluatedKey)\n : true;\n\n // Check if we should store checkpoint and exit.\n if (context.runningOutOfTime()) {\n await context.createCheckpointAndExit(migrationStatus);\n } else {\n await context.createCheckpoint(migrationStatus);\n }\n }\n );\n\n /**\n * This is the end of the migration.\n */\n await restoreOriginalElasticsearchSettings({\n indexSettings: migrationStatus.indexes,\n logger,\n elasticsearchClient: this.elasticsearchClient\n });\n\n migrationStatus.lastEvaluatedKey = true;\n migrationStatus.indexes = {};\n context.createCheckpoint(migrationStatus);\n }\n}\n\nmakeInjectable(CmsEntriesInitNewMetaFields_5_39_2_001, [\n inject(PrimaryDynamoTableSymbol),\n inject(ElasticsearchDynamoTableSymbol),\n inject(ElasticsearchClientSymbol)\n]);\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_dataMigration","require","_utils","_ioc","_utils2","_createEntryEntity","_getDecompressedData","_getCompressedData","_assignNewMetaFields","_fixTypeFieldValue","_isMigratedEntry","_getOldestRevisionCreatedOn","_getFirstLastPublishedOn","_hasValidTypeFieldValue","CmsEntriesInitNewMetaFields_5_39_2_001","constructor","table","esTable","elasticsearchClient","ddbEntryEntity","createDdbEntryEntity","ddbEsEntryEntity","createDdbEsEntryEntity","getId","getDescription","shouldExecute","logger","ddbScanWithCallback","entity","options","attributes","filters","attr","eq","limit","result","error","Error","item","items","hasValidTypeFieldValue","info","execute","context","migrationStatus","checkpoint","lastEvaluatedKey","restoreOriginalElasticsearchSettings","indexSettings","indexes","usingKey","JSON","stringify","debug","startKey","undefined","length","ddbItems","ddbEsItems","ddbEsGetItems","isMigratedEntry","index","esGetIndexName","tenant","locale","type","modelId","isHeadlessCmsModel","settings","fetchOriginalElasticsearchSettings","disableElasticsearchIndexing","createdOn","getOldestRevisionCreatedOn","entry","entryEntity","firstLastPublishedOnByFields","getFirstLastPublishedOnBy","assignNewMetaFields","fixTypeFieldValue","push","putBatch","entryId","getBatch","PK","SK","status","locked","esRecords","batchReadAll","Object","values","esRecord","decompressedData","getDecompressedData","data","trace","forceExecute","compressedData","getCompressedData","batchWriteAll","executeDdbEs","executeWithRetry","onFailedAttempt","attemptNumber","message","runningOutOfTime","createCheckpointAndExit","createCheckpoint","exports","makeInjectable","inject","PrimaryDynamoTableSymbol","ElasticsearchDynamoTableSymbol","ElasticsearchClientSymbol"],"sources":["index.ts"],"sourcesContent":["import { Table } from \"@webiny/db-dynamodb/toolbox\";\nimport {\n DataMigration,\n DataMigrationContext,\n ElasticsearchClientSymbol,\n ElasticsearchDynamoTableSymbol,\n PrimaryDynamoTableSymbol\n} from \"@webiny/data-migration\";\nimport {\n batchReadAll,\n BatchReadItem,\n batchWriteAll,\n BatchWriteItem,\n ddbScanWithCallback,\n disableElasticsearchIndexing,\n esGetIndexName,\n fetchOriginalElasticsearchSettings,\n restoreOriginalElasticsearchSettings\n} from \"~/utils\";\nimport { inject, makeInjectable } from \"@webiny/ioc\";\nimport { Client } from \"@elastic/elasticsearch\";\nimport { executeWithRetry } from \"@webiny/utils\";\nimport {\n createDdbEntryEntity,\n createDdbEsEntryEntity\n} from \"~/migrations/5.39.0/001/entities/createEntryEntity\";\nimport { CmsEntry } from \"~/migrations/5.39.0/001/types\";\nimport { getDecompressedData } from \"~/migrations/5.39.0/001/utils/getDecompressedData\";\nimport { getCompressedData } from \"~/migrations/5.39.0/001/utils/getCompressedData\";\nimport { assignNewMetaFields } from \"~/migrations/5.39.0/001/utils/assignNewMetaFields\";\nimport { fixTypeFieldValue } from \"~/migrations/5.39.0/001/utils/fixTypeFieldValue\";\nimport { isMigratedEntry } from \"~/migrations/5.39.0/001/utils/isMigratedEntry\";\nimport { getOldestRevisionCreatedOn } from \"~/migrations/5.39.0/001/utils/getOldestRevisionCreatedOn\";\nimport { getFirstLastPublishedOnBy } from \"~/migrations/5.39.0/001/utils/getFirstLastPublishedOn\";\nimport { hasValidTypeFieldValue } from \"~/migrations/5.39.0/001/utils/hasValidTypeFieldValue\";\nimport { ScanDbItem } from \"@webiny/db-dynamodb\";\n\ninterface LastEvaluatedKey {\n PK: string;\n SK: string;\n GSI1_PK: string;\n GSI1_SK: string;\n}\n\ninterface IndexSettings {\n refresh_interval: `${number}s`;\n}\n\ninterface CmsEntriesRootFolderDataMigrationCheckpoint {\n lastEvaluatedKey?: LastEvaluatedKey | boolean;\n indexes: {\n [index: string]: IndexSettings | null;\n };\n}\n\ninterface DynamoDbElasticsearchRecord {\n PK: string;\n SK: string;\n data: string;\n}\n\nexport class CmsEntriesInitNewMetaFields_5_39_2_001 implements DataMigration {\n private readonly elasticsearchClient: Client;\n private readonly ddbEntryEntity: ReturnType<typeof createDdbEntryEntity>;\n private readonly ddbEsEntryEntity: ReturnType<typeof createDdbEsEntryEntity>;\n\n public constructor(\n table: Table<string, string, string>,\n esTable: Table<string, string, string>,\n elasticsearchClient: Client\n ) {\n this.elasticsearchClient = elasticsearchClient;\n this.ddbEntryEntity = createDdbEntryEntity(table);\n this.ddbEsEntryEntity = createDdbEsEntryEntity(esTable);\n }\n\n getId() {\n return \"5.39.2-001\";\n }\n\n getDescription() {\n return \"Write new revision and entry-level on/by meta fields (second pass).\";\n }\n\n async shouldExecute({ logger }: DataMigrationContext): Promise<boolean> {\n let shouldExecute = false;\n\n await ddbScanWithCallback<ScanDbItem<CmsEntry>>(\n {\n entity: this.ddbEntryEntity,\n options: {\n attributes: [\"TYPE\", \"SK\"],\n filters: [\n {\n attr: \"_et\",\n eq: \"CmsEntries\"\n }\n ],\n limit: 100\n }\n },\n async result => {\n if (result.error) {\n logger.error(result.error);\n throw new Error(result.error);\n }\n\n for (const item of result.items) {\n if (!hasValidTypeFieldValue(item)) {\n shouldExecute = true;\n\n // Stop further scanning.\n return false;\n }\n }\n\n // Continue further scanning.\n return true;\n }\n );\n\n if (shouldExecute) {\n return true;\n }\n\n logger.info(`CMS entries already upgraded. Skipping...`);\n return false;\n }\n\n async execute({\n logger,\n ...context\n }: DataMigrationContext<CmsEntriesRootFolderDataMigrationCheckpoint>): Promise<void> {\n const migrationStatus =\n context.checkpoint || ({} as CmsEntriesRootFolderDataMigrationCheckpoint);\n\n if (migrationStatus.lastEvaluatedKey === true) {\n await restoreOriginalElasticsearchSettings({\n indexSettings: migrationStatus.indexes,\n logger,\n elasticsearchClient: this.elasticsearchClient\n });\n logger.info(`Migration completed, no need to start again.`);\n return;\n }\n\n let usingKey = \"\";\n if (migrationStatus?.lastEvaluatedKey) {\n usingKey = JSON.stringify(migrationStatus.lastEvaluatedKey);\n }\n\n logger.debug(`Scanning DynamoDB Elasticsearch table... ${usingKey}`);\n await ddbScanWithCallback<CmsEntry>(\n {\n entity: this.ddbEntryEntity,\n options: {\n filters: [\n {\n attr: \"_et\",\n eq: \"CmsEntries\"\n }\n ],\n startKey: migrationStatus.lastEvaluatedKey || undefined,\n limit: 100\n }\n },\n async result => {\n logger.debug(`Processing ${result.items.length} items...`);\n const ddbItems: BatchWriteItem[] = [];\n const ddbEsItems: BatchWriteItem[] = [];\n\n const ddbEsGetItems: Record<string, BatchReadItem> = {};\n /**\n * Update the DynamoDB part of the records.\n */\n for (const item of result.items) {\n if (hasValidTypeFieldValue(item) && isMigratedEntry(item)) {\n continue;\n }\n\n const index = esGetIndexName({\n tenant: item.tenant,\n locale: item.locale,\n type: item.modelId,\n isHeadlessCmsModel: true\n });\n\n // Check for the elasticsearch index settings\n if (!migrationStatus.indexes || migrationStatus.indexes[index] === undefined) {\n // We need to fetch the index settings first\n const settings = await fetchOriginalElasticsearchSettings({\n index,\n logger,\n elasticsearchClient: this.elasticsearchClient\n });\n\n // ... add it to the checkpoint...\n migrationStatus.indexes = {\n ...migrationStatus.indexes,\n [index]: settings\n };\n // and then set not to index\n await disableElasticsearchIndexing({\n elasticsearchClient: this.elasticsearchClient,\n index,\n logger\n });\n }\n\n if (!isMigratedEntry(item)) {\n // Get the oldest revision's `createdOn` value. We use that to set the entry-level `createdOn` value.\n const createdOn = await getOldestRevisionCreatedOn({\n entry: item,\n entryEntity: this.ddbEntryEntity\n });\n\n const firstLastPublishedOnByFields = await getFirstLastPublishedOnBy({\n entry: item,\n entryEntity: this.ddbEntryEntity\n });\n\n assignNewMetaFields(item, {\n createdOn,\n ...firstLastPublishedOnByFields\n });\n }\n\n // Fixes the value of the `TYPE` field, if it's not valid.\n fixTypeFieldValue(item);\n\n ddbItems.push(this.ddbEntryEntity.putBatch(item));\n\n /**\n * Prepare the loading of DynamoDB Elasticsearch part of the records.\n */\n if (ddbEsGetItems[`${item.entryId}:L`]) {\n continue;\n }\n\n ddbEsGetItems[`${item.entryId}:L`] = this.ddbEsEntryEntity.getBatch({\n PK: item.PK,\n SK: \"L\"\n });\n\n if (item.status === \"published\" || !!item.locked) {\n ddbEsGetItems[`${item.entryId}:P`] = this.ddbEsEntryEntity.getBatch({\n PK: item.PK,\n SK: \"P\"\n });\n }\n }\n\n /**\n * Get all the records from DynamoDB Elasticsearch.\n */\n const esRecords = await batchReadAll<DynamoDbElasticsearchRecord>({\n table: this.ddbEsEntryEntity.table,\n items: Object.values(ddbEsGetItems)\n });\n\n for (const esRecord of esRecords) {\n const decompressedData = await getDecompressedData<CmsEntry>(esRecord.data);\n if (!decompressedData) {\n logger.trace(\n `Skipping record \"${esRecord.PK}\" as it is not a valid CMS entry...`\n );\n continue;\n }\n\n if (isMigratedEntry(decompressedData)) {\n const forceExecute = context.forceExecute;\n if (!forceExecute) {\n logger.trace(\n `Skipping record \"${decompressedData.entryId}\" as it already has meta fields defined...`\n );\n continue;\n }\n }\n\n // Get the oldest revision's `createdOn` value. We use that to set the entry-level `createdOn` value.\n const createdOn = await getOldestRevisionCreatedOn({\n entry: { ...decompressedData, PK: esRecord.PK },\n entryEntity: this.ddbEntryEntity\n });\n\n const firstLastPublishedOnByFields = await getFirstLastPublishedOnBy({\n entry: { ...decompressedData, PK: esRecord.PK },\n entryEntity: this.ddbEntryEntity\n });\n\n assignNewMetaFields(decompressedData, {\n createdOn,\n ...firstLastPublishedOnByFields\n });\n\n const compressedData = await getCompressedData(decompressedData);\n\n ddbEsItems.push(\n this.ddbEsEntryEntity.putBatch({\n ...esRecord,\n data: compressedData\n })\n );\n }\n\n const execute = () => {\n return batchWriteAll({\n table: this.ddbEntryEntity.table,\n items: ddbItems\n });\n };\n\n const executeDdbEs = () => {\n return batchWriteAll({\n table: this.ddbEsEntryEntity.table,\n items: ddbEsItems\n });\n };\n\n logger.trace(\"Storing the DynamoDB records...\");\n await executeWithRetry(execute, {\n onFailedAttempt: error => {\n logger.error(\n `\"batchWriteAll\" attempt #${error.attemptNumber} failed: ${error.message}`\n );\n }\n });\n logger.trace(\"...stored.\");\n\n logger.trace(\"Storing the DynamoDB Elasticsearch records...\");\n await executeWithRetry(executeDdbEs, {\n onFailedAttempt: error => {\n logger.error(\n `\"batchWriteAll ddb + es\" attempt #${error.attemptNumber} failed: ${error.message}`\n );\n }\n });\n logger.trace(\"...stored.\");\n\n // Update checkpoint after every batch\n migrationStatus.lastEvaluatedKey = result.lastEvaluatedKey?.PK\n ? (result.lastEvaluatedKey as unknown as LastEvaluatedKey)\n : true;\n\n // Check if we should store checkpoint and exit.\n if (context.runningOutOfTime()) {\n await context.createCheckpointAndExit(migrationStatus);\n } else {\n await context.createCheckpoint(migrationStatus);\n }\n }\n );\n\n /**\n * This is the end of the migration.\n */\n await restoreOriginalElasticsearchSettings({\n indexSettings: migrationStatus.indexes,\n logger,\n elasticsearchClient: this.elasticsearchClient\n });\n\n migrationStatus.lastEvaluatedKey = true;\n migrationStatus.indexes = {};\n context.createCheckpoint(migrationStatus);\n }\n}\n\nmakeInjectable(CmsEntriesInitNewMetaFields_5_39_2_001, [\n inject(PrimaryDynamoTableSymbol),\n inject(ElasticsearchDynamoTableSymbol),\n inject(ElasticsearchClientSymbol)\n]);\n"],"mappings":"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","ignoreList":[]}
@@ -42,8 +42,13 @@ class MetaFieldsMigration {
42
42
  ddbTable: this.ddbTable
43
43
  });
44
44
  if (dataMigrationRecordExists) {
45
- this.logger.info("5.39.6-001 migration has already been executed. Exiting...");
46
- return;
45
+ const forceExecuteEnvVar = process.env["WEBINY_MIGRATION_FORCE_EXECUTE_5_39_6_001"];
46
+ const forceExecute = forceExecuteEnvVar === "true";
47
+ if (!forceExecute) {
48
+ this.logger.info("5.39.6-001 migration has already been executed. Exiting...");
49
+ return;
50
+ }
51
+ this.logger.info("5.39.6-001 migration has already been executed, but force execution was requested.");
47
52
  }
48
53
  this.logger.info("Starting 5.39.6-001 meta fields data migration...");
49
54
  this.logger.info({
@@ -1 +1 @@
1
- {"version":3,"names":["_SegmentProcessor","require","_utils","_apiElasticsearch","_waitUntilHealthy","_utils2","_path","_interopRequireDefault","_os","_fs","_fastGlob","_clientDynamodb","MetaFieldsMigration","constructor","params","runId","String","Date","getTime","ddbTable","ddbEsTable","esEndpoint","totalSegments","logger","esHealthChecks","DEFAULT_ES_HEALTH_CHECKS_PARAMS","execute","scanProcessesPromises","start","now","getDuration","documentClient","getDocumentClient","dataMigrationRecordExists","migrationSkippedDdbRecordExists","info","elasticsearchClient","createElasticsearchClient","endpoint","waitUntilHealthy","createWaitUntilHealthy","wait","indexes","esListIndexes","match","indexSettings","indexName","fetchOriginalElasticsearchSettings","index","disableElasticsearchIndexing","segmentIndex","segmentProcessor","SegmentProcessor","push","Promise","all","restoreOriginalElasticsearchSettings","createMigrationSkippedDdbRecord","duration","resolve","setTimeout","logFilePaths","glob","path","join","os","tmpdir","migrationStats","iterationsCount","avgIterationDuration","recordsScanned","avgRecordsScannedPerIteration","recordsScannedPerSecond","recordsUpdated","recordsSkipped","timeSpentWaiting","checksCount","unhealthyReasons","logFilePath","logFileContent","fs","readFileSync","logFile","JSON","parse","unhealthyReasonType","hasOwnProperty","hasCount","length","writeFileSync","stringify","trace","exports"],"sources":["MetaFieldsMigration.ts"],"sourcesContent":["import { Logger } from \"@webiny/logger\";\nimport { SegmentProcessor } from \"./SegmentProcessor\";\nimport {\n disableElasticsearchIndexing,\n esListIndexes,\n fetchOriginalElasticsearchSettings,\n restoreOriginalElasticsearchSettings\n} from \"~/utils\";\nimport { createElasticsearchClient } from \"@webiny/api-elasticsearch\";\nimport { createWaitUntilHealthy } from \"@webiny/api-elasticsearch/utils/waitUntilHealthy\";\nimport {\n DEFAULT_ES_HEALTH_CHECKS_PARAMS,\n EsHealthChecksParams,\n migrationSkippedDdbRecordExists,\n createMigrationSkippedDdbRecord\n} from \"~/migrations/5.39.6/001/ddb-es/utils\";\nimport path from \"path\";\nimport os from \"os\";\nimport fs from \"fs\";\nimport glob from \"fast-glob\";\nimport { getDocumentClient } from \"@webiny/aws-sdk/client-dynamodb\";\n\nexport interface MetaFieldsMigrationParams {\n ddbTable: string;\n ddbEsTable: string;\n esEndpoint: string;\n totalSegments: number;\n logger: Logger;\n\n // Elasticsearch health check options.\n esHealthChecks?: Partial<EsHealthChecksParams>;\n}\n\nexport class MetaFieldsMigration {\n private readonly runId: string;\n private readonly ddbTable: string;\n private readonly ddbEsTable: string;\n private readonly esEndpoint: string;\n private readonly totalSegments: number;\n private readonly logger: Logger;\n\n private readonly esHealthChecks: EsHealthChecksParams;\n\n constructor(params: MetaFieldsMigrationParams) {\n this.runId = String(new Date().getTime());\n this.ddbTable = params.ddbTable;\n this.ddbEsTable = params.ddbEsTable;\n this.esEndpoint = params.esEndpoint;\n this.totalSegments = params.totalSegments;\n this.logger = params.logger;\n this.esHealthChecks = {\n ...DEFAULT_ES_HEALTH_CHECKS_PARAMS,\n ...params.esHealthChecks\n };\n }\n\n async execute() {\n const scanProcessesPromises = [];\n\n const start = Date.now();\n const getDuration = () => {\n return (Date.now() - start) / 1000;\n };\n\n const documentClient = getDocumentClient();\n\n // Was the migration already executed?\n const dataMigrationRecordExists = await migrationSkippedDdbRecordExists({\n documentClient,\n ddbTable: this.ddbTable\n });\n\n if (dataMigrationRecordExists) {\n this.logger.info(\"5.39.6-001 migration has already been executed. Exiting...\");\n return;\n }\n\n this.logger.info(\"Starting 5.39.6-001 meta fields data migration...\");\n this.logger.info(\n {\n ddbTable: this.ddbTable,\n ddbEsTable: this.ddbEsTable,\n esEndpoint: this.esEndpoint,\n totalSegments: this.totalSegments,\n esHealthChecks: this.esHealthChecks\n },\n \"Received the following parameters:\"\n );\n\n const elasticsearchClient = createElasticsearchClient({\n endpoint: `https://${this.esEndpoint}`\n });\n\n this.logger.info(\"Checking Elasticsearch health status...\");\n const waitUntilHealthy = createWaitUntilHealthy(elasticsearchClient, this.esHealthChecks);\n this.logger.info(\"Elasticsearch is healthy.\");\n\n await waitUntilHealthy.wait();\n\n const indexes = await esListIndexes({ elasticsearchClient, match: \"-headless-cms-\" });\n const indexSettings: Record<string, any> = {};\n for (const indexName of indexes) {\n this.logger.info(`Disabling indexing for Elasticsearch index \"${indexName}\"...`);\n indexSettings[indexName] = await fetchOriginalElasticsearchSettings({\n elasticsearchClient,\n index: indexName,\n logger: this.logger\n });\n\n await disableElasticsearchIndexing({\n elasticsearchClient,\n index: indexName,\n logger: this.logger\n });\n }\n\n this.logger.info(\"Proceeding with the migration...\");\n\n for (let segmentIndex = 0; segmentIndex < this.totalSegments; segmentIndex++) {\n const segmentProcessor = new SegmentProcessor({\n segmentIndex,\n runId: this.runId,\n totalSegments: this.totalSegments,\n ddbTable: this.ddbTable,\n ddbEsTable: this.ddbEsTable,\n esEndpoint: this.esEndpoint,\n esHealthChecks: this.esHealthChecks\n });\n\n scanProcessesPromises.push(segmentProcessor.execute());\n }\n\n await Promise.all(scanProcessesPromises);\n\n this.logger.info(\"Restoring original Elasticsearch settings...\");\n await restoreOriginalElasticsearchSettings({\n elasticsearchClient,\n indexSettings,\n logger: this.logger\n });\n\n // Insert a record that the migration was executed.\n await createMigrationSkippedDdbRecord({\n documentClient,\n ddbTable: this.ddbTable\n });\n\n const duration = getDuration();\n this.logger.info(`5.39.6-001 migration completed in ${duration}s, here are the results...`);\n\n // Wait for 1 second.\n await new Promise(resolve => setTimeout(resolve, 1000));\n\n this.logger.info(\n {\n totalSegments: this.totalSegments,\n esHealthChecks: this.esHealthChecks\n },\n \"The migration was performed with the following following parameters:\"\n );\n\n // Pickup all log files and print a summary of the migration.\n const logFilePaths = await glob(\n path.join(\n os.tmpdir(),\n `webiny-5-39-6-meta-fields-data-migration-log-${this.runId}-*.log`\n )\n );\n\n const migrationStats = {\n iterationsCount: 0,\n avgIterationDuration: 0,\n recordsScanned: 0,\n avgRecordsScannedPerIteration: 0,\n recordsScannedPerSecond: 0,\n recordsUpdated: 0,\n recordsSkipped: 0,\n esHealthChecks: {\n timeSpentWaiting: 0,\n checksCount: 0,\n unhealthyReasons: {} as Record<string, any>\n }\n };\n\n for (const logFilePath of logFilePaths) {\n const logFileContent = fs.readFileSync(logFilePath, \"utf-8\");\n const logFile = JSON.parse(logFileContent);\n\n migrationStats.iterationsCount += logFile.iterationsCount;\n migrationStats.recordsScanned += logFile.recordsScanned;\n migrationStats.recordsUpdated += logFile.recordsUpdated;\n migrationStats.recordsSkipped += logFile.recordsSkipped;\n\n migrationStats.esHealthChecks.timeSpentWaiting +=\n logFile.esHealthChecks.timeSpentWaiting;\n migrationStats.esHealthChecks.checksCount += logFile.esHealthChecks.checksCount;\n\n for (const unhealthyReasonType in logFile.esHealthChecks.unhealthyReasons) {\n if (!logFile.esHealthChecks.unhealthyReasons.hasOwnProperty(unhealthyReasonType)) {\n continue;\n }\n\n const hasCount =\n unhealthyReasonType in migrationStats.esHealthChecks.unhealthyReasons;\n if (hasCount) {\n migrationStats.esHealthChecks.unhealthyReasons[unhealthyReasonType] +=\n logFile.esHealthChecks.unhealthyReasons[unhealthyReasonType];\n } else {\n migrationStats.esHealthChecks.unhealthyReasons[unhealthyReasonType] =\n logFile.esHealthChecks.unhealthyReasons[unhealthyReasonType];\n }\n }\n }\n\n migrationStats.avgIterationDuration = duration / migrationStats.iterationsCount;\n\n migrationStats.avgRecordsScannedPerIteration =\n migrationStats.recordsScanned / migrationStats.iterationsCount;\n\n migrationStats.recordsScannedPerSecond = migrationStats.recordsScanned / duration;\n\n this.logger.info(\n migrationStats,\n `Migration summary (based on ${logFilePaths.length} generated logs):`\n );\n\n const logFilePath = path.join(\n os.tmpdir(),\n `webiny-5-39-6-meta-fields-data-migration-log-${this.runId}.log`\n );\n\n // Save segment processing stats to a file.\n fs.writeFileSync(logFilePath, JSON.stringify(migrationStats, null, 2));\n this.logger.trace(`Migration summary saved to \"${logFilePath}\".`);\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_SegmentProcessor","require","_utils","_apiElasticsearch","_waitUntilHealthy","_utils2","_path","_interopRequireDefault","_os","_fs","_fastGlob","_clientDynamodb","MetaFieldsMigration","constructor","params","runId","String","Date","getTime","ddbTable","ddbEsTable","esEndpoint","totalSegments","logger","esHealthChecks","DEFAULT_ES_HEALTH_CHECKS_PARAMS","execute","scanProcessesPromises","start","now","getDuration","documentClient","getDocumentClient","dataMigrationRecordExists","migrationSkippedDdbRecordExists","forceExecuteEnvVar","process","env","forceExecute","info","elasticsearchClient","createElasticsearchClient","endpoint","waitUntilHealthy","createWaitUntilHealthy","wait","indexes","esListIndexes","match","indexSettings","indexName","fetchOriginalElasticsearchSettings","index","disableElasticsearchIndexing","segmentIndex","segmentProcessor","SegmentProcessor","push","Promise","all","restoreOriginalElasticsearchSettings","createMigrationSkippedDdbRecord","duration","resolve","setTimeout","logFilePaths","glob","path","join","os","tmpdir","migrationStats","iterationsCount","avgIterationDuration","recordsScanned","avgRecordsScannedPerIteration","recordsScannedPerSecond","recordsUpdated","recordsSkipped","timeSpentWaiting","checksCount","unhealthyReasons","logFilePath","logFileContent","fs","readFileSync","logFile","JSON","parse","unhealthyReasonType","hasOwnProperty","hasCount","length","writeFileSync","stringify","trace","exports"],"sources":["MetaFieldsMigration.ts"],"sourcesContent":["import { Logger } from \"@webiny/logger\";\nimport { SegmentProcessor } from \"./SegmentProcessor\";\nimport {\n disableElasticsearchIndexing,\n esListIndexes,\n fetchOriginalElasticsearchSettings,\n restoreOriginalElasticsearchSettings\n} from \"~/utils\";\nimport { createElasticsearchClient } from \"@webiny/api-elasticsearch\";\nimport { createWaitUntilHealthy } from \"@webiny/api-elasticsearch/utils/waitUntilHealthy\";\nimport {\n DEFAULT_ES_HEALTH_CHECKS_PARAMS,\n EsHealthChecksParams,\n migrationSkippedDdbRecordExists,\n createMigrationSkippedDdbRecord\n} from \"~/migrations/5.39.6/001/ddb-es/utils\";\nimport path from \"path\";\nimport os from \"os\";\nimport fs from \"fs\";\nimport glob from \"fast-glob\";\nimport { getDocumentClient } from \"@webiny/aws-sdk/client-dynamodb\";\n\nexport interface MetaFieldsMigrationParams {\n ddbTable: string;\n ddbEsTable: string;\n esEndpoint: string;\n totalSegments: number;\n logger: Logger;\n\n // Elasticsearch health check options.\n esHealthChecks?: Partial<EsHealthChecksParams>;\n}\n\nexport class MetaFieldsMigration {\n private readonly runId: string;\n private readonly ddbTable: string;\n private readonly ddbEsTable: string;\n private readonly esEndpoint: string;\n private readonly totalSegments: number;\n private readonly logger: Logger;\n\n private readonly esHealthChecks: EsHealthChecksParams;\n\n constructor(params: MetaFieldsMigrationParams) {\n this.runId = String(new Date().getTime());\n this.ddbTable = params.ddbTable;\n this.ddbEsTable = params.ddbEsTable;\n this.esEndpoint = params.esEndpoint;\n this.totalSegments = params.totalSegments;\n this.logger = params.logger;\n this.esHealthChecks = {\n ...DEFAULT_ES_HEALTH_CHECKS_PARAMS,\n ...params.esHealthChecks\n };\n }\n\n async execute() {\n const scanProcessesPromises = [];\n\n const start = Date.now();\n const getDuration = () => {\n return (Date.now() - start) / 1000;\n };\n\n const documentClient = getDocumentClient();\n\n // Was the migration already executed?\n const dataMigrationRecordExists = await migrationSkippedDdbRecordExists({\n documentClient,\n ddbTable: this.ddbTable\n });\n\n if (dataMigrationRecordExists) {\n const forceExecuteEnvVar = process.env[\"WEBINY_MIGRATION_FORCE_EXECUTE_5_39_6_001\"];\n const forceExecute = forceExecuteEnvVar === \"true\";\n if (!forceExecute) {\n this.logger.info(\"5.39.6-001 migration has already been executed. Exiting...\");\n return;\n }\n\n this.logger.info(\n \"5.39.6-001 migration has already been executed, but force execution was requested.\"\n );\n }\n\n this.logger.info(\"Starting 5.39.6-001 meta fields data migration...\");\n this.logger.info(\n {\n ddbTable: this.ddbTable,\n ddbEsTable: this.ddbEsTable,\n esEndpoint: this.esEndpoint,\n totalSegments: this.totalSegments,\n esHealthChecks: this.esHealthChecks\n },\n \"Received the following parameters:\"\n );\n\n const elasticsearchClient = createElasticsearchClient({\n endpoint: `https://${this.esEndpoint}`\n });\n\n this.logger.info(\"Checking Elasticsearch health status...\");\n const waitUntilHealthy = createWaitUntilHealthy(elasticsearchClient, this.esHealthChecks);\n this.logger.info(\"Elasticsearch is healthy.\");\n\n await waitUntilHealthy.wait();\n\n const indexes = await esListIndexes({ elasticsearchClient, match: \"-headless-cms-\" });\n const indexSettings: Record<string, any> = {};\n for (const indexName of indexes) {\n this.logger.info(`Disabling indexing for Elasticsearch index \"${indexName}\"...`);\n indexSettings[indexName] = await fetchOriginalElasticsearchSettings({\n elasticsearchClient,\n index: indexName,\n logger: this.logger\n });\n\n await disableElasticsearchIndexing({\n elasticsearchClient,\n index: indexName,\n logger: this.logger\n });\n }\n\n this.logger.info(\"Proceeding with the migration...\");\n\n for (let segmentIndex = 0; segmentIndex < this.totalSegments; segmentIndex++) {\n const segmentProcessor = new SegmentProcessor({\n segmentIndex,\n runId: this.runId,\n totalSegments: this.totalSegments,\n ddbTable: this.ddbTable,\n ddbEsTable: this.ddbEsTable,\n esEndpoint: this.esEndpoint,\n esHealthChecks: this.esHealthChecks\n });\n\n scanProcessesPromises.push(segmentProcessor.execute());\n }\n\n await Promise.all(scanProcessesPromises);\n\n this.logger.info(\"Restoring original Elasticsearch settings...\");\n await restoreOriginalElasticsearchSettings({\n elasticsearchClient,\n indexSettings,\n logger: this.logger\n });\n\n // Insert a record that the migration was executed.\n await createMigrationSkippedDdbRecord({\n documentClient,\n ddbTable: this.ddbTable\n });\n\n const duration = getDuration();\n this.logger.info(`5.39.6-001 migration completed in ${duration}s, here are the results...`);\n\n // Wait for 1 second.\n await new Promise(resolve => setTimeout(resolve, 1000));\n\n this.logger.info(\n {\n totalSegments: this.totalSegments,\n esHealthChecks: this.esHealthChecks\n },\n \"The migration was performed with the following following parameters:\"\n );\n\n // Pickup all log files and print a summary of the migration.\n const logFilePaths = await glob(\n path.join(\n os.tmpdir(),\n `webiny-5-39-6-meta-fields-data-migration-log-${this.runId}-*.log`\n )\n );\n\n const migrationStats = {\n iterationsCount: 0,\n avgIterationDuration: 0,\n recordsScanned: 0,\n avgRecordsScannedPerIteration: 0,\n recordsScannedPerSecond: 0,\n recordsUpdated: 0,\n recordsSkipped: 0,\n esHealthChecks: {\n timeSpentWaiting: 0,\n checksCount: 0,\n unhealthyReasons: {} as Record<string, any>\n }\n };\n\n for (const logFilePath of logFilePaths) {\n const logFileContent = fs.readFileSync(logFilePath, \"utf-8\");\n const logFile = JSON.parse(logFileContent);\n\n migrationStats.iterationsCount += logFile.iterationsCount;\n migrationStats.recordsScanned += logFile.recordsScanned;\n migrationStats.recordsUpdated += logFile.recordsUpdated;\n migrationStats.recordsSkipped += logFile.recordsSkipped;\n\n migrationStats.esHealthChecks.timeSpentWaiting +=\n logFile.esHealthChecks.timeSpentWaiting;\n migrationStats.esHealthChecks.checksCount += logFile.esHealthChecks.checksCount;\n\n for (const unhealthyReasonType in logFile.esHealthChecks.unhealthyReasons) {\n if (!logFile.esHealthChecks.unhealthyReasons.hasOwnProperty(unhealthyReasonType)) {\n continue;\n }\n\n const hasCount =\n unhealthyReasonType in migrationStats.esHealthChecks.unhealthyReasons;\n if (hasCount) {\n migrationStats.esHealthChecks.unhealthyReasons[unhealthyReasonType] +=\n logFile.esHealthChecks.unhealthyReasons[unhealthyReasonType];\n } else {\n migrationStats.esHealthChecks.unhealthyReasons[unhealthyReasonType] =\n logFile.esHealthChecks.unhealthyReasons[unhealthyReasonType];\n }\n }\n }\n\n migrationStats.avgIterationDuration = duration / migrationStats.iterationsCount;\n\n migrationStats.avgRecordsScannedPerIteration =\n migrationStats.recordsScanned / migrationStats.iterationsCount;\n\n migrationStats.recordsScannedPerSecond = migrationStats.recordsScanned / duration;\n\n this.logger.info(\n migrationStats,\n `Migration summary (based on ${logFilePaths.length} generated logs):`\n );\n\n const logFilePath = path.join(\n os.tmpdir(),\n `webiny-5-39-6-meta-fields-data-migration-log-${this.runId}.log`\n );\n\n // Save segment processing stats to a file.\n fs.writeFileSync(logFilePath, JSON.stringify(migrationStats, null, 2));\n this.logger.trace(`Migration summary saved to \"${logFilePath}\".`);\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -8,7 +8,6 @@ interface LastEvaluatedKey {
8
8
  GSI1_SK: string;
9
9
  }
10
10
  interface IndexSettings {
11
- number_of_replicas: number;
12
11
  refresh_interval: `${number}s`;
13
12
  }
14
13
  interface CmsEntriesRootFolderDataMigrationCheckpoint {
@@ -1 +1 @@
1
- {"version":3,"names":["_dataMigration","require","_utils","_ioc","_utils2","_createEntryEntity","_getDecompressedData","_getCompressedData","_assignNewMetaFields","_fixTypeFieldValue","_getOldestRevisionCreatedOn","_getFirstLastPublishedOn","_hasValidTypeFieldValue","_hasAllNonNullableValues","_isMigratedEntry","_getFallbackIdentity","_ensureAllNonNullableValues","CmsEntriesInitNewMetaFields_5_39_6_001","constructor","table","esTable","elasticsearchClient","ddbEntryEntity","createDdbEntryEntity","ddbEsEntryEntity","createDdbEsEntryEntity","getId","getDescription","shouldExecute","logger","ddbScanWithCallback","entity","options","filters","attr","eq","limit","result","error","Error","item","items","isFullyMigrated","isMigratedEntry","hasValidTypeFieldValue","hasAllNonNullableValues","info","execute","context","migrationStatus","checkpoint","lastEvaluatedKey","restoreOriginalElasticsearchSettings","indexSettings","indexes","usingKey","JSON","stringify","trace","currentDdbScanIteration","startKey","undefined","length","ddbItems","ddbEsItems","ddbEsGetItems","fallbackDateTime","Date","toISOString","index","esGetIndexName","tenant","locale","type","modelId","isHeadlessCmsModel","settings","fetchOriginalElasticsearchSettings","disableElasticsearchIndexing","createdOn","getOldestRevisionCreatedOn","entry","entryEntity","firstLastPublishedOnByFields","getFirstLastPublishedOnBy","assignNewMetaFields","fixTypeFieldValue","id","fallbackIdentity","getFallbackIdentity","ensureAllNonNullableValues","dateTime","identity","e","debug","message","push","putBatch","entryId","getBatch","PK","SK","status","locked","ddbEsRecords","batchReadAll","Object","values","ddbEsRecord","decompressedData","getDecompressedData","data","join","compressedData","getCompressedData","batchWriteAll","executeWithRetry","onFailedAttempt","attemptNumber","executeDdbEs","runningOutOfTime","createCheckpointAndExit","createCheckpoint","exports","makeInjectable","inject","PrimaryDynamoTableSymbol","ElasticsearchDynamoTableSymbol","ElasticsearchClientSymbol"],"sources":["index.ts"],"sourcesContent":["import { Table } from \"@webiny/db-dynamodb/toolbox\";\nimport {\n DataMigration,\n DataMigrationContext,\n ElasticsearchClientSymbol,\n ElasticsearchDynamoTableSymbol,\n PrimaryDynamoTableSymbol\n} from \"@webiny/data-migration\";\nimport {\n batchReadAll,\n BatchReadItem,\n batchWriteAll,\n BatchWriteItem,\n ddbScanWithCallback,\n disableElasticsearchIndexing,\n esGetIndexName,\n fetchOriginalElasticsearchSettings,\n restoreOriginalElasticsearchSettings\n} from \"~/utils\";\nimport { inject, makeInjectable } from \"@webiny/ioc\";\nimport { Client } from \"@elastic/elasticsearch\";\nimport { executeWithRetry } from \"@webiny/utils\";\nimport {\n createDdbEntryEntity,\n createDdbEsEntryEntity\n} from \"~/migrations/5.39.0/001/entities/createEntryEntity\";\nimport { CmsEntry } from \"~/migrations/5.39.0/001/types\";\nimport { getDecompressedData } from \"~/migrations/5.39.0/001/utils/getDecompressedData\";\nimport { getCompressedData } from \"~/migrations/5.39.0/001/utils/getCompressedData\";\nimport { assignNewMetaFields } from \"~/migrations/5.39.0/001/utils/assignNewMetaFields\";\nimport { fixTypeFieldValue } from \"~/migrations/5.39.0/001/utils/fixTypeFieldValue\";\nimport { getOldestRevisionCreatedOn } from \"~/migrations/5.39.0/001/utils/getOldestRevisionCreatedOn\";\nimport { getFirstLastPublishedOnBy } from \"~/migrations/5.39.0/001/utils/getFirstLastPublishedOn\";\nimport { hasValidTypeFieldValue } from \"~/migrations/5.39.0/001/utils/hasValidTypeFieldValue\";\nimport { hasAllNonNullableValues } from \"~/migrations/5.39.0/001/utils/hasAllNonNullableValues\";\nimport { isMigratedEntry } from \"~/migrations/5.39.0/001/utils/isMigratedEntry\";\nimport { getFallbackIdentity } from \"~/migrations/5.39.0/001/utils/getFallbackIdentity\";\nimport { ensureAllNonNullableValues } from \"~/migrations/5.39.0/001/utils/ensureAllNonNullableValues\";\nimport { ScanDbItem } from \"@webiny/db-dynamodb\";\n\ninterface LastEvaluatedKey {\n PK: string;\n SK: string;\n GSI1_PK: string;\n GSI1_SK: string;\n}\n\ninterface IndexSettings {\n number_of_replicas: number;\n refresh_interval: `${number}s`;\n}\n\ninterface CmsEntriesRootFolderDataMigrationCheckpoint {\n lastEvaluatedKey?: LastEvaluatedKey | boolean;\n indexes: {\n [index: string]: IndexSettings | null;\n };\n}\n\ninterface DynamoDbElasticsearchRecord {\n PK: string;\n SK: string;\n data: string;\n}\n\nexport class CmsEntriesInitNewMetaFields_5_39_6_001 implements DataMigration {\n private readonly elasticsearchClient: Client;\n private readonly ddbEntryEntity: ReturnType<typeof createDdbEntryEntity>;\n private readonly ddbEsEntryEntity: ReturnType<typeof createDdbEsEntryEntity>;\n\n public constructor(\n table: Table<string, string, string>,\n esTable: Table<string, string, string>,\n elasticsearchClient: Client\n ) {\n this.elasticsearchClient = elasticsearchClient;\n this.ddbEntryEntity = createDdbEntryEntity(table);\n this.ddbEsEntryEntity = createDdbEsEntryEntity(esTable);\n }\n\n getId() {\n return \"5.39.6-001\";\n }\n\n getDescription() {\n return \"Write new revision and entry-level on/by meta fields.\";\n }\n\n async shouldExecute({ logger }: DataMigrationContext): Promise<boolean> {\n let shouldExecute = false;\n\n await ddbScanWithCallback<ScanDbItem<CmsEntry>>(\n {\n entity: this.ddbEntryEntity,\n options: {\n filters: [\n {\n attr: \"_et\",\n eq: \"CmsEntries\"\n }\n ],\n limit: 100\n }\n },\n async result => {\n if (result.error) {\n logger.error(result.error);\n throw new Error(result.error);\n }\n\n for (const item of result.items) {\n const isFullyMigrated =\n isMigratedEntry(item) &&\n hasValidTypeFieldValue(item) &&\n hasAllNonNullableValues(item);\n\n if (!isFullyMigrated) {\n shouldExecute = true;\n\n // Stop further scanning.\n return false;\n }\n }\n\n // Continue further scanning.\n return true;\n }\n );\n\n if (shouldExecute) {\n return true;\n }\n\n logger.info(`CMS entries already upgraded. Skipping...`);\n return false;\n }\n\n async execute({\n logger,\n ...context\n }: DataMigrationContext<CmsEntriesRootFolderDataMigrationCheckpoint>): Promise<void> {\n const migrationStatus =\n context.checkpoint || ({} as CmsEntriesRootFolderDataMigrationCheckpoint);\n\n if (migrationStatus.lastEvaluatedKey === true) {\n await restoreOriginalElasticsearchSettings({\n indexSettings: migrationStatus.indexes,\n logger,\n elasticsearchClient: this.elasticsearchClient\n });\n logger.info(`Migration completed, no need to start again.`);\n return;\n }\n\n let usingKey = \"\";\n if (migrationStatus?.lastEvaluatedKey) {\n usingKey = JSON.stringify(migrationStatus.lastEvaluatedKey);\n }\n\n logger.trace(`Scanning primary DynamoDB table.`, {\n usingKey\n });\n\n let currentDdbScanIteration = 0;\n\n await ddbScanWithCallback<CmsEntry>(\n {\n entity: this.ddbEntryEntity,\n options: {\n filters: [\n {\n attr: \"_et\",\n eq: \"CmsEntries\"\n }\n ],\n startKey: migrationStatus.lastEvaluatedKey || undefined,\n limit: 100\n }\n },\n async result => {\n currentDdbScanIteration++;\n\n logger.trace(`Primary DynamoDB table scan iteration: ${currentDdbScanIteration}.`);\n logger.trace(`Analyzing ${result.items.length} record(s)...`);\n\n const ddbItems: BatchWriteItem[] = [];\n const ddbEsItems: BatchWriteItem[] = [];\n const ddbEsGetItems: Record<string, BatchReadItem> = {};\n\n const fallbackDateTime = new Date().toISOString();\n\n // Update records in primary DynamoDB table. Also do preparations for\n // subsequent updates on DDB-ES DynamoDB table, and in Elasticsearch.\n for (const item of result.items) {\n const isFullyMigrated =\n isMigratedEntry(item) &&\n hasValidTypeFieldValue(item) &&\n hasAllNonNullableValues(item);\n\n if (isFullyMigrated) {\n continue;\n }\n\n const index = esGetIndexName({\n tenant: item.tenant,\n locale: item.locale,\n type: item.modelId,\n isHeadlessCmsModel: true\n });\n\n // Check ES index settings.\n if (!migrationStatus.indexes || migrationStatus.indexes[index] === undefined) {\n // We need to fetch the index settings first\n const settings = await fetchOriginalElasticsearchSettings({\n index,\n logger,\n elasticsearchClient: this.elasticsearchClient\n });\n\n // ... add it to the checkpoint...\n migrationStatus.indexes = {\n ...migrationStatus.indexes,\n [index]: settings\n };\n // and then set not to index\n await disableElasticsearchIndexing({\n elasticsearchClient: this.elasticsearchClient,\n index,\n logger\n });\n }\n\n // 1. Check if the data migration was ever performed. If not, let's perform it.\n if (!isMigratedEntry(item)) {\n // Get the oldest revision's `createdOn` value. We use that to set the entry-level `createdOn` value.\n const createdOn = await getOldestRevisionCreatedOn({\n entry: item,\n entryEntity: this.ddbEntryEntity\n });\n\n const firstLastPublishedOnByFields = await getFirstLastPublishedOnBy({\n entry: item,\n entryEntity: this.ddbEntryEntity\n });\n\n assignNewMetaFields(item, {\n createdOn,\n ...firstLastPublishedOnByFields\n });\n }\n\n // 2. We've noticed some of the records had an invalid `TYPE` field value\n // in the database. This step addresses this issue.\n if (!hasValidTypeFieldValue(item)) {\n // Fixes the value of the `TYPE` field, if it's not valid.\n fixTypeFieldValue(item);\n }\n\n // 3. Finally, once both of the steps were performed, ensure that all\n // new non-nullable meta fields have a value and nothing is missing.\n if (!hasAllNonNullableValues(item)) {\n logger.trace(\n `Detected an entry with missing values for non-nullable meta fields (${item.modelId}/${item.id}).`\n );\n\n try {\n const fallbackIdentity = await getFallbackIdentity({\n entity: this.ddbEntryEntity,\n tenant: item.tenant\n });\n\n ensureAllNonNullableValues(item, {\n dateTime: fallbackDateTime,\n identity: fallbackIdentity\n });\n\n logger.trace(\n `Successfully ensured all non-nullable meta fields have values (${item.modelId}/${item.id}). Will be saving into the database soon.`\n );\n } catch (e) {\n logger.debug(\n `Failed to ensure all non-nullable meta fields have values (${item.modelId}/${item.id}): ${e.message}`\n );\n }\n }\n\n ddbItems.push(this.ddbEntryEntity.putBatch(item));\n\n /**\n * Prepare the loading of DynamoDB Elasticsearch part of the records.\n */\n if (ddbEsGetItems[`${item.entryId}:L`]) {\n continue;\n }\n\n ddbEsGetItems[`${item.entryId}:L`] = this.ddbEsEntryEntity.getBatch({\n PK: item.PK,\n SK: \"L\"\n });\n\n if (item.status === \"published\" || !!item.locked) {\n ddbEsGetItems[`${item.entryId}:P`] = this.ddbEsEntryEntity.getBatch({\n PK: item.PK,\n SK: \"P\"\n });\n }\n }\n\n /**\n * Get all the records from DynamoDB Elasticsearch.\n */\n const ddbEsRecords = await batchReadAll<DynamoDbElasticsearchRecord>({\n table: this.ddbEsEntryEntity.table,\n items: Object.values(ddbEsGetItems)\n });\n\n for (const ddbEsRecord of ddbEsRecords) {\n const decompressedData = await getDecompressedData<CmsEntry>(ddbEsRecord.data);\n if (!decompressedData) {\n logger.trace(\n `[DDB-ES Table] Skipping record \"${ddbEsRecord.PK}\" as it is not a valid CMS entry...`\n );\n continue;\n }\n\n // 1. Check if the data migration was ever performed. If not, let's perform it.\n if (!isMigratedEntry(decompressedData)) {\n // Get the oldest revision's `createdOn` value. We use that to set the entry-level `createdOn` value.\n const createdOn = await getOldestRevisionCreatedOn({\n entry: { ...decompressedData, PK: ddbEsRecord.PK },\n entryEntity: this.ddbEntryEntity\n });\n\n const firstLastPublishedOnByFields = await getFirstLastPublishedOnBy({\n entry: { ...decompressedData, PK: ddbEsRecord.PK },\n entryEntity: this.ddbEntryEntity\n });\n\n assignNewMetaFields(decompressedData, {\n createdOn,\n ...firstLastPublishedOnByFields\n });\n }\n\n // 2. Ensure new non-nullable meta fields have a value and nothing is missing.\n if (!hasAllNonNullableValues(decompressedData)) {\n logger.trace(\n [\n \"[DDB-ES Table] Detected an entry with missing values for non-nullable meta fields\",\n `(${decompressedData.modelId}/${decompressedData.id}).`\n ].join(\" \")\n );\n\n try {\n const fallbackIdentity = await getFallbackIdentity({\n entity: this.ddbEntryEntity,\n tenant: decompressedData.tenant\n });\n\n ensureAllNonNullableValues(decompressedData, {\n dateTime: fallbackDateTime,\n identity: fallbackIdentity\n });\n\n logger.trace(\n [\n \"[DDB-ES Table] Successfully ensured all non-nullable meta fields\",\n `have values (${decompressedData.modelId}/${decompressedData.id}).`,\n \"Will be saving the changes soon.\"\n ].join(\" \")\n );\n } catch (e) {\n logger.debug(\n [\n \"[DDB-ES Table] Failed to ensure all non-nullable meta fields have values\",\n `(${decompressedData.modelId}/${decompressedData.id}): ${e.message}`\n ].join(\" \")\n );\n }\n }\n\n const compressedData = await getCompressedData(decompressedData);\n\n ddbEsItems.push(\n this.ddbEsEntryEntity.putBatch({\n ...ddbEsRecord,\n data: compressedData\n })\n );\n }\n\n // Store data in primary DynamoDB table.\n const execute = () => {\n return batchWriteAll({\n table: this.ddbEntryEntity.table,\n items: ddbItems\n });\n };\n\n logger.trace(\"Storing records in primary DynamoDB table...\");\n await executeWithRetry(execute, {\n onFailedAttempt: error => {\n logger.error(\n `\"batchWriteAll\" attempt #${error.attemptNumber} failed: ${error.message}`\n );\n }\n });\n logger.trace(\"...stored.\");\n\n // Store data in DDB-ES DynamoDB table.\n const executeDdbEs = () => {\n return batchWriteAll({\n table: this.ddbEsEntryEntity.table,\n items: ddbEsItems\n });\n };\n\n logger.trace(\"Storing records in DDB-ES DynamoDB table...\");\n await executeWithRetry(executeDdbEs, {\n onFailedAttempt: error => {\n logger.error(\n `\"batchWriteAll ddb-es\" attempt #${error.attemptNumber} failed: ${error.message}`\n );\n }\n });\n logger.trace(\"...stored.\");\n\n // Update checkpoint after every batch.\n migrationStatus.lastEvaluatedKey = result.lastEvaluatedKey?.PK\n ? (result.lastEvaluatedKey as unknown as LastEvaluatedKey)\n : true;\n\n // Check if we should store checkpoint and exit.\n if (context.runningOutOfTime()) {\n await context.createCheckpointAndExit(migrationStatus);\n } else {\n await context.createCheckpoint(migrationStatus);\n }\n }\n );\n\n /**\n * This is the end of the migration.\n */\n await restoreOriginalElasticsearchSettings({\n indexSettings: migrationStatus.indexes,\n logger,\n elasticsearchClient: this.elasticsearchClient\n });\n\n migrationStatus.lastEvaluatedKey = true;\n migrationStatus.indexes = {};\n context.createCheckpoint(migrationStatus);\n }\n}\n\nmakeInjectable(CmsEntriesInitNewMetaFields_5_39_6_001, [\n inject(PrimaryDynamoTableSymbol),\n inject(ElasticsearchDynamoTableSymbol),\n inject(ElasticsearchClientSymbol)\n]);\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_dataMigration","require","_utils","_ioc","_utils2","_createEntryEntity","_getDecompressedData","_getCompressedData","_assignNewMetaFields","_fixTypeFieldValue","_getOldestRevisionCreatedOn","_getFirstLastPublishedOn","_hasValidTypeFieldValue","_hasAllNonNullableValues","_isMigratedEntry","_getFallbackIdentity","_ensureAllNonNullableValues","CmsEntriesInitNewMetaFields_5_39_6_001","constructor","table","esTable","elasticsearchClient","ddbEntryEntity","createDdbEntryEntity","ddbEsEntryEntity","createDdbEsEntryEntity","getId","getDescription","shouldExecute","logger","ddbScanWithCallback","entity","options","filters","attr","eq","limit","result","error","Error","item","items","isFullyMigrated","isMigratedEntry","hasValidTypeFieldValue","hasAllNonNullableValues","info","execute","context","migrationStatus","checkpoint","lastEvaluatedKey","restoreOriginalElasticsearchSettings","indexSettings","indexes","usingKey","JSON","stringify","trace","currentDdbScanIteration","startKey","undefined","length","ddbItems","ddbEsItems","ddbEsGetItems","fallbackDateTime","Date","toISOString","index","esGetIndexName","tenant","locale","type","modelId","isHeadlessCmsModel","settings","fetchOriginalElasticsearchSettings","disableElasticsearchIndexing","createdOn","getOldestRevisionCreatedOn","entry","entryEntity","firstLastPublishedOnByFields","getFirstLastPublishedOnBy","assignNewMetaFields","fixTypeFieldValue","id","fallbackIdentity","getFallbackIdentity","ensureAllNonNullableValues","dateTime","identity","e","debug","message","push","putBatch","entryId","getBatch","PK","SK","status","locked","ddbEsRecords","batchReadAll","Object","values","ddbEsRecord","decompressedData","getDecompressedData","data","join","compressedData","getCompressedData","batchWriteAll","executeWithRetry","onFailedAttempt","attemptNumber","executeDdbEs","runningOutOfTime","createCheckpointAndExit","createCheckpoint","exports","makeInjectable","inject","PrimaryDynamoTableSymbol","ElasticsearchDynamoTableSymbol","ElasticsearchClientSymbol"],"sources":["index.ts"],"sourcesContent":["import { Table } from \"@webiny/db-dynamodb/toolbox\";\nimport {\n DataMigration,\n DataMigrationContext,\n ElasticsearchClientSymbol,\n ElasticsearchDynamoTableSymbol,\n PrimaryDynamoTableSymbol\n} from \"@webiny/data-migration\";\nimport {\n batchReadAll,\n BatchReadItem,\n batchWriteAll,\n BatchWriteItem,\n ddbScanWithCallback,\n disableElasticsearchIndexing,\n esGetIndexName,\n fetchOriginalElasticsearchSettings,\n restoreOriginalElasticsearchSettings\n} from \"~/utils\";\nimport { inject, makeInjectable } from \"@webiny/ioc\";\nimport { Client } from \"@elastic/elasticsearch\";\nimport { executeWithRetry } from \"@webiny/utils\";\nimport {\n createDdbEntryEntity,\n createDdbEsEntryEntity\n} from \"~/migrations/5.39.0/001/entities/createEntryEntity\";\nimport { CmsEntry } from \"~/migrations/5.39.0/001/types\";\nimport { getDecompressedData } from \"~/migrations/5.39.0/001/utils/getDecompressedData\";\nimport { getCompressedData } from \"~/migrations/5.39.0/001/utils/getCompressedData\";\nimport { assignNewMetaFields } from \"~/migrations/5.39.0/001/utils/assignNewMetaFields\";\nimport { fixTypeFieldValue } from \"~/migrations/5.39.0/001/utils/fixTypeFieldValue\";\nimport { getOldestRevisionCreatedOn } from \"~/migrations/5.39.0/001/utils/getOldestRevisionCreatedOn\";\nimport { getFirstLastPublishedOnBy } from \"~/migrations/5.39.0/001/utils/getFirstLastPublishedOn\";\nimport { hasValidTypeFieldValue } from \"~/migrations/5.39.0/001/utils/hasValidTypeFieldValue\";\nimport { hasAllNonNullableValues } from \"~/migrations/5.39.0/001/utils/hasAllNonNullableValues\";\nimport { isMigratedEntry } from \"~/migrations/5.39.0/001/utils/isMigratedEntry\";\nimport { getFallbackIdentity } from \"~/migrations/5.39.0/001/utils/getFallbackIdentity\";\nimport { ensureAllNonNullableValues } from \"~/migrations/5.39.0/001/utils/ensureAllNonNullableValues\";\nimport { ScanDbItem } from \"@webiny/db-dynamodb\";\n\ninterface LastEvaluatedKey {\n PK: string;\n SK: string;\n GSI1_PK: string;\n GSI1_SK: string;\n}\n\ninterface IndexSettings {\n refresh_interval: `${number}s`;\n}\n\ninterface CmsEntriesRootFolderDataMigrationCheckpoint {\n lastEvaluatedKey?: LastEvaluatedKey | boolean;\n indexes: {\n [index: string]: IndexSettings | null;\n };\n}\n\ninterface DynamoDbElasticsearchRecord {\n PK: string;\n SK: string;\n data: string;\n}\n\nexport class CmsEntriesInitNewMetaFields_5_39_6_001 implements DataMigration {\n private readonly elasticsearchClient: Client;\n private readonly ddbEntryEntity: ReturnType<typeof createDdbEntryEntity>;\n private readonly ddbEsEntryEntity: ReturnType<typeof createDdbEsEntryEntity>;\n\n public constructor(\n table: Table<string, string, string>,\n esTable: Table<string, string, string>,\n elasticsearchClient: Client\n ) {\n this.elasticsearchClient = elasticsearchClient;\n this.ddbEntryEntity = createDdbEntryEntity(table);\n this.ddbEsEntryEntity = createDdbEsEntryEntity(esTable);\n }\n\n getId() {\n return \"5.39.6-001\";\n }\n\n getDescription() {\n return \"Write new revision and entry-level on/by meta fields.\";\n }\n\n async shouldExecute({ logger }: DataMigrationContext): Promise<boolean> {\n let shouldExecute = false;\n\n await ddbScanWithCallback<ScanDbItem<CmsEntry>>(\n {\n entity: this.ddbEntryEntity,\n options: {\n filters: [\n {\n attr: \"_et\",\n eq: \"CmsEntries\"\n }\n ],\n limit: 100\n }\n },\n async result => {\n if (result.error) {\n logger.error(result.error);\n throw new Error(result.error);\n }\n\n for (const item of result.items) {\n const isFullyMigrated =\n isMigratedEntry(item) &&\n hasValidTypeFieldValue(item) &&\n hasAllNonNullableValues(item);\n\n if (!isFullyMigrated) {\n shouldExecute = true;\n\n // Stop further scanning.\n return false;\n }\n }\n\n // Continue further scanning.\n return true;\n }\n );\n\n if (shouldExecute) {\n return true;\n }\n\n logger.info(`CMS entries already upgraded. Skipping...`);\n return false;\n }\n\n async execute({\n logger,\n ...context\n }: DataMigrationContext<CmsEntriesRootFolderDataMigrationCheckpoint>): Promise<void> {\n const migrationStatus =\n context.checkpoint || ({} as CmsEntriesRootFolderDataMigrationCheckpoint);\n\n if (migrationStatus.lastEvaluatedKey === true) {\n await restoreOriginalElasticsearchSettings({\n indexSettings: migrationStatus.indexes,\n logger,\n elasticsearchClient: this.elasticsearchClient\n });\n logger.info(`Migration completed, no need to start again.`);\n return;\n }\n\n let usingKey = \"\";\n if (migrationStatus?.lastEvaluatedKey) {\n usingKey = JSON.stringify(migrationStatus.lastEvaluatedKey);\n }\n\n logger.trace(`Scanning primary DynamoDB table.`, {\n usingKey\n });\n\n let currentDdbScanIteration = 0;\n\n await ddbScanWithCallback<CmsEntry>(\n {\n entity: this.ddbEntryEntity,\n options: {\n filters: [\n {\n attr: \"_et\",\n eq: \"CmsEntries\"\n }\n ],\n startKey: migrationStatus.lastEvaluatedKey || undefined,\n limit: 100\n }\n },\n async result => {\n currentDdbScanIteration++;\n\n logger.trace(`Primary DynamoDB table scan iteration: ${currentDdbScanIteration}.`);\n logger.trace(`Analyzing ${result.items.length} record(s)...`);\n\n const ddbItems: BatchWriteItem[] = [];\n const ddbEsItems: BatchWriteItem[] = [];\n const ddbEsGetItems: Record<string, BatchReadItem> = {};\n\n const fallbackDateTime = new Date().toISOString();\n\n // Update records in primary DynamoDB table. Also do preparations for\n // subsequent updates on DDB-ES DynamoDB table, and in Elasticsearch.\n for (const item of result.items) {\n const isFullyMigrated =\n isMigratedEntry(item) &&\n hasValidTypeFieldValue(item) &&\n hasAllNonNullableValues(item);\n\n if (isFullyMigrated) {\n continue;\n }\n\n const index = esGetIndexName({\n tenant: item.tenant,\n locale: item.locale,\n type: item.modelId,\n isHeadlessCmsModel: true\n });\n\n // Check ES index settings.\n if (!migrationStatus.indexes || migrationStatus.indexes[index] === undefined) {\n // We need to fetch the index settings first\n const settings = await fetchOriginalElasticsearchSettings({\n index,\n logger,\n elasticsearchClient: this.elasticsearchClient\n });\n\n // ... add it to the checkpoint...\n migrationStatus.indexes = {\n ...migrationStatus.indexes,\n [index]: settings\n };\n // and then set not to index\n await disableElasticsearchIndexing({\n elasticsearchClient: this.elasticsearchClient,\n index,\n logger\n });\n }\n\n // 1. Check if the data migration was ever performed. If not, let's perform it.\n if (!isMigratedEntry(item)) {\n // Get the oldest revision's `createdOn` value. We use that to set the entry-level `createdOn` value.\n const createdOn = await getOldestRevisionCreatedOn({\n entry: item,\n entryEntity: this.ddbEntryEntity\n });\n\n const firstLastPublishedOnByFields = await getFirstLastPublishedOnBy({\n entry: item,\n entryEntity: this.ddbEntryEntity\n });\n\n assignNewMetaFields(item, {\n createdOn,\n ...firstLastPublishedOnByFields\n });\n }\n\n // 2. We've noticed some of the records had an invalid `TYPE` field value\n // in the database. This step addresses this issue.\n if (!hasValidTypeFieldValue(item)) {\n // Fixes the value of the `TYPE` field, if it's not valid.\n fixTypeFieldValue(item);\n }\n\n // 3. Finally, once both of the steps were performed, ensure that all\n // new non-nullable meta fields have a value and nothing is missing.\n if (!hasAllNonNullableValues(item)) {\n logger.trace(\n `Detected an entry with missing values for non-nullable meta fields (${item.modelId}/${item.id}).`\n );\n\n try {\n const fallbackIdentity = await getFallbackIdentity({\n entity: this.ddbEntryEntity,\n tenant: item.tenant\n });\n\n ensureAllNonNullableValues(item, {\n dateTime: fallbackDateTime,\n identity: fallbackIdentity\n });\n\n logger.trace(\n `Successfully ensured all non-nullable meta fields have values (${item.modelId}/${item.id}). Will be saving into the database soon.`\n );\n } catch (e) {\n logger.debug(\n `Failed to ensure all non-nullable meta fields have values (${item.modelId}/${item.id}): ${e.message}`\n );\n }\n }\n\n ddbItems.push(this.ddbEntryEntity.putBatch(item));\n\n /**\n * Prepare the loading of DynamoDB Elasticsearch part of the records.\n */\n if (ddbEsGetItems[`${item.entryId}:L`]) {\n continue;\n }\n\n ddbEsGetItems[`${item.entryId}:L`] = this.ddbEsEntryEntity.getBatch({\n PK: item.PK,\n SK: \"L\"\n });\n\n if (item.status === \"published\" || !!item.locked) {\n ddbEsGetItems[`${item.entryId}:P`] = this.ddbEsEntryEntity.getBatch({\n PK: item.PK,\n SK: \"P\"\n });\n }\n }\n\n /**\n * Get all the records from DynamoDB Elasticsearch.\n */\n const ddbEsRecords = await batchReadAll<DynamoDbElasticsearchRecord>({\n table: this.ddbEsEntryEntity.table,\n items: Object.values(ddbEsGetItems)\n });\n\n for (const ddbEsRecord of ddbEsRecords) {\n const decompressedData = await getDecompressedData<CmsEntry>(ddbEsRecord.data);\n if (!decompressedData) {\n logger.trace(\n `[DDB-ES Table] Skipping record \"${ddbEsRecord.PK}\" as it is not a valid CMS entry...`\n );\n continue;\n }\n\n // 1. Check if the data migration was ever performed. If not, let's perform it.\n if (!isMigratedEntry(decompressedData)) {\n // Get the oldest revision's `createdOn` value. We use that to set the entry-level `createdOn` value.\n const createdOn = await getOldestRevisionCreatedOn({\n entry: { ...decompressedData, PK: ddbEsRecord.PK },\n entryEntity: this.ddbEntryEntity\n });\n\n const firstLastPublishedOnByFields = await getFirstLastPublishedOnBy({\n entry: { ...decompressedData, PK: ddbEsRecord.PK },\n entryEntity: this.ddbEntryEntity\n });\n\n assignNewMetaFields(decompressedData, {\n createdOn,\n ...firstLastPublishedOnByFields\n });\n }\n\n // 2. Ensure new non-nullable meta fields have a value and nothing is missing.\n if (!hasAllNonNullableValues(decompressedData)) {\n logger.trace(\n [\n \"[DDB-ES Table] Detected an entry with missing values for non-nullable meta fields\",\n `(${decompressedData.modelId}/${decompressedData.id}).`\n ].join(\" \")\n );\n\n try {\n const fallbackIdentity = await getFallbackIdentity({\n entity: this.ddbEntryEntity,\n tenant: decompressedData.tenant\n });\n\n ensureAllNonNullableValues(decompressedData, {\n dateTime: fallbackDateTime,\n identity: fallbackIdentity\n });\n\n logger.trace(\n [\n \"[DDB-ES Table] Successfully ensured all non-nullable meta fields\",\n `have values (${decompressedData.modelId}/${decompressedData.id}).`,\n \"Will be saving the changes soon.\"\n ].join(\" \")\n );\n } catch (e) {\n logger.debug(\n [\n \"[DDB-ES Table] Failed to ensure all non-nullable meta fields have values\",\n `(${decompressedData.modelId}/${decompressedData.id}): ${e.message}`\n ].join(\" \")\n );\n }\n }\n\n const compressedData = await getCompressedData(decompressedData);\n\n ddbEsItems.push(\n this.ddbEsEntryEntity.putBatch({\n ...ddbEsRecord,\n data: compressedData\n })\n );\n }\n\n // Store data in primary DynamoDB table.\n const execute = () => {\n return batchWriteAll({\n table: this.ddbEntryEntity.table,\n items: ddbItems\n });\n };\n\n logger.trace(\"Storing records in primary DynamoDB table...\");\n await executeWithRetry(execute, {\n onFailedAttempt: error => {\n logger.error(\n `\"batchWriteAll\" attempt #${error.attemptNumber} failed: ${error.message}`\n );\n }\n });\n logger.trace(\"...stored.\");\n\n // Store data in DDB-ES DynamoDB table.\n const executeDdbEs = () => {\n return batchWriteAll({\n table: this.ddbEsEntryEntity.table,\n items: ddbEsItems\n });\n };\n\n logger.trace(\"Storing records in DDB-ES DynamoDB table...\");\n await executeWithRetry(executeDdbEs, {\n onFailedAttempt: error => {\n logger.error(\n `\"batchWriteAll ddb-es\" attempt #${error.attemptNumber} failed: ${error.message}`\n );\n }\n });\n logger.trace(\"...stored.\");\n\n // Update checkpoint after every batch.\n migrationStatus.lastEvaluatedKey = result.lastEvaluatedKey?.PK\n ? (result.lastEvaluatedKey as unknown as LastEvaluatedKey)\n : true;\n\n // Check if we should store checkpoint and exit.\n if (context.runningOutOfTime()) {\n await context.createCheckpointAndExit(migrationStatus);\n } else {\n await context.createCheckpoint(migrationStatus);\n }\n }\n );\n\n /**\n * This is the end of the migration.\n */\n await restoreOriginalElasticsearchSettings({\n indexSettings: migrationStatus.indexes,\n logger,\n elasticsearchClient: this.elasticsearchClient\n });\n\n migrationStatus.lastEvaluatedKey = true;\n migrationStatus.indexes = {};\n context.createCheckpoint(migrationStatus);\n }\n}\n\nmakeInjectable(CmsEntriesInitNewMetaFields_5_39_6_001, [\n inject(PrimaryDynamoTableSymbol),\n inject(ElasticsearchDynamoTableSymbol),\n inject(ElasticsearchClientSymbol)\n]);\n"],"mappings":"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","ignoreList":[]}
package/package.json CHANGED
@@ -1,21 +1,21 @@
1
1
  {
2
2
  "name": "@webiny/migrations",
3
- "version": "5.40.4",
3
+ "version": "5.40.5-beta.0",
4
4
  "scripts": {
5
5
  "build": "yarn webiny run build",
6
6
  "watch": "yarn webiny run watch"
7
7
  },
8
8
  "dependencies": {
9
9
  "@elastic/elasticsearch": "7.12.0",
10
- "@webiny/api-elasticsearch": "5.40.4",
11
- "@webiny/aws-sdk": "5.40.4",
12
- "@webiny/cli-plugin-deploy-pulumi": "5.40.4",
13
- "@webiny/data-migration": "5.40.4",
14
- "@webiny/db-dynamodb": "5.40.4",
15
- "@webiny/error": "5.40.4",
16
- "@webiny/ioc": "5.40.4",
17
- "@webiny/logger": "5.40.4",
18
- "@webiny/utils": "5.40.4",
10
+ "@webiny/api-elasticsearch": "5.40.5-beta.0",
11
+ "@webiny/aws-sdk": "5.40.5-beta.0",
12
+ "@webiny/cli-plugin-deploy-pulumi": "5.40.5-beta.0",
13
+ "@webiny/data-migration": "5.40.5-beta.0",
14
+ "@webiny/db-dynamodb": "5.40.5-beta.0",
15
+ "@webiny/error": "5.40.5-beta.0",
16
+ "@webiny/ioc": "5.40.5-beta.0",
17
+ "@webiny/logger": "5.40.5-beta.0",
18
+ "@webiny/utils": "5.40.5-beta.0",
19
19
  "execa": "5.1.1",
20
20
  "fast-glob": "3.2.12",
21
21
  "jsonpack": "1.1.5",
@@ -30,16 +30,16 @@
30
30
  },
31
31
  "devDependencies": {
32
32
  "@types/execa": "2.0.0",
33
- "@webiny/api-headless-cms": "5.40.4",
34
- "@webiny/api-headless-cms-ddb-es": "5.40.4",
35
- "@webiny/cli": "5.40.4",
36
- "@webiny/handler-aws": "5.40.4",
37
- "@webiny/plugins": "5.40.4",
38
- "@webiny/project-utils": "5.40.4",
33
+ "@webiny/api-headless-cms": "5.40.5-beta.0",
34
+ "@webiny/api-headless-cms-ddb-es": "5.40.5-beta.0",
35
+ "@webiny/cli": "5.40.5-beta.0",
36
+ "@webiny/handler-aws": "5.40.5-beta.0",
37
+ "@webiny/plugins": "5.40.5-beta.0",
38
+ "@webiny/project-utils": "5.40.5-beta.0",
39
39
  "elastic-ts": "0.8.0",
40
40
  "jest-dynalite": "3.6.1",
41
41
  "ttypescript": "1.5.15",
42
42
  "typescript": "4.7.4"
43
43
  },
44
- "gitHead": "1be8d8c3ebb404e7582ee9b426d8ec870afb5b99"
44
+ "gitHead": "f67778732392ed88f28da869ddacbf08a98cdec6"
45
45
  }
@@ -15,7 +15,6 @@ const disableElasticsearchIndexing = async params => {
15
15
  elasticsearchClient: params.elasticsearchClient,
16
16
  index,
17
17
  settings: {
18
- number_of_replicas: 0,
19
18
  refresh_interval: -1
20
19
  }
21
20
  });
@@ -1 +1 @@
1
- {"version":3,"names":["_","require","disableElasticsearchIndexing","params","index","logger","esPutIndexSettings","elasticsearchClient","settings","number_of_replicas","refresh_interval","ex","error","message","code","data","exports"],"sources":["disableEsIndexing.ts"],"sourcesContent":["import { esPutIndexSettings } from \"~/utils\";\nimport { Logger } from \"@webiny/data-migration\";\nimport { Client } from \"@elastic/elasticsearch\";\n\ninterface DisableElasticsearchIndexingParams {\n index: string;\n logger: Logger;\n elasticsearchClient: Client;\n}\n\nexport const disableElasticsearchIndexing = async (\n params: DisableElasticsearchIndexingParams\n): Promise<void> => {\n const { index, logger } = params;\n\n try {\n await esPutIndexSettings({\n elasticsearchClient: params.elasticsearchClient,\n index,\n settings: {\n number_of_replicas: 0,\n refresh_interval: -1\n }\n });\n } catch (ex) {\n logger.error(`Failed to disable indexing for index \"${index}\".`);\n logger.error({\n ...ex,\n message: ex.message,\n code: ex.code,\n data: ex.data\n });\n }\n};\n"],"mappings":";;;;;;AAAA,IAAAA,CAAA,GAAAC,OAAA;AAUO,MAAMC,4BAA4B,GAAG,MACxCC,MAA0C,IAC1B;EAChB,MAAM;IAAEC,KAAK;IAAEC;EAAO,CAAC,GAAGF,MAAM;EAEhC,IAAI;IACA,MAAM,IAAAG,oBAAkB,EAAC;MACrBC,mBAAmB,EAAEJ,MAAM,CAACI,mBAAmB;MAC/CH,KAAK;MACLI,QAAQ,EAAE;QACNC,kBAAkB,EAAE,CAAC;QACrBC,gBAAgB,EAAE,CAAC;MACvB;IACJ,CAAC,CAAC;EACN,CAAC,CAAC,OAAOC,EAAE,EAAE;IACTN,MAAM,CAACO,KAAK,CAAE,yCAAwCR,KAAM,IAAG,CAAC;IAChEC,MAAM,CAACO,KAAK,CAAC;MACT,GAAGD,EAAE;MACLE,OAAO,EAAEF,EAAE,CAACE,OAAO;MACnBC,IAAI,EAAEH,EAAE,CAACG,IAAI;MACbC,IAAI,EAAEJ,EAAE,CAACI;IACb,CAAC,CAAC;EACN;AACJ,CAAC;AAACC,OAAA,CAAAd,4BAAA,GAAAA,4BAAA","ignoreList":[]}
1
+ {"version":3,"names":["_","require","disableElasticsearchIndexing","params","index","logger","esPutIndexSettings","elasticsearchClient","settings","refresh_interval","ex","error","message","code","data","exports"],"sources":["disableEsIndexing.ts"],"sourcesContent":["import { esPutIndexSettings } from \"~/utils\";\nimport { Logger } from \"@webiny/data-migration\";\nimport { Client } from \"@elastic/elasticsearch\";\n\ninterface DisableElasticsearchIndexingParams {\n index: string;\n logger: Logger;\n elasticsearchClient: Client;\n}\n\nexport const disableElasticsearchIndexing = async (\n params: DisableElasticsearchIndexingParams\n): Promise<void> => {\n const { index, logger } = params;\n\n try {\n await esPutIndexSettings({\n elasticsearchClient: params.elasticsearchClient,\n index,\n settings: {\n refresh_interval: -1\n }\n });\n } catch (ex) {\n logger.error(`Failed to disable indexing for index \"${index}\".`);\n logger.error({\n ...ex,\n message: ex.message,\n code: ex.code,\n data: ex.data\n });\n }\n};\n"],"mappings":";;;;;;AAAA,IAAAA,CAAA,GAAAC,OAAA;AAUO,MAAMC,4BAA4B,GAAG,MACxCC,MAA0C,IAC1B;EAChB,MAAM;IAAEC,KAAK;IAAEC;EAAO,CAAC,GAAGF,MAAM;EAEhC,IAAI;IACA,MAAM,IAAAG,oBAAkB,EAAC;MACrBC,mBAAmB,EAAEJ,MAAM,CAACI,mBAAmB;MAC/CH,KAAK;MACLI,QAAQ,EAAE;QACNC,gBAAgB,EAAE,CAAC;MACvB;IACJ,CAAC,CAAC;EACN,CAAC,CAAC,OAAOC,EAAE,EAAE;IACTL,MAAM,CAACM,KAAK,CAAE,yCAAwCP,KAAM,IAAG,CAAC;IAChEC,MAAM,CAACM,KAAK,CAAC;MACT,GAAGD,EAAE;MACLE,OAAO,EAAEF,EAAE,CAACE,OAAO;MACnBC,IAAI,EAAEH,EAAE,CAACG,IAAI;MACbC,IAAI,EAAEJ,EAAE,CAACI;IACb,CAAC,CAAC;EACN;AACJ,CAAC;AAACC,OAAA,CAAAb,4BAAA,GAAAA,4BAAA","ignoreList":[]}
@@ -6,7 +6,6 @@ interface FetchOriginalElasticsearchSettingsParams {
6
6
  logger: Logger;
7
7
  }
8
8
  interface IndexSettings {
9
- number_of_replicas: number;
10
9
  refresh_interval: `${number}s`;
11
10
  }
12
11
  export declare const fetchOriginalElasticsearchSettings: (params: FetchOriginalElasticsearchSettingsParams) => Promise<IndexSettings | null>;
@@ -14,10 +14,9 @@ const fetchOriginalElasticsearchSettings = async params => {
14
14
  const settings = await (0, _.esGetIndexSettings)({
15
15
  elasticsearchClient: params.elasticsearchClient,
16
16
  index,
17
- fields: ["number_of_replicas", "refresh_interval"]
17
+ fields: ["refresh_interval"]
18
18
  });
19
19
  return {
20
- number_of_replicas: settings.number_of_replicas || 1,
21
20
  refresh_interval: settings.refresh_interval || "1s"
22
21
  };
23
22
  } catch (ex) {
@@ -1 +1 @@
1
- {"version":3,"names":["_","require","fetchOriginalElasticsearchSettings","params","index","logger","settings","esGetIndexSettings","elasticsearchClient","fields","number_of_replicas","refresh_interval","ex","error","message","code","data","exports"],"sources":["fetchOriginalEsSettings.ts"],"sourcesContent":["import { esGetIndexSettings } from \"~/utils\";\nimport { Logger } from \"@webiny/data-migration\";\nimport { Client } from \"@elastic/elasticsearch\";\n\ninterface FetchOriginalElasticsearchSettingsParams {\n elasticsearchClient: Client;\n index: string;\n logger: Logger;\n}\n\ninterface IndexSettings {\n number_of_replicas: number;\n refresh_interval: `${number}s`;\n}\n\nexport const fetchOriginalElasticsearchSettings = async (\n params: FetchOriginalElasticsearchSettingsParams\n): Promise<IndexSettings | null> => {\n const { index, logger } = params;\n try {\n const settings = await esGetIndexSettings({\n elasticsearchClient: params.elasticsearchClient,\n index,\n fields: [\"number_of_replicas\", \"refresh_interval\"]\n });\n return {\n number_of_replicas: settings.number_of_replicas || 1,\n refresh_interval: settings.refresh_interval || \"1s\"\n };\n } catch (ex) {\n logger.error(`Failed to fetch original Elasticsearch settings for index \"${index}\".`);\n logger.error({\n ...ex,\n message: ex.message,\n code: ex.code,\n data: ex.data\n });\n }\n\n return null;\n};\n"],"mappings":";;;;;;AAAA,IAAAA,CAAA,GAAAC,OAAA;AAeO,MAAMC,kCAAkC,GAAG,MAC9CC,MAAgD,IAChB;EAChC,MAAM;IAAEC,KAAK;IAAEC;EAAO,CAAC,GAAGF,MAAM;EAChC,IAAI;IACA,MAAMG,QAAQ,GAAG,MAAM,IAAAC,oBAAkB,EAAC;MACtCC,mBAAmB,EAAEL,MAAM,CAACK,mBAAmB;MAC/CJ,KAAK;MACLK,MAAM,EAAE,CAAC,oBAAoB,EAAE,kBAAkB;IACrD,CAAC,CAAC;IACF,OAAO;MACHC,kBAAkB,EAAEJ,QAAQ,CAACI,kBAAkB,IAAI,CAAC;MACpDC,gBAAgB,EAAEL,QAAQ,CAACK,gBAAgB,IAAI;IACnD,CAAC;EACL,CAAC,CAAC,OAAOC,EAAE,EAAE;IACTP,MAAM,CAACQ,KAAK,CAAE,8DAA6DT,KAAM,IAAG,CAAC;IACrFC,MAAM,CAACQ,KAAK,CAAC;MACT,GAAGD,EAAE;MACLE,OAAO,EAAEF,EAAE,CAACE,OAAO;MACnBC,IAAI,EAAEH,EAAE,CAACG,IAAI;MACbC,IAAI,EAAEJ,EAAE,CAACI;IACb,CAAC,CAAC;EACN;EAEA,OAAO,IAAI;AACf,CAAC;AAACC,OAAA,CAAAf,kCAAA,GAAAA,kCAAA","ignoreList":[]}
1
+ {"version":3,"names":["_","require","fetchOriginalElasticsearchSettings","params","index","logger","settings","esGetIndexSettings","elasticsearchClient","fields","refresh_interval","ex","error","message","code","data","exports"],"sources":["fetchOriginalEsSettings.ts"],"sourcesContent":["import { esGetIndexSettings } from \"~/utils\";\nimport { Logger } from \"@webiny/data-migration\";\nimport { Client } from \"@elastic/elasticsearch\";\n\ninterface FetchOriginalElasticsearchSettingsParams {\n elasticsearchClient: Client;\n index: string;\n logger: Logger;\n}\n\ninterface IndexSettings {\n refresh_interval: `${number}s`;\n}\n\nexport const fetchOriginalElasticsearchSettings = async (\n params: FetchOriginalElasticsearchSettingsParams\n): Promise<IndexSettings | null> => {\n const { index, logger } = params;\n try {\n const settings = await esGetIndexSettings({\n elasticsearchClient: params.elasticsearchClient,\n index,\n fields: [\"refresh_interval\"]\n });\n return {\n refresh_interval: settings.refresh_interval || \"1s\"\n };\n } catch (ex) {\n logger.error(`Failed to fetch original Elasticsearch settings for index \"${index}\".`);\n logger.error({\n ...ex,\n message: ex.message,\n code: ex.code,\n data: ex.data\n });\n }\n\n return null;\n};\n"],"mappings":";;;;;;AAAA,IAAAA,CAAA,GAAAC,OAAA;AAcO,MAAMC,kCAAkC,GAAG,MAC9CC,MAAgD,IAChB;EAChC,MAAM;IAAEC,KAAK;IAAEC;EAAO,CAAC,GAAGF,MAAM;EAChC,IAAI;IACA,MAAMG,QAAQ,GAAG,MAAM,IAAAC,oBAAkB,EAAC;MACtCC,mBAAmB,EAAEL,MAAM,CAACK,mBAAmB;MAC/CJ,KAAK;MACLK,MAAM,EAAE,CAAC,kBAAkB;IAC/B,CAAC,CAAC;IACF,OAAO;MACHC,gBAAgB,EAAEJ,QAAQ,CAACI,gBAAgB,IAAI;IACnD,CAAC;EACL,CAAC,CAAC,OAAOC,EAAE,EAAE;IACTN,MAAM,CAACO,KAAK,CAAE,8DAA6DR,KAAM,IAAG,CAAC;IACrFC,MAAM,CAACO,KAAK,CAAC;MACT,GAAGD,EAAE;MACLE,OAAO,EAAEF,EAAE,CAACE,OAAO;MACnBC,IAAI,EAAEH,EAAE,CAACG,IAAI;MACbC,IAAI,EAAEJ,EAAE,CAACI;IACb,CAAC,CAAC;EACN;EAEA,OAAO,IAAI;AACf,CAAC;AAACC,OAAA,CAAAd,kCAAA,GAAAA,kCAAA","ignoreList":[]}
@@ -1,8 +1,7 @@
1
1
  import { Logger } from "@webiny/data-migration";
2
2
  import { Client } from "@elastic/elasticsearch";
3
3
  interface IndexSettings {
4
- number_of_replicas: number;
5
- refresh_interval: `${number}s`;
4
+ refresh_interval: `${number}s` | "-1";
6
5
  }
7
6
  interface RestoreOriginalElasticsearchSettingsParams {
8
7
  indexSettings: {
@@ -19,13 +19,21 @@ const restoreOriginalElasticsearchSettings = async params => {
19
19
  if (!settings || typeof settings !== "object") {
20
20
  continue;
21
21
  }
22
+
23
+ // We must ensure that the refresh interval is not set to a negative value. Why?
24
+ // We've had a case where a migration run has been manually stopped, and the index settings
25
+ // were never restored. Once a second run was started and this restore function
26
+ // was called, the refresh interval was set to `-1s`, which effectively disabled indexing.
27
+ let refreshInterval = settings.refresh_interval || `1s`;
28
+ if (refreshInterval === "-1") {
29
+ refreshInterval = "1s";
30
+ }
22
31
  try {
23
32
  await (0, _.esPutIndexSettings)({
24
33
  elasticsearchClient: params.elasticsearchClient,
25
34
  index,
26
35
  settings: {
27
- number_of_replicas: settings.number_of_replicas || 1,
28
- refresh_interval: settings.refresh_interval || `1s`
36
+ refresh_interval: refreshInterval
29
37
  }
30
38
  });
31
39
  } catch (ex) {
@@ -1 +1 @@
1
- {"version":3,"names":["_","require","restoreOriginalElasticsearchSettings","params","indexSettings","logger","indexes","index","settings","esPutIndexSettings","elasticsearchClient","number_of_replicas","refresh_interval","ex","error","message","code","data","exports"],"sources":["restoreOriginalEsSettings.ts"],"sourcesContent":["import { esPutIndexSettings } from \"~/utils\";\nimport { Logger } from \"@webiny/data-migration\";\nimport { Client } from \"@elastic/elasticsearch\";\n\ninterface IndexSettings {\n number_of_replicas: number;\n refresh_interval: `${number}s`;\n}\n\ninterface RestoreOriginalElasticsearchSettingsParams {\n indexSettings: {\n [index: string]: IndexSettings | null;\n };\n logger: Logger;\n elasticsearchClient: Client;\n}\n\nexport const restoreOriginalElasticsearchSettings = async (\n params: RestoreOriginalElasticsearchSettingsParams\n): Promise<void> => {\n const { indexSettings, logger } = params;\n\n const indexes = indexSettings;\n if (!indexes || typeof indexes !== \"object\") {\n return;\n }\n\n for (const index in indexes) {\n const settings = indexes[index];\n if (!settings || typeof settings !== \"object\") {\n continue;\n }\n try {\n await esPutIndexSettings({\n elasticsearchClient: params.elasticsearchClient,\n index,\n settings: {\n number_of_replicas: settings.number_of_replicas || 1,\n refresh_interval: settings.refresh_interval || `1s`\n }\n });\n } catch (ex) {\n logger.error(\n `Failed to restore original settings for index \"${index}\". Please do it manually.`\n );\n logger.error({\n ...ex,\n message: ex.message,\n code: ex.code,\n data: ex.data\n });\n }\n }\n};\n"],"mappings":";;;;;;AAAA,IAAAA,CAAA,GAAAC,OAAA;AAiBO,MAAMC,oCAAoC,GAAG,MAChDC,MAAkD,IAClC;EAChB,MAAM;IAAEC,aAAa;IAAEC;EAAO,CAAC,GAAGF,MAAM;EAExC,MAAMG,OAAO,GAAGF,aAAa;EAC7B,IAAI,CAACE,OAAO,IAAI,OAAOA,OAAO,KAAK,QAAQ,EAAE;IACzC;EACJ;EAEA,KAAK,MAAMC,KAAK,IAAID,OAAO,EAAE;IACzB,MAAME,QAAQ,GAAGF,OAAO,CAACC,KAAK,CAAC;IAC/B,IAAI,CAACC,QAAQ,IAAI,OAAOA,QAAQ,KAAK,QAAQ,EAAE;MAC3C;IACJ;IACA,IAAI;MACA,MAAM,IAAAC,oBAAkB,EAAC;QACrBC,mBAAmB,EAAEP,MAAM,CAACO,mBAAmB;QAC/CH,KAAK;QACLC,QAAQ,EAAE;UACNG,kBAAkB,EAAEH,QAAQ,CAACG,kBAAkB,IAAI,CAAC;UACpDC,gBAAgB,EAAEJ,QAAQ,CAACI,gBAAgB,IAAK;QACpD;MACJ,CAAC,CAAC;IACN,CAAC,CAAC,OAAOC,EAAE,EAAE;MACTR,MAAM,CAACS,KAAK,CACP,kDAAiDP,KAAM,2BAC5D,CAAC;MACDF,MAAM,CAACS,KAAK,CAAC;QACT,GAAGD,EAAE;QACLE,OAAO,EAAEF,EAAE,CAACE,OAAO;QACnBC,IAAI,EAAEH,EAAE,CAACG,IAAI;QACbC,IAAI,EAAEJ,EAAE,CAACI;MACb,CAAC,CAAC;IACN;EACJ;AACJ,CAAC;AAACC,OAAA,CAAAhB,oCAAA,GAAAA,oCAAA","ignoreList":[]}
1
+ {"version":3,"names":["_","require","restoreOriginalElasticsearchSettings","params","indexSettings","logger","indexes","index","settings","refreshInterval","refresh_interval","esPutIndexSettings","elasticsearchClient","ex","error","message","code","data","exports"],"sources":["restoreOriginalEsSettings.ts"],"sourcesContent":["import { esPutIndexSettings } from \"~/utils\";\nimport { Logger } from \"@webiny/data-migration\";\nimport { Client } from \"@elastic/elasticsearch\";\n\ninterface IndexSettings {\n refresh_interval: `${number}s` | \"-1\";\n}\n\ninterface RestoreOriginalElasticsearchSettingsParams {\n indexSettings: {\n [index: string]: IndexSettings | null;\n };\n logger: Logger;\n elasticsearchClient: Client;\n}\n\nexport const restoreOriginalElasticsearchSettings = async (\n params: RestoreOriginalElasticsearchSettingsParams\n): Promise<void> => {\n const { indexSettings, logger } = params;\n\n const indexes = indexSettings;\n if (!indexes || typeof indexes !== \"object\") {\n return;\n }\n\n for (const index in indexes) {\n const settings = indexes[index];\n if (!settings || typeof settings !== \"object\") {\n continue;\n }\n\n // We must ensure that the refresh interval is not set to a negative value. Why?\n // We've had a case where a migration run has been manually stopped, and the index settings\n // were never restored. Once a second run was started and this restore function\n // was called, the refresh interval was set to `-1s`, which effectively disabled indexing.\n let refreshInterval = settings.refresh_interval || `1s`;\n if (refreshInterval === \"-1\") {\n refreshInterval = \"1s\";\n }\n\n try {\n await esPutIndexSettings({\n elasticsearchClient: params.elasticsearchClient,\n index,\n settings: {\n refresh_interval: refreshInterval\n }\n });\n } catch (ex) {\n logger.error(\n `Failed to restore original settings for index \"${index}\". Please do it manually.`\n );\n logger.error({\n ...ex,\n message: ex.message,\n code: ex.code,\n data: ex.data\n });\n }\n }\n};\n"],"mappings":";;;;;;AAAA,IAAAA,CAAA,GAAAC,OAAA;AAgBO,MAAMC,oCAAoC,GAAG,MAChDC,MAAkD,IAClC;EAChB,MAAM;IAAEC,aAAa;IAAEC;EAAO,CAAC,GAAGF,MAAM;EAExC,MAAMG,OAAO,GAAGF,aAAa;EAC7B,IAAI,CAACE,OAAO,IAAI,OAAOA,OAAO,KAAK,QAAQ,EAAE;IACzC;EACJ;EAEA,KAAK,MAAMC,KAAK,IAAID,OAAO,EAAE;IACzB,MAAME,QAAQ,GAAGF,OAAO,CAACC,KAAK,CAAC;IAC/B,IAAI,CAACC,QAAQ,IAAI,OAAOA,QAAQ,KAAK,QAAQ,EAAE;MAC3C;IACJ;;IAEA;IACA;IACA;IACA;IACA,IAAIC,eAAe,GAAGD,QAAQ,CAACE,gBAAgB,IAAK,IAAG;IACvD,IAAID,eAAe,KAAK,IAAI,EAAE;MAC1BA,eAAe,GAAG,IAAI;IAC1B;IAEA,IAAI;MACA,MAAM,IAAAE,oBAAkB,EAAC;QACrBC,mBAAmB,EAAET,MAAM,CAACS,mBAAmB;QAC/CL,KAAK;QACLC,QAAQ,EAAE;UACNE,gBAAgB,EAAED;QACtB;MACJ,CAAC,CAAC;IACN,CAAC,CAAC,OAAOI,EAAE,EAAE;MACTR,MAAM,CAACS,KAAK,CACP,kDAAiDP,KAAM,2BAC5D,CAAC;MACDF,MAAM,CAACS,KAAK,CAAC;QACT,GAAGD,EAAE;QACLE,OAAO,EAAEF,EAAE,CAACE,OAAO;QACnBC,IAAI,EAAEH,EAAE,CAACG,IAAI;QACbC,IAAI,EAAEJ,EAAE,CAACI;MACb,CAAC,CAAC;IACN;EACJ;AACJ,CAAC;AAACC,OAAA,CAAAhB,oCAAA,GAAAA,oCAAA","ignoreList":[]}