@webiny/api-headless-cms-ddb-es 0.0.0-unstable.78f581c1d2 → 0.0.0-unstable.7be00a75a9
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/README.md +6 -30
- package/configurations.d.ts +13 -6
- package/configurations.js +28 -40
- package/configurations.js.map +1 -1
- package/definitions/entry.d.ts +4 -5
- package/definitions/entry.js +9 -88
- package/definitions/entry.js.map +1 -1
- package/definitions/group.d.ts +6 -6
- package/definitions/group.js +9 -68
- package/definitions/group.js.map +1 -1
- package/definitions/model.d.ts +6 -6
- package/definitions/model.js +9 -90
- package/definitions/model.js.map +1 -1
- package/definitions/types.d.ts +65 -0
- package/definitions/types.js +0 -0
- package/elasticsearch/createElasticsearchIndex.d.ts +5 -5
- package/elasticsearch/createElasticsearchIndex.js +53 -56
- package/elasticsearch/createElasticsearchIndex.js.map +1 -1
- package/elasticsearch/deleteElasticsearchIndex.d.ts +3 -3
- package/elasticsearch/deleteElasticsearchIndex.js +20 -40
- package/elasticsearch/deleteElasticsearchIndex.js.map +1 -1
- package/exports/api/cms/opensearch.d.ts +9 -0
- package/exports/api/cms/opensearch.js +9 -0
- package/feature.d.ts +1 -0
- package/feature.js +179 -0
- package/feature.js.map +1 -0
- package/features/CmsEntryOpenSearchBodyModifier/abstractions.d.ts +16 -0
- package/features/CmsEntryOpenSearchBodyModifier/abstractions.js +5 -0
- package/features/CmsEntryOpenSearchBodyModifier/abstractions.js.map +1 -0
- package/features/CmsEntryOpenSearchBodyModifier/index.d.ts +1 -0
- package/features/CmsEntryOpenSearchBodyModifier/index.js +1 -0
- package/features/CmsEntryOpenSearchFieldIndex/CmsEntryOpenSearchFieldIndexRegistry.d.ts +14 -0
- package/features/CmsEntryOpenSearchFieldIndex/CmsEntryOpenSearchFieldIndexRegistry.js +42 -0
- package/features/CmsEntryOpenSearchFieldIndex/CmsEntryOpenSearchFieldIndexRegistry.js.map +1 -0
- package/features/CmsEntryOpenSearchFieldIndex/abstractions/CmsEntryOpenSearchFieldIndex.d.ts +32 -0
- package/features/CmsEntryOpenSearchFieldIndex/abstractions/CmsEntryOpenSearchFieldIndex.js +5 -0
- package/features/CmsEntryOpenSearchFieldIndex/abstractions/CmsEntryOpenSearchFieldIndex.js.map +1 -0
- package/features/CmsEntryOpenSearchFieldIndex/abstractions/CmsEntryOpenSearchFieldIndexRegistry.d.ts +11 -0
- package/features/CmsEntryOpenSearchFieldIndex/abstractions/CmsEntryOpenSearchFieldIndexRegistry.js +5 -0
- package/features/CmsEntryOpenSearchFieldIndex/abstractions/CmsEntryOpenSearchFieldIndexRegistry.js.map +1 -0
- package/features/CmsEntryOpenSearchFieldIndex/constants.d.ts +1 -0
- package/features/CmsEntryOpenSearchFieldIndex/constants.js +4 -0
- package/features/CmsEntryOpenSearchFieldIndex/constants.js.map +1 -0
- package/features/CmsEntryOpenSearchFieldIndex/feature.d.ts +4 -0
- package/features/CmsEntryOpenSearchFieldIndex/feature.js +29 -0
- package/features/CmsEntryOpenSearchFieldIndex/feature.js.map +1 -0
- package/features/CmsEntryOpenSearchFieldIndex/fields/DateTimeFieldIndex.d.ts +11 -0
- package/features/CmsEntryOpenSearchFieldIndex/fields/DateTimeFieldIndex.js +60 -0
- package/features/CmsEntryOpenSearchFieldIndex/fields/DateTimeFieldIndex.js.map +1 -0
- package/features/CmsEntryOpenSearchFieldIndex/fields/DefaultFieldIndex.d.ts +13 -0
- package/features/CmsEntryOpenSearchFieldIndex/fields/DefaultFieldIndex.js +33 -0
- package/features/CmsEntryOpenSearchFieldIndex/fields/DefaultFieldIndex.js.map +1 -0
- package/features/CmsEntryOpenSearchFieldIndex/fields/JsonFieldIndex.d.ts +10 -0
- package/features/CmsEntryOpenSearchFieldIndex/fields/JsonFieldIndex.js +21 -0
- package/features/CmsEntryOpenSearchFieldIndex/fields/JsonFieldIndex.js.map +1 -0
- package/features/CmsEntryOpenSearchFieldIndex/fields/LongTextFieldIndex.d.ts +10 -0
- package/features/CmsEntryOpenSearchFieldIndex/fields/LongTextFieldIndex.js +22 -0
- package/features/CmsEntryOpenSearchFieldIndex/fields/LongTextFieldIndex.js.map +1 -0
- package/features/CmsEntryOpenSearchFieldIndex/fields/NumberFieldIndex.d.ts +11 -0
- package/features/CmsEntryOpenSearchFieldIndex/fields/NumberFieldIndex.js +32 -0
- package/features/CmsEntryOpenSearchFieldIndex/fields/NumberFieldIndex.js.map +1 -0
- package/features/CmsEntryOpenSearchFieldIndex/fields/ObjectFieldIndex.d.ts +12 -0
- package/features/CmsEntryOpenSearchFieldIndex/fields/ObjectFieldIndex.js +107 -0
- package/features/CmsEntryOpenSearchFieldIndex/fields/ObjectFieldIndex.js.map +1 -0
- package/features/CmsEntryOpenSearchFieldIndex/fields/RichTextFieldIndex.d.ts +10 -0
- package/features/CmsEntryOpenSearchFieldIndex/fields/RichTextFieldIndex.js +21 -0
- package/features/CmsEntryOpenSearchFieldIndex/fields/RichTextFieldIndex.js.map +1 -0
- package/features/CmsEntryOpenSearchFieldIndex/fields/TextCompressedFieldIndex.d.ts +15 -0
- package/features/CmsEntryOpenSearchFieldIndex/fields/TextCompressedFieldIndex.js +40 -0
- package/features/CmsEntryOpenSearchFieldIndex/fields/TextCompressedFieldIndex.js.map +1 -0
- package/features/CmsEntryOpenSearchFieldIndex/fields/TextEncryptedFieldIndex.d.ts +15 -0
- package/features/CmsEntryOpenSearchFieldIndex/fields/TextEncryptedFieldIndex.js +40 -0
- package/features/CmsEntryOpenSearchFieldIndex/fields/TextEncryptedFieldIndex.js.map +1 -0
- package/features/CmsEntryOpenSearchFieldIndex/index.d.ts +3 -0
- package/features/CmsEntryOpenSearchFieldIndex/index.js +3 -0
- package/features/CmsEntryOpenSearchFilter/CmsEntryOpenSearchFilterRegistry.d.ts +11 -0
- package/features/CmsEntryOpenSearchFilter/CmsEntryOpenSearchFilterRegistry.js +36 -0
- package/features/CmsEntryOpenSearchFilter/CmsEntryOpenSearchFilterRegistry.js.map +1 -0
- package/features/CmsEntryOpenSearchFilter/abstractions/CmsEntryOpenSearchFilter.d.ts +37 -0
- package/features/CmsEntryOpenSearchFilter/abstractions/CmsEntryOpenSearchFilter.js +5 -0
- package/features/CmsEntryOpenSearchFilter/abstractions/CmsEntryOpenSearchFilter.js.map +1 -0
- package/features/CmsEntryOpenSearchFilter/abstractions/CmsEntryOpenSearchFilterRegistry.d.ts +9 -0
- package/features/CmsEntryOpenSearchFilter/abstractions/CmsEntryOpenSearchFilterRegistry.js +5 -0
- package/features/CmsEntryOpenSearchFilter/abstractions/CmsEntryOpenSearchFilterRegistry.js.map +1 -0
- package/features/CmsEntryOpenSearchFilter/constants.d.ts +1 -0
- package/features/CmsEntryOpenSearchFilter/constants.js +4 -0
- package/features/CmsEntryOpenSearchFilter/constants.js.map +1 -0
- package/features/CmsEntryOpenSearchFilter/feature.d.ts +4 -0
- package/features/CmsEntryOpenSearchFilter/feature.js +17 -0
- package/features/CmsEntryOpenSearchFilter/feature.js.map +1 -0
- package/features/CmsEntryOpenSearchFilter/fields/DefaultFilter.d.ts +9 -0
- package/features/CmsEntryOpenSearchFilter/fields/DefaultFilter.js +26 -0
- package/features/CmsEntryOpenSearchFilter/fields/DefaultFilter.js.map +1 -0
- package/features/CmsEntryOpenSearchFilter/fields/ObjectFilter.d.ts +9 -0
- package/features/CmsEntryOpenSearchFilter/fields/ObjectFilter.js +43 -0
- package/features/CmsEntryOpenSearchFilter/fields/ObjectFilter.js.map +1 -0
- package/features/CmsEntryOpenSearchFilter/fields/RefFilter.d.ts +9 -0
- package/features/CmsEntryOpenSearchFilter/fields/RefFilter.js +36 -0
- package/features/CmsEntryOpenSearchFilter/fields/RefFilter.js.map +1 -0
- package/features/CmsEntryOpenSearchFilter/index.d.ts +3 -0
- package/features/CmsEntryOpenSearchFilter/index.js +3 -0
- package/features/CmsEntryOpenSearchFullTextSearch/abstractions.d.ts +20 -0
- package/features/CmsEntryOpenSearchFullTextSearch/abstractions.js +5 -0
- package/features/CmsEntryOpenSearchFullTextSearch/abstractions.js.map +1 -0
- package/features/CmsEntryOpenSearchFullTextSearch/index.d.ts +1 -0
- package/features/CmsEntryOpenSearchFullTextSearch/index.js +1 -0
- package/features/CmsEntryOpenSearchIndex/BaseOpenSearchIndex.d.ts +11 -0
- package/features/CmsEntryOpenSearchIndex/BaseOpenSearchIndex.js +17 -0
- package/features/CmsEntryOpenSearchIndex/BaseOpenSearchIndex.js.map +1 -0
- package/features/CmsEntryOpenSearchIndex/abstractions.d.ts +14 -0
- package/features/CmsEntryOpenSearchIndex/abstractions.js +5 -0
- package/features/CmsEntryOpenSearchIndex/abstractions.js.map +1 -0
- package/features/CmsEntryOpenSearchIndex/feature.d.ts +4 -0
- package/features/CmsEntryOpenSearchIndex/feature.js +11 -0
- package/features/CmsEntryOpenSearchIndex/feature.js.map +1 -0
- package/features/CmsEntryOpenSearchIndex/index.d.ts +3 -0
- package/features/CmsEntryOpenSearchIndex/index.js +3 -0
- package/features/CmsEntryOpenSearchQueryModifier/abstractions.d.ts +16 -0
- package/features/CmsEntryOpenSearchQueryModifier/abstractions.js +5 -0
- package/features/CmsEntryOpenSearchQueryModifier/abstractions.js.map +1 -0
- package/features/CmsEntryOpenSearchQueryModifier/index.d.ts +1 -0
- package/features/CmsEntryOpenSearchQueryModifier/index.js +1 -0
- package/features/CmsEntryOpenSearchSortModifier/abstractions.d.ts +15 -0
- package/features/CmsEntryOpenSearchSortModifier/abstractions.js +5 -0
- package/features/CmsEntryOpenSearchSortModifier/abstractions.js.map +1 -0
- package/features/CmsEntryOpenSearchSortModifier/index.d.ts +1 -0
- package/features/CmsEntryOpenSearchSortModifier/index.js +1 -0
- package/features/CmsEntryOpenSearchValueSearch/CmsEntryOpenSearchValueSearchRegistry.d.ts +12 -0
- package/features/CmsEntryOpenSearchValueSearch/CmsEntryOpenSearchValueSearchRegistry.js +31 -0
- package/features/CmsEntryOpenSearchValueSearch/CmsEntryOpenSearchValueSearchRegistry.js.map +1 -0
- package/features/CmsEntryOpenSearchValueSearch/abstractions/CmsEntryOpenSearchValueSearch.d.ts +22 -0
- package/features/CmsEntryOpenSearchValueSearch/abstractions/CmsEntryOpenSearchValueSearch.js +5 -0
- package/features/CmsEntryOpenSearchValueSearch/abstractions/CmsEntryOpenSearchValueSearch.js.map +1 -0
- package/features/CmsEntryOpenSearchValueSearch/abstractions/CmsEntryOpenSearchValueSearchRegistry.d.ts +10 -0
- package/features/CmsEntryOpenSearchValueSearch/abstractions/CmsEntryOpenSearchValueSearchRegistry.js +5 -0
- package/features/CmsEntryOpenSearchValueSearch/abstractions/CmsEntryOpenSearchValueSearchRegistry.js.map +1 -0
- package/features/CmsEntryOpenSearchValueSearch/feature.d.ts +4 -0
- package/features/CmsEntryOpenSearchValueSearch/feature.js +17 -0
- package/features/CmsEntryOpenSearchValueSearch/feature.js.map +1 -0
- package/features/CmsEntryOpenSearchValueSearch/fields/RefSearch.d.ts +10 -0
- package/features/CmsEntryOpenSearchValueSearch/fields/RefSearch.js +21 -0
- package/features/CmsEntryOpenSearchValueSearch/fields/RefSearch.js.map +1 -0
- package/features/CmsEntryOpenSearchValueSearch/fields/SearchableJsonSearch.d.ts +10 -0
- package/features/CmsEntryOpenSearchValueSearch/fields/SearchableJsonSearch.js +44 -0
- package/features/CmsEntryOpenSearchValueSearch/fields/SearchableJsonSearch.js.map +1 -0
- package/features/CmsEntryOpenSearchValueSearch/fields/TimeSearch.d.ts +10 -0
- package/features/CmsEntryOpenSearchValueSearch/fields/TimeSearch.js +22 -0
- package/features/CmsEntryOpenSearchValueSearch/fields/TimeSearch.js.map +1 -0
- package/features/CmsEntryOpenSearchValueSearch/index.d.ts +3 -0
- package/features/CmsEntryOpenSearchValueSearch/index.js +3 -0
- package/features/CmsEntryOpenSearchValuesModifier/abstractions.d.ts +23 -0
- package/features/CmsEntryOpenSearchValuesModifier/abstractions.js +5 -0
- package/features/CmsEntryOpenSearchValuesModifier/abstractions.js.map +1 -0
- package/features/CmsEntryOpenSearchValuesModifier/index.d.ts +1 -0
- package/features/CmsEntryOpenSearchValuesModifier/index.js +1 -0
- package/helpers/entryIndexHelpers.d.ts +13 -11
- package/helpers/entryIndexHelpers.js +72 -196
- package/helpers/entryIndexHelpers.js.map +1 -1
- package/helpers/fieldIdentifier.d.ts +6 -0
- package/helpers/fieldIdentifier.js +23 -0
- package/helpers/fieldIdentifier.js.map +1 -0
- package/helpers/index.d.ts +2 -2
- package/helpers/index.js +2 -31
- package/index.d.ts +1 -3
- package/index.js +1 -268
- package/operations/entry/dataLoader/DataLoaderCache.d.ts +16 -0
- package/operations/entry/dataLoader/DataLoaderCache.js +27 -0
- package/operations/entry/dataLoader/DataLoaderCache.js.map +1 -0
- package/operations/entry/dataLoader/constants.d.ts +1 -0
- package/operations/entry/dataLoader/constants.js +5 -0
- package/operations/entry/dataLoader/constants.js.map +1 -0
- package/operations/entry/dataLoader/createBatchScheduleFn.d.ts +8 -0
- package/operations/entry/dataLoader/createBatchScheduleFn.js +10 -0
- package/operations/entry/dataLoader/createBatchScheduleFn.js.map +1 -0
- package/operations/entry/dataLoader/getAllEntryRevisions.d.ts +4 -0
- package/operations/entry/dataLoader/getAllEntryRevisions.js +24 -0
- package/operations/entry/dataLoader/getAllEntryRevisions.js.map +1 -0
- package/operations/entry/dataLoader/getLatestRevisionByEntryId.d.ts +4 -0
- package/operations/entry/dataLoader/getLatestRevisionByEntryId.js +34 -0
- package/operations/entry/dataLoader/getLatestRevisionByEntryId.js.map +1 -0
- package/operations/entry/dataLoader/getPublishedRevisionByEntryId.d.ts +4 -0
- package/operations/entry/dataLoader/getPublishedRevisionByEntryId.js +34 -0
- package/operations/entry/dataLoader/getPublishedRevisionByEntryId.js.map +1 -0
- package/operations/entry/dataLoader/getRevisionById.d.ts +4 -0
- package/operations/entry/dataLoader/getRevisionById.js +40 -0
- package/operations/entry/dataLoader/getRevisionById.js.map +1 -0
- package/operations/entry/dataLoader/index.d.ts +8 -0
- package/operations/entry/dataLoader/index.js +18 -0
- package/operations/entry/dataLoader/index.js.map +1 -0
- package/operations/entry/dataLoader/types.d.ts +6 -0
- package/operations/entry/dataLoader/types.js +0 -0
- package/operations/entry/dataLoaders.d.ts +17 -38
- package/operations/entry/dataLoaders.js +82 -357
- package/operations/entry/dataLoaders.js.map +1 -1
- package/operations/entry/elasticsearch/assignMinimumShouldMatchToQuery.d.ts +18 -0
- package/operations/entry/elasticsearch/assignMinimumShouldMatchToQuery.js +9 -0
- package/operations/entry/elasticsearch/assignMinimumShouldMatchToQuery.js.map +1 -0
- package/operations/entry/elasticsearch/body.d.ts +29 -0
- package/operations/entry/elasticsearch/body.js +87 -0
- package/operations/entry/elasticsearch/body.js.map +1 -0
- package/operations/entry/elasticsearch/fields/createSystemField.d.ts +4 -0
- package/operations/entry/elasticsearch/fields/createSystemField.js +9 -0
- package/operations/entry/elasticsearch/fields/createSystemField.js.map +1 -0
- package/operations/entry/elasticsearch/fields/live.d.ts +2 -0
- package/operations/entry/elasticsearch/fields/live.js +50 -0
- package/operations/entry/elasticsearch/fields/live.js.map +1 -0
- package/operations/entry/elasticsearch/fields/location.d.ts +2 -0
- package/operations/entry/elasticsearch/fields/location.js +50 -0
- package/operations/entry/elasticsearch/fields/location.js.map +1 -0
- package/operations/entry/elasticsearch/fields/state.d.ts +2 -0
- package/operations/entry/elasticsearch/fields/state.js +104 -0
- package/operations/entry/elasticsearch/fields/state.js.map +1 -0
- package/operations/entry/elasticsearch/fields.d.ts +12 -0
- package/operations/entry/elasticsearch/fields.js +207 -0
- package/operations/entry/elasticsearch/fields.js.map +1 -0
- package/operations/entry/elasticsearch/filtering/applyFiltering.d.ts +9 -0
- package/operations/entry/elasticsearch/filtering/applyFiltering.js +39 -0
- package/operations/entry/elasticsearch/filtering/applyFiltering.js.map +1 -0
- package/operations/entry/elasticsearch/filtering/exec.d.ts +22 -0
- package/operations/entry/elasticsearch/filtering/exec.js +96 -0
- package/operations/entry/elasticsearch/filtering/exec.js.map +1 -0
- package/operations/entry/elasticsearch/filtering/index.d.ts +1 -0
- package/operations/entry/elasticsearch/filtering/index.js +1 -0
- package/operations/entry/elasticsearch/filtering/path.d.ts +17 -0
- package/operations/entry/elasticsearch/filtering/path.js +27 -0
- package/operations/entry/elasticsearch/filtering/path.js.map +1 -0
- package/operations/entry/elasticsearch/filtering/populated.d.ts +2 -0
- package/operations/entry/elasticsearch/filtering/populated.js +12 -0
- package/operations/entry/elasticsearch/filtering/populated.js.map +1 -0
- package/operations/entry/elasticsearch/filtering/values.d.ts +2 -0
- package/operations/entry/elasticsearch/filtering/values.js +15 -0
- package/operations/entry/elasticsearch/filtering/values.js.map +1 -0
- package/operations/entry/elasticsearch/fullTextSearch.d.ts +13 -0
- package/operations/entry/elasticsearch/fullTextSearch.js +51 -0
- package/operations/entry/elasticsearch/fullTextSearch.js.map +1 -0
- package/operations/entry/elasticsearch/fullTextSearchFields.d.ts +8 -0
- package/operations/entry/elasticsearch/fullTextSearchFields.js +10 -0
- package/operations/entry/elasticsearch/fullTextSearchFields.js.map +1 -0
- package/operations/entry/elasticsearch/initialQuery.d.ts +17 -0
- package/operations/entry/elasticsearch/initialQuery.js +45 -0
- package/operations/entry/elasticsearch/initialQuery.js.map +1 -0
- package/operations/entry/elasticsearch/keyword.d.ts +2 -0
- package/operations/entry/elasticsearch/keyword.js +17 -0
- package/operations/entry/elasticsearch/keyword.js.map +1 -0
- package/operations/entry/elasticsearch/plugins/operator.d.ts +7 -0
- package/operations/entry/elasticsearch/plugins/operator.js +13 -0
- package/operations/entry/elasticsearch/plugins/operator.js.map +1 -0
- package/operations/entry/elasticsearch/shouldIgnoreEsResponseError.d.ts +2 -0
- package/operations/entry/elasticsearch/shouldIgnoreEsResponseError.js +8 -0
- package/operations/entry/elasticsearch/shouldIgnoreEsResponseError.js.map +1 -0
- package/operations/entry/elasticsearch/sort.d.ts +12 -0
- package/operations/entry/elasticsearch/sort.js +80 -0
- package/operations/entry/elasticsearch/sort.js.map +1 -0
- package/operations/entry/elasticsearch/transformValueForSearch.d.ts +9 -0
- package/operations/entry/elasticsearch/transformValueForSearch.js +12 -0
- package/operations/entry/elasticsearch/transformValueForSearch.js.map +1 -0
- package/operations/entry/elasticsearch/types.d.ts +34 -0
- package/operations/entry/elasticsearch/types.js +0 -0
- package/operations/entry/index.d.ts +27 -8
- package/operations/entry/index.js +1344 -1245
- package/operations/entry/index.js.map +1 -1
- package/operations/entry/keys.d.ts +31 -1
- package/operations/entry/keys.js +45 -35
- package/operations/entry/keys.js.map +1 -1
- package/operations/entry/recordType.d.ts +3 -0
- package/operations/entry/recordType.js +6 -0
- package/operations/entry/recordType.js.map +1 -0
- package/operations/entry/transformations/convertEntryKeys.d.ts +8 -0
- package/operations/entry/transformations/convertEntryKeys.js +25 -0
- package/operations/entry/transformations/convertEntryKeys.js.map +1 -0
- package/operations/entry/transformations/index.d.ts +33 -0
- package/operations/entry/transformations/index.js +91 -0
- package/operations/entry/transformations/index.js.map +1 -0
- package/operations/entry/transformations/modifyEntryValues.d.ts +53 -0
- package/operations/entry/transformations/modifyEntryValues.js +16 -0
- package/operations/entry/transformations/modifyEntryValues.js.map +1 -0
- package/operations/entry/transformations/transformEntryKeys.d.ts +11 -0
- package/operations/entry/transformations/transformEntryKeys.js +17 -0
- package/operations/entry/transformations/transformEntryKeys.js.map +1 -0
- package/operations/entry/transformations/transformEntryToIndex.d.ts +10 -0
- package/operations/entry/transformations/transformEntryToIndex.js +20 -0
- package/operations/entry/transformations/transformEntryToIndex.js.map +1 -0
- package/operations/group/index.d.ts +7 -6
- package/operations/group/index.js +116 -190
- package/operations/group/index.js.map +1 -1
- package/operations/model/index.d.ts +4 -4
- package/operations/model/index.js +130 -199
- package/operations/model/index.js.map +1 -1
- package/package.json +44 -41
- package/tasks/createIndexTaskPlugin.d.ts +2 -0
- package/tasks/createIndexTaskPlugin.js +45 -0
- package/tasks/createIndexTaskPlugin.js.map +1 -0
- package/types.d.ts +34 -137
- package/types.js +10 -47
- package/types.js.map +1 -1
- package/values/NoValueContainer.d.ts +5 -0
- package/values/NoValueContainer.js +11 -0
- package/values/NoValueContainer.js.map +1 -0
- package/definitions/entryElasticsearch.d.ts +0 -8
- package/definitions/entryElasticsearch.js +0 -42
- package/definitions/entryElasticsearch.js.map +0 -1
- package/definitions/settings.d.ts +0 -8
- package/definitions/settings.js +0 -58
- package/definitions/settings.js.map +0 -1
- package/definitions/system.d.ts +0 -8
- package/definitions/system.js +0 -46
- package/definitions/system.js.map +0 -1
- package/definitions/table.d.ts +0 -8
- package/definitions/table.js +0 -24
- package/definitions/table.js.map +0 -1
- package/definitions/tableElasticsearch.d.ts +0 -8
- package/definitions/tableElasticsearch.js +0 -24
- package/definitions/tableElasticsearch.js.map +0 -1
- package/dynamoDb/index.d.ts +0 -2
- package/dynamoDb/index.js +0 -16
- package/dynamoDb/index.js.map +0 -1
- package/dynamoDb/storage/date.d.ts +0 -2
- package/dynamoDb/storage/date.js +0 -99
- package/dynamoDb/storage/date.js.map +0 -1
- package/dynamoDb/storage/longText.d.ts +0 -10
- package/dynamoDb/storage/longText.js +0 -101
- package/dynamoDb/storage/longText.js.map +0 -1
- package/dynamoDb/storage/richText.d.ts +0 -7
- package/dynamoDb/storage/richText.js +0 -128
- package/dynamoDb/storage/richText.js.map +0 -1
- package/elasticsearch/index.d.ts +0 -2
- package/elasticsearch/index.js +0 -16
- package/elasticsearch/index.js.map +0 -1
- package/elasticsearch/indexing/dateTimeIndexing.d.ts +0 -3
- package/elasticsearch/indexing/dateTimeIndexing.js +0 -103
- package/elasticsearch/indexing/dateTimeIndexing.js.map +0 -1
- package/elasticsearch/indexing/defaultFieldIndexing.d.ts +0 -3
- package/elasticsearch/indexing/defaultFieldIndexing.js +0 -47
- package/elasticsearch/indexing/defaultFieldIndexing.js.map +0 -1
- package/elasticsearch/indexing/index.d.ts +0 -2
- package/elasticsearch/indexing/index.js +0 -24
- package/elasticsearch/indexing/index.js.map +0 -1
- package/elasticsearch/indexing/longTextIndexing.d.ts +0 -3
- package/elasticsearch/indexing/longTextIndexing.js +0 -36
- package/elasticsearch/indexing/longTextIndexing.js.map +0 -1
- package/elasticsearch/indexing/numberIndexing.d.ts +0 -3
- package/elasticsearch/indexing/numberIndexing.js +0 -48
- package/elasticsearch/indexing/numberIndexing.js.map +0 -1
- package/elasticsearch/indexing/objectIndexing.d.ts +0 -12
- package/elasticsearch/indexing/objectIndexing.js +0 -223
- package/elasticsearch/indexing/objectIndexing.js.map +0 -1
- package/elasticsearch/indexing/richTextIndexing.d.ts +0 -3
- package/elasticsearch/indexing/richTextIndexing.js +0 -34
- package/elasticsearch/indexing/richTextIndexing.js.map +0 -1
- package/elasticsearch/indices/base.d.ts +0 -2
- package/elasticsearch/indices/base.js +0 -15
- package/elasticsearch/indices/base.js.map +0 -1
- package/elasticsearch/indices/index.d.ts +0 -1
- package/elasticsearch/indices/index.js +0 -16
- package/elasticsearch/indices/index.js.map +0 -1
- package/elasticsearch/indices/japanese.d.ts +0 -2
- package/elasticsearch/indices/japanese.js +0 -16
- package/elasticsearch/indices/japanese.js.map +0 -1
- package/elasticsearch/search/index.d.ts +0 -3
- package/elasticsearch/search/index.js +0 -14
- package/elasticsearch/search/index.js.map +0 -1
- package/elasticsearch/search/refSearch.d.ts +0 -2
- package/elasticsearch/search/refSearch.js +0 -33
- package/elasticsearch/search/refSearch.js.map +0 -1
- package/elasticsearch/search/timeSearch.d.ts +0 -2
- package/elasticsearch/search/timeSearch.js +0 -33
- package/elasticsearch/search/timeSearch.js.map +0 -1
- package/helpers/createElasticsearchQueryBody.d.ts +0 -11
- package/helpers/createElasticsearchQueryBody.js +0 -611
- package/helpers/createElasticsearchQueryBody.js.map +0 -1
- package/helpers/fields.d.ts +0 -19
- package/helpers/fields.js +0 -205
- package/helpers/fields.js.map +0 -1
- package/helpers/index.js.map +0 -1
- package/helpers/searchPluginsList.d.ts +0 -6
- package/helpers/searchPluginsList.js +0 -26
- package/helpers/searchPluginsList.js.map +0 -1
- package/helpers/transformValueForSearch.d.ts +0 -12
- package/helpers/transformValueForSearch.js +0 -29
- package/helpers/transformValueForSearch.js.map +0 -1
- package/index.js.map +0 -1
- package/operations/entry/elasticsearchFields.d.ts +0 -2
- package/operations/entry/elasticsearchFields.js +0 -38
- package/operations/entry/elasticsearchFields.js.map +0 -1
- package/operations/settings/index.d.ts +0 -6
- package/operations/settings/index.js +0 -135
- package/operations/settings/index.js.map +0 -1
- package/operations/system/index.d.ts +0 -6
- package/operations/system/index.js +0 -99
- package/operations/system/index.js.map +0 -1
- package/plugins/CmsEntryElasticsearchBodyModifierPlugin.d.ts +0 -20
- package/plugins/CmsEntryElasticsearchBodyModifierPlugin.js +0 -24
- package/plugins/CmsEntryElasticsearchBodyModifierPlugin.js.map +0 -1
- package/plugins/CmsEntryElasticsearchFieldPlugin.d.ts +0 -12
- package/plugins/CmsEntryElasticsearchFieldPlugin.js +0 -24
- package/plugins/CmsEntryElasticsearchFieldPlugin.js.map +0 -1
- package/plugins/CmsEntryElasticsearchIndexPlugin.d.ts +0 -4
- package/plugins/CmsEntryElasticsearchIndexPlugin.js +0 -17
- package/plugins/CmsEntryElasticsearchIndexPlugin.js.map +0 -1
- package/plugins/CmsEntryElasticsearchQueryBuilderValueSearchPlugin.d.ts +0 -30
- package/plugins/CmsEntryElasticsearchQueryBuilderValueSearchPlugin.js +0 -43
- package/plugins/CmsEntryElasticsearchQueryBuilderValueSearchPlugin.js.map +0 -1
- package/plugins/CmsEntryElasticsearchQueryModifierPlugin.d.ts +0 -17
- package/plugins/CmsEntryElasticsearchQueryModifierPlugin.js +0 -24
- package/plugins/CmsEntryElasticsearchQueryModifierPlugin.js.map +0 -1
- package/plugins/CmsEntryElasticsearchSortModifierPlugin.d.ts +0 -17
- package/plugins/CmsEntryElasticsearchSortModifierPlugin.js +0 -24
- package/plugins/CmsEntryElasticsearchSortModifierPlugin.js.map +0 -1
- package/plugins/index.d.ts +0 -6
- package/plugins/index.js +0 -83
- package/plugins/index.js.map +0 -1
|
@@ -1,1266 +1,1365 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
var _cloneDeep = _interopRequireDefault(require("lodash/cloneDeep"));
|
|
21
|
-
|
|
22
|
-
var _omit = _interopRequireDefault(require("lodash/omit"));
|
|
23
|
-
|
|
24
|
-
var _batchWrite = require("@webiny/db-dynamodb/utils/batchWrite");
|
|
25
|
-
|
|
26
|
-
var _dataLoaders = require("./dataLoaders");
|
|
27
|
-
|
|
28
|
-
var _keys = require("./keys");
|
|
29
|
-
|
|
30
|
-
var _query = require("@webiny/db-dynamodb/utils/query");
|
|
31
|
-
|
|
32
|
-
var _apiElasticsearch = require("@webiny/api-elasticsearch");
|
|
33
|
-
|
|
34
|
-
var _get = require("@webiny/db-dynamodb/utils/get");
|
|
35
|
-
|
|
36
|
-
var _utils = require("@webiny/utils");
|
|
37
|
-
|
|
38
|
-
var _cleanup = require("@webiny/db-dynamodb/utils/cleanup");
|
|
39
|
-
|
|
40
|
-
const createType = () => {
|
|
41
|
-
return "cms.entry";
|
|
42
|
-
};
|
|
43
|
-
|
|
44
|
-
const createLatestType = () => {
|
|
45
|
-
return `${createType()}.l`;
|
|
46
|
-
};
|
|
47
|
-
|
|
48
|
-
exports.createLatestType = createLatestType;
|
|
49
|
-
|
|
50
|
-
const createPublishedType = () => {
|
|
51
|
-
return `${createType()}.p`;
|
|
52
|
-
};
|
|
53
|
-
|
|
54
|
-
exports.createPublishedType = createPublishedType;
|
|
55
|
-
|
|
56
|
-
const getEntryData = entry => {
|
|
57
|
-
return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, (0, _omit.default)(entry, ["PK", "SK", "published", "latest"])), {}, {
|
|
58
|
-
TYPE: createType(),
|
|
59
|
-
__type: createType()
|
|
60
|
-
});
|
|
61
|
-
};
|
|
62
|
-
|
|
63
|
-
const getESLatestEntryData = async (plugins, entry) => {
|
|
64
|
-
return (0, _apiElasticsearch.compress)(plugins, (0, _objectSpread2.default)((0, _objectSpread2.default)({}, getEntryData(entry)), {}, {
|
|
65
|
-
latest: true,
|
|
66
|
-
TYPE: createLatestType(),
|
|
67
|
-
__type: createLatestType()
|
|
68
|
-
}));
|
|
69
|
-
};
|
|
70
|
-
|
|
71
|
-
const getESPublishedEntryData = async (plugins, entry) => {
|
|
72
|
-
return (0, _apiElasticsearch.compress)(plugins, (0, _objectSpread2.default)((0, _objectSpread2.default)({}, getEntryData(entry)), {}, {
|
|
73
|
-
published: true,
|
|
74
|
-
TYPE: createPublishedType(),
|
|
75
|
-
__type: createPublishedType()
|
|
76
|
-
}));
|
|
77
|
-
};
|
|
78
|
-
|
|
79
|
-
const convertToStorageEntry = params => {
|
|
80
|
-
const {
|
|
81
|
-
model,
|
|
82
|
-
entry
|
|
83
|
-
} = params;
|
|
84
|
-
const values = model.convertValueKeyToStorage({
|
|
85
|
-
fields: model.fields,
|
|
86
|
-
values: entry.values
|
|
87
|
-
});
|
|
88
|
-
return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, entry), {}, {
|
|
89
|
-
values
|
|
90
|
-
});
|
|
91
|
-
};
|
|
92
|
-
|
|
93
|
-
const convertFromStorageEntry = params => {
|
|
94
|
-
const {
|
|
95
|
-
model,
|
|
96
|
-
entry
|
|
97
|
-
} = params;
|
|
98
|
-
const values = model.convertValueKeyFromStorage({
|
|
99
|
-
fields: model.fields,
|
|
100
|
-
values: entry.values
|
|
101
|
-
});
|
|
102
|
-
return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, entry), {}, {
|
|
103
|
-
values
|
|
104
|
-
});
|
|
105
|
-
};
|
|
106
|
-
|
|
107
|
-
const createEntriesStorageOperations = params => {
|
|
108
|
-
const {
|
|
109
|
-
entity,
|
|
110
|
-
esEntity,
|
|
111
|
-
elasticsearch,
|
|
112
|
-
plugins
|
|
113
|
-
} = params;
|
|
114
|
-
const dataLoaders = new _dataLoaders.DataLoadersHandler({
|
|
115
|
-
entity
|
|
116
|
-
});
|
|
117
|
-
|
|
118
|
-
const create = async (model, params) => {
|
|
119
|
-
const {
|
|
120
|
-
entry: initialEntry,
|
|
121
|
-
storageEntry: initialStorageEntry
|
|
122
|
-
} = params;
|
|
123
|
-
const isPublished = initialEntry.status === "published";
|
|
124
|
-
const locked = isPublished ? true : initialEntry.locked;
|
|
125
|
-
const entry = convertToStorageEntry({
|
|
126
|
-
model,
|
|
127
|
-
entry: initialEntry
|
|
128
|
-
});
|
|
129
|
-
const storageEntry = convertToStorageEntry({
|
|
130
|
-
model,
|
|
131
|
-
entry: initialStorageEntry
|
|
1
|
+
import { WebinyError } from "@webiny/error";
|
|
2
|
+
import { CONTENT_ENTRY_STATUS } from "@webiny/api-headless-cms/types/index.js";
|
|
3
|
+
import { extractEntriesFromIndex } from "../../helpers/index.js";
|
|
4
|
+
import { configurations } from "../../configurations.js";
|
|
5
|
+
import { createLimit, decodeCursor, encodeCursor } from "@webiny/api-opensearch";
|
|
6
|
+
import { DataLoadersHandler } from "./dataLoaders.js";
|
|
7
|
+
import { createEntryLatestKeys, createEntryPublishedKeys, createEntryRevisionKeys, createLatestSortKey, createPartitionKey, createPublishedSortKey, createRevisionSortKey } from "./keys.js";
|
|
8
|
+
import { getTotalCount } from "@webiny/api-opensearch/types.js";
|
|
9
|
+
import { createElasticsearchBody } from "./elasticsearch/body.js";
|
|
10
|
+
import { shouldIgnoreEsResponseError } from "./elasticsearch/shouldIgnoreEsResponseError.js";
|
|
11
|
+
import { StorageOperationsCmsModelPlugin } from "@webiny/api-headless-cms";
|
|
12
|
+
import { createTransformer } from "./transformations/index.js";
|
|
13
|
+
import { convertEntryKeysFromStorage } from "./transformations/convertEntryKeys.js";
|
|
14
|
+
import { isDeletedEntryMetaField, isEntryLevelEntryMetaField, isRestoredEntryMetaField, pickEntryMetaFields } from "@webiny/api-headless-cms/constants.js";
|
|
15
|
+
const convertToStorageEntry = (params)=>{
|
|
16
|
+
const { model, storageEntry } = params;
|
|
17
|
+
const values = model.convertValueKeyToStorage({
|
|
18
|
+
fields: model.fields,
|
|
19
|
+
values: storageEntry.values
|
|
132
20
|
});
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
entry: (0, _cloneDeep.default)((0, _objectSpread2.default)((0, _objectSpread2.default)({}, entry), {}, {
|
|
137
|
-
locked
|
|
138
|
-
})),
|
|
139
|
-
storageEntry: (0, _cloneDeep.default)((0, _objectSpread2.default)((0, _objectSpread2.default)({}, storageEntry), {}, {
|
|
140
|
-
locked
|
|
141
|
-
}))
|
|
142
|
-
});
|
|
143
|
-
|
|
144
|
-
const {
|
|
145
|
-
index: esIndex
|
|
146
|
-
} = _configurations.configurations.es({
|
|
147
|
-
model
|
|
148
|
-
});
|
|
149
|
-
|
|
150
|
-
const esLatestData = await getESLatestEntryData(plugins, esEntry);
|
|
151
|
-
const esPublishedData = await getESPublishedEntryData(plugins, esEntry);
|
|
152
|
-
const revisionKeys = {
|
|
153
|
-
PK: (0, _keys.createPartitionKey)({
|
|
154
|
-
id: entry.id,
|
|
155
|
-
locale: model.locale,
|
|
156
|
-
tenant: model.tenant
|
|
157
|
-
}),
|
|
158
|
-
SK: (0, _keys.createRevisionSortKey)(entry)
|
|
21
|
+
return {
|
|
22
|
+
...storageEntry,
|
|
23
|
+
values
|
|
159
24
|
};
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
25
|
+
};
|
|
26
|
+
const createEntriesStorageOperations = (params)=>{
|
|
27
|
+
const { entity, esEntity, elasticsearch, plugins, fieldRegistry, fieldIndexRegistry, compressionHandler, bodyModifiers, sortModifiers, queryModifiers, valueSearchRegistry, fullTextSearches, valuesModifiers, filterRegistry } = params;
|
|
28
|
+
let storageOperationsCmsModelPlugin;
|
|
29
|
+
const getStorageOperationsCmsModelPlugin = ()=>{
|
|
30
|
+
if (storageOperationsCmsModelPlugin) return storageOperationsCmsModelPlugin;
|
|
31
|
+
storageOperationsCmsModelPlugin = plugins.oneByType(StorageOperationsCmsModelPlugin.type);
|
|
32
|
+
return storageOperationsCmsModelPlugin;
|
|
167
33
|
};
|
|
168
|
-
const
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
locale: model.locale,
|
|
172
|
-
tenant: model.tenant
|
|
173
|
-
}),
|
|
174
|
-
SK: (0, _keys.createPublishedSortKey)()
|
|
34
|
+
const getStorageOperationsModel = (model)=>{
|
|
35
|
+
const plugin = getStorageOperationsCmsModelPlugin();
|
|
36
|
+
return plugin.getModel(model);
|
|
175
37
|
};
|
|
176
|
-
const
|
|
177
|
-
|
|
178
|
-
}, revisionKeys), {}, {
|
|
179
|
-
TYPE: createType()
|
|
180
|
-
})), entity.putBatch((0, _objectSpread2.default)((0, _objectSpread2.default)((0, _objectSpread2.default)({}, storageEntry), {}, {
|
|
181
|
-
locked
|
|
182
|
-
}, latestKeys), {}, {
|
|
183
|
-
TYPE: createLatestType()
|
|
184
|
-
}))];
|
|
185
|
-
|
|
186
|
-
if (isPublished) {
|
|
187
|
-
items.push(entity.putBatch((0, _objectSpread2.default)((0, _objectSpread2.default)((0, _objectSpread2.default)({}, storageEntry), {}, {
|
|
188
|
-
locked
|
|
189
|
-
}, publishedKeys), {}, {
|
|
190
|
-
TYPE: createPublishedType()
|
|
191
|
-
})));
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
try {
|
|
195
|
-
await (0, _batchWrite.batchWriteAll)({
|
|
196
|
-
table: entity.table,
|
|
197
|
-
items
|
|
198
|
-
});
|
|
199
|
-
dataLoaders.clearAll({
|
|
200
|
-
model
|
|
201
|
-
});
|
|
202
|
-
} catch (ex) {
|
|
203
|
-
throw new _error.default(ex.message || "Could not insert entry data into the DynamoDB table.", ex.code || "CREATE_ENTRY_ERROR", {
|
|
204
|
-
error: ex,
|
|
205
|
-
entry,
|
|
206
|
-
storageEntry
|
|
207
|
-
});
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
const esItems = [esEntity.putBatch((0, _objectSpread2.default)((0, _objectSpread2.default)({}, latestKeys), {}, {
|
|
211
|
-
index: esIndex,
|
|
212
|
-
data: esLatestData
|
|
213
|
-
}))];
|
|
214
|
-
|
|
215
|
-
if (isPublished) {
|
|
216
|
-
esItems.push(esEntity.putBatch((0, _objectSpread2.default)((0, _objectSpread2.default)({}, publishedKeys), {}, {
|
|
217
|
-
index: esIndex,
|
|
218
|
-
data: esPublishedData
|
|
219
|
-
})));
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
try {
|
|
223
|
-
await (0, _batchWrite.batchWriteAll)({
|
|
224
|
-
table: esEntity.table,
|
|
225
|
-
items: esItems
|
|
226
|
-
});
|
|
227
|
-
} catch (ex) {
|
|
228
|
-
throw new _error.default(ex.message || "Could not insert entry data into the Elasticsearch DynamoDB table.", ex.code || "CREATE_ES_ENTRY_ERROR", {
|
|
229
|
-
error: ex,
|
|
230
|
-
entry,
|
|
231
|
-
esEntry
|
|
232
|
-
});
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
return initialStorageEntry;
|
|
236
|
-
};
|
|
237
|
-
|
|
238
|
-
const createRevisionFrom = async (model, params) => {
|
|
239
|
-
const {
|
|
240
|
-
entry: initialEntry,
|
|
241
|
-
storageEntry: initialStorageEntry
|
|
242
|
-
} = params;
|
|
243
|
-
const entry = convertToStorageEntry({
|
|
244
|
-
model,
|
|
245
|
-
entry: initialEntry
|
|
246
|
-
});
|
|
247
|
-
const storageEntry = convertToStorageEntry({
|
|
248
|
-
model,
|
|
249
|
-
entry: initialStorageEntry
|
|
38
|
+
const dataLoaders = new DataLoadersHandler({
|
|
39
|
+
entity
|
|
250
40
|
});
|
|
251
|
-
const
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
41
|
+
const create = async (initialModel, params)=>{
|
|
42
|
+
const { entry: initialEntry, storageEntry: initialStorageEntry } = params;
|
|
43
|
+
const model = getStorageOperationsModel(initialModel);
|
|
44
|
+
const isPublished = "published" === initialEntry.status;
|
|
45
|
+
const locked = isPublished ? true : initialEntry.locked;
|
|
46
|
+
initialEntry.locked = locked;
|
|
47
|
+
initialStorageEntry.locked = locked;
|
|
48
|
+
const transformer = createTransformer({
|
|
49
|
+
fieldIndexRegistry,
|
|
50
|
+
model,
|
|
51
|
+
entry: initialEntry,
|
|
52
|
+
storageEntry: initialStorageEntry,
|
|
53
|
+
compressionHandler,
|
|
54
|
+
valuesModifiers
|
|
55
|
+
});
|
|
56
|
+
const { entry, storageEntry } = transformer.transformEntryKeys();
|
|
57
|
+
const esEntry = transformer.transformToIndex();
|
|
58
|
+
const { index: esIndex } = configurations.es({
|
|
59
|
+
model
|
|
60
|
+
});
|
|
61
|
+
const revisionKeys = createEntryRevisionKeys(entry);
|
|
62
|
+
const latestKeys = createEntryLatestKeys(entry);
|
|
63
|
+
const publishedKeys = createEntryPublishedKeys(entry);
|
|
64
|
+
const entityBatch = entity.createEntityWriter({
|
|
65
|
+
put: [
|
|
66
|
+
{
|
|
67
|
+
...revisionKeys,
|
|
68
|
+
data: {
|
|
69
|
+
...storageEntry,
|
|
70
|
+
locked
|
|
71
|
+
}
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
...latestKeys,
|
|
75
|
+
data: {
|
|
76
|
+
...storageEntry,
|
|
77
|
+
locked
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
]
|
|
81
|
+
});
|
|
82
|
+
if (isPublished) entityBatch.put({
|
|
83
|
+
...publishedKeys,
|
|
84
|
+
data: {
|
|
85
|
+
...storageEntry,
|
|
86
|
+
locked
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
try {
|
|
90
|
+
await entityBatch.execute();
|
|
91
|
+
dataLoaders.clearAll({
|
|
92
|
+
model
|
|
93
|
+
});
|
|
94
|
+
} catch (ex) {
|
|
95
|
+
throw new WebinyError(ex.message || "Could not insert entry data into the DynamoDB table.", ex.code || "CREATE_ENTRY_ERROR", {
|
|
96
|
+
error: ex,
|
|
97
|
+
entry,
|
|
98
|
+
storageEntry
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
const esLatestData = await transformer.getElasticsearchLatestEntryData();
|
|
102
|
+
const elasticsearchEntityBatch = esEntity.createEntityWriter({
|
|
103
|
+
put: [
|
|
104
|
+
{
|
|
105
|
+
...latestKeys,
|
|
106
|
+
index: esIndex,
|
|
107
|
+
data: esLatestData
|
|
108
|
+
}
|
|
109
|
+
]
|
|
110
|
+
});
|
|
111
|
+
if (isPublished) {
|
|
112
|
+
const esPublishedData = await transformer.getElasticsearchPublishedEntryData();
|
|
113
|
+
elasticsearchEntityBatch.put({
|
|
114
|
+
...publishedKeys,
|
|
115
|
+
index: esIndex,
|
|
116
|
+
data: esPublishedData
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
try {
|
|
120
|
+
await elasticsearchEntityBatch.execute();
|
|
121
|
+
} catch (ex) {
|
|
122
|
+
throw new WebinyError(ex.message || "Could not insert entry data into the Elasticsearch DynamoDB table.", ex.code || "CREATE_ES_ENTRY_ERROR", {
|
|
123
|
+
error: ex,
|
|
124
|
+
entry,
|
|
125
|
+
esEntry
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
return initialStorageEntry;
|
|
258
129
|
};
|
|
259
|
-
const
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
130
|
+
const createRevisionFrom = async (initialModel, params)=>{
|
|
131
|
+
const { entry: initialEntry, storageEntry: initialStorageEntry } = params;
|
|
132
|
+
const model = getStorageOperationsModel(initialModel);
|
|
133
|
+
const transformer = createTransformer({
|
|
134
|
+
model,
|
|
135
|
+
entry: initialEntry,
|
|
136
|
+
storageEntry: initialStorageEntry,
|
|
137
|
+
fieldIndexRegistry,
|
|
138
|
+
compressionHandler,
|
|
139
|
+
valuesModifiers
|
|
140
|
+
});
|
|
141
|
+
const { entry, storageEntry } = transformer.transformEntryKeys();
|
|
142
|
+
const revisionKeys = createEntryRevisionKeys(entry);
|
|
143
|
+
const latestKeys = createEntryLatestKeys(entry);
|
|
144
|
+
const publishedKeys = createEntryPublishedKeys(entry);
|
|
145
|
+
const isPublished = "published" === entry.status;
|
|
146
|
+
const esLatestData = await transformer.getElasticsearchLatestEntryData();
|
|
147
|
+
const entityBatch = entity.createEntityWriter({
|
|
148
|
+
put: [
|
|
149
|
+
{
|
|
150
|
+
...revisionKeys,
|
|
151
|
+
data: storageEntry
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
...latestKeys,
|
|
155
|
+
data: storageEntry
|
|
156
|
+
}
|
|
157
|
+
]
|
|
158
|
+
});
|
|
159
|
+
if (isPublished) {
|
|
160
|
+
entityBatch.put({
|
|
161
|
+
...publishedKeys,
|
|
162
|
+
data: storageEntry
|
|
163
|
+
});
|
|
164
|
+
const [publishedRevisionStorageEntry] = await dataLoaders.getPublishedRevisionByEntryId({
|
|
165
|
+
model,
|
|
166
|
+
ids: [
|
|
167
|
+
entry.id
|
|
168
|
+
]
|
|
169
|
+
});
|
|
170
|
+
if (publishedRevisionStorageEntry) {
|
|
171
|
+
const publishedRevisionKey = createEntryRevisionKeys(publishedRevisionStorageEntry);
|
|
172
|
+
entityBatch.put({
|
|
173
|
+
...publishedRevisionKey,
|
|
174
|
+
data: {
|
|
175
|
+
...publishedRevisionStorageEntry,
|
|
176
|
+
status: CONTENT_ENTRY_STATUS.UNPUBLISHED
|
|
177
|
+
}
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
try {
|
|
182
|
+
await entityBatch.execute();
|
|
183
|
+
dataLoaders.clearAll({
|
|
184
|
+
model
|
|
185
|
+
});
|
|
186
|
+
} catch (ex) {
|
|
187
|
+
throw new WebinyError(ex.message || "Could not create revision from given entry in the DynamoDB table.", ex.code || "CREATE_REVISION_ERROR", {
|
|
188
|
+
error: ex,
|
|
189
|
+
entry,
|
|
190
|
+
storageEntry
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
const { index: esIndex } = configurations.es({
|
|
194
|
+
model
|
|
195
|
+
});
|
|
196
|
+
const elasticsearchEntityBatch = esEntity.createEntityWriter({
|
|
197
|
+
put: [
|
|
198
|
+
{
|
|
199
|
+
...latestKeys,
|
|
200
|
+
index: esIndex,
|
|
201
|
+
data: esLatestData
|
|
202
|
+
}
|
|
203
|
+
]
|
|
204
|
+
});
|
|
205
|
+
if (isPublished) {
|
|
206
|
+
const esPublishedData = await transformer.getElasticsearchPublishedEntryData();
|
|
207
|
+
elasticsearchEntityBatch.put({
|
|
208
|
+
...publishedKeys,
|
|
209
|
+
index: esIndex,
|
|
210
|
+
data: esPublishedData
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
try {
|
|
214
|
+
await elasticsearchEntityBatch.execute();
|
|
215
|
+
} catch (ex) {
|
|
216
|
+
throw new WebinyError(ex.message || "Could not update latest entry in the DynamoDB Elasticsearch table.", ex.code || "CREATE_REVISION_ERROR", {
|
|
217
|
+
error: ex,
|
|
218
|
+
entry
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
return initialStorageEntry;
|
|
266
222
|
};
|
|
267
|
-
const
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
223
|
+
const update = async (initialModel, params)=>{
|
|
224
|
+
const { entry: initialEntry, storageEntry: initialStorageEntry } = params;
|
|
225
|
+
const model = getStorageOperationsModel(initialModel);
|
|
226
|
+
const transformer = createTransformer({
|
|
227
|
+
valuesModifiers,
|
|
228
|
+
model,
|
|
229
|
+
entry: initialEntry,
|
|
230
|
+
storageEntry: initialStorageEntry,
|
|
231
|
+
fieldIndexRegistry,
|
|
232
|
+
compressionHandler
|
|
233
|
+
});
|
|
234
|
+
const { entry, storageEntry } = transformer.transformEntryKeys();
|
|
235
|
+
const isPublished = "published" === entry.status;
|
|
236
|
+
const locked = isPublished ? true : entry.locked;
|
|
237
|
+
const revisionKeys = createEntryRevisionKeys(entry);
|
|
238
|
+
const latestKeys = createEntryLatestKeys(entry);
|
|
239
|
+
const publishedKeys = createEntryPublishedKeys(entry);
|
|
240
|
+
const [latestStorageEntry] = await dataLoaders.getLatestRevisionByEntryId({
|
|
241
|
+
model,
|
|
242
|
+
ids: [
|
|
243
|
+
entry.id
|
|
244
|
+
]
|
|
245
|
+
});
|
|
246
|
+
const [publishedStorageEntry] = await dataLoaders.getPublishedRevisionByEntryId({
|
|
247
|
+
model,
|
|
248
|
+
ids: [
|
|
249
|
+
entry.id
|
|
250
|
+
]
|
|
251
|
+
});
|
|
252
|
+
const entityBatch = entity.createEntityWriter({
|
|
253
|
+
put: [
|
|
254
|
+
{
|
|
255
|
+
...revisionKeys,
|
|
256
|
+
data: {
|
|
257
|
+
...storageEntry,
|
|
258
|
+
locked
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
]
|
|
262
|
+
});
|
|
263
|
+
if (isPublished) entityBatch.put({
|
|
264
|
+
...publishedKeys,
|
|
265
|
+
data: {
|
|
266
|
+
...storageEntry,
|
|
267
|
+
locked
|
|
268
|
+
}
|
|
269
|
+
});
|
|
270
|
+
const elasticsearchEntityBatch = esEntity.createEntityWriter();
|
|
271
|
+
const { index: esIndex } = configurations.es({
|
|
272
|
+
model
|
|
273
|
+
});
|
|
274
|
+
if (latestStorageEntry) {
|
|
275
|
+
const updatingLatestRevision = latestStorageEntry.id === entry.id;
|
|
276
|
+
if (updatingLatestRevision) {
|
|
277
|
+
entityBatch.put({
|
|
278
|
+
...latestKeys,
|
|
279
|
+
data: storageEntry
|
|
280
|
+
});
|
|
281
|
+
const elasticsearchLatestData = await transformer.getElasticsearchLatestEntryData();
|
|
282
|
+
elasticsearchEntityBatch.put({
|
|
283
|
+
...latestKeys,
|
|
284
|
+
index: esIndex,
|
|
285
|
+
data: elasticsearchLatestData
|
|
286
|
+
});
|
|
287
|
+
} else {
|
|
288
|
+
const updatedEntryLevelMetaFields = pickEntryMetaFields(entry, isEntryLevelEntryMetaField);
|
|
289
|
+
const updatedLatestStorageEntry = {
|
|
290
|
+
...latestKeys,
|
|
291
|
+
data: {
|
|
292
|
+
...latestStorageEntry,
|
|
293
|
+
...updatedEntryLevelMetaFields
|
|
294
|
+
}
|
|
295
|
+
};
|
|
296
|
+
entityBatch.put({
|
|
297
|
+
...updatedLatestStorageEntry,
|
|
298
|
+
PK: createPartitionKey({
|
|
299
|
+
id: latestStorageEntry.id,
|
|
300
|
+
tenant: model.tenant
|
|
301
|
+
}),
|
|
302
|
+
SK: createRevisionSortKey(latestStorageEntry)
|
|
303
|
+
});
|
|
304
|
+
entityBatch.put({
|
|
305
|
+
...updatedLatestStorageEntry
|
|
306
|
+
});
|
|
307
|
+
const latestEsEntry = await esEntity.getClean(latestKeys);
|
|
308
|
+
if (latestEsEntry) {
|
|
309
|
+
const latestEsEntryDataDecompressed = await compressionHandler.decompress(latestEsEntry.data);
|
|
310
|
+
const updatedLatestEntry = await compressionHandler.compress({
|
|
311
|
+
...latestEsEntryDataDecompressed,
|
|
312
|
+
...updatedEntryLevelMetaFields
|
|
313
|
+
});
|
|
314
|
+
elasticsearchEntityBatch.put({
|
|
315
|
+
...latestKeys,
|
|
316
|
+
index: esIndex,
|
|
317
|
+
data: updatedLatestEntry
|
|
318
|
+
});
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
if (isPublished && publishedStorageEntry?.id === entry.id) {
|
|
323
|
+
const elasticsearchPublishedData = await transformer.getElasticsearchPublishedEntryData();
|
|
324
|
+
elasticsearchEntityBatch.put({
|
|
325
|
+
...publishedKeys,
|
|
326
|
+
index: esIndex,
|
|
327
|
+
data: elasticsearchPublishedData
|
|
328
|
+
});
|
|
329
|
+
}
|
|
330
|
+
try {
|
|
331
|
+
await entityBatch.execute();
|
|
332
|
+
dataLoaders.clearAll({
|
|
333
|
+
model
|
|
334
|
+
});
|
|
335
|
+
} catch (ex) {
|
|
336
|
+
throw new WebinyError(ex.message || "Could not update entry DynamoDB records.", ex.code || "UPDATE_ENTRY_ERROR", {
|
|
337
|
+
error: ex,
|
|
338
|
+
entry,
|
|
339
|
+
storageEntry
|
|
340
|
+
});
|
|
341
|
+
}
|
|
342
|
+
try {
|
|
343
|
+
await elasticsearchEntityBatch.execute();
|
|
344
|
+
} catch (ex) {
|
|
345
|
+
throw new WebinyError(ex.message || "Could not update entry DynamoDB Elasticsearch records.", ex.code || "UPDATE_ES_ENTRY_ERROR", {
|
|
346
|
+
error: ex,
|
|
347
|
+
entry
|
|
348
|
+
});
|
|
349
|
+
}
|
|
350
|
+
return initialStorageEntry;
|
|
347
351
|
};
|
|
348
|
-
const
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
352
|
+
const move = async (initialModel, id, folderId)=>{
|
|
353
|
+
const model = getStorageOperationsModel(initialModel);
|
|
354
|
+
const partitionKey = createPartitionKey({
|
|
355
|
+
id,
|
|
356
|
+
tenant: model.tenant
|
|
357
|
+
});
|
|
358
|
+
const queryAllParams = {
|
|
359
|
+
partitionKey,
|
|
360
|
+
options: {
|
|
361
|
+
gte: " "
|
|
362
|
+
}
|
|
363
|
+
};
|
|
364
|
+
const latestSortKey = createLatestSortKey();
|
|
365
|
+
const publishedSortKey = createPublishedSortKey();
|
|
366
|
+
const records = await entity.queryAll(queryAllParams);
|
|
367
|
+
let latestRecord;
|
|
368
|
+
let publishedRecord;
|
|
369
|
+
const entityBatch = entity.createEntityWriter();
|
|
370
|
+
for (const record of records){
|
|
371
|
+
entityBatch.put({
|
|
372
|
+
...record,
|
|
373
|
+
data: {
|
|
374
|
+
...record.data,
|
|
375
|
+
location: {
|
|
376
|
+
...record.data.location,
|
|
377
|
+
folderId
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
});
|
|
381
|
+
if (record.SK === publishedSortKey) publishedRecord = record.data;
|
|
382
|
+
else if (record.SK === latestSortKey) latestRecord = record.data;
|
|
383
|
+
}
|
|
384
|
+
try {
|
|
385
|
+
await entityBatch.execute();
|
|
386
|
+
dataLoaders.clearAll({
|
|
387
|
+
model
|
|
388
|
+
});
|
|
389
|
+
} catch (ex) {
|
|
390
|
+
throw new WebinyError(ex.message || "Could not move all entry records from in the DynamoDB table.", ex.code || "MOVE_ENTRY_ERROR", {
|
|
391
|
+
error: ex,
|
|
392
|
+
id
|
|
393
|
+
});
|
|
394
|
+
}
|
|
395
|
+
const esEntityReader = esEntity.createEntityReader();
|
|
396
|
+
if (publishedRecord) esEntityReader.get({
|
|
397
|
+
PK: partitionKey,
|
|
398
|
+
SK: publishedSortKey
|
|
399
|
+
});
|
|
400
|
+
if (latestRecord) esEntityReader.get({
|
|
401
|
+
PK: partitionKey,
|
|
402
|
+
SK: latestSortKey
|
|
403
|
+
});
|
|
404
|
+
if (0 === esEntityReader.total) return;
|
|
405
|
+
const esRecords = await esEntityReader.execute();
|
|
406
|
+
const esItems = (await Promise.all(esRecords.map(async (record)=>{
|
|
407
|
+
if (!record) return null;
|
|
408
|
+
return {
|
|
409
|
+
...record,
|
|
410
|
+
data: await compressionHandler.decompress(record.data)
|
|
411
|
+
};
|
|
412
|
+
}))).filter((item)=>!!item);
|
|
413
|
+
if (0 === esItems.length) return;
|
|
414
|
+
try {
|
|
415
|
+
const elasticsearchEntityBatch = esEntity.createEntityWriter({
|
|
416
|
+
put: await Promise.all(esItems.map(async (item)=>({
|
|
417
|
+
...item,
|
|
418
|
+
data: await compressionHandler.compress({
|
|
419
|
+
...item.data,
|
|
420
|
+
location: {
|
|
421
|
+
...item.data?.location,
|
|
422
|
+
folderId
|
|
423
|
+
}
|
|
424
|
+
})
|
|
425
|
+
})))
|
|
426
|
+
});
|
|
427
|
+
await elasticsearchEntityBatch.execute();
|
|
428
|
+
} catch (ex) {
|
|
429
|
+
throw new WebinyError(ex.message || "Could not move entry DynamoDB Elasticsearch records.", ex.code || "MOVE_ES_ENTRY_ERROR", {
|
|
430
|
+
error: ex,
|
|
431
|
+
partitionKey
|
|
432
|
+
});
|
|
433
|
+
}
|
|
355
434
|
};
|
|
356
|
-
const
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
435
|
+
const moveToBin = async (initialModel, params)=>{
|
|
436
|
+
const { entry: initialEntry, storageEntry: initialStorageEntry } = params;
|
|
437
|
+
const model = getStorageOperationsModel(initialModel);
|
|
438
|
+
const transformer = createTransformer({
|
|
439
|
+
valuesModifiers,
|
|
440
|
+
model,
|
|
441
|
+
entry: initialEntry,
|
|
442
|
+
storageEntry: initialStorageEntry,
|
|
443
|
+
fieldIndexRegistry,
|
|
444
|
+
compressionHandler
|
|
445
|
+
});
|
|
446
|
+
const { entry, storageEntry } = transformer.transformEntryKeys();
|
|
447
|
+
const partitionKey = createPartitionKey({
|
|
448
|
+
id: entry.id,
|
|
449
|
+
tenant: model.tenant
|
|
450
|
+
});
|
|
451
|
+
const queryAllParams = {
|
|
452
|
+
partitionKey,
|
|
453
|
+
options: {
|
|
454
|
+
gte: " "
|
|
455
|
+
}
|
|
456
|
+
};
|
|
457
|
+
const latestSortKey = createLatestSortKey();
|
|
458
|
+
const publishedSortKey = createPublishedSortKey();
|
|
459
|
+
const records = await entity.queryAll(queryAllParams);
|
|
460
|
+
const updatedEntryMetaFields = pickEntryMetaFields(entry, isDeletedEntryMetaField);
|
|
461
|
+
let latestRecord;
|
|
462
|
+
let publishedRecord;
|
|
463
|
+
const entityBatch = entity.createEntityWriter();
|
|
464
|
+
for (const record of records){
|
|
465
|
+
entityBatch.put({
|
|
466
|
+
...record,
|
|
467
|
+
data: {
|
|
468
|
+
...record.data,
|
|
469
|
+
...updatedEntryMetaFields,
|
|
470
|
+
wbyDeleted: storageEntry.wbyDeleted,
|
|
471
|
+
location: storageEntry.location,
|
|
472
|
+
binOriginalFolderId: storageEntry.binOriginalFolderId
|
|
473
|
+
}
|
|
474
|
+
});
|
|
475
|
+
if (record.SK === publishedSortKey) publishedRecord = record.data;
|
|
476
|
+
else if (record.SK === latestSortKey) latestRecord = record.data;
|
|
477
|
+
}
|
|
478
|
+
try {
|
|
479
|
+
await entityBatch.execute();
|
|
480
|
+
dataLoaders.clearAll({
|
|
481
|
+
model
|
|
482
|
+
});
|
|
483
|
+
} catch (ex) {
|
|
484
|
+
throw new WebinyError(ex.message || "Could mark as deleted all entry records from in the DynamoDB table.", ex.code || "MOVE_ENTRY_TO_BIN_ERROR", {
|
|
485
|
+
error: ex,
|
|
486
|
+
entry,
|
|
487
|
+
storageEntry
|
|
488
|
+
});
|
|
489
|
+
}
|
|
490
|
+
const esEntityReader = esEntity.createEntityReader();
|
|
491
|
+
if (publishedRecord) esEntityReader.get({
|
|
492
|
+
PK: partitionKey,
|
|
493
|
+
SK: publishedSortKey
|
|
494
|
+
});
|
|
495
|
+
if (latestRecord) esEntityReader.get({
|
|
496
|
+
PK: partitionKey,
|
|
497
|
+
SK: latestSortKey
|
|
498
|
+
});
|
|
499
|
+
if (0 === esEntityReader.total) return;
|
|
500
|
+
const esRecords = await esEntityReader.execute();
|
|
501
|
+
const esItems = (await Promise.all(esRecords.map(async (record)=>{
|
|
502
|
+
if (!record) return null;
|
|
503
|
+
return {
|
|
504
|
+
...record,
|
|
505
|
+
data: await compressionHandler.decompress(record.data)
|
|
506
|
+
};
|
|
507
|
+
}))).filter((item)=>!!item);
|
|
508
|
+
if (0 === esItems.length) return;
|
|
509
|
+
const elasticsearchEntityBatch = esEntity.createEntityWriter();
|
|
510
|
+
for (const item of esItems)elasticsearchEntityBatch.put({
|
|
511
|
+
...item,
|
|
512
|
+
data: await compressionHandler.compress({
|
|
513
|
+
...item.data,
|
|
514
|
+
...updatedEntryMetaFields,
|
|
515
|
+
wbyDeleted: entry.wbyDeleted,
|
|
516
|
+
location: entry.location,
|
|
517
|
+
binOriginalFolderId: entry.binOriginalFolderId
|
|
518
|
+
})
|
|
519
|
+
});
|
|
520
|
+
try {
|
|
521
|
+
await elasticsearchEntityBatch.execute();
|
|
522
|
+
} catch (ex) {
|
|
523
|
+
throw new WebinyError(ex.message || "Could not mark as deleted entry records from DynamoDB Elasticsearch table.", ex.code || "MOVE_ENTRY_TO_BIN_ERROR", {
|
|
524
|
+
error: ex,
|
|
525
|
+
entry,
|
|
526
|
+
storageEntry
|
|
527
|
+
});
|
|
528
|
+
}
|
|
363
529
|
};
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
model,
|
|
370
|
-
ids: [entry.id]
|
|
371
|
-
});
|
|
372
|
-
const [publishedStorageEntry] = await dataLoaders.getPublishedRevisionByEntryId({
|
|
373
|
-
model,
|
|
374
|
-
ids: [entry.id]
|
|
375
|
-
});
|
|
376
|
-
const items = [entity.putBatch((0, _objectSpread2.default)((0, _objectSpread2.default)((0, _objectSpread2.default)({}, storageEntry), {}, {
|
|
377
|
-
locked
|
|
378
|
-
}, revisionKeys), {}, {
|
|
379
|
-
TYPE: createType()
|
|
380
|
-
}))];
|
|
381
|
-
|
|
382
|
-
if (isPublished) {
|
|
383
|
-
items.push(entity.putBatch((0, _objectSpread2.default)((0, _objectSpread2.default)((0, _objectSpread2.default)({}, storageEntry), {}, {
|
|
384
|
-
locked
|
|
385
|
-
}, publishedKeys), {}, {
|
|
386
|
-
TYPE: createPublishedType()
|
|
387
|
-
})));
|
|
388
|
-
}
|
|
389
|
-
|
|
390
|
-
const esItems = [];
|
|
391
|
-
|
|
392
|
-
const {
|
|
393
|
-
index: esIndex
|
|
394
|
-
} = _configurations.configurations.es({
|
|
395
|
-
model
|
|
396
|
-
});
|
|
397
|
-
/**
|
|
398
|
-
* Variable for the elasticsearch entry so we do not convert it more than once
|
|
399
|
-
*/
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
let esEntry = undefined;
|
|
403
|
-
/**
|
|
404
|
-
* If the latest entry is the one being updated, we need to create a new latest entry records.
|
|
405
|
-
*/
|
|
406
|
-
|
|
407
|
-
let elasticsearchLatestData = null;
|
|
408
|
-
|
|
409
|
-
if ((latestStorageEntry === null || latestStorageEntry === void 0 ? void 0 : latestStorageEntry.id) === entry.id) {
|
|
410
|
-
/**
|
|
411
|
-
* First we update the regular DynamoDB table
|
|
412
|
-
*/
|
|
413
|
-
items.push(entity.putBatch((0, _objectSpread2.default)((0, _objectSpread2.default)((0, _objectSpread2.default)({}, storageEntry), latestKeys), {}, {
|
|
414
|
-
TYPE: (0, _keys.createLatestSortKey)()
|
|
415
|
-
})));
|
|
416
|
-
/**
|
|
417
|
-
* And then update the Elasticsearch table to propagate changes to the Elasticsearch
|
|
418
|
-
*/
|
|
419
|
-
|
|
420
|
-
esEntry = (0, _helpers.prepareEntryToIndex)({
|
|
421
|
-
plugins,
|
|
422
|
-
model,
|
|
423
|
-
entry: (0, _cloneDeep.default)((0, _objectSpread2.default)((0, _objectSpread2.default)({}, entry), {}, {
|
|
424
|
-
locked
|
|
425
|
-
})),
|
|
426
|
-
storageEntry: (0, _cloneDeep.default)((0, _objectSpread2.default)((0, _objectSpread2.default)({}, storageEntry), {}, {
|
|
427
|
-
locked
|
|
428
|
-
}))
|
|
429
|
-
});
|
|
430
|
-
elasticsearchLatestData = await getESLatestEntryData(plugins, esEntry);
|
|
431
|
-
esItems.push(esEntity.putBatch((0, _objectSpread2.default)((0, _objectSpread2.default)({}, latestKeys), {}, {
|
|
432
|
-
index: esIndex,
|
|
433
|
-
data: elasticsearchLatestData
|
|
434
|
-
})));
|
|
435
|
-
}
|
|
436
|
-
|
|
437
|
-
let elasticsearchPublishedData = null;
|
|
438
|
-
|
|
439
|
-
if (isPublished && (publishedStorageEntry === null || publishedStorageEntry === void 0 ? void 0 : publishedStorageEntry.id) === entry.id) {
|
|
440
|
-
if (!elasticsearchLatestData) {
|
|
441
|
-
/**
|
|
442
|
-
* And then update the Elasticsearch table to propagate changes to the Elasticsearch
|
|
443
|
-
*/
|
|
444
|
-
if (!esEntry) {
|
|
445
|
-
esEntry = (0, _helpers.prepareEntryToIndex)({
|
|
446
|
-
plugins,
|
|
530
|
+
const restoreFromBin = async (initialModel, params)=>{
|
|
531
|
+
const { entry: initialEntry, storageEntry: initialStorageEntry } = params;
|
|
532
|
+
const model = getStorageOperationsModel(initialModel);
|
|
533
|
+
const transformer = createTransformer({
|
|
534
|
+
valuesModifiers,
|
|
447
535
|
model,
|
|
448
|
-
entry:
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
536
|
+
entry: initialEntry,
|
|
537
|
+
storageEntry: initialStorageEntry,
|
|
538
|
+
fieldIndexRegistry,
|
|
539
|
+
compressionHandler
|
|
540
|
+
});
|
|
541
|
+
const { entry, storageEntry } = transformer.transformEntryKeys();
|
|
542
|
+
const updatedEntryMetaFields = pickEntryMetaFields(entry, isRestoredEntryMetaField);
|
|
543
|
+
const partitionKey = createPartitionKey({
|
|
544
|
+
id: entry.id,
|
|
545
|
+
tenant: model.tenant
|
|
546
|
+
});
|
|
547
|
+
const queryAllParams = {
|
|
548
|
+
partitionKey,
|
|
549
|
+
options: {
|
|
550
|
+
gte: " "
|
|
551
|
+
}
|
|
552
|
+
};
|
|
553
|
+
const latestSortKey = createLatestSortKey();
|
|
554
|
+
const publishedSortKey = createPublishedSortKey();
|
|
555
|
+
const records = await entity.queryAll(queryAllParams);
|
|
556
|
+
let latestRecord;
|
|
557
|
+
let publishedRecord;
|
|
558
|
+
const entityBatch = entity.createEntityWriter();
|
|
559
|
+
for (const record of records){
|
|
560
|
+
entityBatch.put({
|
|
561
|
+
...record,
|
|
562
|
+
data: {
|
|
563
|
+
...record.data,
|
|
564
|
+
...updatedEntryMetaFields,
|
|
565
|
+
wbyDeleted: storageEntry.wbyDeleted,
|
|
566
|
+
location: storageEntry.location,
|
|
567
|
+
binOriginalFolderId: storageEntry.binOriginalFolderId
|
|
568
|
+
}
|
|
569
|
+
});
|
|
570
|
+
if (record.SK === publishedSortKey) publishedRecord = record.data;
|
|
571
|
+
else if (record.SK === latestSortKey) latestRecord = record.data;
|
|
455
572
|
}
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
}
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
573
|
+
try {
|
|
574
|
+
await entityBatch.execute();
|
|
575
|
+
dataLoaders.clearAll({
|
|
576
|
+
model
|
|
577
|
+
});
|
|
578
|
+
} catch (ex) {
|
|
579
|
+
throw new WebinyError(ex.message || "Could not restore all entry records from in the DynamoDB table.", ex.code || "RESTORE_ENTRY_ERROR", {
|
|
580
|
+
error: ex,
|
|
581
|
+
entry,
|
|
582
|
+
storageEntry
|
|
583
|
+
});
|
|
584
|
+
}
|
|
585
|
+
const esEntityReader = esEntity.createEntityReader();
|
|
586
|
+
if (publishedRecord) esEntityReader.get({
|
|
587
|
+
PK: partitionKey,
|
|
588
|
+
SK: publishedSortKey
|
|
589
|
+
});
|
|
590
|
+
if (latestRecord) esEntityReader.get({
|
|
591
|
+
PK: partitionKey,
|
|
592
|
+
SK: latestSortKey
|
|
593
|
+
});
|
|
594
|
+
const esRecords = await esEntityReader.execute();
|
|
595
|
+
const esItems = (await Promise.all(esRecords.map(async (record)=>{
|
|
596
|
+
if (!record) return null;
|
|
597
|
+
return {
|
|
598
|
+
...record,
|
|
599
|
+
data: await compressionHandler.decompress(record.data)
|
|
600
|
+
};
|
|
601
|
+
}))).filter((item)=>!!item);
|
|
602
|
+
if (0 === esItems.length) return initialStorageEntry;
|
|
603
|
+
const elasticsearchEntityBatch = esEntity.createEntityWriter();
|
|
604
|
+
for (const item of esItems)elasticsearchEntityBatch.put({
|
|
605
|
+
...item,
|
|
606
|
+
data: await compressionHandler.compress({
|
|
607
|
+
...item.data,
|
|
608
|
+
...updatedEntryMetaFields,
|
|
609
|
+
wbyDeleted: entry.wbyDeleted,
|
|
610
|
+
location: entry.location,
|
|
611
|
+
binOriginalFolderId: entry.binOriginalFolderId
|
|
612
|
+
})
|
|
613
|
+
});
|
|
614
|
+
try {
|
|
615
|
+
await elasticsearchEntityBatch.execute();
|
|
616
|
+
} catch (ex) {
|
|
617
|
+
throw new WebinyError(ex.message || "Could not restore entry records from DynamoDB Elasticsearch table.", ex.code || "RESTORE_ENTRY_ERROR", {
|
|
618
|
+
error: ex,
|
|
619
|
+
entry,
|
|
620
|
+
storageEntry
|
|
621
|
+
});
|
|
622
|
+
}
|
|
623
|
+
return initialStorageEntry;
|
|
624
|
+
};
|
|
625
|
+
const deleteEntry = async (initialModel, params)=>{
|
|
626
|
+
const { entry } = params;
|
|
627
|
+
const id = entry.id || entry.entryId;
|
|
628
|
+
const model = getStorageOperationsModel(initialModel);
|
|
629
|
+
const partitionKey = createPartitionKey({
|
|
630
|
+
id,
|
|
631
|
+
tenant: model.tenant
|
|
632
|
+
});
|
|
633
|
+
const items = await entity.queryAll({
|
|
634
|
+
partitionKey,
|
|
635
|
+
options: {
|
|
636
|
+
gte: " "
|
|
637
|
+
}
|
|
638
|
+
});
|
|
639
|
+
const esItems = await esEntity.queryAll({
|
|
640
|
+
partitionKey,
|
|
641
|
+
options: {
|
|
642
|
+
gte: " "
|
|
643
|
+
}
|
|
644
|
+
});
|
|
645
|
+
const entityBatch = entity.createEntityWriter({
|
|
646
|
+
delete: items.map((item)=>({
|
|
647
|
+
PK: item.PK,
|
|
648
|
+
SK: item.SK
|
|
649
|
+
}))
|
|
650
|
+
});
|
|
651
|
+
const elasticsearchEntityBatch = esEntity.createEntityWriter({
|
|
652
|
+
delete: esItems.map((item)=>({
|
|
653
|
+
PK: item.PK,
|
|
654
|
+
SK: item.SK
|
|
655
|
+
}))
|
|
656
|
+
});
|
|
657
|
+
try {
|
|
658
|
+
await entityBatch.execute();
|
|
659
|
+
dataLoaders.clearAll({
|
|
660
|
+
model
|
|
661
|
+
});
|
|
662
|
+
} catch (ex) {
|
|
663
|
+
throw new WebinyError(ex.message || "Could not destroy entry records from DynamoDB table.", ex.code || "DELETE_ENTRY_ERROR", {
|
|
664
|
+
error: ex,
|
|
665
|
+
id
|
|
666
|
+
});
|
|
667
|
+
}
|
|
668
|
+
try {
|
|
669
|
+
await elasticsearchEntityBatch.execute();
|
|
670
|
+
} catch (ex) {
|
|
671
|
+
throw new WebinyError(ex.message || "Could not destroy entry records from DynamoDB Elasticsearch table.", ex.code || "DELETE_ENTRY_ERROR", {
|
|
672
|
+
error: ex,
|
|
673
|
+
id
|
|
674
|
+
});
|
|
675
|
+
}
|
|
676
|
+
};
|
|
677
|
+
const deleteRevision = async (initialModel, params)=>{
|
|
678
|
+
const { entry, latestEntry, latestStorageEntry: initialLatestStorageEntry } = params;
|
|
679
|
+
const model = getStorageOperationsModel(initialModel);
|
|
680
|
+
const partitionKey = createPartitionKey({
|
|
681
|
+
id: entry.id,
|
|
682
|
+
tenant: model.tenant
|
|
683
|
+
});
|
|
684
|
+
const { index } = configurations.es({
|
|
685
|
+
model
|
|
686
|
+
});
|
|
687
|
+
const [publishedStorageEntry] = await dataLoaders.getPublishedRevisionByEntryId({
|
|
688
|
+
model,
|
|
689
|
+
ids: [
|
|
690
|
+
entry.id
|
|
691
|
+
]
|
|
692
|
+
});
|
|
693
|
+
const entityBatch = entity.createEntityWriter({
|
|
694
|
+
delete: [
|
|
695
|
+
{
|
|
696
|
+
PK: partitionKey,
|
|
697
|
+
SK: createRevisionSortKey(entry)
|
|
698
|
+
}
|
|
699
|
+
]
|
|
700
|
+
});
|
|
701
|
+
const elasticsearchEntityBatch = esEntity.createEntityWriter();
|
|
702
|
+
if (publishedStorageEntry?.id === entry.id) {
|
|
703
|
+
entityBatch.delete({
|
|
704
|
+
PK: partitionKey,
|
|
705
|
+
SK: createPublishedSortKey()
|
|
706
|
+
});
|
|
707
|
+
elasticsearchEntityBatch.delete({
|
|
708
|
+
PK: partitionKey,
|
|
709
|
+
SK: createPublishedSortKey()
|
|
710
|
+
});
|
|
711
|
+
}
|
|
712
|
+
if (latestEntry && initialLatestStorageEntry) {
|
|
713
|
+
const latestStorageEntry = convertToStorageEntry({
|
|
714
|
+
storageEntry: initialLatestStorageEntry,
|
|
715
|
+
model
|
|
716
|
+
});
|
|
717
|
+
const latestStorageEntryLatestKey = createEntryLatestKeys(latestStorageEntry);
|
|
718
|
+
entityBatch.put({
|
|
719
|
+
...latestStorageEntryLatestKey,
|
|
720
|
+
data: latestStorageEntry
|
|
721
|
+
});
|
|
722
|
+
const actualRevisionEntryKey = createEntryRevisionKeys(initialLatestStorageEntry);
|
|
723
|
+
entityBatch.put({
|
|
724
|
+
...actualRevisionEntryKey,
|
|
725
|
+
data: latestStorageEntry
|
|
726
|
+
});
|
|
727
|
+
const latestTransformer = createTransformer({
|
|
728
|
+
valuesModifiers,
|
|
729
|
+
model,
|
|
730
|
+
entry: latestEntry,
|
|
731
|
+
storageEntry: initialLatestStorageEntry,
|
|
732
|
+
fieldIndexRegistry,
|
|
733
|
+
compressionHandler
|
|
734
|
+
});
|
|
735
|
+
const esLatestData = await latestTransformer.getElasticsearchLatestEntryData();
|
|
736
|
+
const esLatestKeys = createEntryLatestKeys(latestEntry);
|
|
737
|
+
elasticsearchEntityBatch.put({
|
|
738
|
+
...esLatestKeys,
|
|
739
|
+
index,
|
|
740
|
+
data: esLatestData
|
|
741
|
+
});
|
|
742
|
+
}
|
|
743
|
+
try {
|
|
744
|
+
await entityBatch.execute();
|
|
745
|
+
dataLoaders.clearAll({
|
|
746
|
+
model
|
|
747
|
+
});
|
|
748
|
+
} catch (ex) {
|
|
749
|
+
throw new WebinyError(ex.message || "Could not batch write entry records to DynamoDB table.", ex.code || "DELETE_REVISION_ERROR", {
|
|
750
|
+
error: ex,
|
|
751
|
+
entry,
|
|
752
|
+
latestEntry,
|
|
753
|
+
initialLatestStorageEntry
|
|
754
|
+
});
|
|
755
|
+
}
|
|
756
|
+
try {
|
|
757
|
+
await elasticsearchEntityBatch.execute();
|
|
758
|
+
} catch (ex) {
|
|
759
|
+
throw new WebinyError(ex.message || "Could not batch write entry records to DynamoDB Elasticsearch table.", ex.code || "DELETE_REVISION_ERROR", {
|
|
760
|
+
error: ex,
|
|
761
|
+
entry,
|
|
762
|
+
latestEntry,
|
|
763
|
+
initialLatestStorageEntry
|
|
764
|
+
});
|
|
765
|
+
}
|
|
766
|
+
};
|
|
767
|
+
const deleteMultipleEntries = async (initialModel, params)=>{
|
|
768
|
+
const { entries } = params;
|
|
769
|
+
const model = getStorageOperationsModel(initialModel);
|
|
770
|
+
const revisions = await dataLoaders.getAllEntryRevisions({
|
|
771
|
+
model,
|
|
772
|
+
ids: entries
|
|
773
|
+
});
|
|
774
|
+
const entityBatch = entity.createEntityWriter();
|
|
775
|
+
const elasticsearchEntityBatch = esEntity.createEntityWriter();
|
|
776
|
+
for (const id of entries){
|
|
777
|
+
entityBatch.delete({
|
|
778
|
+
PK: createPartitionKey({
|
|
779
|
+
id,
|
|
780
|
+
tenant: model.tenant
|
|
781
|
+
}),
|
|
782
|
+
SK: "L"
|
|
783
|
+
});
|
|
784
|
+
elasticsearchEntityBatch.delete({
|
|
785
|
+
PK: createPartitionKey({
|
|
786
|
+
id,
|
|
787
|
+
tenant: model.tenant
|
|
788
|
+
}),
|
|
789
|
+
SK: "L"
|
|
790
|
+
});
|
|
791
|
+
entityBatch.delete({
|
|
792
|
+
PK: createPartitionKey({
|
|
793
|
+
id,
|
|
794
|
+
tenant: model.tenant
|
|
795
|
+
}),
|
|
796
|
+
SK: "P"
|
|
797
|
+
});
|
|
798
|
+
elasticsearchEntityBatch.delete({
|
|
799
|
+
PK: createPartitionKey({
|
|
800
|
+
id,
|
|
801
|
+
tenant: model.tenant
|
|
802
|
+
}),
|
|
803
|
+
SK: "P"
|
|
804
|
+
});
|
|
805
|
+
}
|
|
806
|
+
for (const revision of revisions)entityBatch.delete({
|
|
807
|
+
PK: createPartitionKey({
|
|
808
|
+
id: revision.id,
|
|
809
|
+
tenant: model.tenant
|
|
810
|
+
}),
|
|
811
|
+
SK: createRevisionSortKey({
|
|
812
|
+
version: revision.version
|
|
813
|
+
})
|
|
814
|
+
});
|
|
815
|
+
await entityBatch.execute();
|
|
816
|
+
await elasticsearchEntityBatch.execute();
|
|
817
|
+
};
|
|
818
|
+
const list = async (initialModel, params)=>{
|
|
819
|
+
const model = getStorageOperationsModel(initialModel);
|
|
820
|
+
const limit = createLimit(params.limit, 50);
|
|
821
|
+
const { index } = configurations.es({
|
|
822
|
+
model
|
|
823
|
+
});
|
|
824
|
+
const body = createElasticsearchBody({
|
|
825
|
+
model,
|
|
826
|
+
fieldRegistry,
|
|
827
|
+
fieldIndexRegistry,
|
|
828
|
+
bodyModifiers,
|
|
829
|
+
sortModifiers,
|
|
830
|
+
queryModifiers,
|
|
831
|
+
valueSearchRegistry,
|
|
832
|
+
fullTextSearches,
|
|
833
|
+
filterRegistry,
|
|
834
|
+
params: {
|
|
835
|
+
...params,
|
|
836
|
+
limit,
|
|
837
|
+
after: decodeCursor(params.after)
|
|
838
|
+
},
|
|
839
|
+
plugins
|
|
840
|
+
});
|
|
841
|
+
let response;
|
|
842
|
+
try {
|
|
843
|
+
response = await elasticsearch.search({
|
|
844
|
+
index,
|
|
845
|
+
body
|
|
846
|
+
});
|
|
847
|
+
} catch (error) {
|
|
848
|
+
if (shouldIgnoreEsResponseError(error)) return {
|
|
849
|
+
hasMoreItems: false,
|
|
850
|
+
totalCount: 0,
|
|
851
|
+
cursor: null,
|
|
852
|
+
items: []
|
|
853
|
+
};
|
|
854
|
+
throw new WebinyError(error.message, error.code || "OPENSEARCH_ERROR", {
|
|
855
|
+
error,
|
|
856
|
+
index,
|
|
857
|
+
body,
|
|
858
|
+
model
|
|
859
|
+
});
|
|
860
|
+
}
|
|
861
|
+
const { hits, total } = response.body.hits;
|
|
862
|
+
const items = extractEntriesFromIndex({
|
|
863
|
+
fieldRegistry,
|
|
864
|
+
fieldIndexRegistry,
|
|
865
|
+
model,
|
|
866
|
+
entries: hits.map((item)=>item._source)
|
|
867
|
+
}).map((item)=>convertEntryKeysFromStorage({
|
|
868
|
+
model,
|
|
869
|
+
entry: item
|
|
870
|
+
}));
|
|
871
|
+
const hasMoreItems = items.length > limit;
|
|
872
|
+
if (hasMoreItems) items.pop();
|
|
873
|
+
const cursor = items.length > 0 ? encodeCursor(hits[items.length - 1].sort) || null : null;
|
|
702
874
|
return {
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
875
|
+
hasMoreItems,
|
|
876
|
+
totalCount: getTotalCount(total),
|
|
877
|
+
cursor,
|
|
878
|
+
items
|
|
707
879
|
};
|
|
708
|
-
}
|
|
709
|
-
} catch (ex) {
|
|
710
|
-
throw new _error.default("Could not determine if Elasticsearch index exists.", "ELASTICSEARCH_INDEX_CHECK_ERROR", {
|
|
711
|
-
error: ex,
|
|
712
|
-
index
|
|
713
|
-
});
|
|
714
|
-
}
|
|
715
|
-
|
|
716
|
-
const body = (0, _helpers.createElasticsearchQueryBody)({
|
|
717
|
-
model,
|
|
718
|
-
args: (0, _objectSpread2.default)((0, _objectSpread2.default)({}, params), {}, {
|
|
719
|
-
limit
|
|
720
|
-
}),
|
|
721
|
-
plugins,
|
|
722
|
-
parentPath: "values"
|
|
723
|
-
});
|
|
724
|
-
let response;
|
|
725
|
-
|
|
726
|
-
try {
|
|
727
|
-
response = await elasticsearch.search({
|
|
728
|
-
index,
|
|
729
|
-
body
|
|
730
|
-
});
|
|
731
|
-
} catch (ex) {
|
|
732
|
-
throw new _error.default(ex.message, ex.code || "ELASTICSEARCH_ERROR", {
|
|
733
|
-
error: ex,
|
|
734
|
-
index,
|
|
735
|
-
body,
|
|
736
|
-
model
|
|
737
|
-
});
|
|
738
|
-
}
|
|
739
|
-
|
|
740
|
-
const {
|
|
741
|
-
hits,
|
|
742
|
-
total
|
|
743
|
-
} = response.body.hits;
|
|
744
|
-
const items = (0, _helpers.extractEntriesFromIndex)({
|
|
745
|
-
plugins,
|
|
746
|
-
model,
|
|
747
|
-
entries: hits.map(item => item._source)
|
|
748
|
-
}).map(item => {
|
|
749
|
-
return convertFromStorageEntry({
|
|
750
|
-
model,
|
|
751
|
-
entry: item
|
|
752
|
-
});
|
|
753
|
-
});
|
|
754
|
-
const hasMoreItems = items.length > limit;
|
|
755
|
-
|
|
756
|
-
if (hasMoreItems) {
|
|
757
|
-
/**
|
|
758
|
-
* Remove the last item from results, we don't want to include it.
|
|
759
|
-
*/
|
|
760
|
-
items.pop();
|
|
761
|
-
}
|
|
762
|
-
/**
|
|
763
|
-
* Cursor is the `sort` value of the last item in the array.
|
|
764
|
-
* https://www.elastic.co/guide/en/elasticsearch/reference/current/paginate-search-results.html#search-after
|
|
765
|
-
*/
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
const cursor = items.length > 0 ? (0, _apiElasticsearch.encodeCursor)(hits[items.length - 1].sort) || null : null;
|
|
769
|
-
return {
|
|
770
|
-
hasMoreItems,
|
|
771
|
-
totalCount: total.value,
|
|
772
|
-
cursor,
|
|
773
|
-
items
|
|
774
880
|
};
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
}));
|
|
783
|
-
return items.shift() || null;
|
|
784
|
-
};
|
|
785
|
-
|
|
786
|
-
const publish = async (model, params) => {
|
|
787
|
-
const {
|
|
788
|
-
entry: initialEntry,
|
|
789
|
-
storageEntry: initialStorageEntry
|
|
790
|
-
} = params;
|
|
791
|
-
const entry = convertToStorageEntry({
|
|
792
|
-
model,
|
|
793
|
-
entry: initialEntry
|
|
794
|
-
});
|
|
795
|
-
const storageEntry = convertToStorageEntry({
|
|
796
|
-
model,
|
|
797
|
-
entry: initialStorageEntry
|
|
798
|
-
});
|
|
799
|
-
/**
|
|
800
|
-
* We need currently published entry to check if need to remove it.
|
|
801
|
-
*/
|
|
802
|
-
|
|
803
|
-
const [publishedStorageEntry] = await dataLoaders.getPublishedRevisionByEntryId({
|
|
804
|
-
model,
|
|
805
|
-
ids: [entry.id]
|
|
806
|
-
});
|
|
807
|
-
const revisionKeys = {
|
|
808
|
-
PK: (0, _keys.createPartitionKey)({
|
|
809
|
-
id: entry.id,
|
|
810
|
-
locale: model.locale,
|
|
811
|
-
tenant: model.tenant
|
|
812
|
-
}),
|
|
813
|
-
SK: (0, _keys.createRevisionSortKey)(entry)
|
|
881
|
+
const get = async (initialModel, params)=>{
|
|
882
|
+
const model = getStorageOperationsModel(initialModel);
|
|
883
|
+
const { items } = await list(model, {
|
|
884
|
+
...params,
|
|
885
|
+
limit: 1
|
|
886
|
+
});
|
|
887
|
+
return items.shift() || null;
|
|
814
888
|
};
|
|
815
|
-
const
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
889
|
+
const publish = async (initialModel, params)=>{
|
|
890
|
+
const { entry: initialEntry, storageEntry: initialStorageEntry } = params;
|
|
891
|
+
const model = getStorageOperationsModel(initialModel);
|
|
892
|
+
const transformer = createTransformer({
|
|
893
|
+
valuesModifiers,
|
|
894
|
+
model,
|
|
895
|
+
entry: initialEntry,
|
|
896
|
+
storageEntry: initialStorageEntry,
|
|
897
|
+
fieldIndexRegistry,
|
|
898
|
+
compressionHandler
|
|
899
|
+
});
|
|
900
|
+
const { entry, storageEntry } = transformer.transformEntryKeys();
|
|
901
|
+
const revisionKeys = createEntryRevisionKeys(entry);
|
|
902
|
+
const latestKeys = createEntryLatestKeys(entry);
|
|
903
|
+
const publishedKeys = createEntryPublishedKeys(entry);
|
|
904
|
+
let latestEsEntry = null;
|
|
905
|
+
try {
|
|
906
|
+
latestEsEntry = await esEntity.getClean(latestKeys);
|
|
907
|
+
} catch (ex) {
|
|
908
|
+
throw new WebinyError(ex.message || "Could not read Elasticsearch latest data.", ex.code || "PUBLISH_LATEST_READ", {
|
|
909
|
+
error: ex,
|
|
910
|
+
latestKeys: latestKeys,
|
|
911
|
+
publishedKeys: publishedKeys
|
|
912
|
+
});
|
|
913
|
+
}
|
|
914
|
+
if (!latestEsEntry) throw new WebinyError('Could not publish entry. Could not load latest ("L") record (ES table).', "PUBLISH_ERROR", {
|
|
915
|
+
entry
|
|
916
|
+
});
|
|
917
|
+
const [latestStorageEntry] = await dataLoaders.getLatestRevisionByEntryId({
|
|
918
|
+
model,
|
|
919
|
+
ids: [
|
|
920
|
+
entry.id
|
|
921
|
+
]
|
|
922
|
+
});
|
|
923
|
+
if (!latestStorageEntry) throw new WebinyError('Could not publish entry. Could not load latest ("L") record.', "PUBLISH_ERROR", {
|
|
924
|
+
entry
|
|
925
|
+
});
|
|
926
|
+
const [publishedStorageEntry] = await dataLoaders.getPublishedRevisionByEntryId({
|
|
927
|
+
model,
|
|
928
|
+
ids: [
|
|
929
|
+
entry.id
|
|
930
|
+
]
|
|
931
|
+
});
|
|
932
|
+
const entityBatch = entity.createEntityWriter({
|
|
933
|
+
put: [
|
|
934
|
+
{
|
|
935
|
+
...revisionKeys,
|
|
936
|
+
data: storageEntry
|
|
937
|
+
},
|
|
938
|
+
{
|
|
939
|
+
...publishedKeys,
|
|
940
|
+
data: storageEntry
|
|
941
|
+
}
|
|
942
|
+
]
|
|
943
|
+
});
|
|
944
|
+
const elasticsearchEntityWriter = esEntity.createEntityWriter();
|
|
945
|
+
const { index: esIndex } = configurations.es({
|
|
946
|
+
model
|
|
947
|
+
});
|
|
948
|
+
const publishedRevisionId = publishedStorageEntry?.id;
|
|
949
|
+
const publishingLatestRevision = latestStorageEntry?.id === entry.id;
|
|
950
|
+
if (publishingLatestRevision) {
|
|
951
|
+
entityBatch.put({
|
|
952
|
+
...latestKeys,
|
|
953
|
+
data: storageEntry
|
|
954
|
+
});
|
|
955
|
+
if (publishedStorageEntry) {
|
|
956
|
+
const isRepublishing = publishedStorageEntry.id === entry.id;
|
|
957
|
+
if (!isRepublishing) {
|
|
958
|
+
const publishedStorageEntryKeys = createEntryRevisionKeys(publishedStorageEntry);
|
|
959
|
+
entityBatch.put({
|
|
960
|
+
...publishedStorageEntryKeys,
|
|
961
|
+
data: {
|
|
962
|
+
...publishedStorageEntry,
|
|
963
|
+
status: CONTENT_ENTRY_STATUS.UNPUBLISHED
|
|
964
|
+
}
|
|
965
|
+
});
|
|
966
|
+
}
|
|
967
|
+
}
|
|
968
|
+
} else {
|
|
969
|
+
const updatedEntryLevelMetaFields = pickEntryMetaFields(entry, isEntryLevelEntryMetaField);
|
|
970
|
+
let latestRevisionStatus = latestStorageEntry.status;
|
|
971
|
+
if (latestRevisionStatus === CONTENT_ENTRY_STATUS.PUBLISHED) latestRevisionStatus = CONTENT_ENTRY_STATUS.UNPUBLISHED;
|
|
972
|
+
const latestStorageEntryFields = {
|
|
973
|
+
...latestStorageEntry,
|
|
974
|
+
...updatedEntryLevelMetaFields,
|
|
975
|
+
status: latestRevisionStatus
|
|
976
|
+
};
|
|
977
|
+
const latestStorageEntryLatestKeys = createEntryLatestKeys(latestStorageEntry);
|
|
978
|
+
entityBatch.put({
|
|
979
|
+
...latestStorageEntryLatestKeys,
|
|
980
|
+
data: latestStorageEntryFields
|
|
981
|
+
});
|
|
982
|
+
const latestStorageEntryRevisionKeys = createEntryRevisionKeys(latestStorageEntry);
|
|
983
|
+
entityBatch.put({
|
|
984
|
+
...latestStorageEntryRevisionKeys,
|
|
985
|
+
data: latestStorageEntryFields
|
|
986
|
+
});
|
|
987
|
+
if (publishedStorageEntry) {
|
|
988
|
+
const isRepublishing = publishedStorageEntry.id === entry.id;
|
|
989
|
+
const publishedRevisionDifferentFromLatest = publishedRevisionId !== latestStorageEntry.id;
|
|
990
|
+
if (!isRepublishing && publishedRevisionDifferentFromLatest) {
|
|
991
|
+
const publishedStorageEntryRevisionKeys = createEntryRevisionKeys(publishedStorageEntry);
|
|
992
|
+
entityBatch.put({
|
|
993
|
+
...publishedStorageEntryRevisionKeys,
|
|
994
|
+
data: {
|
|
995
|
+
...publishedStorageEntry,
|
|
996
|
+
status: CONTENT_ENTRY_STATUS.UNPUBLISHED
|
|
997
|
+
}
|
|
998
|
+
});
|
|
999
|
+
}
|
|
1000
|
+
}
|
|
1001
|
+
}
|
|
1002
|
+
const esPublishedData = await transformer.getElasticsearchPublishedEntryData();
|
|
1003
|
+
elasticsearchEntityWriter.put({
|
|
1004
|
+
...publishedKeys,
|
|
1005
|
+
index: esIndex,
|
|
1006
|
+
data: esPublishedData
|
|
1007
|
+
});
|
|
1008
|
+
const latestEsEntryDataDecompressed = await compressionHandler.decompress(latestEsEntry.data);
|
|
1009
|
+
if (publishingLatestRevision) {
|
|
1010
|
+
const updatedMetaFields = pickEntryMetaFields(entry);
|
|
1011
|
+
const latestTransformer = createTransformer({
|
|
1012
|
+
valuesModifiers,
|
|
1013
|
+
model,
|
|
1014
|
+
transformedToIndex: {
|
|
1015
|
+
...latestEsEntryDataDecompressed,
|
|
1016
|
+
status: CONTENT_ENTRY_STATUS.PUBLISHED,
|
|
1017
|
+
locked: true,
|
|
1018
|
+
...updatedMetaFields
|
|
1019
|
+
},
|
|
1020
|
+
fieldIndexRegistry,
|
|
1021
|
+
compressionHandler
|
|
1022
|
+
});
|
|
1023
|
+
const esEntryLatestKeys = createEntryLatestKeys(latestEsEntryDataDecompressed);
|
|
1024
|
+
elasticsearchEntityWriter.put({
|
|
1025
|
+
index: esIndex,
|
|
1026
|
+
data: await latestTransformer.getElasticsearchLatestEntryData(),
|
|
1027
|
+
...esEntryLatestKeys
|
|
1028
|
+
});
|
|
1029
|
+
} else {
|
|
1030
|
+
const updatedEntryLevelMetaFields = pickEntryMetaFields(entry, isEntryLevelEntryMetaField);
|
|
1031
|
+
const latestEsEntry = await esEntity.getClean(latestKeys);
|
|
1032
|
+
if (latestEsEntry) {
|
|
1033
|
+
const latestEsEntryDataDecompressed = await compressionHandler.decompress(latestEsEntry.data);
|
|
1034
|
+
let latestRevisionStatus = latestEsEntryDataDecompressed.status;
|
|
1035
|
+
if (latestRevisionStatus === CONTENT_ENTRY_STATUS.PUBLISHED) latestRevisionStatus = CONTENT_ENTRY_STATUS.UNPUBLISHED;
|
|
1036
|
+
const updatedLatestEntry = await compressionHandler.compress({
|
|
1037
|
+
...latestEsEntryDataDecompressed,
|
|
1038
|
+
...updatedEntryLevelMetaFields,
|
|
1039
|
+
status: latestRevisionStatus
|
|
1040
|
+
});
|
|
1041
|
+
elasticsearchEntityWriter.put({
|
|
1042
|
+
...latestKeys,
|
|
1043
|
+
index: esIndex,
|
|
1044
|
+
data: updatedLatestEntry
|
|
1045
|
+
});
|
|
1046
|
+
}
|
|
1047
|
+
}
|
|
1048
|
+
try {
|
|
1049
|
+
await entityBatch.execute();
|
|
1050
|
+
dataLoaders.clearAll({
|
|
1051
|
+
model
|
|
1052
|
+
});
|
|
1053
|
+
} catch (ex) {
|
|
1054
|
+
throw new WebinyError(ex.message || "Could not store publish entry records in DynamoDB table.", ex.code || "PUBLISH_ERROR", {
|
|
1055
|
+
error: ex,
|
|
1056
|
+
entry,
|
|
1057
|
+
latestStorageEntry,
|
|
1058
|
+
publishedStorageEntry
|
|
1059
|
+
});
|
|
1060
|
+
}
|
|
1061
|
+
try {
|
|
1062
|
+
await elasticsearchEntityWriter.execute();
|
|
1063
|
+
} catch (ex) {
|
|
1064
|
+
throw new WebinyError(ex.message || "Could not store publish entry records in DynamoDB Elasticsearch table.", ex.code || "PUBLISH_ES_ERROR", {
|
|
1065
|
+
error: ex,
|
|
1066
|
+
entry,
|
|
1067
|
+
latestStorageEntry,
|
|
1068
|
+
publishedStorageEntry
|
|
1069
|
+
});
|
|
1070
|
+
}
|
|
1071
|
+
return initialStorageEntry;
|
|
822
1072
|
};
|
|
823
|
-
const
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
1073
|
+
const unpublish = async (initialModel, params)=>{
|
|
1074
|
+
const { entry: initialEntry, storageEntry: initialStorageEntry } = params;
|
|
1075
|
+
const model = getStorageOperationsModel(initialModel);
|
|
1076
|
+
const transformer = createTransformer({
|
|
1077
|
+
valuesModifiers,
|
|
1078
|
+
model,
|
|
1079
|
+
entry: initialEntry,
|
|
1080
|
+
storageEntry: initialStorageEntry,
|
|
1081
|
+
fieldIndexRegistry,
|
|
1082
|
+
compressionHandler
|
|
1083
|
+
});
|
|
1084
|
+
const { entry, storageEntry } = await transformer.transformEntryKeys();
|
|
1085
|
+
const [latestStorageEntry] = await dataLoaders.getLatestRevisionByEntryId({
|
|
1086
|
+
model,
|
|
1087
|
+
ids: [
|
|
1088
|
+
entry.id
|
|
1089
|
+
]
|
|
1090
|
+
});
|
|
1091
|
+
const partitionKey = createPartitionKey({
|
|
1092
|
+
id: entry.id,
|
|
1093
|
+
tenant: model.tenant
|
|
1094
|
+
});
|
|
1095
|
+
const entryRevisionKeys = createEntryRevisionKeys(entry);
|
|
1096
|
+
const entityBatch = entity.createEntityWriter({
|
|
1097
|
+
put: [
|
|
1098
|
+
{
|
|
1099
|
+
...entryRevisionKeys,
|
|
1100
|
+
data: storageEntry
|
|
1101
|
+
}
|
|
1102
|
+
],
|
|
1103
|
+
delete: [
|
|
1104
|
+
{
|
|
1105
|
+
PK: partitionKey,
|
|
1106
|
+
SK: createPublishedSortKey()
|
|
1107
|
+
}
|
|
1108
|
+
]
|
|
1109
|
+
});
|
|
1110
|
+
const elasticsearchEntityBatch = esEntity.createEntityWriter({
|
|
1111
|
+
delete: [
|
|
1112
|
+
{
|
|
1113
|
+
PK: partitionKey,
|
|
1114
|
+
SK: createPublishedSortKey()
|
|
1115
|
+
}
|
|
1116
|
+
]
|
|
1117
|
+
});
|
|
1118
|
+
if (latestStorageEntry?.id === entry.id) {
|
|
1119
|
+
const { index } = configurations.es({
|
|
1120
|
+
model
|
|
1121
|
+
});
|
|
1122
|
+
const entryLatestKeys = createEntryLatestKeys(storageEntry);
|
|
1123
|
+
entityBatch.put({
|
|
1124
|
+
...entryLatestKeys,
|
|
1125
|
+
data: storageEntry
|
|
1126
|
+
});
|
|
1127
|
+
const esLatestData = await transformer.getElasticsearchLatestEntryData();
|
|
1128
|
+
elasticsearchEntityBatch.put({
|
|
1129
|
+
index,
|
|
1130
|
+
data: esLatestData,
|
|
1131
|
+
...entryLatestKeys
|
|
1132
|
+
});
|
|
1133
|
+
}
|
|
1134
|
+
try {
|
|
1135
|
+
await entityBatch.execute();
|
|
1136
|
+
dataLoaders.clearAll({
|
|
1137
|
+
model
|
|
1138
|
+
});
|
|
1139
|
+
} catch (ex) {
|
|
1140
|
+
throw new WebinyError(ex.message || "Could not store unpublished entry records in DynamoDB table.", ex.code || "UNPUBLISH_ERROR", {
|
|
1141
|
+
entry,
|
|
1142
|
+
storageEntry
|
|
1143
|
+
});
|
|
1144
|
+
}
|
|
1145
|
+
try {
|
|
1146
|
+
await elasticsearchEntityBatch.execute();
|
|
1147
|
+
} catch (ex) {
|
|
1148
|
+
throw new WebinyError(ex.message || "Could not store unpublished entry records in DynamoDB Elasticsearch table.", ex.code || "UNPUBLISH_ERROR", {
|
|
1149
|
+
entry,
|
|
1150
|
+
storageEntry
|
|
1151
|
+
});
|
|
1152
|
+
}
|
|
1153
|
+
return initialStorageEntry;
|
|
830
1154
|
};
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
}
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
}
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
const preparedEntryData = (0, _helpers.prepareEntryToIndex)({
|
|
1038
|
-
plugins,
|
|
1039
|
-
model,
|
|
1040
|
-
entry: (0, _cloneDeep.default)(entry),
|
|
1041
|
-
storageEntry: (0, _cloneDeep.default)(storageEntry)
|
|
1042
|
-
});
|
|
1043
|
-
const esLatestData = await getESLatestEntryData(plugins, preparedEntryData);
|
|
1044
|
-
esItems.push(esEntity.putBatch({
|
|
1045
|
-
PK: partitionKey,
|
|
1046
|
-
SK: (0, _keys.createLatestSortKey)(),
|
|
1047
|
-
index,
|
|
1048
|
-
data: esLatestData
|
|
1049
|
-
}));
|
|
1050
|
-
}
|
|
1051
|
-
/**
|
|
1052
|
-
* Finally, execute regular table batch.
|
|
1053
|
-
*/
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
try {
|
|
1057
|
-
await (0, _batchWrite.batchWriteAll)({
|
|
1058
|
-
table: entity.table,
|
|
1059
|
-
items
|
|
1060
|
-
});
|
|
1061
|
-
dataLoaders.clearAll({
|
|
1062
|
-
model
|
|
1063
|
-
});
|
|
1064
|
-
} catch (ex) {
|
|
1065
|
-
throw new _error.default(ex.message || "Could not store unpublished entry records in DynamoDB table.", ex.code || "UNPUBLISH_ERROR", {
|
|
1066
|
-
entry,
|
|
1067
|
-
storageEntry
|
|
1068
|
-
});
|
|
1069
|
-
}
|
|
1070
|
-
/**
|
|
1071
|
-
* And Elasticsearch table batch.
|
|
1072
|
-
*/
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
try {
|
|
1076
|
-
await (0, _batchWrite.batchWriteAll)({
|
|
1077
|
-
table: esEntity.table,
|
|
1078
|
-
items: esItems
|
|
1079
|
-
});
|
|
1080
|
-
} catch (ex) {
|
|
1081
|
-
throw new _error.default(ex.message || "Could not store unpublished entry records in DynamoDB Elasticsearch table.", ex.code || "UNPUBLISH_ERROR", {
|
|
1082
|
-
entry,
|
|
1083
|
-
storageEntry
|
|
1084
|
-
});
|
|
1085
|
-
}
|
|
1086
|
-
|
|
1087
|
-
return initialStorageEntry;
|
|
1088
|
-
};
|
|
1089
|
-
|
|
1090
|
-
const getLatestRevisionByEntryId = async (model, params) => {
|
|
1091
|
-
const [entry] = await dataLoaders.getLatestRevisionByEntryId({
|
|
1092
|
-
model,
|
|
1093
|
-
ids: [params.id]
|
|
1094
|
-
});
|
|
1095
|
-
|
|
1096
|
-
if (!entry) {
|
|
1097
|
-
return null;
|
|
1098
|
-
}
|
|
1099
|
-
|
|
1100
|
-
return convertFromStorageEntry({
|
|
1101
|
-
model,
|
|
1102
|
-
entry
|
|
1103
|
-
});
|
|
1104
|
-
};
|
|
1105
|
-
|
|
1106
|
-
const getPublishedRevisionByEntryId = async (model, params) => {
|
|
1107
|
-
const [entry] = await dataLoaders.getPublishedRevisionByEntryId({
|
|
1108
|
-
model,
|
|
1109
|
-
ids: [params.id]
|
|
1110
|
-
});
|
|
1111
|
-
|
|
1112
|
-
if (!entry) {
|
|
1113
|
-
return null;
|
|
1114
|
-
}
|
|
1115
|
-
|
|
1116
|
-
return convertFromStorageEntry({
|
|
1117
|
-
model,
|
|
1118
|
-
entry
|
|
1119
|
-
});
|
|
1120
|
-
};
|
|
1121
|
-
|
|
1122
|
-
const getRevisionById = async (model, params) => {
|
|
1123
|
-
const [entry] = await dataLoaders.getRevisionById({
|
|
1124
|
-
model,
|
|
1125
|
-
ids: [params.id]
|
|
1126
|
-
});
|
|
1127
|
-
|
|
1128
|
-
if (!entry) {
|
|
1129
|
-
return null;
|
|
1130
|
-
}
|
|
1131
|
-
|
|
1132
|
-
return convertFromStorageEntry({
|
|
1133
|
-
model,
|
|
1134
|
-
entry
|
|
1135
|
-
});
|
|
1136
|
-
};
|
|
1137
|
-
|
|
1138
|
-
const getRevisions = async (model, params) => {
|
|
1139
|
-
const entries = await dataLoaders.getAllEntryRevisions({
|
|
1140
|
-
model,
|
|
1141
|
-
ids: [params.id]
|
|
1142
|
-
});
|
|
1143
|
-
return entries.map(entry => {
|
|
1144
|
-
return convertFromStorageEntry({
|
|
1145
|
-
model,
|
|
1146
|
-
entry
|
|
1147
|
-
});
|
|
1148
|
-
});
|
|
1149
|
-
};
|
|
1150
|
-
|
|
1151
|
-
const getByIds = async (model, params) => {
|
|
1152
|
-
const entries = await dataLoaders.getRevisionById({
|
|
1153
|
-
model,
|
|
1154
|
-
ids: params.ids
|
|
1155
|
-
});
|
|
1156
|
-
return entries.map(entry => {
|
|
1157
|
-
return convertFromStorageEntry({
|
|
1158
|
-
model,
|
|
1159
|
-
entry
|
|
1160
|
-
});
|
|
1161
|
-
});
|
|
1162
|
-
};
|
|
1163
|
-
|
|
1164
|
-
const getLatestByIds = async (model, params) => {
|
|
1165
|
-
const entries = await dataLoaders.getLatestRevisionByEntryId({
|
|
1166
|
-
model,
|
|
1167
|
-
ids: params.ids
|
|
1168
|
-
});
|
|
1169
|
-
return entries.map(entry => {
|
|
1170
|
-
return convertFromStorageEntry({
|
|
1171
|
-
model,
|
|
1172
|
-
entry
|
|
1173
|
-
});
|
|
1174
|
-
});
|
|
1175
|
-
};
|
|
1176
|
-
|
|
1177
|
-
const getPublishedByIds = async (model, params) => {
|
|
1178
|
-
const entries = await dataLoaders.getPublishedRevisionByEntryId({
|
|
1179
|
-
model,
|
|
1180
|
-
ids: params.ids
|
|
1181
|
-
});
|
|
1182
|
-
return entries.map(entry => {
|
|
1183
|
-
return convertFromStorageEntry({
|
|
1184
|
-
model,
|
|
1185
|
-
entry
|
|
1186
|
-
});
|
|
1187
|
-
});
|
|
1188
|
-
};
|
|
1189
|
-
|
|
1190
|
-
const getPreviousRevision = async (model, params) => {
|
|
1191
|
-
const {
|
|
1192
|
-
tenant,
|
|
1193
|
-
locale
|
|
1194
|
-
} = model;
|
|
1195
|
-
const {
|
|
1196
|
-
entryId,
|
|
1197
|
-
version
|
|
1198
|
-
} = params;
|
|
1199
|
-
const queryParams = {
|
|
1200
|
-
entity,
|
|
1201
|
-
partitionKey: (0, _keys.createPartitionKey)({
|
|
1202
|
-
tenant,
|
|
1203
|
-
locale,
|
|
1204
|
-
id: entryId
|
|
1205
|
-
}),
|
|
1206
|
-
options: {
|
|
1207
|
-
lt: `REV#${(0, _utils.zeroPad)(version)}`,
|
|
1208
|
-
|
|
1209
|
-
/**
|
|
1210
|
-
* We need to have extra checks because DynamoDB will return published or latest record if there is no REV# record.
|
|
1211
|
-
*/
|
|
1212
|
-
filters: [{
|
|
1213
|
-
attr: "TYPE",
|
|
1214
|
-
eq: createType()
|
|
1215
|
-
}, {
|
|
1216
|
-
attr: "version",
|
|
1217
|
-
lt: version
|
|
1218
|
-
}],
|
|
1219
|
-
reverse: true
|
|
1220
|
-
}
|
|
1155
|
+
const getLatestRevisionByEntryId = async (initialModel, params)=>{
|
|
1156
|
+
const model = getStorageOperationsModel(initialModel);
|
|
1157
|
+
const [entry] = await dataLoaders.getLatestRevisionByEntryId({
|
|
1158
|
+
model,
|
|
1159
|
+
ids: [
|
|
1160
|
+
params.id
|
|
1161
|
+
]
|
|
1162
|
+
});
|
|
1163
|
+
if (!entry) return null;
|
|
1164
|
+
return convertEntryKeysFromStorage({
|
|
1165
|
+
model,
|
|
1166
|
+
entry
|
|
1167
|
+
});
|
|
1168
|
+
};
|
|
1169
|
+
const getPublishedRevisionByEntryId = async (initialModel, params)=>{
|
|
1170
|
+
const model = getStorageOperationsModel(initialModel);
|
|
1171
|
+
const [entry] = await dataLoaders.getPublishedRevisionByEntryId({
|
|
1172
|
+
model,
|
|
1173
|
+
ids: [
|
|
1174
|
+
params.id
|
|
1175
|
+
]
|
|
1176
|
+
});
|
|
1177
|
+
if (!entry) return null;
|
|
1178
|
+
return convertEntryKeysFromStorage({
|
|
1179
|
+
model,
|
|
1180
|
+
entry
|
|
1181
|
+
});
|
|
1182
|
+
};
|
|
1183
|
+
const getRevisionById = async (initialModel, params)=>{
|
|
1184
|
+
const model = getStorageOperationsModel(initialModel);
|
|
1185
|
+
const [entry] = await dataLoaders.getRevisionById({
|
|
1186
|
+
model,
|
|
1187
|
+
ids: [
|
|
1188
|
+
params.id
|
|
1189
|
+
]
|
|
1190
|
+
});
|
|
1191
|
+
if (!entry) return null;
|
|
1192
|
+
return convertEntryKeysFromStorage({
|
|
1193
|
+
model,
|
|
1194
|
+
entry
|
|
1195
|
+
});
|
|
1196
|
+
};
|
|
1197
|
+
const getRevisions = async (initialModel, params)=>{
|
|
1198
|
+
const model = getStorageOperationsModel(initialModel);
|
|
1199
|
+
const entries = await dataLoaders.getAllEntryRevisions({
|
|
1200
|
+
model,
|
|
1201
|
+
ids: [
|
|
1202
|
+
params.id
|
|
1203
|
+
]
|
|
1204
|
+
});
|
|
1205
|
+
return entries.map((entry)=>convertEntryKeysFromStorage({
|
|
1206
|
+
model,
|
|
1207
|
+
entry
|
|
1208
|
+
}));
|
|
1209
|
+
};
|
|
1210
|
+
const getByIds = async (initialModel, params)=>{
|
|
1211
|
+
const model = getStorageOperationsModel(initialModel);
|
|
1212
|
+
const entries = await dataLoaders.getRevisionById({
|
|
1213
|
+
model,
|
|
1214
|
+
ids: params.ids
|
|
1215
|
+
});
|
|
1216
|
+
return entries.map((entry)=>convertEntryKeysFromStorage({
|
|
1217
|
+
model,
|
|
1218
|
+
entry
|
|
1219
|
+
}));
|
|
1220
|
+
};
|
|
1221
|
+
const getLatestByIds = async (initialModel, params)=>{
|
|
1222
|
+
const model = getStorageOperationsModel(initialModel);
|
|
1223
|
+
const entries = await dataLoaders.getLatestRevisionByEntryId({
|
|
1224
|
+
model,
|
|
1225
|
+
ids: params.ids
|
|
1226
|
+
});
|
|
1227
|
+
return entries.map((entry)=>convertEntryKeysFromStorage({
|
|
1228
|
+
model,
|
|
1229
|
+
entry
|
|
1230
|
+
}));
|
|
1231
|
+
};
|
|
1232
|
+
const getPublishedByIds = async (initialModel, params)=>{
|
|
1233
|
+
const model = getStorageOperationsModel(initialModel);
|
|
1234
|
+
const entries = await dataLoaders.getPublishedRevisionByEntryId({
|
|
1235
|
+
model,
|
|
1236
|
+
ids: params.ids
|
|
1237
|
+
});
|
|
1238
|
+
return entries.map((entry)=>convertEntryKeysFromStorage({
|
|
1239
|
+
model,
|
|
1240
|
+
entry
|
|
1241
|
+
}));
|
|
1242
|
+
};
|
|
1243
|
+
const getPreviousRevision = async (initialModel, params)=>{
|
|
1244
|
+
const model = getStorageOperationsModel(initialModel);
|
|
1245
|
+
const { tenant } = model;
|
|
1246
|
+
const { entryId, version } = params;
|
|
1247
|
+
const partitionKey = createPartitionKey({
|
|
1248
|
+
tenant,
|
|
1249
|
+
id: entryId
|
|
1250
|
+
});
|
|
1251
|
+
const options = {
|
|
1252
|
+
beginsWith: "REV#",
|
|
1253
|
+
reverse: true
|
|
1254
|
+
};
|
|
1255
|
+
try {
|
|
1256
|
+
const unfilteredEntries = (await entity.queryAll({
|
|
1257
|
+
partitionKey,
|
|
1258
|
+
options
|
|
1259
|
+
})).map((item)=>item.data);
|
|
1260
|
+
const entries = unfilteredEntries.filter((item)=>item.version < version);
|
|
1261
|
+
const entry = entries[0];
|
|
1262
|
+
if (!entry) return null;
|
|
1263
|
+
return convertEntryKeysFromStorage({
|
|
1264
|
+
entry,
|
|
1265
|
+
model
|
|
1266
|
+
});
|
|
1267
|
+
} catch (ex) {
|
|
1268
|
+
throw new WebinyError(ex.message || "Could not get previous version of given entry.", ex.code || "GET_PREVIOUS_VERSION_ERROR", {
|
|
1269
|
+
...params,
|
|
1270
|
+
error: ex,
|
|
1271
|
+
partitionKey,
|
|
1272
|
+
options,
|
|
1273
|
+
model
|
|
1274
|
+
});
|
|
1275
|
+
}
|
|
1276
|
+
};
|
|
1277
|
+
const getUniqueFieldValues = async (model, params)=>{
|
|
1278
|
+
const { where, fieldId } = params;
|
|
1279
|
+
const { index } = configurations.es({
|
|
1280
|
+
model
|
|
1281
|
+
});
|
|
1282
|
+
const initialBody = createElasticsearchBody({
|
|
1283
|
+
model,
|
|
1284
|
+
fieldRegistry,
|
|
1285
|
+
fieldIndexRegistry,
|
|
1286
|
+
bodyModifiers,
|
|
1287
|
+
sortModifiers,
|
|
1288
|
+
queryModifiers,
|
|
1289
|
+
valueSearchRegistry,
|
|
1290
|
+
fullTextSearches,
|
|
1291
|
+
filterRegistry,
|
|
1292
|
+
params: {
|
|
1293
|
+
limit: 1,
|
|
1294
|
+
where
|
|
1295
|
+
},
|
|
1296
|
+
plugins
|
|
1297
|
+
});
|
|
1298
|
+
const field = model.fields.find((f)=>f.fieldId === fieldId);
|
|
1299
|
+
if (!field) throw new WebinyError('Could not find field with given "fieldId" value.', "FIELD_NOT_FOUND", {
|
|
1300
|
+
fieldId
|
|
1301
|
+
});
|
|
1302
|
+
const body = {
|
|
1303
|
+
...initialBody,
|
|
1304
|
+
size: 0,
|
|
1305
|
+
aggregations: {
|
|
1306
|
+
getUniqueFieldValues: {
|
|
1307
|
+
terms: {
|
|
1308
|
+
field: `values.${field.storageId}.keyword`,
|
|
1309
|
+
size: 1000000
|
|
1310
|
+
}
|
|
1311
|
+
}
|
|
1312
|
+
}
|
|
1313
|
+
};
|
|
1314
|
+
let response;
|
|
1315
|
+
try {
|
|
1316
|
+
response = await elasticsearch.search({
|
|
1317
|
+
index,
|
|
1318
|
+
body
|
|
1319
|
+
});
|
|
1320
|
+
} catch (error) {
|
|
1321
|
+
if (shouldIgnoreEsResponseError(error)) return [];
|
|
1322
|
+
throw new WebinyError(error.message || "Error in the Elasticsearch query.", error.code || "OPENSEARCH_ERROR", {
|
|
1323
|
+
error,
|
|
1324
|
+
index,
|
|
1325
|
+
model,
|
|
1326
|
+
body
|
|
1327
|
+
});
|
|
1328
|
+
}
|
|
1329
|
+
const aggregations = response.body.aggregations || {};
|
|
1330
|
+
const agg = aggregations["getUniqueFieldValues"];
|
|
1331
|
+
const buckets = agg && "buckets" in agg && Array.isArray(agg.buckets) ? agg.buckets : [];
|
|
1332
|
+
return buckets.map((bucket)=>({
|
|
1333
|
+
value: bucket.key,
|
|
1334
|
+
count: bucket.doc_count
|
|
1335
|
+
}));
|
|
1336
|
+
};
|
|
1337
|
+
return {
|
|
1338
|
+
create,
|
|
1339
|
+
createRevisionFrom,
|
|
1340
|
+
update,
|
|
1341
|
+
move,
|
|
1342
|
+
delete: deleteEntry,
|
|
1343
|
+
moveToBin,
|
|
1344
|
+
restoreFromBin,
|
|
1345
|
+
deleteRevision,
|
|
1346
|
+
deleteMultipleEntries,
|
|
1347
|
+
get,
|
|
1348
|
+
publish,
|
|
1349
|
+
unpublish,
|
|
1350
|
+
list,
|
|
1351
|
+
getLatestRevisionByEntryId,
|
|
1352
|
+
getPublishedRevisionByEntryId,
|
|
1353
|
+
getRevisionById,
|
|
1354
|
+
getRevisions,
|
|
1355
|
+
getByIds,
|
|
1356
|
+
getLatestByIds,
|
|
1357
|
+
getPublishedByIds,
|
|
1358
|
+
getPreviousRevision,
|
|
1359
|
+
getUniqueFieldValues,
|
|
1360
|
+
dataLoaders
|
|
1221
1361
|
};
|
|
1222
|
-
|
|
1223
|
-
try {
|
|
1224
|
-
const result = await (0, _query.queryOne)(queryParams);
|
|
1225
|
-
const entry = (0, _cleanup.cleanupItem)(entity, result);
|
|
1226
|
-
|
|
1227
|
-
if (!entry) {
|
|
1228
|
-
return null;
|
|
1229
|
-
}
|
|
1230
|
-
|
|
1231
|
-
return convertFromStorageEntry({
|
|
1232
|
-
entry,
|
|
1233
|
-
model
|
|
1234
|
-
});
|
|
1235
|
-
} catch (ex) {
|
|
1236
|
-
throw new _error.default(ex.message || "Could not get previous version of given entry.", ex.code || "GET_PREVIOUS_VERSION_ERROR", (0, _objectSpread2.default)((0, _objectSpread2.default)({}, params), {}, {
|
|
1237
|
-
error: ex,
|
|
1238
|
-
partitionKey: queryParams.partitionKey,
|
|
1239
|
-
options: queryParams.options,
|
|
1240
|
-
model
|
|
1241
|
-
}));
|
|
1242
|
-
}
|
|
1243
|
-
};
|
|
1244
|
-
|
|
1245
|
-
return {
|
|
1246
|
-
create,
|
|
1247
|
-
createRevisionFrom,
|
|
1248
|
-
update,
|
|
1249
|
-
delete: deleteEntry,
|
|
1250
|
-
deleteRevision,
|
|
1251
|
-
get,
|
|
1252
|
-
publish,
|
|
1253
|
-
unpublish,
|
|
1254
|
-
list,
|
|
1255
|
-
getLatestRevisionByEntryId,
|
|
1256
|
-
getPublishedRevisionByEntryId,
|
|
1257
|
-
getRevisionById,
|
|
1258
|
-
getRevisions,
|
|
1259
|
-
getByIds,
|
|
1260
|
-
getLatestByIds,
|
|
1261
|
-
getPublishedByIds,
|
|
1262
|
-
getPreviousRevision
|
|
1263
|
-
};
|
|
1264
1362
|
};
|
|
1363
|
+
export { createEntriesStorageOperations };
|
|
1265
1364
|
|
|
1266
|
-
|
|
1365
|
+
//# sourceMappingURL=index.js.map
|