@webiny/api-headless-cms-ddb 5.15.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +25 -0
  3. package/configurations.d.ts +18 -0
  4. package/configurations.js +24 -0
  5. package/configurations.js.map +1 -0
  6. package/definitions/entry.d.ts +6 -0
  7. package/definitions/entry.js +86 -0
  8. package/definitions/entry.js.map +1 -0
  9. package/definitions/table.d.ts +14 -0
  10. package/definitions/table.js +30 -0
  11. package/definitions/table.js.map +1 -0
  12. package/dynamoDb/index.d.ts +2 -0
  13. package/dynamoDb/index.js +23 -0
  14. package/dynamoDb/index.js.map +1 -0
  15. package/dynamoDb/path/plainObject.d.ts +3 -0
  16. package/dynamoDb/path/plainObject.js +34 -0
  17. package/dynamoDb/path/plainObject.js.map +1 -0
  18. package/dynamoDb/path/ref.d.ts +3 -0
  19. package/dynamoDb/path/ref.js +28 -0
  20. package/dynamoDb/path/ref.js.map +1 -0
  21. package/dynamoDb/storage/date.d.ts +3 -0
  22. package/dynamoDb/storage/date.js +69 -0
  23. package/dynamoDb/storage/date.js.map +1 -0
  24. package/dynamoDb/storage/richText.d.ts +8 -0
  25. package/dynamoDb/storage/richText.js +108 -0
  26. package/dynamoDb/storage/richText.js.map +1 -0
  27. package/dynamoDb/transformValue/datetime.d.ts +3 -0
  28. package/dynamoDb/transformValue/datetime.js +48 -0
  29. package/dynamoDb/transformValue/datetime.js.map +1 -0
  30. package/index.d.ts +6 -0
  31. package/index.js +30 -0
  32. package/index.js.map +1 -0
  33. package/operations/entry/CmsContentEntryDynamo.d.ts +86 -0
  34. package/operations/entry/CmsContentEntryDynamo.js +972 -0
  35. package/operations/entry/CmsContentEntryDynamo.js.map +1 -0
  36. package/operations/entry/dataLoaders.d.ts +23 -0
  37. package/operations/entry/dataLoaders.js +283 -0
  38. package/operations/entry/dataLoaders.js.map +1 -0
  39. package/operations/entry/index.d.ts +4 -0
  40. package/operations/entry/index.js +25 -0
  41. package/operations/entry/index.js.map +1 -0
  42. package/operations/entry/systemFields.d.ts +2 -0
  43. package/operations/entry/systemFields.js +51 -0
  44. package/operations/entry/systemFields.js.map +1 -0
  45. package/operations/entry/utils.d.ts +26 -0
  46. package/operations/entry/utils.js +362 -0
  47. package/operations/entry/utils.js.map +1 -0
  48. package/operations/helpers.d.ts +5 -0
  49. package/operations/helpers.js +96 -0
  50. package/operations/helpers.js.map +1 -0
  51. package/operations/model/CmsContentModelDynamo.d.ts +18 -0
  52. package/operations/model/CmsContentModelDynamo.js +234 -0
  53. package/operations/model/CmsContentModelDynamo.js.map +1 -0
  54. package/operations/model/index.d.ts +3 -0
  55. package/operations/model/index.js +26 -0
  56. package/operations/model/index.js.map +1 -0
  57. package/operations/modelGroup/CmsContentModelGroupDynamo.d.ts +42 -0
  58. package/operations/modelGroup/CmsContentModelGroupDynamo.js +230 -0
  59. package/operations/modelGroup/CmsContentModelGroupDynamo.js.map +1 -0
  60. package/operations/modelGroup/index.d.ts +3 -0
  61. package/operations/modelGroup/index.js +26 -0
  62. package/operations/modelGroup/index.js.map +1 -0
  63. package/operations/settings/CmsSettingsDynamo.d.ts +16 -0
  64. package/operations/settings/CmsSettingsDynamo.js +145 -0
  65. package/operations/settings/CmsSettingsDynamo.js.map +1 -0
  66. package/operations/settings/index.d.ts +3 -0
  67. package/operations/settings/index.js +25 -0
  68. package/operations/settings/index.js.map +1 -0
  69. package/operations/system/CmsSystemDynamo.d.ts +16 -0
  70. package/operations/system/CmsSystemDynamo.js +126 -0
  71. package/operations/system/CmsSystemDynamo.js.map +1 -0
  72. package/operations/system/index.d.ts +3 -0
  73. package/operations/system/index.js +25 -0
  74. package/operations/system/index.js.map +1 -0
  75. package/package.json +61 -0
  76. package/types.d.ts +54 -0
  77. package/types.js +6 -0
  78. package/types.js.map +1 -0
  79. package/utils.d.ts +5 -0
  80. package/utils.js +62 -0
  81. package/utils.js.map +1 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/operations/entry/CmsContentEntryDynamo.ts"],"names":["TYPE_ENTRY","TYPE_ENTRY_LATEST","TYPE_ENTRY_PUBLISHED","GSI1_INDEX","configurationDefaults","defaultLimit","maxLimit","undefined","CmsContentEntryDynamo","context","_context","configuration","_configuration","table","_table","entity","_entity","constructor","_modelPartitionKey","partitionKey","_dataLoaders","DataLoadersHandler","indexes","sortKey","create","model","args","entry","storageEntry","getPartitionKey","id","items","putBatch","PK","SK","getSortKeyRevision","version","TYPE","GSI1_PK","getGSIEntryPartitionKey","GSI1_SK","getGSISortKey","getSortKeyLatest","getGSILatestPartitionKey","batchWrite","ex","WebinyError","message","code","error","createRevisionFrom","originalEntry","latestEntry","delete","results","query","gte","keys","Items","map","item","key","deleteBatch","deleteRevision","entryToDelete","entryToSetAsLatest","storageEntryToSetAsLatest","publishedStorageEntry","getPublishedRevisionByEntryId","push","getSortKeyPublished","get","list","limit","length","shift","initialLimit","where","originalWhere","after","sort","queryOptions","createQueryOptions","queryPartitionKeys","runQuery","options","modelFields","filteredItems","fields","totalCount","sortedItems","start","hasMoreItems","end","slicedItems","slice","cursor","update","latestStorageEntry","getLatestRevisionByEntryId","publish","getGSIPublishedPartitionKey","status","CONTENT_ENTRY_STATUS","UNPUBLISHED","clearAllEntryRevisions","unpublish","requestChanges","requestReview","getAllRevisionsByIds","ids","getAllEntryRevisions","getByIds","getRevisionById","getPublishedByIds","getLatestByIds","getRevisions","getSingleDynamoDbItem","value","entryId","getPreviousRevision","op","order","reverse","result","Array","isArray","match","split","getGSIPartitionKey","type","modelId","includes","pop","filters","index","id_in","entryId_in","published","latest","eq","beginsWith","previousResult","next"],"mappings":"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","sourcesContent":["import WebinyError from \"@webiny/error\";\nimport { DataLoadersHandler } from \"./dataLoaders\";\nimport {\n CmsContentEntry,\n CmsContentEntryListWhere,\n CmsContentEntryStorageOperations,\n CmsContentEntryStorageOperationsCreateArgs,\n CmsContentEntryStorageOperationsCreateRevisionFromArgs,\n CmsContentEntryStorageOperationsDeleteArgs,\n CmsContentEntryStorageOperationsDeleteRevisionArgs,\n CmsContentEntryStorageOperationsGetArgs,\n CmsContentEntryStorageOperationsListArgs,\n CmsContentEntryStorageOperationsListResponse,\n CmsContentEntryStorageOperationsPublishArgs,\n CmsContentEntryStorageOperationsRequestChangesArgs,\n CmsContentEntryStorageOperationsRequestReviewArgs,\n CmsContentEntryStorageOperationsUnpublishArgs,\n CmsContentEntryStorageOperationsUpdateArgs,\n CmsContentModel,\n CmsContext,\n CONTENT_ENTRY_STATUS\n} from \"@webiny/api-headless-cms/types\";\nimport { zeroPad } from \"@webiny/api-headless-cms/utils\";\nimport { createBasePartitionKey, decodePaginationCursor, encodePaginationCursor } from \"~/utils\";\nimport { Entity, Table } from \"dynamodb-toolbox\";\nimport { filterItems, buildModelFields, sortEntryItems } from \"./utils\";\nimport { queryOptions as DynamoDBToolboxQueryOptions } from \"dynamodb-toolbox/dist/classes/Table\";\nimport lodashCloneDeep from \"lodash.clonedeep\";\nimport { createEntryEntity } from \"~/definitions/entry\";\nimport { createTable } from \"~/definitions/table\";\n\nexport const TYPE_ENTRY = \"cms.entry\";\nexport const TYPE_ENTRY_LATEST = TYPE_ENTRY + \".l\";\nexport const TYPE_ENTRY_PUBLISHED = TYPE_ENTRY + \".p\";\n\nexport interface CmsContentEntryConfiguration {\n defaultLimit?: number;\n maxLimit?: number;\n}\n\ninterface ConstructorArgs {\n context: CmsContext;\n configuration: CmsContentEntryConfiguration;\n}\n\ninterface GetSingleDynamoDBItemArgs {\n partitionKey: string;\n value: any;\n op?: \"eq\" | \"lt\" | \"lte\" | \"gt\" | \"gte\" | \"between\" | \"beginsWith\";\n order?: string;\n}\n\ninterface RunQueryArgs {\n options?: DynamoDBToolboxQueryOptions;\n partitionKey: string;\n}\n\nconst GSI1_INDEX = \"GSI1\";\n\nconst configurationDefaults: CmsContentEntryConfiguration = {\n defaultLimit: 100,\n maxLimit: undefined\n};\n/**\n * We do not use transactions in this storage operations implementation due to their cost.\n */\nexport class CmsContentEntryDynamo implements CmsContentEntryStorageOperations {\n private readonly _context: CmsContext;\n private readonly _configuration: CmsContentEntryConfiguration;\n private readonly _modelPartitionKey: string;\n private readonly _dataLoaders: DataLoadersHandler;\n private readonly _table: Table;\n private readonly _entity: Entity<any>;\n\n private get context(): CmsContext {\n return this._context;\n }\n\n private get configuration(): CmsContentEntryConfiguration {\n return this._configuration;\n }\n\n public get table() {\n return this._table;\n }\n\n public get entity() {\n return this._entity;\n }\n\n public constructor({ context, configuration }: ConstructorArgs) {\n this._context = context;\n this._configuration = {\n ...configurationDefaults,\n ...(configuration || {})\n };\n this._modelPartitionKey = `${this.partitionKey}#M`;\n this._dataLoaders = new DataLoadersHandler(context, this);\n\n this._table = createTable({\n context,\n indexes: {\n [GSI1_INDEX]: {\n partitionKey: \"GSI1_PK\",\n sortKey: \"GSI1_SK\"\n }\n }\n });\n\n this._entity = createEntryEntity({\n table: this._table\n });\n }\n\n public async create(\n model: CmsContentModel,\n args: CmsContentEntryStorageOperationsCreateArgs\n ): Promise<CmsContentEntry> {\n const { entry, storageEntry } = args;\n\n const partitionKey = this.getPartitionKey(entry.id);\n /**\n * We need to:\n * - create new main entry item\n * - create new or update latest entry item\n */\n const items = [\n this._entity.putBatch({\n ...storageEntry,\n PK: partitionKey,\n SK: this.getSortKeyRevision(entry.version),\n TYPE: TYPE_ENTRY,\n GSI1_PK: this.getGSIEntryPartitionKey(model),\n GSI1_SK: this.getGSISortKey(storageEntry)\n }),\n this._entity.putBatch({\n ...storageEntry,\n PK: partitionKey,\n SK: this.getSortKeyLatest(),\n TYPE: TYPE_ENTRY_LATEST,\n GSI1_PK: this.getGSILatestPartitionKey(model),\n GSI1_SK: this.getGSISortKey(storageEntry)\n })\n ];\n\n try {\n await this._table.batchWrite(items);\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not insert data into the DynamoDB.\",\n ex.code || \"CREATE_ENTRY_ERROR\",\n {\n error: ex,\n entry\n }\n );\n }\n\n return storageEntry;\n }\n\n public async createRevisionFrom(\n model: CmsContentModel,\n args: CmsContentEntryStorageOperationsCreateRevisionFromArgs\n ) {\n const { originalEntry, entry, storageEntry, latestEntry } = args;\n\n const partitionKey = this.getPartitionKey(storageEntry.id);\n /**\n * We need to:\n * - create the main entry item\n * - update the last entry item to a current one\n */\n const items = [\n this._entity.putBatch({\n ...storageEntry,\n PK: partitionKey,\n SK: this.getSortKeyRevision(storageEntry.version),\n TYPE: TYPE_ENTRY,\n GSI1_PK: this.getGSIEntryPartitionKey(model),\n GSI1_SK: this.getGSISortKey(storageEntry)\n }),\n this._entity.putBatch({\n ...storageEntry,\n PK: partitionKey,\n SK: this.getSortKeyLatest(),\n TYPE: TYPE_ENTRY_LATEST,\n GSI1_PK: this.getGSILatestPartitionKey(model),\n GSI1_SK: this.getGSISortKey(storageEntry)\n })\n ];\n try {\n await this._table.batchWrite(items);\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not create revision from given entry.\",\n ex.code || \"CREATE_REVISION_ERROR\",\n {\n error: ex,\n originalEntry,\n latestEntry,\n entry,\n storageEntry\n }\n );\n }\n /**\n * There are no modifications on the entry created so just return the data.\n */\n return storageEntry;\n }\n\n public async delete(\n model: CmsContentModel,\n args: CmsContentEntryStorageOperationsDeleteArgs\n ): Promise<void> {\n const { entry } = args;\n const partitionKey = this.getPartitionKey(entry.id);\n\n const results = await this._entity.query(partitionKey, {\n gte: \" \"\n });\n\n const keys = results.Items.map(item => ({\n PK: partitionKey,\n SK: item.SK\n }));\n try {\n await this._table.batchWrite(keys.map(key => this._entity.deleteBatch(key)));\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not delete the entry.\",\n ex.code || \"DELETE_ENTRY_ERROR\",\n {\n error: ex,\n partitionKey,\n keys\n }\n );\n }\n }\n\n public async deleteRevision(\n model: CmsContentModel,\n args: CmsContentEntryStorageOperationsDeleteRevisionArgs\n ): Promise<void> {\n const { entryToDelete, entryToSetAsLatest, storageEntryToSetAsLatest } = args;\n const partitionKey = this.getPartitionKey(entryToDelete.id);\n\n const items = [\n this._entity.deleteBatch({\n PK: partitionKey,\n SK: this.getSortKeyRevision(entryToDelete.id)\n })\n ];\n\n const publishedStorageEntry = await this.getPublishedRevisionByEntryId(\n model,\n entryToDelete.id\n );\n\n /**\n * If revision we are deleting is the published one as well, we need to delete those records as well.\n */\n if (publishedStorageEntry && entryToDelete.id === publishedStorageEntry.id) {\n items.push(\n this._entity.deleteBatch({\n PK: partitionKey,\n SK: this.getSortKeyPublished()\n })\n );\n }\n if (storageEntryToSetAsLatest) {\n items.push(\n this._entity.putBatch({\n ...storageEntryToSetAsLatest,\n PK: partitionKey,\n SK: this.getSortKeyLatest(),\n TYPE: TYPE_ENTRY_LATEST,\n GSI1_PK: this.getGSILatestPartitionKey(model),\n GSI1_SK: this.getGSISortKey(storageEntryToSetAsLatest)\n })\n );\n }\n try {\n await this._table.batchWrite(items);\n } catch (ex) {\n throw new WebinyError(ex.message, ex.code, {\n error: ex,\n entryToDelete,\n entryToSetAsLatest\n });\n }\n }\n\n public async get(\n model: CmsContentModel,\n args: CmsContentEntryStorageOperationsGetArgs\n ): Promise<CmsContentEntry | null> {\n const { items } = await this.list(model, {\n ...(args || {}),\n limit: 1\n });\n if (items.length === 0) {\n return null;\n }\n return items.shift();\n }\n\n public async list(\n model: CmsContentModel,\n args: CmsContentEntryStorageOperationsListArgs\n ): Promise<CmsContentEntryStorageOperationsListResponse> {\n const { limit: initialLimit, where: originalWhere, after, sort } = args;\n /**\n * There is no max limit imposed because that is up to the devs using this.\n * Default is some reasonable number for us but users can set their own when initializing the plugin.\n */\n const defaultLimit = this.configuration.defaultLimit || configurationDefaults.defaultLimit;\n const maxLimit = this.configuration.maxLimit || defaultLimit;\n const limit =\n !initialLimit || initialLimit <= 0\n ? initialLimit > maxLimit\n ? maxLimit\n : defaultLimit\n : initialLimit;\n\n const items: CmsContentEntry[] = [];\n\n const queryOptions = this.createQueryOptions({\n where: originalWhere,\n model\n });\n\n try {\n /**\n * We run the query method on all the partition keys that were built in the createQueryOptions() method.\n * Partition keys are always built as array because of the possibility that we might need to read from different partitions\n * which is the case if where condition is something like id_in or entryId_in.\n * If we are reading from the GSI1_PK it is a single partition but we keep it as an array\n * just to make it easier to read in all of the cases.\n */\n for (const partitionKey of queryOptions.queryPartitionKeys) {\n const results = await this.runQuery({\n partitionKey,\n options: queryOptions.options\n });\n items.push(...results);\n }\n } catch (ex) {\n throw new WebinyError(ex.message, \"SCAN_ERROR\", {\n error: ex\n });\n }\n /**\n * We need a object containing field, transformers and paths.\n * Just build it here and pass on into other methods that require it to avoid mapping multiple times.\n */\n const modelFields = buildModelFields({\n context: this.context,\n model\n });\n /**\n * Filter the read items via the code.\n * It will build the filters out of the where input and transform the values it is using.\n */\n const filteredItems = filterItems({\n items,\n where: queryOptions.where,\n context: this.context,\n fields: modelFields\n });\n\n const totalCount = filteredItems.length;\n /**\n * Sorting is also done via the code.\n * It takes the sort input and sorts by it via the lodash sortBy method.\n */\n const sortedItems = sortEntryItems({\n items: filteredItems,\n sort,\n fields: modelFields\n });\n\n const start = decodePaginationCursor(after) || 0;\n const hasMoreItems = totalCount > start + limit;\n const end = limit > totalCount + start + limit ? undefined : start + limit;\n const slicedItems = sortedItems.slice(start, end);\n /**\n * Although we do not need a cursor here, we will use it as such to keep it standardized.\n * Number is simply encoded.\n */\n const cursor = totalCount > start + limit ? encodePaginationCursor(start + limit) : null;\n return {\n hasMoreItems,\n totalCount,\n cursor,\n items: slicedItems\n };\n }\n public async update(\n model: CmsContentModel,\n args: CmsContentEntryStorageOperationsUpdateArgs\n ): Promise<CmsContentEntry> {\n const { originalEntry, entry, storageEntry } = args;\n const partitionKey = this.getPartitionKey(originalEntry.id);\n\n const items = [];\n /**\n * We need to:\n * - update the current entry\n * - update the latest entry if the current entry is the latest one\n */\n items.push(\n this._entity.putBatch({\n ...storageEntry,\n PK: partitionKey,\n SK: this.getSortKeyRevision(storageEntry.version),\n TYPE: TYPE_ENTRY,\n GSI1_PK: this.getGSIEntryPartitionKey(model),\n GSI1_SK: this.getGSISortKey(storageEntry)\n })\n );\n\n /**\n * We need the latest entry to update it as well if neccessary.\n */\n const latestStorageEntry = await this.getLatestRevisionByEntryId(model, entry.id);\n\n if (latestStorageEntry && latestStorageEntry.id === entry.id) {\n items.push(\n this._entity.putBatch({\n ...storageEntry,\n PK: partitionKey,\n SK: this.getSortKeyLatest(),\n TYPE: TYPE_ENTRY_LATEST,\n GSI1_PK: this.getGSILatestPartitionKey(model),\n GSI1_SK: this.getGSISortKey(entry)\n })\n );\n }\n\n try {\n await this._table.batchWrite(items);\n return storageEntry;\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not update entry.\",\n ex.code || \"UPDATE_ERROR\",\n {\n error: ex,\n originalEntry,\n entry,\n latestStorageEntry\n }\n );\n }\n }\n\n public async publish(\n model: CmsContentModel,\n args: CmsContentEntryStorageOperationsPublishArgs\n ): Promise<CmsContentEntry> {\n const { entry, storageEntry } = args;\n\n const partitionKey = this.getPartitionKey(entry.id);\n\n /**\n * We need the latest and published entries to see if something needs to be updated along side the publishing one.\n */\n const latestStorageEntry = await this.getLatestRevisionByEntryId(model, entry.id);\n const publishedStorageEntry = await this.getPublishedRevisionByEntryId(model, entry.id);\n /**\n * We need to update:\n * - current entry revision sort key\n * - published sort key\n * - latest sort key - if entry updated is actually latest\n * - previous published entry to unpublished status - if any previously published entry\n */\n const items = [\n this._entity.putBatch({\n ...storageEntry,\n PK: partitionKey,\n SK: this.getSortKeyRevision(entry.version),\n TYPE: TYPE_ENTRY,\n GSI1_PK: this.getGSIEntryPartitionKey(model),\n GSI1_SK: this.getGSISortKey(entry)\n }),\n this._entity.putBatch({\n ...storageEntry,\n PK: partitionKey,\n SK: this.getSortKeyPublished(),\n TYPE: TYPE_ENTRY_PUBLISHED,\n GSI1_PK: this.getGSIPublishedPartitionKey(model),\n GSI1_SK: this.getGSISortKey(entry)\n })\n ];\n if (entry.id === latestStorageEntry.id) {\n items.push(\n this._entity.putBatch({\n ...storageEntry,\n PK: partitionKey,\n SK: this.getSortKeyLatest(),\n TYPE: TYPE_ENTRY_LATEST,\n GSI1_PK: this.getGSILatestPartitionKey(model),\n GSI1_SK: this.getGSISortKey(entry)\n })\n );\n }\n if (publishedStorageEntry) {\n items.push(\n this._entity.putBatch({\n ...publishedStorageEntry,\n PK: partitionKey,\n SK: this.getSortKeyRevision(publishedStorageEntry.version),\n TYPE: TYPE_ENTRY,\n status: CONTENT_ENTRY_STATUS.UNPUBLISHED,\n GSI1_PK: this.getGSIEntryPartitionKey(model),\n GSI1_SK: this.getGSISortKey(publishedStorageEntry)\n })\n );\n }\n\n try {\n await this._table.batchWrite(items);\n this._dataLoaders.clearAllEntryRevisions(model, entry);\n return entry;\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not execute the publishing batch.\",\n ex.code || \"PUBLISH_ERROR\",\n {\n entry,\n latestStorageEntry,\n publishedStorageEntry\n }\n );\n }\n }\n\n public async unpublish(\n model: CmsContentModel,\n args: CmsContentEntryStorageOperationsUnpublishArgs\n ): Promise<CmsContentEntry> {\n const { entry, storageEntry } = args;\n\n const partitionKey = this.getPartitionKey(entry.id);\n /**\n * We need to:\n * - delete currently published entry\n * - update current entry revision with new data\n * - update latest entry status - if entry being unpublished is latest\n */\n const items = [\n this._entity.deleteBatch({\n PK: partitionKey,\n SK: this.getSortKeyPublished()\n }),\n this._entity.putBatch({\n ...storageEntry,\n PK: partitionKey,\n SK: this.getSortKeyRevision(entry.version),\n TYPE: TYPE_ENTRY,\n GSI1_PK: this.getGSIEntryPartitionKey(model),\n GSI1_SK: this.getGSISortKey(entry)\n })\n ];\n\n /**\n * We need the latest entry to see if something needs to be updated along side the unpublishing one.\n */\n const latestStorageEntry = await this.getLatestRevisionByEntryId(model, entry.id);\n\n if (entry.id === latestStorageEntry.id) {\n items.push(\n this._entity.putBatch({\n ...storageEntry,\n PK: partitionKey,\n SK: this.getSortKeyLatest(),\n TYPE: TYPE_ENTRY_LATEST,\n GSI1_PK: this.getGSILatestPartitionKey(model),\n GSI1_SK: this.getGSISortKey(entry)\n })\n );\n }\n\n try {\n await this._table.batchWrite(items);\n return storageEntry;\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not execute unpublish batch.\",\n ex.code || \"UNPUBLISH_ERROR\",\n {\n entry,\n storageEntry\n }\n );\n }\n }\n\n public async requestChanges(\n model: CmsContentModel,\n args: CmsContentEntryStorageOperationsRequestChangesArgs\n ): Promise<CmsContentEntry> {\n const { entry, storageEntry, originalEntry } = args;\n\n const partitionKey = this.getPartitionKey(entry.id);\n\n /**\n * We need to:\n * - update the existing entry\n * - update latest version - if existing entry is the latest version\n */\n const items = [\n this._entity.putBatch({\n ...storageEntry,\n PK: partitionKey,\n SK: this.getSortKeyRevision(entry.version),\n GSI1_PK: this.getGSIEntryPartitionKey(model),\n GSI1_SK: this.getGSISortKey(entry)\n })\n ];\n\n /**\n * We need the latest entry to see if something needs to be updated along side the request changes one.\n */\n const latestStorageEntry = await this.getLatestRevisionByEntryId(model, entry.id);\n\n if (latestStorageEntry.id === entry.id) {\n items.push(\n this._entity.putBatch({\n ...storageEntry,\n PK: partitionKey,\n SK: this.getSortKeyLatest(),\n TYPE: TYPE_ENTRY_LATEST,\n GSI1_PK: this.getGSILatestPartitionKey(model),\n GSI1_SK: this.getGSISortKey(entry)\n })\n );\n }\n\n try {\n await this._table.batchWrite(items);\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not execute the request changes batch.\",\n ex.code || \"REQUEST_CHANGES_ERROR\",\n {\n entry,\n originalEntry\n }\n );\n }\n return entry;\n }\n\n public async requestReview(\n model: CmsContentModel,\n args: CmsContentEntryStorageOperationsRequestReviewArgs\n ): Promise<CmsContentEntry> {\n const { entry, storageEntry, originalEntry } = args;\n\n const partitionKey = this.getPartitionKey(entry.id);\n /**\n * We need to:\n * - update existing entry\n * - update latest entry - if existing entry is the latest entry\n */\n const items = [\n this._entity.putBatch({\n ...storageEntry,\n PK: partitionKey,\n SK: this.getSortKeyRevision(entry.version),\n GSI1_PK: this.getGSIEntryPartitionKey(model),\n GSI1_SK: this.getGSISortKey(entry)\n })\n ];\n\n /**\n * We need the latest entry to see if something needs to be updated along side the request review one.\n */\n const latestStorageEntry = await this.getLatestRevisionByEntryId(model, entry.id);\n\n if (latestStorageEntry.id === entry.id) {\n items.push(\n this._entity.putBatch({\n ...storageEntry,\n PK: partitionKey,\n SK: this.getSortKeyLatest(),\n TYPE: TYPE_ENTRY_LATEST,\n GSI1_PK: this.getGSILatestPartitionKey(model),\n GSI1_SK: this.getGSISortKey(entry)\n })\n );\n }\n\n try {\n await this._table.batchWrite(items);\n return entry;\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not execute request review batch.\",\n ex.code || \"REQUEST_REVIEW_ERROR\",\n {\n entry,\n storageEntry,\n originalEntry\n }\n );\n }\n }\n\n public async getAllRevisionsByIds(\n model: CmsContentModel,\n ids: readonly string[]\n ): Promise<CmsContentEntry[]> {\n if (ids.length === 0) {\n return [];\n }\n try {\n return await this._dataLoaders.getAllEntryRevisions(model, ids);\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not read multiple entries.\",\n ex.code || \"GET_ALL_REVISIONS_BY_IDS_ERROR\",\n {\n ids\n }\n );\n }\n }\n\n public async getByIds(\n model: CmsContentModel,\n ids: readonly string[]\n ): Promise<CmsContentEntry[]> {\n if (ids.length === 0) {\n return [];\n }\n try {\n return await this._dataLoaders.getRevisionById(model, ids);\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not read multiple entries.\",\n ex.code || \"GET_BY_IDS_ERROR\",\n {\n ids\n }\n );\n }\n }\n\n public async getPublishedByIds(\n model: CmsContentModel,\n ids: readonly string[]\n ): Promise<CmsContentEntry[]> {\n if (ids.length === 0) {\n return [];\n }\n try {\n return await this._dataLoaders.getPublishedRevisionByEntryId(model, ids);\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not read multiple entries.\",\n ex.code || \"GET_BY_IDS_ERROR\",\n {\n ids\n }\n );\n }\n }\n\n public async getLatestByIds(\n model: CmsContentModel,\n ids: readonly string[]\n ): Promise<CmsContentEntry[]> {\n if (ids.length === 0) {\n return [];\n }\n try {\n return await this._dataLoaders.getLatestRevisionByEntryId(model, ids);\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not read multiple entries.\",\n ex.code || \"GET_BY_IDS_ERROR\",\n {\n ids\n }\n );\n }\n }\n\n public async getRevisions(model: CmsContentModel, id: string): Promise<CmsContentEntry[]> {\n try {\n return await this._dataLoaders.getAllEntryRevisions(model, [id]);\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not read multiple entries.\",\n ex.code || \"GET_ALL_REVISIONS_BY_IDS_ERROR\",\n {\n id\n }\n );\n }\n }\n\n public async getRevisionById(\n model: CmsContentModel,\n id: string\n ): Promise<CmsContentEntry | null> {\n return this.getSingleDynamoDbItem({\n partitionKey: this.getPartitionKey(id),\n value: this.getSortKeyRevision(id)\n });\n }\n\n public async getPublishedRevisionByEntryId(\n model: CmsContentModel,\n entryId: string\n ): Promise<CmsContentEntry | null> {\n return this.getSingleDynamoDbItem({\n partitionKey: this.getPartitionKey(entryId),\n value: this.getSortKeyPublished()\n });\n }\n\n public async getLatestRevisionByEntryId(\n model: CmsContentModel,\n entryId: string\n ): Promise<CmsContentEntry | null> {\n return this.getSingleDynamoDbItem({\n partitionKey: this.getPartitionKey(entryId),\n value: this.getSortKeyLatest()\n });\n }\n\n public async getPreviousRevision(\n model: CmsContentModel,\n entryId: string,\n version: number\n ): Promise<CmsContentEntry | null> {\n const entry = await this.getSingleDynamoDbItem({\n partitionKey: this.getPartitionKey(entryId),\n op: \"lt\",\n value: this.getSortKeyRevision(version),\n order: \"DESC\"\n });\n if ((entry as any).TYPE !== TYPE_ENTRY) {\n return null;\n }\n return entry;\n }\n\n private async getSingleDynamoDbItem(\n args: GetSingleDynamoDBItemArgs\n ): Promise<CmsContentEntry | null> {\n const { partitionKey, op = \"eq\", value, order = \"ASC\" } = args;\n const queryOptions: DynamoDBToolboxQueryOptions = {\n [op]: value,\n reverse: order === \"DESC\",\n limit: 1\n };\n\n try {\n const result = await this._entity.query(partitionKey, queryOptions);\n if (!result || Array.isArray(result.Items) === false) {\n throw new WebinyError(\n \"Error when querying for content entries - no result.\",\n \"QUERY_ERROR\",\n {\n partitionKey,\n queryOptions\n }\n );\n }\n if (result.Items.length === 0) {\n return null;\n }\n return result.Items.shift();\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not read from the DynamoDB.\",\n ex.code || \"DDB_READ_ERROR\",\n {\n partitionKey,\n queryOptions\n }\n );\n }\n }\n\n public getPartitionKey(id: string): string {\n /**\n * If ID includes # it means it is composed of ID and VERSION.\n * We need ID only so extract it.\n */\n if (id.match(\"#\") !== null) {\n id = id.split(\"#\").shift();\n }\n return `${this.partitionKey}#${id}`;\n }\n\n private get partitionKey(): string {\n return `${createBasePartitionKey(this.context)}#CME`;\n }\n\n private getGSIPartitionKey(type: \"L\" | \"P\" | \"A\", model: CmsContentModel) {\n return `${this.partitionKey}#M#${model.modelId}#${type}`;\n }\n\n private getGSIEntryPartitionKey(model: CmsContentModel): string {\n return this.getGSIPartitionKey(\"A\", model);\n }\n private getGSILatestPartitionKey(model: CmsContentModel): string {\n return this.getGSIPartitionKey(\"L\", model);\n }\n\n private getGSIPublishedPartitionKey(model: CmsContentModel): string {\n return this.getGSIPartitionKey(\"P\", model);\n }\n\n private getGSISortKey(entry: CmsContentEntry): string {\n return entry.id;\n }\n /**\n * Gets a secondary key in form of REV#version from:\n * id#0003\n * 0003\n * 3\n */\n public getSortKeyRevision(version: string | number) {\n if (typeof version === \"string\" && version.includes(\"#\") === true) {\n version = version.split(\"#\").pop();\n }\n return `REV#${zeroPad(version)}`;\n }\n\n public getSortKeyLatest(): string {\n return \"L\";\n }\n\n public getSortKeyPublished(): string {\n return \"P\";\n }\n /**\n * Method to build the query partition keys, always an array, and create the target index:\n * - if undefined then it is primary\n * - if populated then it is that given one (and partition keys are reflecting that)\n */\n private createQueryOptions({\n where: originalWhere,\n model\n }: {\n where: CmsContentEntryListWhere;\n model: CmsContentModel;\n }): {\n queryPartitionKeys: string[];\n where: CmsContentEntryListWhere;\n options: DynamoDBToolboxQueryOptions;\n } {\n const options: DynamoDBToolboxQueryOptions = {\n filters: [],\n index: undefined\n };\n const where = lodashCloneDeep(originalWhere);\n /**\n * if we have id or entry ID, we will query via the primary key\n * just add all the possible IDs to find\n */\n const queryPartitionKeys: string[] = [];\n if (where.id) {\n queryPartitionKeys.push(this.getPartitionKey(where.id));\n }\n if (where.entryId) {\n queryPartitionKeys.push(this.getPartitionKey(where.entryId));\n }\n if (where.id_in) {\n queryPartitionKeys.push(...where.id_in.map(id => this.getPartitionKey(id)));\n }\n if (where.entryId_in) {\n queryPartitionKeys.push(...where.entryId_in.map(id => this.getPartitionKey(id)));\n }\n\n /**\n * If we do not have any of the IDs, we will query via the GSI1_PK just depending on the entry type\n * At this point there will probably be a lot of results\n * but we will apply some basic dynamodb filters so we dont get much data from the db\n * NOTE: It is still going to get charged tho\n */\n if (queryPartitionKeys.length === 0) {\n options.index = GSI1_INDEX;\n if (where.published) {\n queryPartitionKeys.push(this.getGSIPartitionKey(\"P\", model));\n } else if (where.latest) {\n queryPartitionKeys.push(this.getGSIPartitionKey(\"L\", model));\n } else {\n queryPartitionKeys.push(this.getGSIPartitionKey(\"A\", model));\n }\n }\n /**\n * If index is the primary one, we can filter records by type (latest, published or regular)\n * so we do not need to filter in the code\n */\n if (!options.index) {\n if (where.published) {\n options.eq = this.getSortKeyPublished();\n } else if (where.latest) {\n options.eq = this.getSortKeyLatest();\n } else {\n options.beginsWith = \"REV#\";\n }\n }\n /**\n * we remove all the used where conditions\n */\n delete where[\"id\"];\n delete where[\"id_in\"];\n delete where[\"entryId\"];\n delete where[\"entryId_in\"];\n delete where[\"published\"];\n delete where[\"latest\"];\n return {\n options,\n queryPartitionKeys,\n where\n };\n }\n /**\n * A method to query the database at the given partition key with the built query options.\n * Method runs in the loop until it reads everything it needs to.\n * We could impose the limit on the records read but there is no point since we MUST read everything to be able\n * to filter and sort the data.\n */\n public async runQuery(args: RunQueryArgs): Promise<CmsContentEntry[]> {\n let previousResult = undefined;\n let results;\n const items: CmsContentEntry[] = [];\n while ((results = await this.query(previousResult, args))) {\n items.push(...results.Items);\n previousResult = results;\n }\n return items;\n }\n\n private async query(previousResult, args: RunQueryArgs) {\n const { partitionKey, options } = args;\n let result;\n /**\n * In case there is no previous result we must make a new query.\n * This is the first query on the given partition key.\n */\n if (!previousResult) {\n result = await this._entity.query(partitionKey, options);\n } else if (typeof previousResult.next === \"function\") {\n /**\n * In case we have a previous result and it has a next method, we run it.\n * In case result of the next method is false, it means it has nothing else to read\n * and we return a null to keep the query from repeating.\n */\n result = await previousResult.next();\n if (result === false) {\n return null;\n }\n } else {\n /**\n * This could probably never happen but keep it here just in case to break the query loop.\n * Basically, either previousResult does not exist or it exists and has a next method\n * and at that point a result returned will be null and loop should not start again.\n */\n return null;\n }\n /**\n * We expect the result to contain an Items array and if not, something went wrong, very wrong.\n */\n if (!result || !result.Items || !Array.isArray(result.Items)) {\n throw new WebinyError(\n \"Error when querying for content entries - no result.\",\n \"QUERY_ERROR\",\n {\n partitionKey,\n options\n }\n );\n }\n return result;\n }\n}\n"],"file":"CmsContentEntryDynamo.js"}
@@ -0,0 +1,23 @@
1
+ import { CmsContentEntry, CmsContentModel, CmsContext } from "@webiny/api-headless-cms/types";
2
+ import { CmsContentEntryDynamo } from "./CmsContentEntryDynamo";
3
+ export declare class DataLoadersHandler {
4
+ private readonly _loaders;
5
+ private readonly _context;
6
+ private readonly _storageOperations;
7
+ constructor(context: CmsContext, storageOperations: CmsContentEntryDynamo);
8
+ getAllEntryRevisions(model: CmsContentModel, ids: readonly string[]): Promise<CmsContentEntry[]>;
9
+ clearAllEntryRevisions(model: CmsContentModel, entry?: CmsContentEntry): void;
10
+ getRevisionById(model: CmsContentModel, ids: readonly string[]): Promise<CmsContentEntry[]>;
11
+ clearRevisionById(model: CmsContentModel, entry?: CmsContentEntry): void;
12
+ getPublishedRevisionByEntryId(model: CmsContentModel, ids: readonly string[]): Promise<CmsContentEntry[]>;
13
+ clearPublishedRevisionByEntryId(model: CmsContentModel, entry?: CmsContentEntry): void;
14
+ getLatestRevisionByEntryId(model: CmsContentModel, ids: readonly string[]): Promise<CmsContentEntry[]>;
15
+ clearLatestRevisionByEntryId(model: CmsContentModel, entry?: CmsContentEntry): void;
16
+ private getLoader;
17
+ private loadMany;
18
+ /**
19
+ * Helper to clear the cache for certain data loader.
20
+ * If entry is passed then clear target key only.
21
+ */
22
+ private clear;
23
+ }
@@ -0,0 +1,283 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.DataLoadersHandler = void 0;
9
+
10
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11
+
12
+ var _dataloader = _interopRequireDefault(require("dataloader"));
13
+
14
+ var _error = _interopRequireDefault(require("@webiny/error"));
15
+
16
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
17
+
18
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
19
+
20
+ /**
21
+ * *** GLOBAL NOTE ***
22
+ * When records are received from the batch get, we get them in all sorts of order.
23
+ * What we need for DataLoader to work properly we must have id > records order.
24
+ * So in the order IDs got into the DataLoader, its records must go out in the same order / bundle.
25
+ */
26
+ const flatResponses = responses => {
27
+ const entries = [];
28
+ const values = Object.values(responses);
29
+
30
+ for (const items of values) {
31
+ entries.push(...items);
32
+ }
33
+
34
+ return entries;
35
+ };
36
+
37
+ const executeBatchGet = async (storageOperations, batch) => {
38
+ const items = [];
39
+ const result = await storageOperations.table.batchGet(batch);
40
+
41
+ if (!result) {
42
+ return items;
43
+ }
44
+
45
+ if (result.Responses) {
46
+ items.push(...flatResponses(result.Responses));
47
+ }
48
+
49
+ if (typeof result.next === "function") {
50
+ let previous = result;
51
+ let nResult;
52
+
53
+ while (nResult = await previous.next()) {
54
+ items.push(...flatResponses(nResult.Responses));
55
+ previous = nResult;
56
+
57
+ if (!nResult || typeof nResult.next !== "function") {
58
+ return items;
59
+ }
60
+ }
61
+ }
62
+
63
+ return items;
64
+ };
65
+
66
+ const getAllEntryRevisions = (context, model, storageOperations) => {
67
+ return new _dataloader.default(async ids => {
68
+ const promises = ids.map(id => {
69
+ const partitionKey = storageOperations.getPartitionKey(id);
70
+ return storageOperations.runQuery({
71
+ partitionKey,
72
+ options: {
73
+ beginsWith: "REV#"
74
+ }
75
+ });
76
+ });
77
+ return Promise.all(promises);
78
+ });
79
+ };
80
+
81
+ const getRevisionById = (context, model, storageOperations) => {
82
+ return new _dataloader.default(async ids => {
83
+ const batch = ids.reduce((collection, id) => {
84
+ const partitionKey = storageOperations.getPartitionKey(id);
85
+ const sortKey = storageOperations.getSortKeyRevision(id);
86
+ const keys = `${partitionKey}__${sortKey}`;
87
+
88
+ if (collection[keys]) {
89
+ return collection;
90
+ }
91
+
92
+ collection[keys] = storageOperations.entity.getBatch({
93
+ PK: partitionKey,
94
+ SK: sortKey
95
+ });
96
+ return collection;
97
+ }, {});
98
+ const items = await executeBatchGet(storageOperations, Object.values(batch));
99
+ return ids.map(id => {
100
+ return items.filter(item => {
101
+ const partitionKey = storageOperations.getPartitionKey(id);
102
+ const sortKey = storageOperations.getSortKeyRevision(id);
103
+ return item.PK === partitionKey && item.SK === sortKey;
104
+ });
105
+ });
106
+ });
107
+ };
108
+
109
+ const getPublishedRevisionByEntryId = (context, model, storageOperations) => {
110
+ return new _dataloader.default(async ids => {
111
+ const sortKey = storageOperations.getSortKeyPublished();
112
+ const batch = ids.reduce((collection, id) => {
113
+ const partitionKey = storageOperations.getPartitionKey(id);
114
+
115
+ if (collection[partitionKey]) {
116
+ return collection;
117
+ }
118
+
119
+ collection[partitionKey] = storageOperations.entity.getBatch({
120
+ PK: partitionKey,
121
+ SK: sortKey
122
+ });
123
+ return collection;
124
+ }, {});
125
+ const items = await executeBatchGet(storageOperations, Object.values(batch));
126
+ return ids.map(id => {
127
+ return items.filter(item => {
128
+ const partitionKey = storageOperations.getPartitionKey(id);
129
+ return item.PK === partitionKey && item.SK === sortKey;
130
+ });
131
+ });
132
+ });
133
+ };
134
+
135
+ const getLatestRevisionByEntryId = (context, model, storageOperations) => {
136
+ return new _dataloader.default(async ids => {
137
+ const sortKey = storageOperations.getSortKeyLatest();
138
+ const batch = ids.reduce((collection, id) => {
139
+ const partitionKey = storageOperations.getPartitionKey(id);
140
+
141
+ if (collection[partitionKey]) {
142
+ return collection;
143
+ }
144
+
145
+ collection[partitionKey] = storageOperations.entity.getBatch({
146
+ PK: partitionKey,
147
+ SK: sortKey
148
+ });
149
+ return collection;
150
+ }, {});
151
+ const items = await executeBatchGet(storageOperations, Object.values(batch));
152
+ return ids.map(id => {
153
+ return items.filter(item => {
154
+ const partitionKey = storageOperations.getPartitionKey(id);
155
+ return item.PK === partitionKey && item.SK === sortKey;
156
+ });
157
+ });
158
+ });
159
+ };
160
+
161
+ const dataLoaders = {
162
+ getAllEntryRevisions,
163
+ getRevisionById,
164
+ getPublishedRevisionByEntryId,
165
+ getLatestRevisionByEntryId
166
+ };
167
+
168
+ class DataLoadersHandler {
169
+ constructor(context, storageOperations) {
170
+ (0, _defineProperty2.default)(this, "_loaders", new Map());
171
+ (0, _defineProperty2.default)(this, "_context", void 0);
172
+ (0, _defineProperty2.default)(this, "_storageOperations", void 0);
173
+ this._context = context;
174
+ this._storageOperations = storageOperations;
175
+ }
176
+
177
+ async getAllEntryRevisions(model, ids) {
178
+ return await this.loadMany("getAllEntryRevisions", model, ids);
179
+ }
180
+
181
+ clearAllEntryRevisions(model, entry) {
182
+ this.clear("getAllEntryRevisions", model, entry);
183
+ }
184
+
185
+ async getRevisionById(model, ids) {
186
+ return await this.loadMany("getRevisionById", model, ids);
187
+ }
188
+
189
+ clearRevisionById(model, entry) {
190
+ this.clear("getRevisionById", model, entry);
191
+ }
192
+
193
+ async getPublishedRevisionByEntryId(model, ids) {
194
+ return await this.loadMany("getPublishedRevisionByEntryId", model, ids);
195
+ }
196
+
197
+ clearPublishedRevisionByEntryId(model, entry) {
198
+ this.clear("getPublishedRevisionByEntryId", model, entry);
199
+ }
200
+
201
+ async getLatestRevisionByEntryId(model, ids) {
202
+ return await this.loadMany("getLatestRevisionByEntryId", model, ids);
203
+ }
204
+
205
+ clearLatestRevisionByEntryId(model, entry) {
206
+ this.clear("getLatestRevisionByEntryId", model, entry);
207
+ }
208
+
209
+ getLoader(name, model) {
210
+ if (!dataLoaders[name]) {
211
+ throw new _error.default("Unknown data loader.", "UNKNOWN_DATA_LOADER", {
212
+ name
213
+ });
214
+ }
215
+
216
+ const loaderKey = `${name}-${model.modelId}`;
217
+
218
+ if (!this._loaders.has(loaderKey)) {
219
+ this._loaders.set(loaderKey, dataLoaders[name](this._context, model, this._storageOperations));
220
+ }
221
+
222
+ return this._loaders.get(loaderKey);
223
+ }
224
+
225
+ async loadMany(loader, model, ids) {
226
+ let results;
227
+
228
+ try {
229
+ results = await this.getLoader(loader, model).loadMany(ids);
230
+
231
+ if (Array.isArray(results) === true) {
232
+ return results.reduce((acc, res) => {
233
+ if (Array.isArray(res) === false) {
234
+ if (res !== null && res !== void 0 && res.message) {
235
+ throw new _error.default(res.message, res.code, _objectSpread(_objectSpread({}, res), {}, {
236
+ data: JSON.stringify(res.data || {})
237
+ }));
238
+ }
239
+
240
+ throw new _error.default("Result from the data loader must be an array of arrays which contain requested items.");
241
+ }
242
+
243
+ acc.push(...res);
244
+ return acc;
245
+ }, []);
246
+ }
247
+ } catch (ex) {
248
+ throw new _error.default(ex.message || "Data loader error.", ex.code || "DATA_LOADER_ERROR", {
249
+ loader,
250
+ ids,
251
+ model,
252
+ data: ex.data || {}
253
+ });
254
+ }
255
+
256
+ throw new _error.default(`Data loader did not return array of items or empty array.`, "INVALID_DATA_LOADER_RESULT", {
257
+ loader,
258
+ ids,
259
+ results
260
+ });
261
+ }
262
+ /**
263
+ * Helper to clear the cache for certain data loader.
264
+ * If entry is passed then clear target key only.
265
+ */
266
+
267
+
268
+ clear(name, model, entry) {
269
+ const loader = this.getLoader(name, model);
270
+
271
+ if (!entry) {
272
+ loader.clearAll();
273
+ return;
274
+ }
275
+
276
+ loader.clear(entry.id);
277
+ loader.clear(this._storageOperations.getPartitionKey(entry.id));
278
+ }
279
+
280
+ }
281
+
282
+ exports.DataLoadersHandler = DataLoadersHandler;
283
+ //# sourceMappingURL=dataLoaders.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/operations/entry/dataLoaders.ts"],"names":["flatResponses","responses","entries","values","Object","items","push","executeBatchGet","storageOperations","batch","result","table","batchGet","Responses","next","previous","nResult","getAllEntryRevisions","context","model","DataLoader","ids","promises","map","id","partitionKey","getPartitionKey","runQuery","options","beginsWith","Promise","all","getRevisionById","reduce","collection","sortKey","getSortKeyRevision","keys","entity","getBatch","PK","SK","filter","item","getPublishedRevisionByEntryId","getSortKeyPublished","getLatestRevisionByEntryId","getSortKeyLatest","dataLoaders","DataLoadersHandler","constructor","Map","_context","_storageOperations","loadMany","clearAllEntryRevisions","entry","clear","clearRevisionById","clearPublishedRevisionByEntryId","clearLatestRevisionByEntryId","getLoader","name","WebinyError","loaderKey","modelId","_loaders","has","set","get","loader","results","Array","isArray","acc","res","message","code","data","JSON","stringify","ex","clearAll"],"mappings":"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","sourcesContent":["import DataLoader from \"dataloader\";\nimport { CmsContentEntry, CmsContentModel, CmsContext } from \"@webiny/api-headless-cms/types\";\nimport WebinyError from \"@webiny/error\";\nimport { CmsContentEntryDynamo } from \"./CmsContentEntryDynamo\";\n\n/**\n * *** GLOBAL NOTE ***\n * When records are received from the batch get, we get them in all sorts of order.\n * What we need for DataLoader to work properly we must have id > records order.\n * So in the order IDs got into the DataLoader, its records must go out in the same order / bundle.\n */\n\nconst flatResponses = (responses: Record<string, CmsContentEntry[]>): CmsContentEntry[] => {\n const entries = [];\n const values = Object.values(responses);\n for (const items of values) {\n entries.push(...items);\n }\n return entries;\n};\n\nconst executeBatchGet = async (storageOperations: CmsContentEntryDynamo, batch: any[]) => {\n const items = [];\n const result = await storageOperations.table.batchGet(batch);\n if (!result) {\n return items;\n }\n if (result.Responses) {\n items.push(...flatResponses(result.Responses));\n }\n if (typeof result.next === \"function\") {\n let previous = result;\n let nResult;\n while ((nResult = await previous.next())) {\n items.push(...flatResponses(nResult.Responses));\n previous = nResult;\n if (!nResult || typeof nResult.next !== \"function\") {\n return items;\n }\n }\n }\n\n return items;\n};\n\nconst getAllEntryRevisions = (\n context: CmsContext,\n model: CmsContentModel,\n storageOperations: CmsContentEntryDynamo\n) => {\n return new DataLoader<string, CmsContentEntry[]>(async ids => {\n const promises = ids.map(id => {\n const partitionKey = storageOperations.getPartitionKey(id);\n return storageOperations.runQuery({\n partitionKey,\n options: {\n beginsWith: \"REV#\"\n }\n });\n });\n\n return Promise.all(promises);\n });\n};\n\nconst getRevisionById = (\n context: CmsContext,\n model: CmsContentModel,\n storageOperations: CmsContentEntryDynamo\n) => {\n return new DataLoader<string, CmsContentEntry>(async ids => {\n const batch = ids.reduce((collection, id) => {\n const partitionKey = storageOperations.getPartitionKey(id);\n const sortKey = storageOperations.getSortKeyRevision(id);\n const keys = `${partitionKey}__${sortKey}`;\n if (collection[keys]) {\n return collection;\n }\n collection[keys] = storageOperations.entity.getBatch({\n PK: partitionKey,\n SK: sortKey\n });\n return collection;\n }, {});\n\n const items = await executeBatchGet(storageOperations, Object.values(batch));\n\n return ids.map(id => {\n return items.filter(item => {\n const partitionKey = storageOperations.getPartitionKey(id);\n const sortKey = storageOperations.getSortKeyRevision(id);\n return item.PK === partitionKey && item.SK === sortKey;\n });\n }) as any;\n });\n};\n\nconst getPublishedRevisionByEntryId = (\n context: CmsContext,\n model: CmsContentModel,\n storageOperations: CmsContentEntryDynamo\n) => {\n return new DataLoader<string, CmsContentEntry>(async ids => {\n const sortKey = storageOperations.getSortKeyPublished();\n const batch = ids.reduce((collection, id) => {\n const partitionKey = storageOperations.getPartitionKey(id);\n if (collection[partitionKey]) {\n return collection;\n }\n collection[partitionKey] = storageOperations.entity.getBatch({\n PK: partitionKey,\n SK: sortKey\n });\n return collection;\n }, {});\n\n const items = await executeBatchGet(storageOperations, Object.values(batch));\n return ids.map(id => {\n return items.filter(item => {\n const partitionKey = storageOperations.getPartitionKey(id);\n return item.PK === partitionKey && item.SK === sortKey;\n });\n }) as any;\n });\n};\n\nconst getLatestRevisionByEntryId = (\n context: CmsContext,\n model: CmsContentModel,\n storageOperations: CmsContentEntryDynamo\n) => {\n return new DataLoader<string, CmsContentEntry>(async ids => {\n const sortKey = storageOperations.getSortKeyLatest();\n const batch = ids.reduce((collection, id) => {\n const partitionKey = storageOperations.getPartitionKey(id);\n if (collection[partitionKey]) {\n return collection;\n }\n collection[partitionKey] = storageOperations.entity.getBatch({\n PK: partitionKey,\n SK: sortKey\n });\n return collection;\n }, {});\n\n const items = await executeBatchGet(storageOperations, Object.values(batch));\n return ids.map(id => {\n return items.filter(item => {\n const partitionKey = storageOperations.getPartitionKey(id);\n return item.PK === partitionKey && item.SK === sortKey;\n });\n }) as any;\n });\n};\n\nconst dataLoaders = {\n getAllEntryRevisions,\n getRevisionById,\n getPublishedRevisionByEntryId,\n getLatestRevisionByEntryId\n};\n\nexport class DataLoadersHandler {\n private readonly _loaders: Map<string, DataLoader<any, any>> = new Map();\n private readonly _context: CmsContext;\n private readonly _storageOperations: CmsContentEntryDynamo;\n\n public constructor(context: CmsContext, storageOperations: CmsContentEntryDynamo) {\n this._context = context;\n this._storageOperations = storageOperations;\n }\n\n public async getAllEntryRevisions(\n model: CmsContentModel,\n ids: readonly string[]\n ): Promise<CmsContentEntry[]> {\n return await this.loadMany(\"getAllEntryRevisions\", model, ids);\n }\n\n public clearAllEntryRevisions(model: CmsContentModel, entry?: CmsContentEntry): void {\n this.clear(\"getAllEntryRevisions\", model, entry);\n }\n\n public async getRevisionById(\n model: CmsContentModel,\n ids: readonly string[]\n ): Promise<CmsContentEntry[]> {\n return await this.loadMany(\"getRevisionById\", model, ids);\n }\n\n public clearRevisionById(model: CmsContentModel, entry?: CmsContentEntry): void {\n this.clear(\"getRevisionById\", model, entry);\n }\n\n public async getPublishedRevisionByEntryId(\n model: CmsContentModel,\n ids: readonly string[]\n ): Promise<CmsContentEntry[]> {\n return await this.loadMany(\"getPublishedRevisionByEntryId\", model, ids);\n }\n public clearPublishedRevisionByEntryId(model: CmsContentModel, entry?: CmsContentEntry): void {\n this.clear(\"getPublishedRevisionByEntryId\", model, entry);\n }\n\n public async getLatestRevisionByEntryId(\n model: CmsContentModel,\n ids: readonly string[]\n ): Promise<CmsContentEntry[]> {\n return await this.loadMany(\"getLatestRevisionByEntryId\", model, ids);\n }\n\n public clearLatestRevisionByEntryId(model: CmsContentModel, entry?: CmsContentEntry): void {\n this.clear(\"getLatestRevisionByEntryId\", model, entry);\n }\n\n private getLoader(name: string, model: CmsContentModel): DataLoader<any, any> {\n if (!dataLoaders[name]) {\n throw new WebinyError(\"Unknown data loader.\", \"UNKNOWN_DATA_LOADER\", {\n name\n });\n }\n const loaderKey = `${name}-${model.modelId}`;\n if (!this._loaders.has(loaderKey)) {\n this._loaders.set(\n loaderKey,\n dataLoaders[name](this._context, model, this._storageOperations)\n );\n }\n return this._loaders.get(loaderKey);\n }\n\n private async loadMany(\n loader: string,\n model: CmsContentModel,\n ids: readonly string[]\n ): Promise<CmsContentEntry[]> {\n let results;\n try {\n results = await this.getLoader(loader, model).loadMany(ids);\n if (Array.isArray(results) === true) {\n return results.reduce((acc, res) => {\n if (Array.isArray(res) === false) {\n if (res?.message) {\n throw new WebinyError(res.message, res.code, {\n ...res,\n data: JSON.stringify(res.data || {})\n });\n }\n throw new WebinyError(\n \"Result from the data loader must be an array of arrays which contain requested items.\"\n );\n }\n acc.push(...res);\n return acc;\n }, []);\n }\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Data loader error.\",\n ex.code || \"DATA_LOADER_ERROR\",\n {\n loader,\n ids,\n model,\n data: ex.data || {}\n }\n );\n }\n throw new WebinyError(\n `Data loader did not return array of items or empty array.`,\n \"INVALID_DATA_LOADER_RESULT\",\n {\n loader,\n ids,\n results\n }\n );\n }\n /**\n * Helper to clear the cache for certain data loader.\n * If entry is passed then clear target key only.\n */\n private clear(name: string, model: CmsContentModel, entry?: CmsContentEntry): void {\n const loader = this.getLoader(name, model);\n if (!entry) {\n loader.clearAll();\n return;\n }\n loader.clear(entry.id);\n loader.clear(this._storageOperations.getPartitionKey(entry.id));\n }\n}\n"],"file":"dataLoaders.js"}
@@ -0,0 +1,4 @@
1
+ import { CmsContentEntryConfiguration } from "./CmsContentEntryDynamo";
2
+ import { CmsContentEntryStorageOperationsProvider } from "@webiny/api-headless-cms/types";
3
+ declare const contentEntryStorageOperationsProvider: (configuration?: CmsContentEntryConfiguration) => CmsContentEntryStorageOperationsProvider;
4
+ export default contentEntryStorageOperationsProvider;
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _CmsContentEntryDynamo = require("./CmsContentEntryDynamo");
9
+
10
+ const contentEntryStorageOperationsProvider = configuration => ({
11
+ type: "cms-content-entry-storage-operations-provider",
12
+ name: "cms-content-entry-storage-operations-ddb-crud",
13
+ provide: async ({
14
+ context
15
+ }) => {
16
+ return new _CmsContentEntryDynamo.CmsContentEntryDynamo({
17
+ context,
18
+ configuration
19
+ });
20
+ }
21
+ });
22
+
23
+ var _default = contentEntryStorageOperationsProvider;
24
+ exports.default = _default;
25
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/operations/entry/index.ts"],"names":["contentEntryStorageOperationsProvider","configuration","type","name","provide","context","CmsContentEntryDynamo"],"mappings":";;;;;;;AAAA;;AAGA,MAAMA,qCAAqC,GACvCC,aAD0C,KAEE;AAC5CC,EAAAA,IAAI,EAAE,+CADsC;AAE5CC,EAAAA,IAAI,EAAE,+CAFsC;AAG5CC,EAAAA,OAAO,EAAE,OAAO;AAAEC,IAAAA;AAAF,GAAP,KAAuB;AAC5B,WAAO,IAAIC,4CAAJ,CAA0B;AAC7BD,MAAAA,OAD6B;AAE7BJ,MAAAA;AAF6B,KAA1B,CAAP;AAIH;AAR2C,CAFF,CAA9C;;eAaeD,qC","sourcesContent":["import { CmsContentEntryDynamo, CmsContentEntryConfiguration } from \"./CmsContentEntryDynamo\";\nimport { CmsContentEntryStorageOperationsProvider } from \"@webiny/api-headless-cms/types\";\n\nconst contentEntryStorageOperationsProvider = (\n configuration?: CmsContentEntryConfiguration\n): CmsContentEntryStorageOperationsProvider => ({\n type: \"cms-content-entry-storage-operations-provider\",\n name: \"cms-content-entry-storage-operations-ddb-crud\",\n provide: async ({ context }) => {\n return new CmsContentEntryDynamo({\n context,\n configuration\n });\n }\n});\n\nexport default contentEntryStorageOperationsProvider;\n"],"file":"index.js"}
@@ -0,0 +1,2 @@
1
+ import { CmsContentModelField } from "@webiny/api-headless-cms/types";
2
+ export declare const systemFields: Record<string, CmsContentModelField>;
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.systemFields = void 0;
7
+
8
+ const createSystemField = field => {
9
+ return field;
10
+ };
11
+
12
+ const systemFields = {
13
+ id: createSystemField({
14
+ id: "id",
15
+ type: "text",
16
+ fieldId: "id"
17
+ }),
18
+ entryId: createSystemField({
19
+ id: "entryId",
20
+ type: "text",
21
+ fieldId: "entryId"
22
+ }),
23
+ createdOn: createSystemField({
24
+ id: "createdOn",
25
+ type: "datetime",
26
+ fieldId: "createdOn"
27
+ }),
28
+ savedOn: createSystemField({
29
+ id: "savedOn",
30
+ type: "datetime",
31
+ fieldId: "savedOn"
32
+ }),
33
+ createdBy: createSystemField({
34
+ id: "createdBy",
35
+ type: "plainObject",
36
+ fieldId: "createdBy",
37
+ settings: {
38
+ path: "createdBy.id"
39
+ }
40
+ }),
41
+ ownedBy: createSystemField({
42
+ id: "ownedBy",
43
+ type: "plainObject",
44
+ fieldId: "ownedBy",
45
+ settings: {
46
+ path: "ownedBy.id"
47
+ }
48
+ })
49
+ };
50
+ exports.systemFields = systemFields;
51
+ //# sourceMappingURL=systemFields.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/operations/entry/systemFields.ts"],"names":["createSystemField","field","systemFields","id","type","fieldId","entryId","createdOn","savedOn","createdBy","settings","path","ownedBy"],"mappings":";;;;;;;AAEA,MAAMA,iBAAiB,GAAIC,KAAD,IAAgE;AACtF,SAAOA,KAAP;AACH,CAFD;;AAIO,MAAMC,YAAkD,GAAG;AAC9DC,EAAAA,EAAE,EAAEH,iBAAiB,CAAC;AAClBG,IAAAA,EAAE,EAAE,IADc;AAElBC,IAAAA,IAAI,EAAE,MAFY;AAGlBC,IAAAA,OAAO,EAAE;AAHS,GAAD,CADyC;AAM9DC,EAAAA,OAAO,EAAEN,iBAAiB,CAAC;AACvBG,IAAAA,EAAE,EAAE,SADmB;AAEvBC,IAAAA,IAAI,EAAE,MAFiB;AAGvBC,IAAAA,OAAO,EAAE;AAHc,GAAD,CANoC;AAW9DE,EAAAA,SAAS,EAAEP,iBAAiB,CAAC;AACzBG,IAAAA,EAAE,EAAE,WADqB;AAEzBC,IAAAA,IAAI,EAAE,UAFmB;AAGzBC,IAAAA,OAAO,EAAE;AAHgB,GAAD,CAXkC;AAgB9DG,EAAAA,OAAO,EAAER,iBAAiB,CAAC;AACvBG,IAAAA,EAAE,EAAE,SADmB;AAEvBC,IAAAA,IAAI,EAAE,UAFiB;AAGvBC,IAAAA,OAAO,EAAE;AAHc,GAAD,CAhBoC;AAqB9DI,EAAAA,SAAS,EAAET,iBAAiB,CAAC;AACzBG,IAAAA,EAAE,EAAE,WADqB;AAEzBC,IAAAA,IAAI,EAAE,aAFmB;AAGzBC,IAAAA,OAAO,EAAE,WAHgB;AAIzBK,IAAAA,QAAQ,EAAE;AACNC,MAAAA,IAAI,EAAE;AADA;AAJe,GAAD,CArBkC;AA6B9DC,EAAAA,OAAO,EAAEZ,iBAAiB,CAAC;AACvBG,IAAAA,EAAE,EAAE,SADmB;AAEvBC,IAAAA,IAAI,EAAE,aAFiB;AAGvBC,IAAAA,OAAO,EAAE,SAHc;AAIvBK,IAAAA,QAAQ,EAAE;AACNC,MAAAA,IAAI,EAAE;AADA;AAJa,GAAD;AA7BoC,CAA3D","sourcesContent":["import { CmsContentModelField } from \"@webiny/api-headless-cms/types\";\n\nconst createSystemField = (field: Partial<CmsContentModelField>): CmsContentModelField => {\n return field as CmsContentModelField;\n};\n\nexport const systemFields: Record<string, CmsContentModelField> = {\n id: createSystemField({\n id: \"id\",\n type: \"text\",\n fieldId: \"id\"\n }),\n entryId: createSystemField({\n id: \"entryId\",\n type: \"text\",\n fieldId: \"entryId\"\n }),\n createdOn: createSystemField({\n id: \"createdOn\",\n type: \"datetime\",\n fieldId: \"createdOn\"\n }),\n savedOn: createSystemField({\n id: \"savedOn\",\n type: \"datetime\",\n fieldId: \"savedOn\"\n }),\n createdBy: createSystemField({\n id: \"createdBy\",\n type: \"plainObject\",\n fieldId: \"createdBy\",\n settings: {\n path: \"createdBy.id\"\n }\n }),\n ownedBy: createSystemField({\n id: \"ownedBy\",\n type: \"plainObject\",\n fieldId: \"ownedBy\",\n settings: {\n path: \"ownedBy.id\"\n }\n })\n};\n"],"file":"systemFields.js"}
@@ -0,0 +1,26 @@
1
+ import { CmsContentEntry, CmsContentEntryListWhere, CmsContentModel, CmsContentModelField, CmsContext } from "@webiny/api-headless-cms/types";
2
+ interface ModelField {
3
+ def: CmsContentModelField;
4
+ valueTransformer: (value: any) => any;
5
+ valuePath: string;
6
+ isSystemField?: boolean;
7
+ }
8
+ declare type ModelFieldRecords = Record<string, ModelField>;
9
+ interface FilterItemsArgs {
10
+ items: CmsContentEntry[];
11
+ where: CmsContentEntryListWhere;
12
+ context: CmsContext;
13
+ fields: ModelFieldRecords;
14
+ }
15
+ export declare const filterItems: (args: FilterItemsArgs) => CmsContentEntry[];
16
+ interface SortEntryItemsArgs {
17
+ items: CmsContentEntry[];
18
+ sort: string[];
19
+ fields: ModelFieldRecords;
20
+ }
21
+ export declare const sortEntryItems: (args: SortEntryItemsArgs) => CmsContentEntry[];
22
+ export declare const buildModelFields: ({ context, model }: {
23
+ context: CmsContext;
24
+ model: CmsContentModel;
25
+ }) => Record<string, ModelField>;
26
+ export {};
@@ -0,0 +1,362 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.buildModelFields = exports.sortEntryItems = exports.filterItems = void 0;
9
+
10
+ var _error = _interopRequireDefault(require("@webiny/error"));
11
+
12
+ var _lodash = _interopRequireDefault(require("lodash.sortby"));
13
+
14
+ var _dotProp = _interopRequireDefault(require("dot-prop"));
15
+
16
+ var _systemFields = require("./systemFields");
17
+
18
+ var _ValueFilterPlugin = require("@webiny/db-dynamodb/plugins/definitions/ValueFilterPlugin");
19
+
20
+ const VALUES_ATTRIBUTE = "values";
21
+
22
+ const extractWhereArgs = key => {
23
+ const result = key.split("_");
24
+ const fieldId = result.shift();
25
+ const rawOp = result.length === 0 ? "eq" : result.join("_");
26
+ /**
27
+ * When rawOp is not, it means it is equal negated so just return that.
28
+ */
29
+
30
+ if (rawOp === "not") {
31
+ return {
32
+ fieldId,
33
+ operation: "eq",
34
+ negate: true
35
+ };
36
+ }
37
+
38
+ const negate = rawOp.match("not_") !== null;
39
+ const operation = rawOp.replace("not_", "");
40
+ return {
41
+ fieldId,
42
+ operation,
43
+ negate
44
+ };
45
+ };
46
+
47
+ const transformValue = (value, transform) => {
48
+ if (Array.isArray(value)) {
49
+ return value.map(v => transform(v));
50
+ }
51
+
52
+ return transform(value);
53
+ };
54
+
55
+ const createFilters = args => {
56
+ const {
57
+ where,
58
+ context,
59
+ fields
60
+ } = args;
61
+ const filterPlugins = getMappedPlugins({
62
+ context,
63
+ type: _ValueFilterPlugin.ValueFilterPlugin.type,
64
+ property: "operation"
65
+ });
66
+ const transformValuePlugins = getMappedPlugins({
67
+ context,
68
+ type: "cms-field-filter-value-transform",
69
+ property: "fieldType"
70
+ });
71
+ const valuePathPlugins = getMappedPlugins({
72
+ context,
73
+ type: "cms-field-filter-path",
74
+ property: "fieldType"
75
+ });
76
+ return Object.keys(where).map(key => {
77
+ const {
78
+ fieldId,
79
+ operation,
80
+ negate
81
+ } = extractWhereArgs(key);
82
+ const field = fields[fieldId];
83
+
84
+ if (!field) {
85
+ throw new _error.default(`There is no field with the fieldId "${fieldId}".`, "FIELD_ERROR", {
86
+ fieldId
87
+ });
88
+ }
89
+
90
+ const transformValuePlugin = transformValuePlugins[field.def.type];
91
+ const valuePathPlugin = valuePathPlugins[field.def.type];
92
+ let targetValuePath;
93
+ /**
94
+ * add the base path if field is not a system field
95
+ * pathPlugin should not know about that
96
+ */
97
+
98
+ const basePath = _systemFields.systemFields[fieldId] ? "" : `${VALUES_ATTRIBUTE}.`;
99
+
100
+ if (valuePathPlugin) {
101
+ targetValuePath = valuePathPlugin.createPath({
102
+ field: field.def
103
+ });
104
+ } else if (_systemFields.systemFields[fieldId]) {
105
+ targetValuePath = fieldId;
106
+ } else {
107
+ targetValuePath = field.def.fieldId;
108
+ }
109
+
110
+ const valuePath = `${basePath}${targetValuePath}`;
111
+ const filterPlugin = filterPlugins[operation];
112
+
113
+ if (!filterPlugin) {
114
+ throw new _error.default(`There is no filter plugin for operation "${operation}".`, "FILTER_PLUGIN_ERROR", {
115
+ operation
116
+ });
117
+ }
118
+
119
+ const transformValueCallable = value => {
120
+ if (!transformValuePlugin) {
121
+ return value;
122
+ }
123
+
124
+ return transformValuePlugin.transform({
125
+ field: field.def,
126
+ value
127
+ });
128
+ };
129
+
130
+ return {
131
+ fieldId,
132
+ path: valuePath,
133
+ filterPlugin,
134
+ negate,
135
+ compareValue: transformValue(where[key], transformValueCallable),
136
+ transformValue: transformValueCallable
137
+ };
138
+ });
139
+ };
140
+
141
+ const filterItems = args => {
142
+ const {
143
+ items,
144
+ where,
145
+ context,
146
+ fields
147
+ } = args;
148
+ const filters = createFilters({
149
+ context,
150
+ where,
151
+ fields
152
+ });
153
+ return items.filter(item => {
154
+ for (const filter of filters) {
155
+ const value = transformValue(_dotProp.default.get(item, filter.path), filter.transformValue);
156
+ const matched = filter.filterPlugin.matches({
157
+ value,
158
+ compareValue: filter.compareValue
159
+ });
160
+
161
+ if ((filter.negate ? !matched : matched) === false) {
162
+ return false;
163
+ }
164
+ }
165
+
166
+ return true;
167
+ });
168
+ };
169
+
170
+ exports.filterItems = filterItems;
171
+
172
+ const extractSort = (sortBy, fields) => {
173
+ const result = sortBy.split("_");
174
+
175
+ if (result.length !== 2) {
176
+ throw new _error.default("Problem in determining the sorting for the entry items.", "SORT_ERROR", {
177
+ sortBy
178
+ });
179
+ }
180
+
181
+ const [fieldId, order] = result;
182
+ const modelField = fields[fieldId];
183
+
184
+ if (!modelField) {
185
+ throw new _error.default("Sorting field does not exist in the content model.", "SORTING_FIELD_ERROR", {
186
+ fieldId,
187
+ fields
188
+ });
189
+ }
190
+
191
+ const valuePath = modelField.valuePath;
192
+ return {
193
+ fieldId,
194
+ valuePath,
195
+ reverse: order === "DESC"
196
+ };
197
+ };
198
+
199
+ const sortEntryItems = args => {
200
+ const {
201
+ items,
202
+ sort = [],
203
+ fields
204
+ } = args;
205
+
206
+ if (items.length <= 1) {
207
+ return items;
208
+ } else if (sort.length === 0) {
209
+ sort.push("savedOn_DESC");
210
+ } else if (sort.length > 1) {
211
+ throw new _error.default("Sorting is limited to a single field", "SORT_ERROR", {
212
+ sort: sort
213
+ });
214
+ }
215
+
216
+ const [firstSort] = sort;
217
+
218
+ if (!firstSort) {
219
+ throw new _error.default("Empty sort array item.", "SORT_ERROR", {
220
+ sort
221
+ });
222
+ }
223
+
224
+ const {
225
+ fieldId,
226
+ valuePath,
227
+ reverse
228
+ } = extractSort(firstSort, fields);
229
+ const field = fields[fieldId];
230
+ const itemsToSort = items.map(item => {
231
+ return {
232
+ id: item.id,
233
+ value: field.valueTransformer(_dotProp.default.get(item, valuePath))
234
+ };
235
+ });
236
+ const sortedItems = (0, _lodash.default)(itemsToSort, "value");
237
+ const newItems = sortedItems.map(s => {
238
+ const item = items.find(i => i.id === s.id);
239
+
240
+ if (item) {
241
+ return item;
242
+ }
243
+
244
+ throw new _error.default("Could not find item by given id after the sorting.", "SORTING_ITEMS_ERROR", {
245
+ id: s.id,
246
+ sortingBy: fieldId,
247
+ reverse
248
+ });
249
+ });
250
+
251
+ if (!reverse) {
252
+ return newItems;
253
+ }
254
+
255
+ return newItems.reverse();
256
+ };
257
+
258
+ exports.sortEntryItems = sortEntryItems;
259
+
260
+ const getMappedPlugins = args => {
261
+ const {
262
+ context,
263
+ type,
264
+ property
265
+ } = args;
266
+ const plugins = context.plugins.byType(type);
267
+
268
+ if (plugins.length === 0) {
269
+ throw new _error.default(`There are no plugins of type "${type}".`, "PLUGINS_ERROR", {
270
+ type
271
+ });
272
+ }
273
+
274
+ return plugins.reduce((collection, plugin) => {
275
+ const key = plugin[property];
276
+
277
+ if (typeof key !== "string") {
278
+ throw new _error.default("Property to map the plugins on must be a string.", "PLUGIN_PROPERTY_ERROR", {
279
+ type,
280
+ property
281
+ });
282
+ }
283
+
284
+ collection[key] = plugin;
285
+ return collection;
286
+ }, {});
287
+ };
288
+
289
+ const buildModelFields = ({
290
+ context,
291
+ model
292
+ }) => {
293
+ const transformValuePlugins = getMappedPlugins({
294
+ context,
295
+ type: "cms-field-filter-value-transform",
296
+ property: "fieldType"
297
+ });
298
+ const valuePathPlugins = getMappedPlugins({
299
+ context,
300
+ type: "cms-field-filter-path",
301
+ property: "fieldType"
302
+ });
303
+ const fields = Object.values(_systemFields.systemFields).reduce((collection, field) => {
304
+ const transformValuePlugin = transformValuePlugins[field.type];
305
+ const valuePathPlugin = valuePathPlugins[field.type];
306
+ let valuePath;
307
+
308
+ if (valuePathPlugin) {
309
+ valuePath = valuePathPlugin.createPath({
310
+ field
311
+ });
312
+ }
313
+
314
+ collection[field.fieldId] = {
315
+ def: field,
316
+ valueTransformer: value => {
317
+ if (!transformValuePlugin) {
318
+ return value;
319
+ }
320
+
321
+ return transformValuePlugin.transform({
322
+ field,
323
+ value
324
+ });
325
+ },
326
+ valuePath: valuePath || field.fieldId,
327
+ isSystemField: true
328
+ };
329
+ return collection;
330
+ }, {});
331
+ return model.fields.reduce((collection, field) => {
332
+ const transformValuePlugin = transformValuePlugins[field.type];
333
+ const valuePathPlugin = valuePathPlugins[field.type];
334
+ let valuePath;
335
+
336
+ if (valuePathPlugin) {
337
+ valuePath = valuePathPlugin.createPath({
338
+ field
339
+ });
340
+ }
341
+
342
+ const targetValuePath = `${VALUES_ATTRIBUTE}.${valuePath || field.fieldId}`;
343
+ collection[field.fieldId] = {
344
+ def: field,
345
+ valueTransformer: value => {
346
+ if (!transformValuePlugin) {
347
+ return value;
348
+ }
349
+
350
+ return transformValuePlugin.transform({
351
+ field,
352
+ value
353
+ });
354
+ },
355
+ valuePath: targetValuePath || field.fieldId
356
+ };
357
+ return collection;
358
+ }, fields);
359
+ };
360
+
361
+ exports.buildModelFields = buildModelFields;
362
+ //# sourceMappingURL=utils.js.map