@webiny/api-page-builder-so-ddb-es 5.16.0 → 5.17.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.
@@ -11,7 +11,7 @@ var _error = _interopRequireDefault(require("@webiny/error"));
11
11
 
12
12
  var _default = {
13
13
  db: () => ({
14
- table: process.env.DB_TABLE_PAGE_BUILDER || process.env.DB_TABLE,
14
+ table: process.env.DB_TABLE,
15
15
  keys: [{
16
16
  primary: true,
17
17
  unique: true,
@@ -31,19 +31,21 @@ var _default = {
31
31
  }]
32
32
  }]
33
33
  }),
34
- esDb: () => ({
35
- table: process.env.DB_TABLE_ELASTICSEARCH,
36
- keys: [{
37
- primary: true,
38
- unique: true,
39
- name: "primary",
40
- fields: [{
41
- name: "PK"
42
- }, {
43
- name: "SK"
34
+ esDb: () => {
35
+ return {
36
+ table: process.env.DB_TABLE_ELASTICSEARCH,
37
+ keys: [{
38
+ primary: true,
39
+ unique: true,
40
+ name: "primary",
41
+ fields: [{
42
+ name: "PK"
43
+ }, {
44
+ name: "SK"
45
+ }]
44
46
  }]
45
- }]
46
- }),
47
+ };
48
+ },
47
49
  es: context => {
48
50
  const tenant = context.tenancy.getCurrentTenant();
49
51
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/operations/configurations.ts"],"names":["db","table","process","env","DB_TABLE_PAGE_BUILDER","DB_TABLE","keys","primary","unique","name","fields","esDb","DB_TABLE_ELASTICSEARCH","es","context","tenant","tenancy","getCurrentTenant","WebinyError","sharedIndex","ELASTICSEARCH_SHARED_INDEXES","index","id","prefix","ELASTIC_SEARCH_INDEX_PREFIX"],"mappings":";;;;;;;;;AAAA;;eAGe;AACXA,EAAAA,EAAE,EAAE,OAAO;AACPC,IAAAA,KAAK,EAAEC,OAAO,CAACC,GAAR,CAAYC,qBAAZ,IAAqCF,OAAO,CAACC,GAAR,CAAYE,QADjD;AAEPC,IAAAA,IAAI,EAAE,CACF;AACIC,MAAAA,OAAO,EAAE,IADb;AAEIC,MAAAA,MAAM,EAAE,IAFZ;AAGIC,MAAAA,IAAI,EAAE,SAHV;AAIIC,MAAAA,MAAM,EAAE,CAAC;AAAED,QAAAA,IAAI,EAAE;AAAR,OAAD,EAAiB;AAAEA,QAAAA,IAAI,EAAE;AAAR,OAAjB;AAJZ,KADE,EAOF;AAAED,MAAAA,MAAM,EAAE,IAAV;AAAgBC,MAAAA,IAAI,EAAE,MAAtB;AAA8BC,MAAAA,MAAM,EAAE,CAAC;AAAED,QAAAA,IAAI,EAAE;AAAR,OAAD,EAAsB;AAAEA,QAAAA,IAAI,EAAE;AAAR,OAAtB;AAAtC,KAPE;AAFC,GAAP,CADO;AAaXE,EAAAA,IAAI,EAAE,OAAO;AACTV,IAAAA,KAAK,EAAEC,OAAO,CAACC,GAAR,CAAYS,sBADV;AAETN,IAAAA,IAAI,EAAE,CACF;AACIC,MAAAA,OAAO,EAAE,IADb;AAEIC,MAAAA,MAAM,EAAE,IAFZ;AAGIC,MAAAA,IAAI,EAAE,SAHV;AAIIC,MAAAA,MAAM,EAAE,CAAC;AAAED,QAAAA,IAAI,EAAE;AAAR,OAAD,EAAiB;AAAEA,QAAAA,IAAI,EAAE;AAAR,OAAjB;AAJZ,KADE;AAFG,GAAP,CAbK;AAwBXI,EAAAA,EAAE,EAAGC,OAAD,IAAwB;AACxB,UAAMC,MAAM,GAAGD,OAAO,CAACE,OAAR,CAAgBC,gBAAhB,EAAf;;AACA,QAAI,CAACF,MAAL,EAAa;AACT,YAAM,IAAIG,cAAJ,CAAgB,iBAAhB,EAAmC,gBAAnC,CAAN;AACH;;AAED,UAAMC,WAAW,GAAGjB,OAAO,CAACC,GAAR,CAAYiB,4BAAZ,KAA6C,MAAjE;AACA,UAAMC,KAAK,GAAI,GAAEF,WAAW,GAAG,MAAH,GAAYJ,MAAM,CAACO,EAAG,eAAlD;AAEA,UAAMC,MAAM,GAAGrB,OAAO,CAACC,GAAR,CAAYqB,2BAA3B;;AACA,QAAID,MAAJ,EAAY;AACR,aAAO;AAAEF,QAAAA,KAAK,EAAEE,MAAM,GAAGF;AAAlB,OAAP;AACH;;AACD,WAAO;AAAEA,MAAAA;AAAF,KAAP;AACH;AAtCU,C","sourcesContent":["import WebinyError from \"@webiny/error\";\nimport { PbContext } from \"@webiny/api-page-builder/graphql/types\";\n\nexport default {\n db: () => ({\n table: process.env.DB_TABLE_PAGE_BUILDER || process.env.DB_TABLE,\n keys: [\n {\n primary: true,\n unique: true,\n name: \"primary\",\n fields: [{ name: \"PK\" }, { name: \"SK\" }]\n },\n { unique: true, name: \"GSI1\", fields: [{ name: \"GSI1_PK\" }, { name: \"GSI1_SK\" }] }\n ]\n }),\n esDb: () => ({\n table: process.env.DB_TABLE_ELASTICSEARCH,\n keys: [\n {\n primary: true,\n unique: true,\n name: \"primary\",\n fields: [{ name: \"PK\" }, { name: \"SK\" }]\n }\n ]\n }),\n es: (context: PbContext) => {\n const tenant = context.tenancy.getCurrentTenant();\n if (!tenant) {\n throw new WebinyError(\"Tenant missing.\", \"MISSING_TENANT\");\n }\n\n const sharedIndex = process.env.ELASTICSEARCH_SHARED_INDEXES === \"true\";\n const index = `${sharedIndex ? \"root\" : tenant.id}-page-builder`;\n\n const prefix = process.env.ELASTIC_SEARCH_INDEX_PREFIX;\n if (prefix) {\n return { index: prefix + index };\n }\n return { index };\n }\n};\n"],"file":"configurations.js"}
1
+ {"version":3,"sources":["../../src/operations/configurations.ts"],"names":["db","table","process","env","DB_TABLE","keys","primary","unique","name","fields","esDb","DB_TABLE_ELASTICSEARCH","es","context","tenant","tenancy","getCurrentTenant","WebinyError","sharedIndex","ELASTICSEARCH_SHARED_INDEXES","index","id","prefix","ELASTIC_SEARCH_INDEX_PREFIX"],"mappings":";;;;;;;;;AAAA;;eAGe;AACXA,EAAAA,EAAE,EAAE,OAAO;AACPC,IAAAA,KAAK,EAAEC,OAAO,CAACC,GAAR,CAAYC,QADZ;AAEPC,IAAAA,IAAI,EAAE,CACF;AACIC,MAAAA,OAAO,EAAE,IADb;AAEIC,MAAAA,MAAM,EAAE,IAFZ;AAGIC,MAAAA,IAAI,EAAE,SAHV;AAIIC,MAAAA,MAAM,EAAE,CAAC;AAAED,QAAAA,IAAI,EAAE;AAAR,OAAD,EAAiB;AAAEA,QAAAA,IAAI,EAAE;AAAR,OAAjB;AAJZ,KADE,EAOF;AAAED,MAAAA,MAAM,EAAE,IAAV;AAAgBC,MAAAA,IAAI,EAAE,MAAtB;AAA8BC,MAAAA,MAAM,EAAE,CAAC;AAAED,QAAAA,IAAI,EAAE;AAAR,OAAD,EAAsB;AAAEA,QAAAA,IAAI,EAAE;AAAR,OAAtB;AAAtC,KAPE;AAFC,GAAP,CADO;AAaXE,EAAAA,IAAI,EAAE,MAAM;AACR,WAAO;AACHT,MAAAA,KAAK,EAAEC,OAAO,CAACC,GAAR,CAAYQ,sBADhB;AAEHN,MAAAA,IAAI,EAAE,CACF;AACIC,QAAAA,OAAO,EAAE,IADb;AAEIC,QAAAA,MAAM,EAAE,IAFZ;AAGIC,QAAAA,IAAI,EAAE,SAHV;AAIIC,QAAAA,MAAM,EAAE,CAAC;AAAED,UAAAA,IAAI,EAAE;AAAR,SAAD,EAAiB;AAAEA,UAAAA,IAAI,EAAE;AAAR,SAAjB;AAJZ,OADE;AAFH,KAAP;AAWH,GAzBU;AA0BXI,EAAAA,EAAE,EAAGC,OAAD,IAAwB;AACxB,UAAMC,MAAM,GAAGD,OAAO,CAACE,OAAR,CAAgBC,gBAAhB,EAAf;;AACA,QAAI,CAACF,MAAL,EAAa;AACT,YAAM,IAAIG,cAAJ,CAAgB,iBAAhB,EAAmC,gBAAnC,CAAN;AACH;;AAED,UAAMC,WAAW,GAAGhB,OAAO,CAACC,GAAR,CAAYgB,4BAAZ,KAA6C,MAAjE;AACA,UAAMC,KAAK,GAAI,GAAEF,WAAW,GAAG,MAAH,GAAYJ,MAAM,CAACO,EAAG,eAAlD;AAEA,UAAMC,MAAM,GAAGpB,OAAO,CAACC,GAAR,CAAYoB,2BAA3B;;AACA,QAAID,MAAJ,EAAY;AACR,aAAO;AAAEF,QAAAA,KAAK,EAAEE,MAAM,GAAGF;AAAlB,OAAP;AACH;;AACD,WAAO;AAAEA,MAAAA;AAAF,KAAP;AACH;AAxCU,C","sourcesContent":["import WebinyError from \"@webiny/error\";\nimport { PbContext } from \"@webiny/api-page-builder/graphql/types\";\n\nexport default {\n db: () => ({\n table: process.env.DB_TABLE,\n keys: [\n {\n primary: true,\n unique: true,\n name: \"primary\",\n fields: [{ name: \"PK\" }, { name: \"SK\" }]\n },\n { unique: true, name: \"GSI1\", fields: [{ name: \"GSI1_PK\" }, { name: \"GSI1_SK\" }] }\n ]\n }),\n esDb: () => {\n return {\n table: process.env.DB_TABLE_ELASTICSEARCH,\n keys: [\n {\n primary: true,\n unique: true,\n name: \"primary\",\n fields: [{ name: \"PK\" }, { name: \"SK\" }]\n }\n ]\n };\n },\n es: (context: PbContext) => {\n const tenant = context.tenancy.getCurrentTenant();\n if (!tenant) {\n throw new WebinyError(\"Tenant missing.\", \"MISSING_TENANT\");\n }\n\n const sharedIndex = process.env.ELASTICSEARCH_SHARED_INDEXES === \"true\";\n const index = `${sharedIndex ? \"root\" : tenant.id}-page-builder`;\n\n const prefix = process.env.ELASTIC_SEARCH_INDEX_PREFIX;\n if (prefix) {\n return { index: prefix + index };\n }\n return { index };\n }\n};\n"],"file":"configurations.js"}
@@ -43,6 +43,8 @@ var _get = _interopRequireDefault(require("lodash/get"));
43
43
 
44
44
  var _zeroPaddedVersionNumber = require("@webiny/api-page-builder/utils/zeroPaddedVersionNumber");
45
45
 
46
+ var _get2 = require("@webiny/db-dynamodb/utils/get");
47
+
46
48
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
47
49
 
48
50
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
@@ -329,6 +331,10 @@ class PageStorageOperationsDdbEs {
329
331
  throw new _error.default(ex.message || "Could not batch write all the page records.", ex.code || "BATCH_WRITE_RECORDS_ERROR");
330
332
  }
331
333
 
334
+ if (esItems.length === 0) {
335
+ return [page, previousLatestPage];
336
+ }
337
+
332
338
  try {
333
339
  await (0, _batchWrite.batchWriteAll)({
334
340
  table: this.esTable,
@@ -399,10 +405,17 @@ class PageStorageOperationsDdbEs {
399
405
  const esItems = [this.esEntity.deleteBatch({
400
406
  PK: partitionKey,
401
407
  SK: this.createLatestSortKey()
402
- }), this.esEntity.deleteBatch({
403
- PK: partitionKey,
404
- SK: this.createPublishedSortKey()
405
408
  })];
409
+ /**
410
+ * Delete published record if it is published.
411
+ */
412
+
413
+ if (publishedPathEntryDeleted) {
414
+ esItems.push(this.esEntity.deleteBatch({
415
+ PK: partitionKey,
416
+ SK: this.createPublishedSortKey()
417
+ }));
418
+ }
406
419
 
407
420
  try {
408
421
  await (0, _batchWrite.batchWriteAll)({
@@ -510,12 +523,26 @@ class PageStorageOperationsDdbEs {
510
523
  }));
511
524
  } else {
512
525
  /**
513
- * Delete published record if not visible
526
+ * We need to check if record is in the Elasticsearch table.
514
527
  */
515
- esItems.push(this.esEntity.deleteBatch({
528
+ const keys = {
516
529
  PK: this.createPartitionKey(page.pid),
517
530
  SK: this.createPublishedSortKey()
518
- }));
531
+ };
532
+ const esRecord = await (0, _get2.get)({
533
+ entity: this.esEntity,
534
+ keys
535
+ });
536
+ /**
537
+ * And if it is, delete it.
538
+ */
539
+
540
+ if (esRecord) {
541
+ /**
542
+ * Delete published record if not visible
543
+ */
544
+ esItems.push(this.esEntity.deleteBatch(keys));
545
+ }
519
546
  }
520
547
  /**
521
548
  * Update or insert published path.
@@ -545,6 +572,14 @@ class PageStorageOperationsDdbEs {
545
572
  } catch (ex) {
546
573
  throw new _error.default(ex.message || "Could not update all the page records when publishing.", ex.code || "UPDATE_RECORDS_ERROR");
547
574
  }
575
+ /**
576
+ * No point in continuing if there are no items in Elasticsearch data
577
+ */
578
+
579
+
580
+ if (esItems.length === 0) {
581
+ return page;
582
+ }
548
583
 
549
584
  try {
550
585
  await (0, _batchWrite.batchWriteAll)({
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/operations/pages/PageStorageOperations.ts"],"names":["getElasticsearchClient","context","ctx","elasticsearch","WebinyError","PageStorageOperationsDdbEs","constructor","table","esTable","entity","esEntity","create","params","page","versionKeys","PK","createPartitionKey","id","SK","createSortKey","version","latestKeys","createLatestSortKey","items","putBatch","TYPE","createBasicType","createLatestType","esData","put","index","configurations","es","data","ex","message","code","createFrom","latestPage","original","undefined","update","keys","latestPageResult","get","Item","deleteEsRecord","push","delete","publishedPage","partitionKey","deleteBatch","esItems","createPublishedSortKey","createPathPartitionKey","createPathSortKey","previousLatestPage","previousLatestRecord","options","lt","reverse","deleteAll","queryAllParams","gte","revisions","publishedPathEntryDeleted","revision","status","path","publish","pid","createPublishedPathType","createPublishedType","unpublish","length","requestReview","requestChanges","where","published","includes","Number","split","pop","sortKey","result","list","latest","after","previousCursor","limit","initialLimit","body","plugins","byType","SearchPublishedPagesPlugin","type","SearchLatestPagesPlugin","plugin","modifyQuery","query","args","modifySort","sort","response","esConfig","search","meta","hasMoreItems","totalCount","cursor","hits","total","map","item","_source","value","listRevisions","beginsWith","listTags","tenant","locale","size","aggs","tags","terms","field","include","aggregations","buckets","key","createBasePartitionKey","tenancy","getCurrentTenant","i18nContent","getLocale","shift","input"],"mappings":"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","sourcesContent":["import {\n Page,\n PageStorageOperations,\n PageStorageOperationsCreateFromParams,\n PageStorageOperationsCreateParams,\n PageStorageOperationsDeleteAllParams,\n PageStorageOperationsDeleteParams,\n PageStorageOperationsGetParams,\n PageStorageOperationsListParams,\n PageStorageOperationsListResponse,\n PageStorageOperationsListRevisionsParams,\n PageStorageOperationsListTagsParams,\n PageStorageOperationsPublishParams,\n PageStorageOperationsRequestChangesParams,\n PageStorageOperationsRequestReviewParams,\n PageStorageOperationsUnpublishParams,\n PageStorageOperationsUpdateParams,\n PbContext\n} from \"@webiny/api-page-builder/types\";\nimport { Entity, Table } from \"dynamodb-toolbox\";\nimport { defineTable } from \"~/definitions/table\";\nimport { definePageEntity } from \"~/definitions/pageEntity\";\nimport WebinyError from \"@webiny/error\";\nimport { cleanupItem } from \"@webiny/db-dynamodb/utils/cleanup\";\nimport { Client } from \"@elastic/elasticsearch\";\nimport {\n ElasticsearchBoolQueryConfig,\n ElasticsearchContext\n} from \"@webiny/api-elasticsearch/types\";\nimport configurations from \"~/operations/configurations\";\nimport { encodeCursor } from \"@webiny/api-elasticsearch/cursors\";\nimport { createLimit } from \"@webiny/api-elasticsearch/limit\";\nimport { createElasticsearchQueryBody } from \"./elasticsearchQueryBody\";\nimport { SearchLatestPagesPlugin } from \"~/plugins/definitions/SearchLatestPagesPlugin\";\nimport { SearchPublishedPagesPlugin } from \"~/plugins/definitions/SearchPublishedPagesPlugin\";\nimport { queryAll, QueryAllParams, queryOne } from \"@webiny/db-dynamodb/utils/query\";\nimport { SearchPagesPlugin } from \"~/plugins/definitions/SearchPagesPlugin\";\nimport { defineTableElasticsearch } from \"~/definitions/tableElasticsearch\";\nimport { definePageElasticsearchEntity } from \"~/definitions/pageElasticsearchEntity\";\nimport { batchWriteAll } from \"@webiny/db-dynamodb/utils/batchWrite\";\nimport { getESLatestPageData, getESPublishedPageData } from \"./helpers\";\nimport lodashGet from \"lodash/get\";\nimport { getZeroPaddedVersionNumber } from \"@webiny/api-page-builder/utils/zeroPaddedVersionNumber\";\n\nconst getElasticsearchClient = (context: any): Client => {\n const ctx = context as Partial<ElasticsearchContext>;\n if (!ctx.elasticsearch) {\n throw new WebinyError(\"Missing Elasticsearch client on the context\");\n }\n return ctx.elasticsearch;\n};\n\ninterface Params {\n context: PbContext;\n}\n\ninterface EntityKeys {\n PK: string;\n SK: string;\n}\n\ntype DbRecord<T> = T & { PK: string; SK: string; TYPE: string };\n\nexport class PageStorageOperationsDdbEs implements PageStorageOperations {\n protected readonly context: PbContext;\n protected readonly elasticsearch: Client;\n public readonly table: Table;\n public readonly esTable: Table;\n public readonly entity: Entity<any>;\n public readonly esEntity: Entity<any>;\n\n public constructor({ context }: Params) {\n this.context = context;\n this.table = defineTable({\n context\n });\n\n this.esTable = defineTableElasticsearch({\n context\n });\n\n this.entity = definePageEntity({\n context,\n table: this.table\n });\n\n this.esEntity = definePageElasticsearchEntity({\n context,\n table: this.esTable\n });\n\n this.elasticsearch = getElasticsearchClient(context);\n }\n\n public async create(params: PageStorageOperationsCreateParams): Promise<Page> {\n const { page } = params;\n\n const versionKeys: EntityKeys = {\n PK: this.createPartitionKey(page.id),\n SK: this.createSortKey(page.version)\n };\n const latestKeys: EntityKeys = {\n ...versionKeys,\n SK: this.createLatestSortKey()\n };\n\n const items = [\n this.entity.putBatch({\n ...page,\n ...versionKeys,\n TYPE: this.createBasicType()\n }),\n this.entity.putBatch({\n ...page,\n ...latestKeys,\n TYPE: this.createLatestType()\n })\n ];\n const esData = getESLatestPageData(this.context, page);\n try {\n await batchWriteAll({\n table: this.table,\n items: items\n });\n await this.esEntity.put({\n index: configurations.es(this.context).index,\n data: esData,\n ...latestKeys\n });\n return page;\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not create new page.\",\n ex.code || \"CREATE_PAGE_ERROR\",\n {\n versionKeys,\n latestKeys,\n page\n }\n );\n }\n }\n\n public async createFrom(params: PageStorageOperationsCreateFromParams): Promise<Page> {\n const { page, latestPage, original } = params;\n\n const versionKeys: EntityKeys = {\n PK: this.createPartitionKey(page.id),\n SK: this.createSortKey(page.version)\n };\n const latestKeys: EntityKeys = {\n ...versionKeys,\n SK: this.createLatestSortKey()\n };\n\n const items = [\n this.entity.putBatch({\n ...page,\n TYPE: this.createBasicType(),\n ...versionKeys\n }),\n this.entity.putBatch({\n ...page,\n TYPE: this.createLatestType(),\n ...latestKeys\n })\n ];\n /**\n * Specifically for the Elasticsearch.\n * If visibility on the latest list is not false, push it into the ES.\n */\n let esData: any = undefined;\n if (lodashGet(page, \"visibility.list.latest\") !== false) {\n esData = getESLatestPageData(this.context, page);\n }\n\n try {\n await batchWriteAll({\n table: this.table,\n items\n });\n if (esData) {\n await this.esEntity.put({\n index: configurations.es(this.context).index,\n data: esData,\n ...latestKeys\n });\n }\n return page;\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not create new page from existing page.\",\n ex.code || \"CREATE_PAGE_FROM_ERROR\",\n {\n versionKeys,\n latestKeys,\n latestPage,\n original,\n page\n }\n );\n }\n }\n\n public async update(params: PageStorageOperationsUpdateParams): Promise<Page> {\n const { original, page } = params;\n\n const keys: EntityKeys = {\n PK: this.createPartitionKey(page.id),\n SK: this.createSortKey(page.version)\n };\n\n const latestKeys: EntityKeys = {\n ...keys,\n SK: this.createLatestSortKey()\n };\n const latestPageResult = await this.entity.get(latestKeys);\n const latestPage = cleanupItem(\n this.entity,\n latestPageResult ? latestPageResult.Item : null\n );\n\n const items = [\n this.entity.putBatch({\n ...page,\n TYPE: this.createBasicType(),\n ...keys\n })\n ];\n /**\n * In the case the latest page is the page we are currently updating\n * check for the visibility in the list.\n * If visibility is set to false - delete the record\n * Otherwise update it.\n */\n let esData: Record<string, any> = undefined;\n let deleteEsRecord = false;\n if (latestPage && latestPage.id === page.id) {\n if (lodashGet(page, \"visibility.list.latest\") === false) {\n deleteEsRecord = true;\n } else {\n esData = getESLatestPageData(this.context, page);\n }\n /**\n * We also update the regular record.\n */\n items.push(\n this.entity.putBatch({\n ...page,\n TYPE: this.createLatestType(),\n ...latestKeys\n })\n );\n }\n /**\n * Unfortunately we cannot push regular and es record in the batch write because they are two separate tables.\n */\n try {\n await batchWriteAll({\n table: this.table,\n items\n });\n\n if (deleteEsRecord) {\n await this.esEntity.delete({\n ...latestKeys\n });\n } else if (esData) {\n await this.esEntity.put({\n index: configurations.es(this.context).index,\n data: esData,\n ...latestKeys\n });\n }\n\n return page;\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not update existing page.\",\n ex.code || \"UPDATE_PAGE_ERROR\",\n {\n original,\n page,\n latestPage,\n latestKeys,\n keys\n }\n );\n }\n }\n /**\n * In case of delete, we must delete records:\n * - revision\n * - path if published\n * Update:\n * - latest\n */\n public async delete(params: PageStorageOperationsDeleteParams): Promise<[Page, Page | null]> {\n const { page, latestPage, publishedPage } = params;\n\n const partitionKey = this.createPartitionKey(page.id);\n\n const items = [\n this.entity.deleteBatch({\n PK: partitionKey,\n SK: this.createSortKey(page.version)\n })\n ];\n const esItems = [];\n if (publishedPage && publishedPage.id === page.id) {\n items.push(\n this.entity.deleteBatch({\n PK: partitionKey,\n SK: this.createPublishedSortKey()\n })\n );\n items.push(\n this.entity.deleteBatch({\n PK: this.createPathPartitionKey(),\n SK: this.createPathSortKey(page)\n })\n );\n esItems.push(\n this.esEntity.deleteBatch({\n PK: partitionKey,\n SK: this.createPublishedSortKey()\n })\n );\n }\n let previousLatestPage: Page = null;\n if (latestPage && latestPage.id === page.id) {\n const previousLatestRecord = await queryOne<DbRecord<Page>>({\n entity: this.entity,\n partitionKey,\n options: {\n lt: this.createSortKey(latestPage.version),\n reverse: true\n }\n });\n if (previousLatestRecord) {\n items.push(\n this.entity.putBatch({\n ...previousLatestRecord,\n TYPE: this.createLatestType(),\n PK: partitionKey,\n SK: this.createLatestSortKey()\n })\n );\n esItems.push(\n this.esEntity.putBatch({\n PK: partitionKey,\n SK: this.createLatestSortKey(),\n index: configurations.es(this.context).index,\n data: getESLatestPageData(this.context, previousLatestRecord)\n })\n );\n previousLatestPage = cleanupItem(this.entity, previousLatestRecord);\n }\n }\n try {\n await batchWriteAll({\n table: this.table,\n items\n });\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not batch write all the page records.\",\n ex.code || \"BATCH_WRITE_RECORDS_ERROR\"\n );\n }\n try {\n await batchWriteAll({\n table: this.esTable,\n items: esItems\n });\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not batch write all the page Elasticsearch records.\",\n ex.code || \"BATCH_WWRITE_ELASTICSEARCH_RECORDS_ERROR\"\n );\n }\n return [page, previousLatestPage];\n }\n /**\n * In case of deleteAll, we must delete records:\n * - latest\n * - published\n * - path if published\n * - revision\n * - es latest\n * - es published\n */\n public async deleteAll(params: PageStorageOperationsDeleteAllParams): Promise<[Page]> {\n const { page } = params;\n\n const partitionKey = this.createPartitionKey(page.id);\n const queryAllParams = {\n entity: this.entity,\n partitionKey,\n options: {\n gte: \" \"\n }\n };\n let revisions: DbRecord<Page>[];\n try {\n revisions = await queryAll(queryAllParams);\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not query for all revisions of the page.\",\n ex.code || \"LIST_REVISIONS_ERROR\",\n {\n params: queryAllParams\n }\n );\n }\n\n /**\n * We need to go through all possible entries and delete them.\n * Also, delete the published entry path record.\n */\n const items = [];\n let publishedPathEntryDeleted = false;\n for (const revision of revisions) {\n if (revision.status === \"published\" && !publishedPathEntryDeleted) {\n publishedPathEntryDeleted = true;\n items.push(\n this.entity.deleteBatch({\n PK: this.createPathPartitionKey(),\n SK: revision.path\n })\n );\n }\n items.push(\n this.entity.deleteBatch({\n PK: revision.PK,\n SK: revision.SK\n })\n );\n }\n const esItems = [\n this.esEntity.deleteBatch({\n PK: partitionKey,\n SK: this.createLatestSortKey()\n }),\n this.esEntity.deleteBatch({\n PK: partitionKey,\n SK: this.createPublishedSortKey()\n })\n ];\n\n try {\n await batchWriteAll({\n table: this.table,\n items\n });\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not delete all the page records.\",\n ex.code || \"DELETE_RECORDS_ERROR\"\n );\n }\n try {\n await batchWriteAll({\n table: this.esTable,\n items: esItems\n });\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not delete all the page Elasticsearch records.\",\n ex.code || \"DELETE_ELASTICSEARCH_RECORDS_ERROR\"\n );\n }\n return [page];\n }\n /**\n * When publishing a page, we need to:\n * - update that page record\n * - update latest record if we are publishing latest one\n * - update published record\n * - update publish path to a new one\n */\n public async publish(params: PageStorageOperationsPublishParams): Promise<Page> {\n const { page, latestPage, publishedPage } = params;\n\n /**\n * Update the given revision of the page.\n */\n const items = [\n this.entity.putBatch({\n ...page,\n TYPE: this.createBasicType(),\n PK: this.createPartitionKey(page.pid),\n SK: this.createSortKey(page.version)\n })\n ];\n const esItems = [];\n /**\n * If we are publishing the latest revision, let's also update the latest revision entry's\n * status in ES. Also, if we are publishing the latest revision and the \"LATEST page lists\n * visibility\" is not false, then we need to update the latest page revision entry in ES.\n */\n if (latestPage.id === page.id) {\n items.push(\n this.entity.putBatch({\n ...page,\n TYPE: this.createLatestType(),\n PK: this.createPartitionKey(page.pid),\n SK: this.createLatestSortKey()\n })\n );\n if (lodashGet(page, \"visibility.list.latest\") !== false) {\n esItems.push(\n this.esEntity.putBatch({\n PK: this.createPartitionKey(page.pid),\n SK: this.createLatestSortKey(),\n index: configurations.es(this.context).index,\n data: getESLatestPageData(this.context, page)\n })\n );\n }\n }\n /**\n * If we have already published revision of this page:\n * - set existing published page revision to unpublished\n * - remove old published path if paths are different\n */\n if (publishedPage) {\n items.push(\n this.entity.putBatch({\n ...publishedPage,\n status: \"unpublished\",\n PK: this.createPartitionKey(publishedPage.pid),\n SK: this.createSortKey(publishedPage.version)\n })\n );\n /**\n * Remove old published path if required.\n */\n if (publishedPage.path !== page.path) {\n items.push(\n this.entity.deleteBatch({\n PK: this.createPathPartitionKey(),\n SK: publishedPage.path\n })\n );\n }\n }\n /**\n * If we need to display the published page in the list.\n * Check only if it's not false, because only that should stop the propagation.\n */\n if (lodashGet(page, \"visibility.list.published\") !== false) {\n esItems.push(\n this.esEntity.putBatch({\n PK: this.createPartitionKey(page.pid),\n SK: this.createPublishedSortKey(),\n index: configurations.es(this.context).index,\n data: getESPublishedPageData(this.context, page)\n })\n );\n } else {\n /**\n * Delete published record if not visible\n */\n esItems.push(\n this.esEntity.deleteBatch({\n PK: this.createPartitionKey(page.pid),\n SK: this.createPublishedSortKey()\n })\n );\n }\n /**\n * Update or insert published path.\n */\n items.push(\n this.entity.putBatch({\n ...page,\n TYPE: this.createPublishedPathType(),\n PK: this.createPathPartitionKey(),\n SK: this.createPathSortKey(page)\n })\n );\n /**\n * Update or insert published page.\n */\n items.push(\n this.entity.putBatch({\n ...page,\n TYPE: this.createPublishedType(),\n PK: this.createPartitionKey(page.pid),\n SK: this.createPublishedSortKey()\n })\n );\n\n try {\n await batchWriteAll({\n table: this.table,\n items\n });\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not update all the page records when publishing.\",\n ex.code || \"UPDATE_RECORDS_ERROR\"\n );\n }\n try {\n await batchWriteAll({\n table: this.esTable,\n items: esItems\n });\n } catch (ex) {\n throw new WebinyError(\n ex.message ||\n \"Could not update all the page Elasticsearch records when publishing.\",\n ex.code || \"UPDATE_ELASTICSEARCH_RECORDS_ERROR\"\n );\n }\n return page;\n }\n\n public async unpublish(params: PageStorageOperationsUnpublishParams): Promise<Page> {\n const { page, latestPage } = params;\n\n const items = [\n this.entity.deleteBatch({\n PK: this.createPartitionKey(page.pid),\n SK: this.createPublishedSortKey()\n }),\n this.entity.deleteBatch({\n PK: this.createPathPartitionKey(),\n SK: this.createPathSortKey(page)\n }),\n this.entity.putBatch({\n ...page,\n TYPE: this.createBasicType(),\n PK: this.createPartitionKey(page.pid),\n SK: this.createSortKey(page.version)\n })\n ];\n const esItems = [];\n /*\n * If we are unpublishing the latest revision, let's also update the latest revision entry's\n * status in ES. We can only do that if the entry actually exists, or in other words, if the\n * published page's \"LATEST pages lists visibility\" setting is not set to false.\n */\n if (latestPage.id === page.id && lodashGet(page, \"visibility.list.latest\") !== false) {\n items.push(\n this.entity.putBatch({\n ...page,\n TYPE: this.createLatestType(),\n PK: this.createPartitionKey(page.pid),\n SK: this.createLatestSortKey()\n })\n );\n esItems.push(\n this.esEntity.putBatch({\n PK: this.createPartitionKey(page.pid),\n SK: this.createLatestSortKey(),\n index: configurations.es(this.context).index,\n data: getESLatestPageData(this.context, page)\n })\n );\n }\n if (lodashGet(page, \"visibility.list.published\") !== false) {\n esItems.push(\n this.esEntity.deleteBatch({\n PK: this.createPartitionKey(page.pid),\n SK: this.createPublishedSortKey()\n })\n );\n }\n\n try {\n await batchWriteAll({\n table: this.table,\n items\n });\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not update all the page records when unpublishing.\",\n ex.code || \"UPDATE_RECORDS_ERROR\"\n );\n }\n /**\n * No need to go further if no Elasticsearch items to be applied.\n */\n if (esItems.length === 0) {\n return page;\n }\n try {\n await batchWriteAll({\n table: this.esTable,\n items: esItems\n });\n } catch (ex) {\n throw new WebinyError(\n ex.message ||\n \"Could not update all the page Elasticsearch records when unpublishing.\",\n ex.code || \"UPDATE_ELASTICSEARCH_RECORDS_ERROR\"\n );\n }\n return page;\n }\n /**\n * We need to update:\n * - regular record\n * - latest record if page is the latest one\n * - ES latest record if page is the latest one\n */\n public async requestReview(params: PageStorageOperationsRequestReviewParams): Promise<Page> {\n const { original, page, latestPage } = params;\n\n const items = [\n this.entity.putBatch({\n ...page,\n TYPE: this.createBasicType(),\n PK: this.createPartitionKey(page.pid),\n SK: this.createSortKey(page.version)\n })\n ];\n let esData = undefined;\n if (latestPage.id === page.id && lodashGet(page, \"visibility.list.latest\") !== false) {\n items.push(\n this.entity.putBatch({\n ...page,\n TYPE: this.createLatestType(),\n PK: this.createPartitionKey(page.pid),\n SK: this.createLatestSortKey()\n })\n );\n esData = getESLatestPageData(this.context, page);\n }\n try {\n await batchWriteAll({\n table: this.table,\n items\n });\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not request review on page record.\",\n ex.code || \"REQUEST_REVIEW_ERROR\",\n {\n original,\n page,\n latestPage\n }\n );\n }\n /**\n * Just return if we do not need to update the Elasticsearch.\n */\n if (!esData) {\n return page;\n }\n\n try {\n await this.esEntity.put({\n PK: this.createPartitionKey(page.pid),\n SK: this.createLatestSortKey(),\n index: configurations.es(this.context).index,\n data: esData\n });\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not request review on page Elasticsearch record.\",\n ex.code || \"REQUEST_REVIEW_ES_ERROR\",\n {\n original,\n page,\n latestPage\n }\n );\n }\n\n return page;\n }\n\n public async requestChanges(params: PageStorageOperationsRequestChangesParams): Promise<Page> {\n const { original, page, latestPage } = params;\n\n const items = [\n this.entity.putBatch({\n ...page,\n TYPE: this.createBasicType(),\n PK: this.createPartitionKey(page.pid),\n SK: this.createSortKey(page.version)\n })\n ];\n let esData = undefined;\n if (latestPage.id === page.id && lodashGet(page, \"visibility.list.latest\") !== false) {\n items.push(\n this.entity.putBatch({\n ...page,\n TYPE: this.createLatestType(),\n PK: this.createPartitionKey(page.pid),\n SK: this.createLatestSortKey()\n })\n );\n esData = getESLatestPageData(this.context, page);\n }\n\n try {\n await batchWriteAll({\n table: this.table,\n items\n });\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not request changes on page record.\",\n ex.code || \"REQUEST_CHANGES_ERROR\",\n {\n original,\n page,\n latestPage\n }\n );\n }\n /**\n * Just return if we do not need to update the Elasticsearch.\n */\n if (!esData) {\n return page;\n }\n\n try {\n await this.esEntity.put({\n PK: this.createPartitionKey(page.pid),\n SK: this.createLatestSortKey(),\n index: configurations.es(this.context).index,\n data: esData\n });\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not request changes on page Elasticsearch record.\",\n ex.code || \"REQUEST_CHANGES_ES_ERROR\",\n {\n original,\n page,\n latestPage\n }\n );\n }\n\n return page;\n }\n\n /**\n * There are only few options to use when getting the page.\n * For that reason we try to have it as simple as possible when querying.\n */\n public async get(params: PageStorageOperationsGetParams): Promise<Page | null> {\n const { where } = params;\n const { pid, id, path, published } = where;\n let { version } = where;\n /**\n * In case of having full ID and not having version we can take the version from the id.\n */\n if (id && id.includes(\"#\") && !version) {\n version = Number(id.split(\"#\").pop());\n }\n let partitionKey: string = undefined;\n let sortKey: string;\n if (path) {\n partitionKey = this.createPathPartitionKey();\n sortKey = path;\n } else if (published) {\n sortKey = this.createPublishedSortKey();\n } else if (version) {\n sortKey = this.createSortKey(version);\n } else {\n sortKey = this.createLatestSortKey();\n }\n /**\n * If partition key is still undefined, create one with id or pid\n */\n if (!partitionKey) {\n partitionKey = this.createPartitionKey(pid || id);\n }\n const keys: EntityKeys = {\n PK: partitionKey,\n SK: sortKey\n };\n try {\n const result = await this.entity.get(keys);\n if (!result || !result.Item) {\n return null;\n }\n return cleanupItem(this.entity, result.Item);\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not load page by given params.\",\n ex.code || \"GET_PAGE_ERROR\",\n {\n where,\n keys\n }\n );\n }\n }\n\n public async list(\n params: PageStorageOperationsListParams\n ): Promise<PageStorageOperationsListResponse> {\n /**\n * We do not allow loading both published and latest at the same time.\n * @see PageStorageOperationsListWhere\n */\n if (params.where.published && params.where.latest) {\n throw new WebinyError(\n \"Both published and latest cannot be defined at the same time.\",\n \"MALFORMED_WHERE_ERROR\",\n {\n where: params.where\n }\n );\n }\n\n const { after: previousCursor, limit: initialLimit } = params;\n\n const limit = createLimit(initialLimit, 50);\n const body = createElasticsearchQueryBody({\n ...params,\n where: {\n ...params.where\n },\n limit,\n after: previousCursor,\n context: this.context\n });\n\n let plugins: SearchPagesPlugin[] = [];\n if (params.where.published) {\n plugins = this.context.plugins.byType<SearchPublishedPagesPlugin>(\n SearchPublishedPagesPlugin.type\n );\n } else if (params.where.latest) {\n plugins = this.context.plugins.byType<SearchLatestPagesPlugin>(\n SearchLatestPagesPlugin.type\n );\n } else {\n throw new WebinyError(\n \"Only published or latest can be listed. Missing where condition.\",\n \"MALFORMED_WHERE_ERROR\",\n {\n where: params.where\n }\n );\n }\n\n for (const plugin of plugins) {\n /**\n * Apply query modifications\n */\n plugin.modifyQuery({\n query: body.query as unknown as ElasticsearchBoolQueryConfig,\n args: params,\n context: this.context\n });\n\n /**\n * Apply sort modifications\n */\n plugin.modifySort({\n sort: body.sort,\n args: params,\n context: this.context\n });\n }\n\n let response;\n const esConfig = configurations.es(this.context);\n try {\n response = await this.elasticsearch.search({\n ...esConfig,\n body\n });\n } catch (ex) {\n /**\n * Do not throw the error if Elasticsearch index does not exist.\n * In some CRUDs we try to get list of pages but index was not created yet.\n */\n if (ex.message === \"index_not_found_exception\") {\n return {\n items: [],\n meta: {\n hasMoreItems: false,\n totalCount: 0,\n cursor: null\n }\n };\n }\n throw new WebinyError(\n ex.message || \"Could not load pages by given Elasticsearch body.\",\n ex.code || \"LIST_PAGES_ERROR\",\n {\n body\n }\n );\n }\n const { hits, total } = response.body.hits;\n const items = hits.map(item => item._source);\n\n const hasMoreItems = items.length > limit;\n if (hasMoreItems) {\n /**\n * Remove the last item from results, we don't want to include it.\n */\n items.pop();\n }\n /**\n * Cursor is the `sort` value of the last item in the array.\n * https://www.elastic.co/guide/en/elasticsearch/reference/current/paginate-search-results.html#search-after\n */\n const cursor =\n items.length > 0 && hasMoreItems ? encodeCursor(hits[items.length - 1].sort) : null;\n return {\n items,\n meta: {\n hasMoreItems,\n totalCount: total.value,\n cursor\n }\n };\n }\n /**\n * Listing of the revisions will be done through the DynamoDB since there are no revisions saved in the Elasticsearch.\n */\n public async listRevisions(params: PageStorageOperationsListRevisionsParams): Promise<Page[]> {\n const queryAllParams: QueryAllParams = {\n entity: this.entity,\n partitionKey: this.createPartitionKey(params.where.pid),\n options: {\n beginsWith: \"REV#\",\n reverse: false\n }\n };\n\n try {\n return await queryAll(queryAllParams);\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not load all the revisions from requested page.\",\n ex.code || \"LOAD_PAGE_REVISIONS_ERROR\",\n {\n params\n }\n );\n }\n }\n\n public async listTags(params: PageStorageOperationsListTagsParams): Promise<string[]> {\n const { where } = params;\n\n const tenant: string = where.tenant;\n const body = createElasticsearchQueryBody({\n ...params,\n where: {\n locale: where.locale,\n search: undefined,\n tenant\n },\n sort: [],\n limit: 100000,\n context: this.context\n });\n\n const esConfig = configurations.es(this.context);\n\n try {\n const response = await this.elasticsearch.search({\n ...esConfig,\n body: {\n ...body,\n sort: undefined,\n limit: undefined,\n size: 0,\n aggs: {\n tags: {\n terms: {\n field: \"tags.keyword\",\n include: `.*${where.search}.*`,\n size: 10\n }\n }\n }\n }\n });\n return response.body.aggregations.tags.buckets.map(item => item.key);\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not list tags by given parameters.\",\n ex.code || \"LIST_TAGS_ERROR\",\n {\n body,\n where\n }\n );\n }\n }\n /**\n * Used in multiple partition keys.\n */\n protected createBasePartitionKey(): string {\n const tenant = this.context.tenancy.getCurrentTenant().id;\n const locale = this.context.i18nContent.getLocale().code;\n return `T#${tenant}#L#${locale}#PB#`;\n }\n\n protected createPartitionKey(id: string): string {\n if (id.includes(\"#\")) {\n id = id.split(\"#\").shift();\n }\n return `${this.createBasePartitionKey()}P#${id}`;\n }\n\n protected createPathPartitionKey(): string {\n return `${this.createBasePartitionKey()}PATH`;\n }\n\n protected createSortKey(version: string | number): string {\n if (typeof version !== \"number\") {\n if (version.includes(\"#\")) {\n version = Number(version.split(\"#\").pop());\n }\n }\n return `REV#${getZeroPaddedVersionNumber(version)}`;\n }\n\n protected createPathSortKey(input: Pick<Page, \"path\"> | string): string {\n if (typeof input === \"string\") {\n return input;\n } else if (input.path) {\n return input.path;\n }\n throw new WebinyError(\n \"Could not determine the page path sort key from the input.\",\n \"MALFORMED_SORT_KEY\",\n {\n input\n }\n );\n }\n\n protected createPublishedSortKey(): string {\n return \"P\";\n }\n\n protected createLatestSortKey(): string {\n return \"L\";\n }\n\n protected createBasicType(): string {\n return \"pb.page\";\n }\n\n protected createLatestType(): string {\n return \"pb.page.l\";\n }\n\n protected createPublishedType(): string {\n return \"pb.page.p\";\n }\n\n protected createPublishedPathType(): string {\n return \"pb.page.p.path\";\n }\n}\n"],"file":"PageStorageOperations.js"}
1
+ {"version":3,"sources":["../../../src/operations/pages/PageStorageOperations.ts"],"names":["getElasticsearchClient","context","ctx","elasticsearch","WebinyError","PageStorageOperationsDdbEs","constructor","table","esTable","entity","esEntity","create","params","page","versionKeys","PK","createPartitionKey","id","SK","createSortKey","version","latestKeys","createLatestSortKey","items","putBatch","TYPE","createBasicType","createLatestType","esData","put","index","configurations","es","data","ex","message","code","createFrom","latestPage","original","undefined","update","keys","latestPageResult","get","Item","deleteEsRecord","push","delete","publishedPage","partitionKey","deleteBatch","esItems","createPublishedSortKey","createPathPartitionKey","createPathSortKey","previousLatestPage","previousLatestRecord","options","lt","reverse","length","deleteAll","queryAllParams","gte","revisions","publishedPathEntryDeleted","revision","status","path","publish","pid","esRecord","createPublishedPathType","createPublishedType","unpublish","requestReview","requestChanges","where","published","includes","Number","split","pop","sortKey","result","list","latest","after","previousCursor","limit","initialLimit","body","plugins","byType","SearchPublishedPagesPlugin","type","SearchLatestPagesPlugin","plugin","modifyQuery","query","args","modifySort","sort","response","esConfig","search","meta","hasMoreItems","totalCount","cursor","hits","total","map","item","_source","value","listRevisions","beginsWith","listTags","tenant","locale","size","aggs","tags","terms","field","include","aggregations","buckets","key","createBasePartitionKey","tenancy","getCurrentTenant","i18nContent","getLocale","shift","input"],"mappings":"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","sourcesContent":["import {\n Page,\n PageStorageOperations,\n PageStorageOperationsCreateFromParams,\n PageStorageOperationsCreateParams,\n PageStorageOperationsDeleteAllParams,\n PageStorageOperationsDeleteParams,\n PageStorageOperationsGetParams,\n PageStorageOperationsListParams,\n PageStorageOperationsListResponse,\n PageStorageOperationsListRevisionsParams,\n PageStorageOperationsListTagsParams,\n PageStorageOperationsPublishParams,\n PageStorageOperationsRequestChangesParams,\n PageStorageOperationsRequestReviewParams,\n PageStorageOperationsUnpublishParams,\n PageStorageOperationsUpdateParams,\n PbContext\n} from \"@webiny/api-page-builder/types\";\nimport { Entity, Table } from \"dynamodb-toolbox\";\nimport { defineTable } from \"~/definitions/table\";\nimport { definePageEntity } from \"~/definitions/pageEntity\";\nimport WebinyError from \"@webiny/error\";\nimport { cleanupItem } from \"@webiny/db-dynamodb/utils/cleanup\";\nimport { Client } from \"@elastic/elasticsearch\";\nimport {\n ElasticsearchBoolQueryConfig,\n ElasticsearchContext\n} from \"@webiny/api-elasticsearch/types\";\nimport configurations from \"~/operations/configurations\";\nimport { encodeCursor } from \"@webiny/api-elasticsearch/cursors\";\nimport { createLimit } from \"@webiny/api-elasticsearch/limit\";\nimport { createElasticsearchQueryBody } from \"./elasticsearchQueryBody\";\nimport { SearchLatestPagesPlugin } from \"~/plugins/definitions/SearchLatestPagesPlugin\";\nimport { SearchPublishedPagesPlugin } from \"~/plugins/definitions/SearchPublishedPagesPlugin\";\nimport { queryAll, QueryAllParams, queryOne } from \"@webiny/db-dynamodb/utils/query\";\nimport { SearchPagesPlugin } from \"~/plugins/definitions/SearchPagesPlugin\";\nimport { defineTableElasticsearch } from \"~/definitions/tableElasticsearch\";\nimport { definePageElasticsearchEntity } from \"~/definitions/pageElasticsearchEntity\";\nimport { batchWriteAll } from \"@webiny/db-dynamodb/utils/batchWrite\";\nimport { getESLatestPageData, getESPublishedPageData } from \"./helpers\";\nimport lodashGet from \"lodash/get\";\nimport { getZeroPaddedVersionNumber } from \"@webiny/api-page-builder/utils/zeroPaddedVersionNumber\";\nimport { get } from \"@webiny/db-dynamodb/utils/get\";\n\nconst getElasticsearchClient = (context: any): Client => {\n const ctx = context as Partial<ElasticsearchContext>;\n if (!ctx.elasticsearch) {\n throw new WebinyError(\"Missing Elasticsearch client on the context\");\n }\n return ctx.elasticsearch;\n};\n\ninterface Params {\n context: PbContext;\n}\n\ninterface EntityKeys {\n PK: string;\n SK: string;\n}\n\ntype DbRecord<T> = T & { PK: string; SK: string; TYPE: string };\n\nexport class PageStorageOperationsDdbEs implements PageStorageOperations {\n protected readonly context: PbContext;\n protected readonly elasticsearch: Client;\n public readonly table: Table;\n public readonly esTable: Table;\n public readonly entity: Entity<any>;\n public readonly esEntity: Entity<any>;\n\n public constructor({ context }: Params) {\n this.context = context;\n this.table = defineTable({\n context\n });\n\n this.esTable = defineTableElasticsearch({\n context\n });\n\n this.entity = definePageEntity({\n context,\n table: this.table\n });\n\n this.esEntity = definePageElasticsearchEntity({\n context,\n table: this.esTable\n });\n\n this.elasticsearch = getElasticsearchClient(context);\n }\n\n public async create(params: PageStorageOperationsCreateParams): Promise<Page> {\n const { page } = params;\n\n const versionKeys: EntityKeys = {\n PK: this.createPartitionKey(page.id),\n SK: this.createSortKey(page.version)\n };\n const latestKeys: EntityKeys = {\n ...versionKeys,\n SK: this.createLatestSortKey()\n };\n\n const items = [\n this.entity.putBatch({\n ...page,\n ...versionKeys,\n TYPE: this.createBasicType()\n }),\n this.entity.putBatch({\n ...page,\n ...latestKeys,\n TYPE: this.createLatestType()\n })\n ];\n const esData = getESLatestPageData(this.context, page);\n try {\n await batchWriteAll({\n table: this.table,\n items: items\n });\n await this.esEntity.put({\n index: configurations.es(this.context).index,\n data: esData,\n ...latestKeys\n });\n return page;\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not create new page.\",\n ex.code || \"CREATE_PAGE_ERROR\",\n {\n versionKeys,\n latestKeys,\n page\n }\n );\n }\n }\n\n public async createFrom(params: PageStorageOperationsCreateFromParams): Promise<Page> {\n const { page, latestPage, original } = params;\n\n const versionKeys: EntityKeys = {\n PK: this.createPartitionKey(page.id),\n SK: this.createSortKey(page.version)\n };\n const latestKeys: EntityKeys = {\n ...versionKeys,\n SK: this.createLatestSortKey()\n };\n\n const items = [\n this.entity.putBatch({\n ...page,\n TYPE: this.createBasicType(),\n ...versionKeys\n }),\n this.entity.putBatch({\n ...page,\n TYPE: this.createLatestType(),\n ...latestKeys\n })\n ];\n /**\n * Specifically for the Elasticsearch.\n * If visibility on the latest list is not false, push it into the ES.\n */\n let esData: any = undefined;\n if (lodashGet(page, \"visibility.list.latest\") !== false) {\n esData = getESLatestPageData(this.context, page);\n }\n\n try {\n await batchWriteAll({\n table: this.table,\n items\n });\n if (esData) {\n await this.esEntity.put({\n index: configurations.es(this.context).index,\n data: esData,\n ...latestKeys\n });\n }\n return page;\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not create new page from existing page.\",\n ex.code || \"CREATE_PAGE_FROM_ERROR\",\n {\n versionKeys,\n latestKeys,\n latestPage,\n original,\n page\n }\n );\n }\n }\n\n public async update(params: PageStorageOperationsUpdateParams): Promise<Page> {\n const { original, page } = params;\n\n const keys: EntityKeys = {\n PK: this.createPartitionKey(page.id),\n SK: this.createSortKey(page.version)\n };\n\n const latestKeys: EntityKeys = {\n ...keys,\n SK: this.createLatestSortKey()\n };\n const latestPageResult = await this.entity.get(latestKeys);\n const latestPage = cleanupItem(\n this.entity,\n latestPageResult ? latestPageResult.Item : null\n );\n\n const items = [\n this.entity.putBatch({\n ...page,\n TYPE: this.createBasicType(),\n ...keys\n })\n ];\n /**\n * In the case the latest page is the page we are currently updating\n * check for the visibility in the list.\n * If visibility is set to false - delete the record\n * Otherwise update it.\n */\n let esData: Record<string, any> = undefined;\n let deleteEsRecord = false;\n if (latestPage && latestPage.id === page.id) {\n if (lodashGet(page, \"visibility.list.latest\") === false) {\n deleteEsRecord = true;\n } else {\n esData = getESLatestPageData(this.context, page);\n }\n /**\n * We also update the regular record.\n */\n items.push(\n this.entity.putBatch({\n ...page,\n TYPE: this.createLatestType(),\n ...latestKeys\n })\n );\n }\n /**\n * Unfortunately we cannot push regular and es record in the batch write because they are two separate tables.\n */\n try {\n await batchWriteAll({\n table: this.table,\n items\n });\n\n if (deleteEsRecord) {\n await this.esEntity.delete({\n ...latestKeys\n });\n } else if (esData) {\n await this.esEntity.put({\n index: configurations.es(this.context).index,\n data: esData,\n ...latestKeys\n });\n }\n\n return page;\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not update existing page.\",\n ex.code || \"UPDATE_PAGE_ERROR\",\n {\n original,\n page,\n latestPage,\n latestKeys,\n keys\n }\n );\n }\n }\n /**\n * In case of delete, we must delete records:\n * - revision\n * - path if published\n * Update:\n * - latest\n */\n public async delete(params: PageStorageOperationsDeleteParams): Promise<[Page, Page | null]> {\n const { page, latestPage, publishedPage } = params;\n\n const partitionKey = this.createPartitionKey(page.id);\n\n const items = [\n this.entity.deleteBatch({\n PK: partitionKey,\n SK: this.createSortKey(page.version)\n })\n ];\n const esItems = [];\n if (publishedPage && publishedPage.id === page.id) {\n items.push(\n this.entity.deleteBatch({\n PK: partitionKey,\n SK: this.createPublishedSortKey()\n })\n );\n items.push(\n this.entity.deleteBatch({\n PK: this.createPathPartitionKey(),\n SK: this.createPathSortKey(page)\n })\n );\n esItems.push(\n this.esEntity.deleteBatch({\n PK: partitionKey,\n SK: this.createPublishedSortKey()\n })\n );\n }\n let previousLatestPage: Page = null;\n if (latestPage && latestPage.id === page.id) {\n const previousLatestRecord = await queryOne<DbRecord<Page>>({\n entity: this.entity,\n partitionKey,\n options: {\n lt: this.createSortKey(latestPage.version),\n reverse: true\n }\n });\n if (previousLatestRecord) {\n items.push(\n this.entity.putBatch({\n ...previousLatestRecord,\n TYPE: this.createLatestType(),\n PK: partitionKey,\n SK: this.createLatestSortKey()\n })\n );\n esItems.push(\n this.esEntity.putBatch({\n PK: partitionKey,\n SK: this.createLatestSortKey(),\n index: configurations.es(this.context).index,\n data: getESLatestPageData(this.context, previousLatestRecord)\n })\n );\n previousLatestPage = cleanupItem(this.entity, previousLatestRecord);\n }\n }\n try {\n await batchWriteAll({\n table: this.table,\n items\n });\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not batch write all the page records.\",\n ex.code || \"BATCH_WRITE_RECORDS_ERROR\"\n );\n }\n if (esItems.length === 0) {\n return [page, previousLatestPage];\n }\n try {\n await batchWriteAll({\n table: this.esTable,\n items: esItems\n });\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not batch write all the page Elasticsearch records.\",\n ex.code || \"BATCH_WWRITE_ELASTICSEARCH_RECORDS_ERROR\"\n );\n }\n return [page, previousLatestPage];\n }\n /**\n * In case of deleteAll, we must delete records:\n * - latest\n * - published\n * - path if published\n * - revision\n * - es latest\n * - es published\n */\n public async deleteAll(params: PageStorageOperationsDeleteAllParams): Promise<[Page]> {\n const { page } = params;\n\n const partitionKey = this.createPartitionKey(page.id);\n const queryAllParams = {\n entity: this.entity,\n partitionKey,\n options: {\n gte: \" \"\n }\n };\n let revisions: DbRecord<Page>[];\n try {\n revisions = await queryAll(queryAllParams);\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not query for all revisions of the page.\",\n ex.code || \"LIST_REVISIONS_ERROR\",\n {\n params: queryAllParams\n }\n );\n }\n\n /**\n * We need to go through all possible entries and delete them.\n * Also, delete the published entry path record.\n */\n const items = [];\n let publishedPathEntryDeleted = false;\n for (const revision of revisions) {\n if (revision.status === \"published\" && !publishedPathEntryDeleted) {\n publishedPathEntryDeleted = true;\n items.push(\n this.entity.deleteBatch({\n PK: this.createPathPartitionKey(),\n SK: revision.path\n })\n );\n }\n items.push(\n this.entity.deleteBatch({\n PK: revision.PK,\n SK: revision.SK\n })\n );\n }\n const esItems = [\n this.esEntity.deleteBatch({\n PK: partitionKey,\n SK: this.createLatestSortKey()\n })\n ];\n /**\n * Delete published record if it is published.\n */\n if (publishedPathEntryDeleted) {\n esItems.push(\n this.esEntity.deleteBatch({\n PK: partitionKey,\n SK: this.createPublishedSortKey()\n })\n );\n }\n\n try {\n await batchWriteAll({\n table: this.table,\n items\n });\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not delete all the page records.\",\n ex.code || \"DELETE_RECORDS_ERROR\"\n );\n }\n try {\n await batchWriteAll({\n table: this.esTable,\n items: esItems\n });\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not delete all the page Elasticsearch records.\",\n ex.code || \"DELETE_ELASTICSEARCH_RECORDS_ERROR\"\n );\n }\n return [page];\n }\n /**\n * When publishing a page, we need to:\n * - update that page record\n * - update latest record if we are publishing latest one\n * - update published record\n * - update publish path to a new one\n */\n public async publish(params: PageStorageOperationsPublishParams): Promise<Page> {\n const { page, latestPage, publishedPage } = params;\n\n /**\n * Update the given revision of the page.\n */\n const items = [\n this.entity.putBatch({\n ...page,\n TYPE: this.createBasicType(),\n PK: this.createPartitionKey(page.pid),\n SK: this.createSortKey(page.version)\n })\n ];\n const esItems = [];\n /**\n * If we are publishing the latest revision, let's also update the latest revision entry's\n * status in ES. Also, if we are publishing the latest revision and the \"LATEST page lists\n * visibility\" is not false, then we need to update the latest page revision entry in ES.\n */\n if (latestPage.id === page.id) {\n items.push(\n this.entity.putBatch({\n ...page,\n TYPE: this.createLatestType(),\n PK: this.createPartitionKey(page.pid),\n SK: this.createLatestSortKey()\n })\n );\n if (lodashGet(page, \"visibility.list.latest\") !== false) {\n esItems.push(\n this.esEntity.putBatch({\n PK: this.createPartitionKey(page.pid),\n SK: this.createLatestSortKey(),\n index: configurations.es(this.context).index,\n data: getESLatestPageData(this.context, page)\n })\n );\n }\n }\n /**\n * If we have already published revision of this page:\n * - set existing published page revision to unpublished\n * - remove old published path if paths are different\n */\n if (publishedPage) {\n items.push(\n this.entity.putBatch({\n ...publishedPage,\n status: \"unpublished\",\n PK: this.createPartitionKey(publishedPage.pid),\n SK: this.createSortKey(publishedPage.version)\n })\n );\n /**\n * Remove old published path if required.\n */\n if (publishedPage.path !== page.path) {\n items.push(\n this.entity.deleteBatch({\n PK: this.createPathPartitionKey(),\n SK: publishedPage.path\n })\n );\n }\n }\n /**\n * If we need to display the published page in the list.\n * Check only if it's not false, because only that should stop the propagation.\n */\n if (lodashGet(page, \"visibility.list.published\") !== false) {\n esItems.push(\n this.esEntity.putBatch({\n PK: this.createPartitionKey(page.pid),\n SK: this.createPublishedSortKey(),\n index: configurations.es(this.context).index,\n data: getESPublishedPageData(this.context, page)\n })\n );\n } else {\n /**\n * We need to check if record is in the Elasticsearch table.\n */\n const keys = {\n PK: this.createPartitionKey(page.pid),\n SK: this.createPublishedSortKey()\n };\n const esRecord = await get({\n entity: this.esEntity,\n keys\n });\n /**\n * And if it is, delete it.\n */\n if (esRecord) {\n /**\n * Delete published record if not visible\n */\n esItems.push(this.esEntity.deleteBatch(keys));\n }\n }\n /**\n * Update or insert published path.\n */\n items.push(\n this.entity.putBatch({\n ...page,\n TYPE: this.createPublishedPathType(),\n PK: this.createPathPartitionKey(),\n SK: this.createPathSortKey(page)\n })\n );\n /**\n * Update or insert published page.\n */\n items.push(\n this.entity.putBatch({\n ...page,\n TYPE: this.createPublishedType(),\n PK: this.createPartitionKey(page.pid),\n SK: this.createPublishedSortKey()\n })\n );\n\n try {\n await batchWriteAll({\n table: this.table,\n items\n });\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not update all the page records when publishing.\",\n ex.code || \"UPDATE_RECORDS_ERROR\"\n );\n }\n /**\n * No point in continuing if there are no items in Elasticsearch data\n */\n if (esItems.length === 0) {\n return page;\n }\n try {\n await batchWriteAll({\n table: this.esTable,\n items: esItems\n });\n } catch (ex) {\n throw new WebinyError(\n ex.message ||\n \"Could not update all the page Elasticsearch records when publishing.\",\n ex.code || \"UPDATE_ELASTICSEARCH_RECORDS_ERROR\"\n );\n }\n return page;\n }\n\n public async unpublish(params: PageStorageOperationsUnpublishParams): Promise<Page> {\n const { page, latestPage } = params;\n\n const items = [\n this.entity.deleteBatch({\n PK: this.createPartitionKey(page.pid),\n SK: this.createPublishedSortKey()\n }),\n this.entity.deleteBatch({\n PK: this.createPathPartitionKey(),\n SK: this.createPathSortKey(page)\n }),\n this.entity.putBatch({\n ...page,\n TYPE: this.createBasicType(),\n PK: this.createPartitionKey(page.pid),\n SK: this.createSortKey(page.version)\n })\n ];\n const esItems = [];\n /*\n * If we are unpublishing the latest revision, let's also update the latest revision entry's\n * status in ES. We can only do that if the entry actually exists, or in other words, if the\n * published page's \"LATEST pages lists visibility\" setting is not set to false.\n */\n if (latestPage.id === page.id && lodashGet(page, \"visibility.list.latest\") !== false) {\n items.push(\n this.entity.putBatch({\n ...page,\n TYPE: this.createLatestType(),\n PK: this.createPartitionKey(page.pid),\n SK: this.createLatestSortKey()\n })\n );\n esItems.push(\n this.esEntity.putBatch({\n PK: this.createPartitionKey(page.pid),\n SK: this.createLatestSortKey(),\n index: configurations.es(this.context).index,\n data: getESLatestPageData(this.context, page)\n })\n );\n }\n if (lodashGet(page, \"visibility.list.published\") !== false) {\n esItems.push(\n this.esEntity.deleteBatch({\n PK: this.createPartitionKey(page.pid),\n SK: this.createPublishedSortKey()\n })\n );\n }\n\n try {\n await batchWriteAll({\n table: this.table,\n items\n });\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not update all the page records when unpublishing.\",\n ex.code || \"UPDATE_RECORDS_ERROR\"\n );\n }\n /**\n * No need to go further if no Elasticsearch items to be applied.\n */\n if (esItems.length === 0) {\n return page;\n }\n try {\n await batchWriteAll({\n table: this.esTable,\n items: esItems\n });\n } catch (ex) {\n throw new WebinyError(\n ex.message ||\n \"Could not update all the page Elasticsearch records when unpublishing.\",\n ex.code || \"UPDATE_ELASTICSEARCH_RECORDS_ERROR\"\n );\n }\n return page;\n }\n /**\n * We need to update:\n * - regular record\n * - latest record if page is the latest one\n * - ES latest record if page is the latest one\n */\n public async requestReview(params: PageStorageOperationsRequestReviewParams): Promise<Page> {\n const { original, page, latestPage } = params;\n\n const items = [\n this.entity.putBatch({\n ...page,\n TYPE: this.createBasicType(),\n PK: this.createPartitionKey(page.pid),\n SK: this.createSortKey(page.version)\n })\n ];\n let esData = undefined;\n if (latestPage.id === page.id && lodashGet(page, \"visibility.list.latest\") !== false) {\n items.push(\n this.entity.putBatch({\n ...page,\n TYPE: this.createLatestType(),\n PK: this.createPartitionKey(page.pid),\n SK: this.createLatestSortKey()\n })\n );\n esData = getESLatestPageData(this.context, page);\n }\n try {\n await batchWriteAll({\n table: this.table,\n items\n });\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not request review on page record.\",\n ex.code || \"REQUEST_REVIEW_ERROR\",\n {\n original,\n page,\n latestPage\n }\n );\n }\n /**\n * Just return if we do not need to update the Elasticsearch.\n */\n if (!esData) {\n return page;\n }\n\n try {\n await this.esEntity.put({\n PK: this.createPartitionKey(page.pid),\n SK: this.createLatestSortKey(),\n index: configurations.es(this.context).index,\n data: esData\n });\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not request review on page Elasticsearch record.\",\n ex.code || \"REQUEST_REVIEW_ES_ERROR\",\n {\n original,\n page,\n latestPage\n }\n );\n }\n\n return page;\n }\n\n public async requestChanges(params: PageStorageOperationsRequestChangesParams): Promise<Page> {\n const { original, page, latestPage } = params;\n\n const items = [\n this.entity.putBatch({\n ...page,\n TYPE: this.createBasicType(),\n PK: this.createPartitionKey(page.pid),\n SK: this.createSortKey(page.version)\n })\n ];\n let esData = undefined;\n if (latestPage.id === page.id && lodashGet(page, \"visibility.list.latest\") !== false) {\n items.push(\n this.entity.putBatch({\n ...page,\n TYPE: this.createLatestType(),\n PK: this.createPartitionKey(page.pid),\n SK: this.createLatestSortKey()\n })\n );\n esData = getESLatestPageData(this.context, page);\n }\n\n try {\n await batchWriteAll({\n table: this.table,\n items\n });\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not request changes on page record.\",\n ex.code || \"REQUEST_CHANGES_ERROR\",\n {\n original,\n page,\n latestPage\n }\n );\n }\n /**\n * Just return if we do not need to update the Elasticsearch.\n */\n if (!esData) {\n return page;\n }\n\n try {\n await this.esEntity.put({\n PK: this.createPartitionKey(page.pid),\n SK: this.createLatestSortKey(),\n index: configurations.es(this.context).index,\n data: esData\n });\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not request changes on page Elasticsearch record.\",\n ex.code || \"REQUEST_CHANGES_ES_ERROR\",\n {\n original,\n page,\n latestPage\n }\n );\n }\n\n return page;\n }\n\n /**\n * There are only few options to use when getting the page.\n * For that reason we try to have it as simple as possible when querying.\n */\n public async get(params: PageStorageOperationsGetParams): Promise<Page | null> {\n const { where } = params;\n const { pid, id, path, published } = where;\n let { version } = where;\n /**\n * In case of having full ID and not having version we can take the version from the id.\n */\n if (id && id.includes(\"#\") && !version) {\n version = Number(id.split(\"#\").pop());\n }\n let partitionKey: string = undefined;\n let sortKey: string;\n if (path) {\n partitionKey = this.createPathPartitionKey();\n sortKey = path;\n } else if (published) {\n sortKey = this.createPublishedSortKey();\n } else if (version) {\n sortKey = this.createSortKey(version);\n } else {\n sortKey = this.createLatestSortKey();\n }\n /**\n * If partition key is still undefined, create one with id or pid\n */\n if (!partitionKey) {\n partitionKey = this.createPartitionKey(pid || id);\n }\n const keys: EntityKeys = {\n PK: partitionKey,\n SK: sortKey\n };\n try {\n const result = await this.entity.get(keys);\n if (!result || !result.Item) {\n return null;\n }\n return cleanupItem(this.entity, result.Item);\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not load page by given params.\",\n ex.code || \"GET_PAGE_ERROR\",\n {\n where,\n keys\n }\n );\n }\n }\n\n public async list(\n params: PageStorageOperationsListParams\n ): Promise<PageStorageOperationsListResponse> {\n /**\n * We do not allow loading both published and latest at the same time.\n * @see PageStorageOperationsListWhere\n */\n if (params.where.published && params.where.latest) {\n throw new WebinyError(\n \"Both published and latest cannot be defined at the same time.\",\n \"MALFORMED_WHERE_ERROR\",\n {\n where: params.where\n }\n );\n }\n\n const { after: previousCursor, limit: initialLimit } = params;\n\n const limit = createLimit(initialLimit, 50);\n const body = createElasticsearchQueryBody({\n ...params,\n where: {\n ...params.where\n },\n limit,\n after: previousCursor,\n context: this.context\n });\n\n let plugins: SearchPagesPlugin[] = [];\n if (params.where.published) {\n plugins = this.context.plugins.byType<SearchPublishedPagesPlugin>(\n SearchPublishedPagesPlugin.type\n );\n } else if (params.where.latest) {\n plugins = this.context.plugins.byType<SearchLatestPagesPlugin>(\n SearchLatestPagesPlugin.type\n );\n } else {\n throw new WebinyError(\n \"Only published or latest can be listed. Missing where condition.\",\n \"MALFORMED_WHERE_ERROR\",\n {\n where: params.where\n }\n );\n }\n\n for (const plugin of plugins) {\n /**\n * Apply query modifications\n */\n plugin.modifyQuery({\n query: body.query as unknown as ElasticsearchBoolQueryConfig,\n args: params,\n context: this.context\n });\n\n /**\n * Apply sort modifications\n */\n plugin.modifySort({\n sort: body.sort,\n args: params,\n context: this.context\n });\n }\n\n let response;\n const esConfig = configurations.es(this.context);\n try {\n response = await this.elasticsearch.search({\n ...esConfig,\n body\n });\n } catch (ex) {\n /**\n * Do not throw the error if Elasticsearch index does not exist.\n * In some CRUDs we try to get list of pages but index was not created yet.\n */\n if (ex.message === \"index_not_found_exception\") {\n return {\n items: [],\n meta: {\n hasMoreItems: false,\n totalCount: 0,\n cursor: null\n }\n };\n }\n throw new WebinyError(\n ex.message || \"Could not load pages by given Elasticsearch body.\",\n ex.code || \"LIST_PAGES_ERROR\",\n {\n body\n }\n );\n }\n const { hits, total } = response.body.hits;\n const items = hits.map(item => item._source);\n\n const hasMoreItems = items.length > limit;\n if (hasMoreItems) {\n /**\n * Remove the last item from results, we don't want to include it.\n */\n items.pop();\n }\n /**\n * Cursor is the `sort` value of the last item in the array.\n * https://www.elastic.co/guide/en/elasticsearch/reference/current/paginate-search-results.html#search-after\n */\n const cursor =\n items.length > 0 && hasMoreItems ? encodeCursor(hits[items.length - 1].sort) : null;\n return {\n items,\n meta: {\n hasMoreItems,\n totalCount: total.value,\n cursor\n }\n };\n }\n /**\n * Listing of the revisions will be done through the DynamoDB since there are no revisions saved in the Elasticsearch.\n */\n public async listRevisions(params: PageStorageOperationsListRevisionsParams): Promise<Page[]> {\n const queryAllParams: QueryAllParams = {\n entity: this.entity,\n partitionKey: this.createPartitionKey(params.where.pid),\n options: {\n beginsWith: \"REV#\",\n reverse: false\n }\n };\n\n try {\n return await queryAll(queryAllParams);\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not load all the revisions from requested page.\",\n ex.code || \"LOAD_PAGE_REVISIONS_ERROR\",\n {\n params\n }\n );\n }\n }\n\n public async listTags(params: PageStorageOperationsListTagsParams): Promise<string[]> {\n const { where } = params;\n\n const tenant: string = where.tenant;\n const body = createElasticsearchQueryBody({\n ...params,\n where: {\n locale: where.locale,\n search: undefined,\n tenant\n },\n sort: [],\n limit: 100000,\n context: this.context\n });\n\n const esConfig = configurations.es(this.context);\n\n try {\n const response = await this.elasticsearch.search({\n ...esConfig,\n body: {\n ...body,\n sort: undefined,\n limit: undefined,\n size: 0,\n aggs: {\n tags: {\n terms: {\n field: \"tags.keyword\",\n include: `.*${where.search}.*`,\n size: 10\n }\n }\n }\n }\n });\n return response.body.aggregations.tags.buckets.map(item => item.key);\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not list tags by given parameters.\",\n ex.code || \"LIST_TAGS_ERROR\",\n {\n body,\n where\n }\n );\n }\n }\n /**\n * Used in multiple partition keys.\n */\n protected createBasePartitionKey(): string {\n const tenant = this.context.tenancy.getCurrentTenant().id;\n const locale = this.context.i18nContent.getLocale().code;\n return `T#${tenant}#L#${locale}#PB#`;\n }\n\n protected createPartitionKey(id: string): string {\n if (id.includes(\"#\")) {\n id = id.split(\"#\").shift();\n }\n return `${this.createBasePartitionKey()}P#${id}`;\n }\n\n protected createPathPartitionKey(): string {\n return `${this.createBasePartitionKey()}PATH`;\n }\n\n protected createSortKey(version: string | number): string {\n if (typeof version !== \"number\") {\n if (version.includes(\"#\")) {\n version = Number(version.split(\"#\").pop());\n }\n }\n return `REV#${getZeroPaddedVersionNumber(version)}`;\n }\n\n protected createPathSortKey(input: Pick<Page, \"path\"> | string): string {\n if (typeof input === \"string\") {\n return input;\n } else if (input.path) {\n return input.path;\n }\n throw new WebinyError(\n \"Could not determine the page path sort key from the input.\",\n \"MALFORMED_SORT_KEY\",\n {\n input\n }\n );\n }\n\n protected createPublishedSortKey(): string {\n return \"P\";\n }\n\n protected createLatestSortKey(): string {\n return \"L\";\n }\n\n protected createBasicType(): string {\n return \"pb.page\";\n }\n\n protected createLatestType(): string {\n return \"pb.page.l\";\n }\n\n protected createPublishedType(): string {\n return \"pb.page.p\";\n }\n\n protected createPublishedPathType(): string {\n return \"pb.page.p.path\";\n }\n}\n"],"file":"PageStorageOperations.js"}
@@ -5,7 +5,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
- exports.getESPublishedPageData = exports.getESLatestPageData = exports.getESPageData = void 0;
8
+ exports.getESPublishedPageData = exports.getESPageData = exports.getESLatestPageData = void 0;
9
9
 
10
10
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11
11
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webiny/api-page-builder-so-ddb-es",
3
- "version": "5.16.0",
3
+ "version": "5.17.0",
4
4
  "main": "index.js",
5
5
  "keywords": [
6
6
  "@webiny/api-page-builder",
@@ -17,14 +17,14 @@
17
17
  "description": "The DynamoDB + Elasticsearch storage operations Webiny Page Builder API.",
18
18
  "license": "MIT",
19
19
  "dependencies": {
20
- "@babel/runtime": "7.15.3",
21
- "@webiny/api-elasticsearch": "5.16.0",
22
- "@webiny/api-page-builder": "5.16.0",
23
- "@webiny/api-upgrade": "5.16.0",
24
- "@webiny/db-dynamodb": "5.16.0",
25
- "@webiny/error": "5.16.0",
26
- "@webiny/handler-db": "5.16.0",
27
- "@webiny/plugins": "5.16.0",
20
+ "@babel/runtime": "7.15.4",
21
+ "@webiny/api-elasticsearch": "5.17.0",
22
+ "@webiny/api-page-builder": "5.17.0",
23
+ "@webiny/api-upgrade": "5.17.0",
24
+ "@webiny/db-dynamodb": "5.17.0",
25
+ "@webiny/error": "5.17.0",
26
+ "@webiny/handler-db": "5.17.0",
27
+ "@webiny/plugins": "5.17.0",
28
28
  "dataloader": "2.0.0",
29
29
  "dynamodb-toolbox": "0.3.4",
30
30
  "elastic-ts": "0.7.0",
@@ -38,14 +38,14 @@
38
38
  "@elastic/elasticsearch": "7.12.0",
39
39
  "@elastic/elasticsearch-mock": "0.3.0",
40
40
  "@shelf/jest-elasticsearch": "^1.0.0",
41
- "@webiny/api-dynamodb-to-elasticsearch": "^5.16.0",
42
- "@webiny/api-security": "^5.16.0",
43
- "@webiny/api-tenancy": "^5.16.0",
44
- "@webiny/cli": "^5.16.0",
45
- "@webiny/handler": "^5.16.0",
46
- "@webiny/handler-aws": "^5.16.0",
47
- "@webiny/handler-graphql": "^5.16.0",
48
- "@webiny/project-utils": "^5.16.0",
41
+ "@webiny/api-dynamodb-to-elasticsearch": "^5.17.0",
42
+ "@webiny/api-security": "^5.17.0",
43
+ "@webiny/api-tenancy": "^5.17.0",
44
+ "@webiny/cli": "^5.17.0",
45
+ "@webiny/handler": "^5.17.0",
46
+ "@webiny/handler-aws": "^5.17.0",
47
+ "@webiny/handler-graphql": "^5.17.0",
48
+ "@webiny/project-utils": "^5.17.0",
49
49
  "jest": "^26.6.3",
50
50
  "jest-dynalite": "^3.2.0",
51
51
  "jest-environment-node": "^27.0.6",
@@ -61,5 +61,5 @@
61
61
  "build": "yarn webiny run build",
62
62
  "watch": "yarn webiny run watch"
63
63
  },
64
- "gitHead": "a31f07d466c5b5ebac53b31deb0a3044b6d3ae4c"
64
+ "gitHead": "a5e429d0f195c85f8e6ec482954f54fa8ff4c533"
65
65
  }