@webiny/api-elasticsearch-tasks 6.3.0 → 6.4.0-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.
- package/abstractions/DbRegistry.js +2 -1
- package/abstractions/DbRegistry.js.map +1 -1
- package/abstractions/OpensearchTenantIndexFactory.js +2 -1
- package/abstractions/OpensearchTenantIndexFactory.js.map +1 -1
- package/abstractions/SynchronizationContext.js +2 -1
- package/abstractions/SynchronizationContext.js.map +1 -1
- package/errors/IndexSettingsGetError.js +10 -9
- package/errors/IndexSettingsGetError.js.map +1 -1
- package/errors/IndexSettingsSetError.js +10 -9
- package/errors/IndexSettingsSetError.js.map +1 -1
- package/errors/IndexingDisableError.js +3 -1
- package/errors/IndexingDisableError.js.map +1 -1
- package/errors/IndexingEnableError.js +3 -1
- package/errors/IndexingEnableError.js.map +1 -1
- package/errors/index.js +0 -2
- package/helpers/getClients.js +9 -10
- package/helpers/getClients.js.map +1 -1
- package/helpers/scan.js +12 -14
- package/helpers/scan.js.map +1 -1
- package/index.js +14 -11
- package/index.js.map +1 -1
- package/package.json +22 -22
- package/settings/DisableIndexing.js +16 -15
- package/settings/DisableIndexing.js.map +1 -1
- package/settings/EnableIndexing.js +16 -15
- package/settings/EnableIndexing.js.map +1 -1
- package/settings/IndexManager.js +67 -79
- package/settings/IndexManager.js.map +1 -1
- package/settings/IndexSettingsManager.js +31 -30
- package/settings/IndexSettingsManager.js.map +1 -1
- package/settings/index.js +0 -2
- package/settings/types.js +0 -3
- package/tasks/Manager.js +23 -24
- package/tasks/Manager.js.map +1 -1
- package/tasks/createIndexes/CreateIndexesTask.js +33 -48
- package/tasks/createIndexes/CreateIndexesTask.js.map +1 -1
- package/tasks/createIndexes/CreateIndexesTaskRunner.js +45 -61
- package/tasks/createIndexes/CreateIndexesTaskRunner.js.map +1 -1
- package/tasks/createIndexes/OnBeforeTrigger.js +28 -41
- package/tasks/createIndexes/OnBeforeTrigger.js.map +1 -1
- package/tasks/createIndexes/createIndex.js +12 -17
- package/tasks/createIndexes/createIndex.js.map +1 -1
- package/tasks/createIndexes/index.js +9 -12
- package/tasks/createIndexes/index.js.map +1 -1
- package/tasks/createIndexes/listIndexes.js +10 -16
- package/tasks/createIndexes/listIndexes.js.map +1 -1
- package/tasks/createIndexes/types.js +0 -3
- package/tasks/dataSynchronization/DataSynchronizationTask.js +52 -64
- package/tasks/dataSynchronization/DataSynchronizationTask.js.map +1 -1
- package/tasks/dataSynchronization/DataSynchronizationTaskRunner.js +31 -39
- package/tasks/dataSynchronization/DataSynchronizationTaskRunner.js.map +1 -1
- package/tasks/dataSynchronization/createFactories.js +4 -7
- package/tasks/dataSynchronization/createFactories.js.map +1 -1
- package/tasks/dataSynchronization/elasticsearch/ElasticsearchFetcher.js +65 -89
- package/tasks/dataSynchronization/elasticsearch/ElasticsearchFetcher.js.map +1 -1
- package/tasks/dataSynchronization/elasticsearch/ElasticsearchSynchronize.js +49 -62
- package/tasks/dataSynchronization/elasticsearch/ElasticsearchSynchronize.js.map +1 -1
- package/tasks/dataSynchronization/elasticsearch/ElasticsearchToDynamoDbSynchronization.js +50 -62
- package/tasks/dataSynchronization/elasticsearch/ElasticsearchToDynamoDbSynchronization.js.map +1 -1
- package/tasks/dataSynchronization/elasticsearch/abstractions/ElasticsearchFetcher.js +0 -3
- package/tasks/dataSynchronization/elasticsearch/abstractions/ElasticsearchSynchronize.js +0 -3
- package/tasks/dataSynchronization/elasticsearch/shouldIgnoreEsResponseError.js +7 -4
- package/tasks/dataSynchronization/elasticsearch/shouldIgnoreEsResponseError.js.map +1 -1
- package/tasks/dataSynchronization/entities/getElasticsearchEntity.js +14 -20
- package/tasks/dataSynchronization/entities/getElasticsearchEntity.js.map +1 -1
- package/tasks/dataSynchronization/entities/getElasticsearchEntityType.js +7 -8
- package/tasks/dataSynchronization/entities/getElasticsearchEntityType.js.map +1 -1
- package/tasks/dataSynchronization/entities/getTable.js +13 -19
- package/tasks/dataSynchronization/entities/getTable.js.map +1 -1
- package/tasks/dataSynchronization/entities/index.js +0 -2
- package/tasks/dataSynchronization/index.js +15 -18
- package/tasks/dataSynchronization/index.js.map +1 -1
- package/tasks/dataSynchronization/types.js +0 -3
- package/tasks/enableIndexing/EnableIndexingTaskRunner.js +27 -35
- package/tasks/enableIndexing/EnableIndexingTaskRunner.js.map +1 -1
- package/tasks/enableIndexing/index.js +23 -33
- package/tasks/enableIndexing/index.js.map +1 -1
- package/tasks/enableIndexing/types.js +0 -3
- package/tasks/index.js +0 -2
- package/tasks/reindexing/ReindexingTaskRunner.js +75 -119
- package/tasks/reindexing/ReindexingTaskRunner.js.map +1 -1
- package/tasks/reindexing/index.js +0 -2
- package/tasks/reindexing/reindexingTaskDefinition.js +25 -40
- package/tasks/reindexing/reindexingTaskDefinition.js.map +1 -1
- package/types.js +0 -3
- package/errors/index.js.map +0 -1
- package/settings/index.js.map +0 -1
- package/settings/types.js.map +0 -1
- package/tasks/createIndexes/types.js.map +0 -1
- package/tasks/dataSynchronization/elasticsearch/abstractions/ElasticsearchFetcher.js.map +0 -1
- package/tasks/dataSynchronization/elasticsearch/abstractions/ElasticsearchSynchronize.js.map +0 -1
- package/tasks/dataSynchronization/entities/index.js.map +0 -1
- package/tasks/dataSynchronization/types.js.map +0 -1
- package/tasks/enableIndexing/types.js.map +0 -1
- package/tasks/index.js.map +0 -1
- package/tasks/reindexing/index.js.map +0 -1
- package/types.js.map +0 -1
|
@@ -1,20 +1,15 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
1
|
+
const createIndexFactory = (manager)=>({
|
|
2
|
+
create: async (index, settings)=>manager.createIndex(index, settings),
|
|
3
|
+
createIfNotExists: async (index, settings)=>{
|
|
4
|
+
try {
|
|
5
|
+
const exists = await manager.indexExists(index);
|
|
6
|
+
if (exists) return;
|
|
7
|
+
} catch {
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
return await manager.createIndex(index, settings);
|
|
11
11
|
}
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
}
|
|
15
|
-
return await manager.createIndex(index, settings);
|
|
16
|
-
}
|
|
17
|
-
};
|
|
18
|
-
};
|
|
12
|
+
});
|
|
13
|
+
export { createIndexFactory };
|
|
19
14
|
|
|
20
15
|
//# sourceMappingURL=createIndex.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"tasks/createIndexes/createIndex.js","sources":["../../../src/tasks/createIndexes/createIndex.ts"],"sourcesContent":["import type { IndexManager } from \"~/settings/index.js\";\n\nexport const createIndexFactory = (manager: IndexManager) => {\n return {\n create: async (index: string, settings?: Record<string, any>): Promise<void> => {\n return manager.createIndex(index, settings);\n },\n createIfNotExists: async (index: string, settings?: Record<string, any>): Promise<void> => {\n try {\n const exists = await manager.indexExists(index);\n if (exists) {\n return;\n }\n } catch {\n return;\n }\n\n return await manager.createIndex(index, settings);\n }\n };\n};\n"],"names":["createIndexFactory","manager","index","settings","exists"],"mappings":"AAEO,MAAMA,qBAAqB,CAACC,UACxB;QACH,QAAQ,OAAOC,OAAeC,WACnBF,QAAQ,WAAW,CAACC,OAAOC;QAEtC,mBAAmB,OAAOD,OAAeC;YACrC,IAAI;gBACA,MAAMC,SAAS,MAAMH,QAAQ,WAAW,CAACC;gBACzC,IAAIE,QACA;YAER,EAAE,OAAM;gBACJ;YACJ;YAEA,OAAO,MAAMH,QAAQ,WAAW,CAACC,OAAOC;QAC5C;IACJ"}
|
|
@@ -5,18 +5,15 @@ import { CreateIndexesTaskDefinition } from "./CreateIndexesTask.js";
|
|
|
5
5
|
import { TenantContext } from "@webiny/api-core/features/tenancy/TenantContext/index.js";
|
|
6
6
|
import { ListTenantsUseCase } from "@webiny/api-core/features/tenancy/ListTenants/index.js";
|
|
7
7
|
import { OpensearchTenantIndexFactory } from "../../abstractions/OpensearchTenantIndexFactory.js";
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
const indexFactories = context.container.resolveAll(OpensearchTenantIndexFactory);
|
|
17
|
-
return new CreateIndexesTaskDefinition(clients.elasticsearchClient, clients.documentClient, tenantContext, listTenantsUseCase, indexFactories);
|
|
8
|
+
const createIndexesTaskDefinition = (params)=>createContextPlugin(async (context)=>{
|
|
9
|
+
const clients = getClients(context, params);
|
|
10
|
+
context.container.registerFactory(TaskDefinition, ()=>{
|
|
11
|
+
const tenantContext = context.container.resolve(TenantContext);
|
|
12
|
+
const listTenantsUseCase = context.container.resolve(ListTenantsUseCase);
|
|
13
|
+
const indexFactories = context.container.resolveAll(OpensearchTenantIndexFactory);
|
|
14
|
+
return new CreateIndexesTaskDefinition(clients.elasticsearchClient, clients.documentClient, tenantContext, listTenantsUseCase, indexFactories);
|
|
15
|
+
});
|
|
18
16
|
});
|
|
19
|
-
|
|
20
|
-
};
|
|
17
|
+
export { createIndexesTaskDefinition };
|
|
21
18
|
|
|
22
19
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"tasks/createIndexes/index.js","sources":["../../../src/tasks/createIndexes/index.ts"],"sourcesContent":["import { TaskDefinition } from \"@webiny/api-core/features/task/TaskDefinition/index.js\";\nimport type { Context, IElasticsearchTaskConfig } from \"~/types.js\";\nimport { createContextPlugin } from \"@webiny/api\";\nimport { getClients } from \"~/helpers/getClients.js\";\nimport { CreateIndexesTaskDefinition } from \"~/tasks/createIndexes/CreateIndexesTask.js\";\nimport { TenantContext } from \"@webiny/api-core/features/tenancy/TenantContext/index.js\";\nimport { ListTenantsUseCase } from \"@webiny/api-core/features/tenancy/ListTenants/index.js\";\nimport { OpensearchTenantIndexFactory } from \"~/abstractions/OpensearchTenantIndexFactory.js\";\n\nexport const createIndexesTaskDefinition = (params?: Partial<IElasticsearchTaskConfig>) => {\n return createContextPlugin<Context>(async context => {\n const clients = getClients(context, params);\n\n // Register the task definition\n context.container.registerFactory(TaskDefinition, () => {\n const tenantContext = context.container.resolve(TenantContext);\n const listTenantsUseCase = context.container.resolve(ListTenantsUseCase);\n const indexFactories = context.container.resolveAll(OpensearchTenantIndexFactory);\n\n return new CreateIndexesTaskDefinition(\n clients.elasticsearchClient,\n clients.documentClient,\n tenantContext,\n listTenantsUseCase,\n indexFactories\n );\n });\n });\n};\n"],"names":["createIndexesTaskDefinition","params","createContextPlugin","context","clients","getClients","TaskDefinition","tenantContext","TenantContext","listTenantsUseCase","ListTenantsUseCase","indexFactories","OpensearchTenantIndexFactory","CreateIndexesTaskDefinition"],"mappings":";;;;;;;AASO,MAAMA,8BAA8B,CAACC,SACjCC,oBAA6B,OAAMC;QACtC,MAAMC,UAAUC,WAAWF,SAASF;QAGpCE,QAAQ,SAAS,CAAC,eAAe,CAACG,gBAAgB;YAC9C,MAAMC,gBAAgBJ,QAAQ,SAAS,CAAC,OAAO,CAACK;YAChD,MAAMC,qBAAqBN,QAAQ,SAAS,CAAC,OAAO,CAACO;YACrD,MAAMC,iBAAiBR,QAAQ,SAAS,CAAC,UAAU,CAACS;YAEpD,OAAO,IAAIC,4BACPT,QAAQ,mBAAmB,EAC3BA,QAAQ,cAAc,EACtBG,eACAE,oBACAE;QAER;IACJ"}
|
|
@@ -1,20 +1,14 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
const results = await factory.getIndexList(tenant);
|
|
9
|
-
for (const result of results) {
|
|
10
|
-
if (indexes.some(i => i.index === result.index)) {
|
|
11
|
-
continue;
|
|
1
|
+
const listIndexes = async (tenantContext, tenants, indexFactories)=>{
|
|
2
|
+
if (0 === indexFactories.length) return [];
|
|
3
|
+
const indexes = [];
|
|
4
|
+
await tenantContext.withEachTenant(tenants, async (tenant)=>{
|
|
5
|
+
for (const factory of indexFactories){
|
|
6
|
+
const results = await factory.getIndexList(tenant);
|
|
7
|
+
for (const result of results)if (!indexes.some((i)=>i.index === result.index)) indexes.push(result);
|
|
12
8
|
}
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
}
|
|
16
|
-
});
|
|
17
|
-
return indexes;
|
|
9
|
+
});
|
|
10
|
+
return indexes;
|
|
18
11
|
};
|
|
12
|
+
export { listIndexes };
|
|
19
13
|
|
|
20
14
|
//# sourceMappingURL=listIndexes.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"tasks/createIndexes/listIndexes.js","sources":["../../../src/tasks/createIndexes/listIndexes.ts"],"sourcesContent":["import { OpensearchTenantIndexFactory } from \"~/abstractions/OpensearchTenantIndexFactory.js\";\nimport type { Tenant } from \"@webiny/api-core/types/tenancy.js\";\nimport { TenantContext } from \"@webiny/api-core/features/tenancy/TenantContext/index.js\";\n\nexport const listIndexes = async (\n tenantContext: TenantContext.Interface,\n tenants: Tenant[],\n indexFactories: OpensearchTenantIndexFactory.Interface[]\n): Promise<OpensearchTenantIndexFactory.IndexConfig[]> => {\n if (indexFactories.length === 0) {\n return [];\n }\n\n const indexes: OpensearchTenantIndexFactory.IndexConfig[] = [];\n await tenantContext.withEachTenant(tenants, async tenant => {\n for (const factory of indexFactories) {\n const results = await factory.getIndexList(tenant);\n for (const result of results) {\n if (indexes.some(i => i.index === result.index)) {\n continue;\n }\n indexes.push(result);\n }\n }\n });\n\n return indexes;\n};\n"],"names":["listIndexes","tenantContext","tenants","indexFactories","indexes","tenant","factory","results","result","i"],"mappings":"AAIO,MAAMA,cAAc,OACvBC,eACAC,SACAC;IAEA,IAAIA,AAA0B,MAA1BA,eAAe,MAAM,EACrB,OAAO,EAAE;IAGb,MAAMC,UAAsD,EAAE;IAC9D,MAAMH,cAAc,cAAc,CAACC,SAAS,OAAMG;QAC9C,KAAK,MAAMC,WAAWH,eAAgB;YAClC,MAAMI,UAAU,MAAMD,QAAQ,YAAY,CAACD;YAC3C,KAAK,MAAMG,UAAUD,QACjB,KAAIH,QAAQ,IAAI,CAACK,CAAAA,IAAKA,EAAE,KAAK,KAAKD,OAAO,KAAK,GAG9CJ,QAAQ,IAAI,CAACI;QAErB;IACJ;IAEA,OAAOJ;AACX"}
|
|
@@ -1,69 +1,57 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
}
|
|
14
|
-
async run({
|
|
15
|
-
input,
|
|
16
|
-
controller
|
|
17
|
-
}) {
|
|
18
|
-
if (controller.runtime.isAborted()) {
|
|
19
|
-
return controller.response.aborted();
|
|
1
|
+
const DATA_SYNCHRONIZATION_TASK = "dataSynchronization";
|
|
2
|
+
class DataSynchronizationTask {
|
|
3
|
+
constructor(elasticsearchClient, documentClient, elasticsearchSynchronize){
|
|
4
|
+
this.elasticsearchClient = elasticsearchClient;
|
|
5
|
+
this.documentClient = documentClient;
|
|
6
|
+
this.elasticsearchSynchronize = elasticsearchSynchronize;
|
|
7
|
+
this.id = DATA_SYNCHRONIZATION_TASK;
|
|
8
|
+
this.title = "Data Synchronization";
|
|
9
|
+
this.description = "Synchronize data between Elasticsearch and DynamoDB";
|
|
10
|
+
this.isPrivate = false;
|
|
11
|
+
this.maxIterations = 100;
|
|
12
|
+
this.databaseLogs = false;
|
|
20
13
|
}
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
14
|
+
async run({ input, controller }) {
|
|
15
|
+
if (controller.runtime.isAborted()) return controller.response.aborted();
|
|
16
|
+
const { Manager } = await import("../Manager.js");
|
|
17
|
+
const { IndexManager } = await import("../../settings/index.js");
|
|
18
|
+
const manager = new Manager({
|
|
19
|
+
elasticsearchClient: this.elasticsearchClient,
|
|
20
|
+
documentClient: this.documentClient,
|
|
21
|
+
controller
|
|
22
|
+
});
|
|
23
|
+
const indexManager = new IndexManager(manager.elasticsearch, {});
|
|
24
|
+
const { DataSynchronizationTaskRunner } = await import("./DataSynchronizationTaskRunner.js");
|
|
25
|
+
const { createFactories } = await import("./createFactories.js");
|
|
26
|
+
try {
|
|
27
|
+
const dataSynchronization = new DataSynchronizationTaskRunner({
|
|
28
|
+
manager,
|
|
29
|
+
indexManager,
|
|
30
|
+
factories: createFactories(),
|
|
31
|
+
elasticsearchSynchronize: this.elasticsearchSynchronize
|
|
32
|
+
});
|
|
33
|
+
return await dataSynchronization.run({
|
|
34
|
+
...input
|
|
35
|
+
});
|
|
36
|
+
} catch (ex) {
|
|
37
|
+
return controller.response.error(ex);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
createInputValidation({ validator }) {
|
|
41
|
+
return {
|
|
42
|
+
flow: validator.enum([
|
|
43
|
+
"elasticsearchToDynamoDb"
|
|
44
|
+
]),
|
|
45
|
+
elasticsearchToDynamoDb: validator.object({
|
|
46
|
+
finished: validator.boolean().optional().default(false),
|
|
47
|
+
index: validator.string().optional(),
|
|
48
|
+
cursor: validator.array(validator.string()).optional()
|
|
49
|
+
}).optional().default({
|
|
50
|
+
finished: false
|
|
51
|
+
})
|
|
52
|
+
};
|
|
51
53
|
}
|
|
52
|
-
}
|
|
53
|
-
createInputValidation({
|
|
54
|
-
validator
|
|
55
|
-
}) {
|
|
56
|
-
return {
|
|
57
|
-
flow: validator.enum(["elasticsearchToDynamoDb"]),
|
|
58
|
-
elasticsearchToDynamoDb: validator.object({
|
|
59
|
-
finished: validator.boolean().optional().default(false),
|
|
60
|
-
index: validator.string().optional(),
|
|
61
|
-
cursor: validator.array(validator.string()).optional()
|
|
62
|
-
}).optional().default({
|
|
63
|
-
finished: false
|
|
64
|
-
})
|
|
65
|
-
};
|
|
66
|
-
}
|
|
67
54
|
}
|
|
55
|
+
export { DATA_SYNCHRONIZATION_TASK, DataSynchronizationTask };
|
|
68
56
|
|
|
69
57
|
//# sourceMappingURL=DataSynchronizationTask.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"tasks/dataSynchronization/DataSynchronizationTask.js","sources":["../../../src/tasks/dataSynchronization/DataSynchronizationTask.ts"],"sourcesContent":["import { TaskDefinition } from \"@webiny/api-core/features/task/TaskDefinition/index.js\";\nimport type { IElasticsearchTaskConfig } from \"~/types.js\";\nimport type {\n IDataSynchronizationInput,\n IDataSynchronizationOutput\n} from \"~/tasks/dataSynchronization/types.js\";\nimport { ElasticsearchSynchronize } from \"~/tasks/dataSynchronization/elasticsearch/ElasticsearchSynchronize.js\";\n\nexport const DATA_SYNCHRONIZATION_TASK = \"dataSynchronization\";\n\nexport class DataSynchronizationTask implements TaskDefinition.Interface<\n IDataSynchronizationInput,\n IDataSynchronizationOutput\n> {\n id = DATA_SYNCHRONIZATION_TASK;\n title = \"Data Synchronization\";\n description = \"Synchronize data between Elasticsearch and DynamoDB\";\n isPrivate = false;\n maxIterations = 100;\n databaseLogs = false;\n\n constructor(\n private elasticsearchClient: IElasticsearchTaskConfig[\"elasticsearchClient\"],\n private documentClient: IElasticsearchTaskConfig[\"documentClient\"],\n private elasticsearchSynchronize: ElasticsearchSynchronize\n ) {}\n\n async run({\n input,\n controller\n }: TaskDefinition.RunParams<IDataSynchronizationInput, IDataSynchronizationOutput>) {\n if (controller.runtime.isAborted()) {\n return controller.response.aborted();\n }\n\n const { Manager } = await import(\n /* webpackChunkName: \"Manager\" */\n \"../Manager.js\"\n );\n\n const { IndexManager } = await import(\n /* webpackChunkName: \"IndexManager\" */ \"~/settings/index.js\"\n );\n\n const manager = new Manager<IDataSynchronizationInput, IDataSynchronizationOutput>({\n elasticsearchClient: this.elasticsearchClient,\n documentClient: this.documentClient,\n controller\n });\n\n const indexManager = new IndexManager(manager.elasticsearch, {});\n\n const { DataSynchronizationTaskRunner } = await import(\n /* webpackChunkName: \"DataSynchronizationTaskRunner\" */ \"./DataSynchronizationTaskRunner.js\"\n );\n\n const { createFactories } = await import(\n /* webpackChunkName: \"createFactories\" */ \"./createFactories.js\"\n );\n\n try {\n const dataSynchronization = new DataSynchronizationTaskRunner({\n manager,\n indexManager,\n factories: createFactories(),\n elasticsearchSynchronize: this.elasticsearchSynchronize\n });\n\n return await dataSynchronization.run({\n ...input\n });\n } catch (ex) {\n return controller.response.error(ex);\n }\n }\n\n createInputValidation({ validator }: TaskDefinition.CreateInputValidationParams) {\n return {\n flow: validator.enum([\"elasticsearchToDynamoDb\"]),\n elasticsearchToDynamoDb: validator\n .object({\n finished: validator.boolean().optional().default(false),\n index: validator.string().optional(),\n cursor: validator.array(validator.string()).optional()\n })\n .optional()\n .default({\n finished: false\n })\n };\n }\n}\n"],"names":["DATA_SYNCHRONIZATION_TASK","DataSynchronizationTask","elasticsearchClient","documentClient","elasticsearchSynchronize","input","controller","Manager","IndexManager","manager","indexManager","DataSynchronizationTaskRunner","createFactories","dataSynchronization","ex","validator"],"mappings":"AAQO,MAAMA,4BAA4B;AAElC,MAAMC;IAWT,YACYC,mBAAoE,EACpEC,cAA0D,EAC1DC,wBAAkD,CAC5D;aAHUF,mBAAmB,GAAnBA;aACAC,cAAc,GAAdA;aACAC,wBAAwB,GAAxBA;aAVZ,EAAE,GAAGJ;aACL,KAAK,GAAG;aACR,WAAW,GAAG;aACd,SAAS,GAAG;aACZ,aAAa,GAAG;aAChB,YAAY,GAAG;IAMZ;IAEH,MAAM,IAAI,EACNK,KAAK,EACLC,UAAU,EACoE,EAAE;QAChF,IAAIA,WAAW,OAAO,CAAC,SAAS,IAC5B,OAAOA,WAAW,QAAQ,CAAC,OAAO;QAGtC,MAAM,EAAEC,OAAO,EAAE,GAAG,MAAM,MAAM,CAAN;QAK1B,MAAM,EAAEC,YAAY,EAAE,GAAG,MAAM,MAAM,CAAN;QAI/B,MAAMC,UAAU,IAAIF,QAA+D;YAC/E,qBAAqB,IAAI,CAAC,mBAAmB;YAC7C,gBAAgB,IAAI,CAAC,cAAc;YACnCD;QACJ;QAEA,MAAMI,eAAe,IAAIF,aAAaC,QAAQ,aAAa,EAAE,CAAC;QAE9D,MAAM,EAAEE,6BAA6B,EAAE,GAAG,MAAM,MAAM,CAAN;QAIhD,MAAM,EAAEC,eAAe,EAAE,GAAG,MAAM,MAAM,CAAN;QAIlC,IAAI;YACA,MAAMC,sBAAsB,IAAIF,8BAA8B;gBAC1DF;gBACAC;gBACA,WAAWE;gBACX,0BAA0B,IAAI,CAAC,wBAAwB;YAC3D;YAEA,OAAO,MAAMC,oBAAoB,GAAG,CAAC;gBACjC,GAAGR,KAAK;YACZ;QACJ,EAAE,OAAOS,IAAI;YACT,OAAOR,WAAW,QAAQ,CAAC,KAAK,CAACQ;QACrC;IACJ;IAEA,sBAAsB,EAAEC,SAAS,EAA8C,EAAE;QAC7E,OAAO;YACH,MAAMA,UAAU,IAAI,CAAC;gBAAC;aAA0B;YAChD,yBAAyBA,UACpB,MAAM,CAAC;gBACJ,UAAUA,UAAU,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;gBACjD,OAAOA,UAAU,MAAM,GAAG,QAAQ;gBAClC,QAAQA,UAAU,KAAK,CAACA,UAAU,MAAM,IAAI,QAAQ;YACxD,GACC,QAAQ,GACR,OAAO,CAAC;gBACL,UAAU;YACd;QACR;IACJ;AACJ"}
|
|
@@ -1,45 +1,37 @@
|
|
|
1
1
|
import { ElasticsearchFetcher } from "./elasticsearch/ElasticsearchFetcher.js";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
}
|
|
9
|
-
async run(input) {
|
|
10
|
-
this.validateFlow(input);
|
|
11
|
-
/**
|
|
12
|
-
* Go through the Elasticsearch and delete records which do not exist in the Elasticsearch table.
|
|
13
|
-
*/
|
|
14
|
-
//
|
|
15
|
-
if (input.flow === "elasticsearchToDynamoDb" && !input.elasticsearchToDynamoDb?.finished) {
|
|
16
|
-
const sync = this.factories.elasticsearchToDynamoDb({
|
|
17
|
-
manager: this.manager,
|
|
18
|
-
indexManager: this.indexManager,
|
|
19
|
-
synchronize: this.elasticsearchSynchronize,
|
|
20
|
-
fetcher: new ElasticsearchFetcher({
|
|
21
|
-
client: this.manager.elasticsearch
|
|
22
|
-
})
|
|
23
|
-
});
|
|
24
|
-
try {
|
|
25
|
-
return await sync.run(input);
|
|
26
|
-
} catch (ex) {
|
|
27
|
-
return this.manager.controller.response.error(ex);
|
|
28
|
-
}
|
|
2
|
+
class DataSynchronizationTaskRunner {
|
|
3
|
+
constructor(params){
|
|
4
|
+
this.manager = params.manager;
|
|
5
|
+
this.indexManager = params.indexManager;
|
|
6
|
+
this.factories = params.factories;
|
|
7
|
+
this.elasticsearchSynchronize = params.elasticsearchSynchronize;
|
|
29
8
|
}
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
9
|
+
async run(input) {
|
|
10
|
+
this.validateFlow(input);
|
|
11
|
+
if ("elasticsearchToDynamoDb" === input.flow && !input.elasticsearchToDynamoDb?.finished) {
|
|
12
|
+
const sync = this.factories.elasticsearchToDynamoDb({
|
|
13
|
+
manager: this.manager,
|
|
14
|
+
indexManager: this.indexManager,
|
|
15
|
+
synchronize: this.elasticsearchSynchronize,
|
|
16
|
+
fetcher: new ElasticsearchFetcher({
|
|
17
|
+
client: this.manager.elasticsearch
|
|
18
|
+
})
|
|
19
|
+
});
|
|
20
|
+
try {
|
|
21
|
+
return await sync.run(input);
|
|
22
|
+
} catch (ex) {
|
|
23
|
+
return this.manager.controller.response.error(ex);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return this.manager.controller.response.done();
|
|
27
|
+
}
|
|
28
|
+
validateFlow(input) {
|
|
29
|
+
if (input.flow) {
|
|
30
|
+
if (this.factories[input.flow]) return;
|
|
31
|
+
} else throw new Error('Missing "flow" in the input.');
|
|
32
|
+
throw new Error(`Invalid flow "${input.flow}". Allowed flows: ${Object.keys(this.factories).join(", ")}.`);
|
|
40
33
|
}
|
|
41
|
-
throw new Error(`Invalid flow "${input.flow}". Allowed flows: ${Object.keys(this.factories).join(", ")}.`);
|
|
42
|
-
}
|
|
43
34
|
}
|
|
35
|
+
export { DataSynchronizationTaskRunner };
|
|
44
36
|
|
|
45
37
|
//# sourceMappingURL=DataSynchronizationTaskRunner.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"tasks/dataSynchronization/DataSynchronizationTaskRunner.js","sources":["../../../src/tasks/dataSynchronization/DataSynchronizationTaskRunner.ts"],"sourcesContent":["import type {\n IDataSynchronizationInput,\n IDataSynchronizationManager,\n IFactories\n} from \"~/tasks/dataSynchronization/types.js\";\nimport type { IIndexManager } from \"~/settings/types.js\";\nimport { ElasticsearchSynchronize } from \"~/tasks/dataSynchronization/elasticsearch/ElasticsearchSynchronize.js\";\nimport { ElasticsearchFetcher } from \"~/tasks/dataSynchronization/elasticsearch/ElasticsearchFetcher.js\";\n\nexport interface IDataSynchronizationTaskRunnerParams {\n manager: IDataSynchronizationManager;\n indexManager: IIndexManager;\n factories: IFactories;\n elasticsearchSynchronize: ElasticsearchSynchronize;\n}\n\nexport class DataSynchronizationTaskRunner {\n private readonly manager: IDataSynchronizationManager;\n private readonly indexManager: IIndexManager;\n private readonly factories: IFactories;\n private readonly elasticsearchSynchronize: ElasticsearchSynchronize;\n\n public constructor(params: IDataSynchronizationTaskRunnerParams) {\n this.manager = params.manager;\n this.indexManager = params.indexManager;\n this.factories = params.factories;\n this.elasticsearchSynchronize = params.elasticsearchSynchronize;\n }\n\n public async run(input: IDataSynchronizationInput) {\n this.validateFlow(input);\n /**\n * Go through the Elasticsearch and delete records which do not exist in the Elasticsearch table.\n */\n //\n if (input.flow === \"elasticsearchToDynamoDb\" && !input.elasticsearchToDynamoDb?.finished) {\n const sync = this.factories.elasticsearchToDynamoDb({\n manager: this.manager,\n indexManager: this.indexManager,\n synchronize: this.elasticsearchSynchronize,\n fetcher: new ElasticsearchFetcher({\n client: this.manager.elasticsearch\n })\n });\n try {\n return await sync.run(input);\n } catch (ex) {\n return this.manager.controller.response.error(ex);\n }\n }\n /**\n * We are done.\n */\n return this.manager.controller.response.done();\n }\n\n private validateFlow(input: IDataSynchronizationInput): void {\n if (!input.flow) {\n throw new Error(`Missing \"flow\" in the input.`);\n } else if (this.factories[input.flow]) {\n return;\n }\n throw new Error(\n `Invalid flow \"${input.flow}\". Allowed flows: ${Object.keys(this.factories).join(\n \", \"\n )}.`\n );\n }\n}\n"],"names":["DataSynchronizationTaskRunner","params","input","sync","ElasticsearchFetcher","ex","Error","Object"],"mappings":";AAgBO,MAAMA;IAMT,YAAmBC,MAA4C,CAAE;QAC7D,IAAI,CAAC,OAAO,GAAGA,OAAO,OAAO;QAC7B,IAAI,CAAC,YAAY,GAAGA,OAAO,YAAY;QACvC,IAAI,CAAC,SAAS,GAAGA,OAAO,SAAS;QACjC,IAAI,CAAC,wBAAwB,GAAGA,OAAO,wBAAwB;IACnE;IAEA,MAAa,IAAIC,KAAgC,EAAE;QAC/C,IAAI,CAAC,YAAY,CAACA;QAKlB,IAAIA,AAAe,8BAAfA,MAAM,IAAI,IAAkC,CAACA,MAAM,uBAAuB,EAAE,UAAU;YACtF,MAAMC,OAAO,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAAC;gBAChD,SAAS,IAAI,CAAC,OAAO;gBACrB,cAAc,IAAI,CAAC,YAAY;gBAC/B,aAAa,IAAI,CAAC,wBAAwB;gBAC1C,SAAS,IAAIC,qBAAqB;oBAC9B,QAAQ,IAAI,CAAC,OAAO,CAAC,aAAa;gBACtC;YACJ;YACA,IAAI;gBACA,OAAO,MAAMD,KAAK,GAAG,CAACD;YAC1B,EAAE,OAAOG,IAAI;gBACT,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAACA;YAClD;QACJ;QAIA,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI;IAChD;IAEQ,aAAaH,KAAgC,EAAQ;QACzD,IAAKA,MAAM,IAAI,EAER;YAAA,IAAI,IAAI,CAAC,SAAS,CAACA,MAAM,IAAI,CAAC,EACjC;QACJ,OAHI,MAAM,IAAII,MAAM;QAIpB,MAAM,IAAIA,MACN,CAAC,cAAc,EAAEJ,MAAM,IAAI,CAAC,kBAAkB,EAAEK,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAC5E,MACF,CAAC,CAAC;IAEZ;AACJ"}
|
|
@@ -1,10 +1,7 @@
|
|
|
1
1
|
import { ElasticsearchToDynamoDbSynchronization } from "./elasticsearch/ElasticsearchToDynamoDbSynchronization.js";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
}
|
|
7
|
-
};
|
|
8
|
-
};
|
|
2
|
+
const createFactories = ()=>({
|
|
3
|
+
elasticsearchToDynamoDb: (params)=>new ElasticsearchToDynamoDbSynchronization(params)
|
|
4
|
+
});
|
|
5
|
+
export { createFactories };
|
|
9
6
|
|
|
10
7
|
//# sourceMappingURL=createFactories.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"tasks/dataSynchronization/createFactories.js","sources":["../../../src/tasks/dataSynchronization/createFactories.ts"],"sourcesContent":["import type { IFactories } from \"./types.js\";\nimport { ElasticsearchToDynamoDbSynchronization } from \"./elasticsearch/ElasticsearchToDynamoDbSynchronization.js\";\n\nexport const createFactories = (): IFactories => {\n return {\n elasticsearchToDynamoDb: params => {\n return new ElasticsearchToDynamoDbSynchronization(params);\n }\n };\n};\n"],"names":["createFactories","params","ElasticsearchToDynamoDbSynchronization"],"mappings":";AAGO,MAAMA,kBAAkB,IACpB;QACH,yBAAyBC,CAAAA,SACd,IAAIC,uCAAuCD;IAE1D"}
|
|
@@ -1,101 +1,77 @@
|
|
|
1
1
|
import { getTotalCount } from "@webiny/api-opensearch/types.js";
|
|
2
2
|
import { shouldIgnoreEsResponseError } from "./shouldIgnoreEsResponseError.js";
|
|
3
3
|
import { inspect } from "node:util";
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
4
|
+
class ElasticsearchFetcher {
|
|
5
|
+
constructor(params){
|
|
6
|
+
this.client = params.client;
|
|
7
|
+
}
|
|
8
|
+
async fetch({ index, cursor, limit }) {
|
|
9
|
+
let response;
|
|
10
|
+
try {
|
|
11
|
+
response = await this.client.search({
|
|
12
|
+
index,
|
|
13
|
+
body: {
|
|
14
|
+
query: {
|
|
15
|
+
match_all: {}
|
|
16
|
+
},
|
|
17
|
+
sort: {
|
|
18
|
+
"id.keyword": {
|
|
19
|
+
order: "asc"
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
size: limit + 1,
|
|
23
|
+
track_total_hits: true,
|
|
24
|
+
search_after: cursor,
|
|
25
|
+
_source: false
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
} catch (ex) {
|
|
29
|
+
if (shouldIgnoreEsResponseError(ex)) {
|
|
30
|
+
if ("true" === process.env.DEBUG) console.error(inspect(ex, {
|
|
31
|
+
depth: 5,
|
|
32
|
+
showHidden: true
|
|
33
|
+
}));
|
|
34
|
+
return {
|
|
35
|
+
done: true,
|
|
36
|
+
totalCount: 0,
|
|
37
|
+
items: []
|
|
38
|
+
};
|
|
24
39
|
}
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
track_total_hits: true,
|
|
28
|
-
search_after: cursor,
|
|
29
|
-
_source: false
|
|
40
|
+
console.error("Failed to fetch data from Elasticsearch.", ex);
|
|
41
|
+
throw ex;
|
|
30
42
|
}
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
43
|
+
const { hits, total } = response.body.hits;
|
|
44
|
+
if (0 === hits.length) return {
|
|
45
|
+
done: true,
|
|
46
|
+
cursor: void 0,
|
|
47
|
+
totalCount: getTotalCount(total),
|
|
48
|
+
items: []
|
|
49
|
+
};
|
|
50
|
+
const hasMoreItems = hits.length > limit;
|
|
51
|
+
let nextCursor;
|
|
52
|
+
if (hasMoreItems) {
|
|
53
|
+
hits.pop();
|
|
54
|
+
nextCursor = hits.at(-1)?.sort;
|
|
42
55
|
}
|
|
56
|
+
const items = hits.reduce((collection, hit)=>{
|
|
57
|
+
const [PK, SK] = hit._id.split(":");
|
|
58
|
+
if (!PK || !SK) return collection;
|
|
59
|
+
collection.push({
|
|
60
|
+
PK,
|
|
61
|
+
SK,
|
|
62
|
+
_id: hit._id,
|
|
63
|
+
index: hit._index
|
|
64
|
+
});
|
|
65
|
+
return collection;
|
|
66
|
+
}, []);
|
|
43
67
|
return {
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
68
|
+
totalCount: getTotalCount(total),
|
|
69
|
+
cursor: nextCursor,
|
|
70
|
+
done: !nextCursor,
|
|
71
|
+
items
|
|
47
72
|
};
|
|
48
|
-
}
|
|
49
|
-
console.error("Failed to fetch data from Elasticsearch.", ex);
|
|
50
|
-
throw ex;
|
|
51
|
-
}
|
|
52
|
-
const {
|
|
53
|
-
hits,
|
|
54
|
-
total
|
|
55
|
-
} = response.body.hits;
|
|
56
|
-
if (hits.length === 0) {
|
|
57
|
-
return {
|
|
58
|
-
done: true,
|
|
59
|
-
cursor: undefined,
|
|
60
|
-
totalCount: getTotalCount(total),
|
|
61
|
-
items: []
|
|
62
|
-
};
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
/**
|
|
66
|
-
* TODO expect errors over hit properties is required due to opensearch library narrowing types too much because of the _source: false. At least what Claude says, didnt go into it too much.
|
|
67
|
-
* Properties are there, but types are not correct.
|
|
68
|
-
*/
|
|
69
|
-
const hasMoreItems = hits.length > limit;
|
|
70
|
-
let nextCursor;
|
|
71
|
-
if (hasMoreItems) {
|
|
72
|
-
hits.pop();
|
|
73
|
-
// @ts-expect-error
|
|
74
|
-
nextCursor = hits.at(-1)?.sort;
|
|
75
73
|
}
|
|
76
|
-
const items = hits.reduce((collection, hit) => {
|
|
77
|
-
// @ts-expect-error
|
|
78
|
-
const [PK, SK] = hit._id.split(":");
|
|
79
|
-
if (!PK || !SK) {
|
|
80
|
-
return collection;
|
|
81
|
-
}
|
|
82
|
-
collection.push({
|
|
83
|
-
PK,
|
|
84
|
-
SK,
|
|
85
|
-
// @ts-expect-error
|
|
86
|
-
_id: hit._id,
|
|
87
|
-
// @ts-expect-error
|
|
88
|
-
index: hit._index
|
|
89
|
-
});
|
|
90
|
-
return collection;
|
|
91
|
-
}, []);
|
|
92
|
-
return {
|
|
93
|
-
totalCount: getTotalCount(total),
|
|
94
|
-
cursor: nextCursor,
|
|
95
|
-
done: !nextCursor,
|
|
96
|
-
items
|
|
97
|
-
};
|
|
98
|
-
}
|
|
99
74
|
}
|
|
75
|
+
export { ElasticsearchFetcher };
|
|
100
76
|
|
|
101
77
|
//# sourceMappingURL=ElasticsearchFetcher.js.map
|