@webiny/api-headless-cms-ddb 5.15.0-beta.3 → 5.16.0-beta.2
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/configurations.js +1 -1
- package/configurations.js.map +1 -1
- package/operations/entry/CmsContentEntryDynamo.js +2 -2
- package/operations/entry/CmsContentEntryDynamo.js.map +1 -1
- package/operations/entry/utils.d.ts +5 -4
- package/operations/entry/utils.js +11 -11
- package/operations/entry/utils.js.map +1 -1
- package/package.json +9 -9
package/configurations.js
CHANGED
|
@@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
exports.default = void 0;
|
|
7
7
|
const configurations = {
|
|
8
8
|
db: () => ({
|
|
9
|
-
table: process.env.DB_TABLE_HEADLESS_CMS,
|
|
9
|
+
table: process.env.DB_TABLE_HEADLESS_CMS || process.env.DB_TABLE,
|
|
10
10
|
keys: [{
|
|
11
11
|
primary: true,
|
|
12
12
|
unique: true,
|
package/configurations.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/configurations.ts"],"names":["configurations","db","table","process","env","DB_TABLE_HEADLESS_CMS","keys","primary","unique","name","fields"],"mappings":";;;;;;AAoBA,MAAMA,cAA8B,GAAG;AACnCC,EAAAA,EAAE,EAAE,OAAO;AACPC,IAAAA,KAAK,EAAEC,OAAO,CAACC,GAAR,CAAYC,
|
|
1
|
+
{"version":3,"sources":["../src/configurations.ts"],"names":["configurations","db","table","process","env","DB_TABLE_HEADLESS_CMS","DB_TABLE","keys","primary","unique","name","fields"],"mappings":";;;;;;AAoBA,MAAMA,cAA8B,GAAG;AACnCC,EAAAA,EAAE,EAAE,OAAO;AACPC,IAAAA,KAAK,EAAEC,OAAO,CAACC,GAAR,CAAYC,qBAAZ,IAAqCF,OAAO,CAACC,GAAR,CAAYE,QADjD;AAEPC,IAAAA,IAAI,EAAE,CACF;AACIC,MAAAA,OAAO,EAAE,IADb;AAEIC,MAAAA,MAAM,EAAE,IAFZ;AAGIC,MAAAA,IAAI,EAAE,SAHV;AAIIC,MAAAA,MAAM,EAAE,CAAC;AAAED,QAAAA,IAAI,EAAE;AAAR,OAAD,EAAiB;AAAEA,QAAAA,IAAI,EAAE;AAAR,OAAjB;AAJZ,KADE;AAFC,GAAP;AAD+B,CAAvC;eAceV,c","sourcesContent":["interface DatabaseConfigKeyFields {\n name: string;\n}\n\ninterface DatabaseConfigKeys {\n primary: boolean;\n unique: boolean;\n name: string;\n fields: DatabaseConfigKeyFields[];\n}\n\nexport interface CmsDatabaseConfig {\n table: string;\n keys: DatabaseConfigKeys[];\n}\n\ninterface Configurations {\n db: () => CmsDatabaseConfig;\n}\n\nconst configurations: Configurations = {\n db: () => ({\n table: process.env.DB_TABLE_HEADLESS_CMS || process.env.DB_TABLE,\n keys: [\n {\n primary: true,\n unique: true,\n name: \"primary\",\n fields: [{ name: \"PK\" }, { name: \"SK\" }]\n }\n ]\n })\n};\n\nexport default configurations;\n"],"file":"configurations.js"}
|
|
@@ -306,7 +306,7 @@ class CmsContentEntryDynamo {
|
|
|
306
306
|
|
|
307
307
|
|
|
308
308
|
const modelFields = (0, _utils3.buildModelFields)({
|
|
309
|
-
|
|
309
|
+
plugins: this.context.plugins,
|
|
310
310
|
model
|
|
311
311
|
});
|
|
312
312
|
/**
|
|
@@ -317,7 +317,7 @@ class CmsContentEntryDynamo {
|
|
|
317
317
|
const filteredItems = (0, _utils3.filterItems)({
|
|
318
318
|
items,
|
|
319
319
|
where: queryOptions.where,
|
|
320
|
-
|
|
320
|
+
plugins: this.context.plugins,
|
|
321
321
|
fields: modelFields
|
|
322
322
|
});
|
|
323
323
|
const totalCount = filteredItems.length;
|
|
@@ -1 +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"}
|
|
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","plugins","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 plugins: this.context.plugins,\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 plugins: this.context.plugins,\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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { CmsContentEntry, CmsContentEntryListWhere, CmsContentModel, CmsContentModelField
|
|
1
|
+
import { CmsContentEntry, CmsContentEntryListWhere, CmsContentModel, CmsContentModelField } from "@webiny/api-headless-cms/types";
|
|
2
|
+
import { PluginsContainer } from "@webiny/plugins";
|
|
2
3
|
interface ModelField {
|
|
3
4
|
def: CmsContentModelField;
|
|
4
5
|
valueTransformer: (value: any) => any;
|
|
@@ -9,7 +10,7 @@ declare type ModelFieldRecords = Record<string, ModelField>;
|
|
|
9
10
|
interface FilterItemsArgs {
|
|
10
11
|
items: CmsContentEntry[];
|
|
11
12
|
where: CmsContentEntryListWhere;
|
|
12
|
-
|
|
13
|
+
plugins: PluginsContainer;
|
|
13
14
|
fields: ModelFieldRecords;
|
|
14
15
|
}
|
|
15
16
|
export declare const filterItems: (args: FilterItemsArgs) => CmsContentEntry[];
|
|
@@ -19,8 +20,8 @@ interface SortEntryItemsArgs {
|
|
|
19
20
|
fields: ModelFieldRecords;
|
|
20
21
|
}
|
|
21
22
|
export declare const sortEntryItems: (args: SortEntryItemsArgs) => CmsContentEntry[];
|
|
22
|
-
export declare const buildModelFields: ({
|
|
23
|
-
|
|
23
|
+
export declare const buildModelFields: ({ plugins, model }: {
|
|
24
|
+
plugins: PluginsContainer;
|
|
24
25
|
model: CmsContentModel;
|
|
25
26
|
}) => Record<string, ModelField>;
|
|
26
27
|
export {};
|
|
@@ -55,21 +55,21 @@ const transformValue = (value, transform) => {
|
|
|
55
55
|
const createFilters = args => {
|
|
56
56
|
const {
|
|
57
57
|
where,
|
|
58
|
-
|
|
58
|
+
plugins,
|
|
59
59
|
fields
|
|
60
60
|
} = args;
|
|
61
61
|
const filterPlugins = getMappedPlugins({
|
|
62
|
-
|
|
62
|
+
plugins,
|
|
63
63
|
type: _ValueFilterPlugin.ValueFilterPlugin.type,
|
|
64
64
|
property: "operation"
|
|
65
65
|
});
|
|
66
66
|
const transformValuePlugins = getMappedPlugins({
|
|
67
|
-
|
|
67
|
+
plugins,
|
|
68
68
|
type: "cms-field-filter-value-transform",
|
|
69
69
|
property: "fieldType"
|
|
70
70
|
});
|
|
71
71
|
const valuePathPlugins = getMappedPlugins({
|
|
72
|
-
|
|
72
|
+
plugins,
|
|
73
73
|
type: "cms-field-filter-path",
|
|
74
74
|
property: "fieldType"
|
|
75
75
|
});
|
|
@@ -142,11 +142,11 @@ const filterItems = args => {
|
|
|
142
142
|
const {
|
|
143
143
|
items,
|
|
144
144
|
where,
|
|
145
|
-
|
|
145
|
+
plugins,
|
|
146
146
|
fields
|
|
147
147
|
} = args;
|
|
148
148
|
const filters = createFilters({
|
|
149
|
-
|
|
149
|
+
plugins,
|
|
150
150
|
where,
|
|
151
151
|
fields
|
|
152
152
|
});
|
|
@@ -259,11 +259,11 @@ exports.sortEntryItems = sortEntryItems;
|
|
|
259
259
|
|
|
260
260
|
const getMappedPlugins = args => {
|
|
261
261
|
const {
|
|
262
|
-
|
|
262
|
+
plugins: pluginsContainer,
|
|
263
263
|
type,
|
|
264
264
|
property
|
|
265
265
|
} = args;
|
|
266
|
-
const plugins =
|
|
266
|
+
const plugins = pluginsContainer.byType(type);
|
|
267
267
|
|
|
268
268
|
if (plugins.length === 0) {
|
|
269
269
|
throw new _error.default(`There are no plugins of type "${type}".`, "PLUGINS_ERROR", {
|
|
@@ -287,16 +287,16 @@ const getMappedPlugins = args => {
|
|
|
287
287
|
};
|
|
288
288
|
|
|
289
289
|
const buildModelFields = ({
|
|
290
|
-
|
|
290
|
+
plugins,
|
|
291
291
|
model
|
|
292
292
|
}) => {
|
|
293
293
|
const transformValuePlugins = getMappedPlugins({
|
|
294
|
-
|
|
294
|
+
plugins,
|
|
295
295
|
type: "cms-field-filter-value-transform",
|
|
296
296
|
property: "fieldType"
|
|
297
297
|
});
|
|
298
298
|
const valuePathPlugins = getMappedPlugins({
|
|
299
|
-
|
|
299
|
+
plugins,
|
|
300
300
|
type: "cms-field-filter-path",
|
|
301
301
|
property: "fieldType"
|
|
302
302
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/operations/entry/utils.ts"],"names":["VALUES_ATTRIBUTE","extractWhereArgs","key","result","split","fieldId","shift","rawOp","length","join","operation","negate","match","replace","transformValue","value","transform","Array","isArray","map","v","createFilters","args","where","context","fields","filterPlugins","getMappedPlugins","type","ValueFilterPlugin","property","transformValuePlugins","valuePathPlugins","Object","keys","field","WebinyError","transformValuePlugin","def","valuePathPlugin","targetValuePath","basePath","systemFields","createPath","valuePath","filterPlugin","transformValueCallable","path","compareValue","filterItems","items","filters","filter","item","dotProp","get","matched","matches","extractSort","sortBy","order","modelField","reverse","sortEntryItems","sort","push","firstSort","itemsToSort","id","valueTransformer","sortedItems","newItems","s","find","i","sortingBy","plugins","byType","reduce","collection","plugin","buildModelFields","model","values","isSystemField"],"mappings":"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","sourcesContent":["import {\n CmsContentEntry,\n CmsContentEntryListWhere,\n CmsContentModel,\n CmsContentModelField,\n CmsContext\n} from \"@webiny/api-headless-cms/types\";\nimport { Plugin } from \"@webiny/plugins/types\";\nimport WebinyError from \"@webiny/error\";\nimport lodashSortBy from \"lodash.sortby\";\nimport dotProp from \"dot-prop\";\nimport { CmsFieldFilterPathPlugin, CmsFieldFilterValueTransformPlugin } from \"~/types\";\nimport { systemFields } from \"./systemFields\";\nimport { ValueFilterPlugin } from \"@webiny/db-dynamodb/plugins/definitions/ValueFilterPlugin\";\n\ninterface ModelField {\n def: CmsContentModelField;\n valueTransformer: (value: any) => any;\n valuePath: string;\n isSystemField?: boolean;\n}\n\ntype ModelFieldRecords = Record<string, ModelField>;\n\ninterface CreateFiltersArgs {\n context: CmsContext;\n where: CmsContentEntryListWhere;\n fields: ModelFieldRecords;\n}\n\ninterface ItemFilter {\n fieldId: string;\n path: string;\n filterPlugin: ValueFilterPlugin;\n negate: boolean;\n compareValue: any;\n transformValue: <I = any, O = any>(value: I) => O;\n}\n\ninterface FilterItemsArgs {\n items: CmsContentEntry[];\n where: CmsContentEntryListWhere;\n context: CmsContext;\n fields: ModelFieldRecords;\n}\n\nconst VALUES_ATTRIBUTE = \"values\";\n\nconst extractWhereArgs = (key: string) => {\n const result = key.split(\"_\");\n const fieldId = result.shift();\n const rawOp = result.length === 0 ? \"eq\" : result.join(\"_\");\n /**\n * When rawOp is not, it means it is equal negated so just return that.\n */\n if (rawOp === \"not\") {\n return {\n fieldId,\n operation: \"eq\",\n negate: true\n };\n }\n const negate = rawOp.match(\"not_\") !== null;\n const operation = rawOp.replace(\"not_\", \"\");\n return { fieldId, operation, negate };\n};\n\nconst transformValue = (value: any, transform: (value: any) => any): any => {\n if (Array.isArray(value)) {\n return value.map(v => transform(v));\n }\n return transform(value);\n};\n\nconst createFilters = (args: CreateFiltersArgs): ItemFilter[] => {\n const { where, context, fields } = args;\n const filterPlugins = getMappedPlugins<ValueFilterPlugin>({\n context,\n type: ValueFilterPlugin.type,\n property: \"operation\"\n });\n const transformValuePlugins = getMappedPlugins<CmsFieldFilterValueTransformPlugin>({\n context,\n type: \"cms-field-filter-value-transform\",\n property: \"fieldType\"\n });\n const valuePathPlugins = getMappedPlugins<CmsFieldFilterPathPlugin>({\n context,\n type: \"cms-field-filter-path\",\n property: \"fieldType\"\n });\n return Object.keys(where).map(key => {\n const { fieldId, operation, negate } = extractWhereArgs(key);\n\n const field: ModelField = fields[fieldId];\n if (!field) {\n throw new WebinyError(\n `There is no field with the fieldId \"${fieldId}\".`,\n \"FIELD_ERROR\",\n {\n fieldId\n }\n );\n }\n\n const transformValuePlugin: CmsFieldFilterValueTransformPlugin =\n transformValuePlugins[field.def.type];\n const valuePathPlugin = valuePathPlugins[field.def.type];\n let targetValuePath: string;\n /**\n * add the base path if field is not a system field\n * pathPlugin should not know about that\n */\n const basePath = systemFields[fieldId] ? \"\" : `${VALUES_ATTRIBUTE}.`;\n if (valuePathPlugin) {\n targetValuePath = valuePathPlugin.createPath({\n field: field.def\n });\n } else if (systemFields[fieldId]) {\n targetValuePath = fieldId;\n } else {\n targetValuePath = field.def.fieldId;\n }\n\n const valuePath = `${basePath}${targetValuePath}`;\n\n const filterPlugin = filterPlugins[operation];\n if (!filterPlugin) {\n throw new WebinyError(\n `There is no filter plugin for operation \"${operation}\".`,\n \"FILTER_PLUGIN_ERROR\",\n {\n operation\n }\n );\n }\n\n const transformValueCallable = (value: any) => {\n if (!transformValuePlugin) {\n return value;\n }\n return transformValuePlugin.transform({\n field: field.def,\n value\n });\n };\n\n return {\n fieldId,\n path: valuePath,\n filterPlugin,\n negate,\n compareValue: transformValue(where[key], transformValueCallable),\n transformValue: transformValueCallable\n };\n });\n};\n\nexport const filterItems = (args: FilterItemsArgs): CmsContentEntry[] => {\n const { items, where, context, fields } = args;\n\n const filters = createFilters({\n context,\n where,\n fields\n });\n return items.filter(item => {\n for (const filter of filters) {\n const value = transformValue(dotProp.get(item, filter.path), filter.transformValue);\n const matched = filter.filterPlugin.matches({\n value,\n compareValue: filter.compareValue\n });\n if ((filter.negate ? !matched : matched) === false) {\n return false;\n }\n }\n return true;\n });\n};\n\nconst extractSort = (\n sortBy: string,\n fields: ModelFieldRecords\n): { valuePath: string; reverse: boolean; fieldId: string } => {\n const result = sortBy.split(\"_\");\n if (result.length !== 2) {\n throw new WebinyError(\n \"Problem in determining the sorting for the entry items.\",\n \"SORT_ERROR\",\n {\n sortBy\n }\n );\n }\n const [fieldId, order] = result;\n\n const modelField = fields[fieldId];\n\n if (!modelField) {\n throw new WebinyError(\n \"Sorting field does not exist in the content model.\",\n \"SORTING_FIELD_ERROR\",\n {\n fieldId,\n fields\n }\n );\n }\n const valuePath = modelField.valuePath;\n return {\n fieldId,\n valuePath,\n reverse: order === \"DESC\"\n };\n};\n\ninterface SortEntryItemsArgs {\n items: CmsContentEntry[];\n sort: string[];\n fields: ModelFieldRecords;\n}\n\nexport const sortEntryItems = (args: SortEntryItemsArgs): CmsContentEntry[] => {\n const { items, sort = [], fields } = args;\n if (items.length <= 1) {\n return items;\n } else if (sort.length === 0) {\n sort.push(\"savedOn_DESC\");\n } else if (sort.length > 1) {\n throw new WebinyError(\"Sorting is limited to a single field.\", \"SORT_ERROR\", {\n sort: sort\n });\n }\n const [firstSort] = sort;\n if (!firstSort) {\n throw new WebinyError(\"Empty sort array item.\", \"SORT_ERROR\", {\n sort\n });\n }\n\n const { fieldId, valuePath, reverse } = extractSort(firstSort, fields);\n const field = fields[fieldId];\n\n const itemsToSort = items.map(item => {\n return {\n id: item.id,\n value: field.valueTransformer(dotProp.get(item, valuePath))\n };\n });\n const sortedItems: { id: string; value: any }[] = lodashSortBy(itemsToSort, \"value\");\n const newItems = sortedItems.map(s => {\n const item = items.find(i => i.id === s.id);\n if (item) {\n return item;\n }\n throw new WebinyError(\n \"Could not find item by given id after the sorting.\",\n \"SORTING_ITEMS_ERROR\",\n {\n id: s.id,\n sortingBy: fieldId,\n reverse\n }\n );\n });\n if (!reverse) {\n return newItems;\n }\n return newItems.reverse();\n};\n\nconst getMappedPlugins = <T extends Plugin>(args: {\n context: CmsContext;\n type: string;\n property: string;\n}): Record<string, T> => {\n const { context, type, property } = args;\n const plugins = context.plugins.byType<T>(type);\n if (plugins.length === 0) {\n throw new WebinyError(`There are no plugins of type \"${type}\".`, \"PLUGINS_ERROR\", {\n type\n });\n }\n return plugins.reduce((collection, plugin) => {\n const key = plugin[property];\n if (typeof key !== \"string\") {\n throw new WebinyError(\n \"Property to map the plugins on must be a string.\",\n \"PLUGIN_PROPERTY_ERROR\",\n {\n type,\n property\n }\n );\n }\n collection[key] = plugin;\n return collection;\n }, {});\n};\n\nexport const buildModelFields = ({\n context,\n model\n}: {\n context: CmsContext;\n model: CmsContentModel;\n}) => {\n const transformValuePlugins = getMappedPlugins<CmsFieldFilterValueTransformPlugin>({\n context,\n type: \"cms-field-filter-value-transform\",\n property: \"fieldType\"\n });\n const valuePathPlugins = getMappedPlugins<CmsFieldFilterPathPlugin>({\n context,\n type: \"cms-field-filter-path\",\n property: \"fieldType\"\n });\n const fields: ModelFieldRecords = Object.values(systemFields).reduce((collection, field) => {\n const transformValuePlugin = transformValuePlugins[field.type];\n const valuePathPlugin = valuePathPlugins[field.type];\n let valuePath: string;\n if (valuePathPlugin) {\n valuePath = valuePathPlugin.createPath({\n field\n });\n }\n collection[field.fieldId] = {\n def: field,\n valueTransformer: (value: any) => {\n if (!transformValuePlugin) {\n return value;\n }\n return transformValuePlugin.transform({ field, value });\n },\n valuePath: valuePath || field.fieldId,\n isSystemField: true\n };\n\n return collection;\n }, {} as ModelFieldRecords);\n\n return model.fields.reduce((collection, field) => {\n const transformValuePlugin = transformValuePlugins[field.type];\n const valuePathPlugin = valuePathPlugins[field.type];\n let valuePath: string;\n if (valuePathPlugin) {\n valuePath = valuePathPlugin.createPath({\n field\n });\n }\n const targetValuePath = `${VALUES_ATTRIBUTE}.${valuePath || field.fieldId}`;\n collection[field.fieldId] = {\n def: field,\n valueTransformer: (value: any) => {\n if (!transformValuePlugin) {\n return value;\n }\n return transformValuePlugin.transform({ field, value });\n },\n valuePath: targetValuePath || field.fieldId\n };\n\n return collection;\n }, fields);\n};\n"],"file":"utils.js"}
|
|
1
|
+
{"version":3,"sources":["../../../src/operations/entry/utils.ts"],"names":["VALUES_ATTRIBUTE","extractWhereArgs","key","result","split","fieldId","shift","rawOp","length","join","operation","negate","match","replace","transformValue","value","transform","Array","isArray","map","v","createFilters","args","where","plugins","fields","filterPlugins","getMappedPlugins","type","ValueFilterPlugin","property","transformValuePlugins","valuePathPlugins","Object","keys","field","WebinyError","transformValuePlugin","def","valuePathPlugin","targetValuePath","basePath","systemFields","createPath","valuePath","filterPlugin","transformValueCallable","path","compareValue","filterItems","items","filters","filter","item","dotProp","get","matched","matches","extractSort","sortBy","order","modelField","reverse","sortEntryItems","sort","push","firstSort","itemsToSort","id","valueTransformer","sortedItems","newItems","s","find","i","sortingBy","pluginsContainer","byType","reduce","collection","plugin","buildModelFields","model","values","isSystemField"],"mappings":";;;;;;;;;AAAA;;AACA;;AACA;;AASA;;AACA;;AAkCA,MAAMA,gBAAgB,GAAG,QAAzB;;AAEA,MAAMC,gBAAgB,GAAIC,GAAD,IAAiB;AACtC,QAAMC,MAAM,GAAGD,GAAG,CAACE,KAAJ,CAAU,GAAV,CAAf;AACA,QAAMC,OAAO,GAAGF,MAAM,CAACG,KAAP,EAAhB;AACA,QAAMC,KAAK,GAAGJ,MAAM,CAACK,MAAP,KAAkB,CAAlB,GAAsB,IAAtB,GAA6BL,MAAM,CAACM,IAAP,CAAY,GAAZ,CAA3C;AACA;AACJ;AACA;;AACI,MAAIF,KAAK,KAAK,KAAd,EAAqB;AACjB,WAAO;AACHF,MAAAA,OADG;AAEHK,MAAAA,SAAS,EAAE,IAFR;AAGHC,MAAAA,MAAM,EAAE;AAHL,KAAP;AAKH;;AACD,QAAMA,MAAM,GAAGJ,KAAK,CAACK,KAAN,CAAY,MAAZ,MAAwB,IAAvC;AACA,QAAMF,SAAS,GAAGH,KAAK,CAACM,OAAN,CAAc,MAAd,EAAsB,EAAtB,CAAlB;AACA,SAAO;AAAER,IAAAA,OAAF;AAAWK,IAAAA,SAAX;AAAsBC,IAAAA;AAAtB,GAAP;AACH,CAjBD;;AAmBA,MAAMG,cAAc,GAAG,CAACC,KAAD,EAAaC,SAAb,KAAqD;AACxE,MAAIC,KAAK,CAACC,OAAN,CAAcH,KAAd,CAAJ,EAA0B;AACtB,WAAOA,KAAK,CAACI,GAAN,CAAUC,CAAC,IAAIJ,SAAS,CAACI,CAAD,CAAxB,CAAP;AACH;;AACD,SAAOJ,SAAS,CAACD,KAAD,CAAhB;AACH,CALD;;AAOA,MAAMM,aAAa,GAAIC,IAAD,IAA2C;AAC7D,QAAM;AAAEC,IAAAA,KAAF;AAASC,IAAAA,OAAT;AAAkBC,IAAAA;AAAlB,MAA6BH,IAAnC;AACA,QAAMI,aAAa,GAAGC,gBAAgB,CAAoB;AACtDH,IAAAA,OADsD;AAEtDI,IAAAA,IAAI,EAAEC,qCAAkBD,IAF8B;AAGtDE,IAAAA,QAAQ,EAAE;AAH4C,GAApB,CAAtC;AAKA,QAAMC,qBAAqB,GAAGJ,gBAAgB,CAAqC;AAC/EH,IAAAA,OAD+E;AAE/EI,IAAAA,IAAI,EAAE,kCAFyE;AAG/EE,IAAAA,QAAQ,EAAE;AAHqE,GAArC,CAA9C;AAKA,QAAME,gBAAgB,GAAGL,gBAAgB,CAA2B;AAChEH,IAAAA,OADgE;AAEhEI,IAAAA,IAAI,EAAE,uBAF0D;AAGhEE,IAAAA,QAAQ,EAAE;AAHsD,GAA3B,CAAzC;AAKA,SAAOG,MAAM,CAACC,IAAP,CAAYX,KAAZ,EAAmBJ,GAAnB,CAAuBjB,GAAG,IAAI;AACjC,UAAM;AAAEG,MAAAA,OAAF;AAAWK,MAAAA,SAAX;AAAsBC,MAAAA;AAAtB,QAAiCV,gBAAgB,CAACC,GAAD,CAAvD;AAEA,UAAMiC,KAAiB,GAAGV,MAAM,CAACpB,OAAD,CAAhC;;AACA,QAAI,CAAC8B,KAAL,EAAY;AACR,YAAM,IAAIC,cAAJ,CACD,uCAAsC/B,OAAQ,IAD7C,EAEF,aAFE,EAGF;AACIA,QAAAA;AADJ,OAHE,CAAN;AAOH;;AAED,UAAMgC,oBAAwD,GAC1DN,qBAAqB,CAACI,KAAK,CAACG,GAAN,CAAUV,IAAX,CADzB;AAEA,UAAMW,eAAe,GAAGP,gBAAgB,CAACG,KAAK,CAACG,GAAN,CAAUV,IAAX,CAAxC;AACA,QAAIY,eAAJ;AACA;AACR;AACA;AACA;;AACQ,UAAMC,QAAQ,GAAGC,2BAAarC,OAAb,IAAwB,EAAxB,GAA8B,GAAEL,gBAAiB,GAAlE;;AACA,QAAIuC,eAAJ,EAAqB;AACjBC,MAAAA,eAAe,GAAGD,eAAe,CAACI,UAAhB,CAA2B;AACzCR,QAAAA,KAAK,EAAEA,KAAK,CAACG;AAD4B,OAA3B,CAAlB;AAGH,KAJD,MAIO,IAAII,2BAAarC,OAAb,CAAJ,EAA2B;AAC9BmC,MAAAA,eAAe,GAAGnC,OAAlB;AACH,KAFM,MAEA;AACHmC,MAAAA,eAAe,GAAGL,KAAK,CAACG,GAAN,CAAUjC,OAA5B;AACH;;AAED,UAAMuC,SAAS,GAAI,GAAEH,QAAS,GAAED,eAAgB,EAAhD;AAEA,UAAMK,YAAY,GAAGnB,aAAa,CAAChB,SAAD,CAAlC;;AACA,QAAI,CAACmC,YAAL,EAAmB;AACf,YAAM,IAAIT,cAAJ,CACD,4CAA2C1B,SAAU,IADpD,EAEF,qBAFE,EAGF;AACIA,QAAAA;AADJ,OAHE,CAAN;AAOH;;AAED,UAAMoC,sBAAsB,GAAI/B,KAAD,IAAgB;AAC3C,UAAI,CAACsB,oBAAL,EAA2B;AACvB,eAAOtB,KAAP;AACH;;AACD,aAAOsB,oBAAoB,CAACrB,SAArB,CAA+B;AAClCmB,QAAAA,KAAK,EAAEA,KAAK,CAACG,GADqB;AAElCvB,QAAAA;AAFkC,OAA/B,CAAP;AAIH,KARD;;AAUA,WAAO;AACHV,MAAAA,OADG;AAEH0C,MAAAA,IAAI,EAAEH,SAFH;AAGHC,MAAAA,YAHG;AAIHlC,MAAAA,MAJG;AAKHqC,MAAAA,YAAY,EAAElC,cAAc,CAACS,KAAK,CAACrB,GAAD,CAAN,EAAa4C,sBAAb,CALzB;AAMHhC,MAAAA,cAAc,EAAEgC;AANb,KAAP;AAQH,GAhEM,CAAP;AAiEH,CAlFD;;AAoFO,MAAMG,WAAW,GAAI3B,IAAD,IAA8C;AACrE,QAAM;AAAE4B,IAAAA,KAAF;AAAS3B,IAAAA,KAAT;AAAgBC,IAAAA,OAAhB;AAAyBC,IAAAA;AAAzB,MAAoCH,IAA1C;AAEA,QAAM6B,OAAO,GAAG9B,aAAa,CAAC;AAC1BG,IAAAA,OAD0B;AAE1BD,IAAAA,KAF0B;AAG1BE,IAAAA;AAH0B,GAAD,CAA7B;AAKA,SAAOyB,KAAK,CAACE,MAAN,CAAaC,IAAI,IAAI;AACxB,SAAK,MAAMD,MAAX,IAAqBD,OAArB,EAA8B;AAC1B,YAAMpC,KAAK,GAAGD,cAAc,CAACwC,iBAAQC,GAAR,CAAYF,IAAZ,EAAkBD,MAAM,CAACL,IAAzB,CAAD,EAAiCK,MAAM,CAACtC,cAAxC,CAA5B;AACA,YAAM0C,OAAO,GAAGJ,MAAM,CAACP,YAAP,CAAoBY,OAApB,CAA4B;AACxC1C,QAAAA,KADwC;AAExCiC,QAAAA,YAAY,EAAEI,MAAM,CAACJ;AAFmB,OAA5B,CAAhB;;AAIA,UAAI,CAACI,MAAM,CAACzC,MAAP,GAAgB,CAAC6C,OAAjB,GAA2BA,OAA5B,MAAyC,KAA7C,EAAoD;AAChD,eAAO,KAAP;AACH;AACJ;;AACD,WAAO,IAAP;AACH,GAZM,CAAP;AAaH,CArBM;;;;AAuBP,MAAME,WAAW,GAAG,CAChBC,MADgB,EAEhBlC,MAFgB,KAG2C;AAC3D,QAAMtB,MAAM,GAAGwD,MAAM,CAACvD,KAAP,CAAa,GAAb,CAAf;;AACA,MAAID,MAAM,CAACK,MAAP,KAAkB,CAAtB,EAAyB;AACrB,UAAM,IAAI4B,cAAJ,CACF,yDADE,EAEF,YAFE,EAGF;AACIuB,MAAAA;AADJ,KAHE,CAAN;AAOH;;AACD,QAAM,CAACtD,OAAD,EAAUuD,KAAV,IAAmBzD,MAAzB;AAEA,QAAM0D,UAAU,GAAGpC,MAAM,CAACpB,OAAD,CAAzB;;AAEA,MAAI,CAACwD,UAAL,EAAiB;AACb,UAAM,IAAIzB,cAAJ,CACF,oDADE,EAEF,qBAFE,EAGF;AACI/B,MAAAA,OADJ;AAEIoB,MAAAA;AAFJ,KAHE,CAAN;AAQH;;AACD,QAAMmB,SAAS,GAAGiB,UAAU,CAACjB,SAA7B;AACA,SAAO;AACHvC,IAAAA,OADG;AAEHuC,IAAAA,SAFG;AAGHkB,IAAAA,OAAO,EAAEF,KAAK,KAAK;AAHhB,GAAP;AAKH,CAlCD;;AA0CO,MAAMG,cAAc,GAAIzC,IAAD,IAAiD;AAC3E,QAAM;AAAE4B,IAAAA,KAAF;AAASc,IAAAA,IAAI,GAAG,EAAhB;AAAoBvC,IAAAA;AAApB,MAA+BH,IAArC;;AACA,MAAI4B,KAAK,CAAC1C,MAAN,IAAgB,CAApB,EAAuB;AACnB,WAAO0C,KAAP;AACH,GAFD,MAEO,IAAIc,IAAI,CAACxD,MAAL,KAAgB,CAApB,EAAuB;AAC1BwD,IAAAA,IAAI,CAACC,IAAL,CAAU,cAAV;AACH,GAFM,MAEA,IAAID,IAAI,CAACxD,MAAL,GAAc,CAAlB,EAAqB;AACxB,UAAM,IAAI4B,cAAJ,CAAgB,uCAAhB,EAAyD,YAAzD,EAAuE;AACzE4B,MAAAA,IAAI,EAAEA;AADmE,KAAvE,CAAN;AAGH;;AACD,QAAM,CAACE,SAAD,IAAcF,IAApB;;AACA,MAAI,CAACE,SAAL,EAAgB;AACZ,UAAM,IAAI9B,cAAJ,CAAgB,wBAAhB,EAA0C,YAA1C,EAAwD;AAC1D4B,MAAAA;AAD0D,KAAxD,CAAN;AAGH;;AAED,QAAM;AAAE3D,IAAAA,OAAF;AAAWuC,IAAAA,SAAX;AAAsBkB,IAAAA;AAAtB,MAAkCJ,WAAW,CAACQ,SAAD,EAAYzC,MAAZ,CAAnD;AACA,QAAMU,KAAK,GAAGV,MAAM,CAACpB,OAAD,CAApB;AAEA,QAAM8D,WAAW,GAAGjB,KAAK,CAAC/B,GAAN,CAAUkC,IAAI,IAAI;AAClC,WAAO;AACHe,MAAAA,EAAE,EAAEf,IAAI,CAACe,EADN;AAEHrD,MAAAA,KAAK,EAAEoB,KAAK,CAACkC,gBAAN,CAAuBf,iBAAQC,GAAR,CAAYF,IAAZ,EAAkBT,SAAlB,CAAvB;AAFJ,KAAP;AAIH,GALmB,CAApB;AAMA,QAAM0B,WAAyC,GAAG,qBAAaH,WAAb,EAA0B,OAA1B,CAAlD;AACA,QAAMI,QAAQ,GAAGD,WAAW,CAACnD,GAAZ,CAAgBqD,CAAC,IAAI;AAClC,UAAMnB,IAAI,GAAGH,KAAK,CAACuB,IAAN,CAAWC,CAAC,IAAIA,CAAC,CAACN,EAAF,KAASI,CAAC,CAACJ,EAA3B,CAAb;;AACA,QAAIf,IAAJ,EAAU;AACN,aAAOA,IAAP;AACH;;AACD,UAAM,IAAIjB,cAAJ,CACF,oDADE,EAEF,qBAFE,EAGF;AACIgC,MAAAA,EAAE,EAAEI,CAAC,CAACJ,EADV;AAEIO,MAAAA,SAAS,EAAEtE,OAFf;AAGIyD,MAAAA;AAHJ,KAHE,CAAN;AASH,GAdgB,CAAjB;;AAeA,MAAI,CAACA,OAAL,EAAc;AACV,WAAOS,QAAP;AACH;;AACD,SAAOA,QAAQ,CAACT,OAAT,EAAP;AACH,CA/CM;;;;AAiDP,MAAMnC,gBAAgB,GAAsBL,IAAnB,IAIA;AACrB,QAAM;AAAEE,IAAAA,OAAO,EAAEoD,gBAAX;AAA6BhD,IAAAA,IAA7B;AAAmCE,IAAAA;AAAnC,MAAgDR,IAAtD;AACA,QAAME,OAAO,GAAGoD,gBAAgB,CAACC,MAAjB,CAA2BjD,IAA3B,CAAhB;;AACA,MAAIJ,OAAO,CAAChB,MAAR,KAAmB,CAAvB,EAA0B;AACtB,UAAM,IAAI4B,cAAJ,CAAiB,iCAAgCR,IAAK,IAAtD,EAA2D,eAA3D,EAA4E;AAC9EA,MAAAA;AAD8E,KAA5E,CAAN;AAGH;;AACD,SAAOJ,OAAO,CAACsD,MAAR,CAAe,CAACC,UAAD,EAAaC,MAAb,KAAwB;AAC1C,UAAM9E,GAAG,GAAG8E,MAAM,CAAClD,QAAD,CAAlB;;AACA,QAAI,OAAO5B,GAAP,KAAe,QAAnB,EAA6B;AACzB,YAAM,IAAIkC,cAAJ,CACF,kDADE,EAEF,uBAFE,EAGF;AACIR,QAAAA,IADJ;AAEIE,QAAAA;AAFJ,OAHE,CAAN;AAQH;;AACDiD,IAAAA,UAAU,CAAC7E,GAAD,CAAV,GAAkB8E,MAAlB;AACA,WAAOD,UAAP;AACH,GAdM,EAcJ,EAdI,CAAP;AAeH,CA3BD;;AA6BO,MAAME,gBAAgB,GAAG,CAAC;AAC7BzD,EAAAA,OAD6B;AAE7B0D,EAAAA;AAF6B,CAAD,KAM1B;AACF,QAAMnD,qBAAqB,GAAGJ,gBAAgB,CAAqC;AAC/EH,IAAAA,OAD+E;AAE/EI,IAAAA,IAAI,EAAE,kCAFyE;AAG/EE,IAAAA,QAAQ,EAAE;AAHqE,GAArC,CAA9C;AAKA,QAAME,gBAAgB,GAAGL,gBAAgB,CAA2B;AAChEH,IAAAA,OADgE;AAEhEI,IAAAA,IAAI,EAAE,uBAF0D;AAGhEE,IAAAA,QAAQ,EAAE;AAHsD,GAA3B,CAAzC;AAKA,QAAML,MAAyB,GAAGQ,MAAM,CAACkD,MAAP,CAAczC,0BAAd,EAA4BoC,MAA5B,CAAmC,CAACC,UAAD,EAAa5C,KAAb,KAAuB;AACxF,UAAME,oBAAoB,GAAGN,qBAAqB,CAACI,KAAK,CAACP,IAAP,CAAlD;AACA,UAAMW,eAAe,GAAGP,gBAAgB,CAACG,KAAK,CAACP,IAAP,CAAxC;AACA,QAAIgB,SAAJ;;AACA,QAAIL,eAAJ,EAAqB;AACjBK,MAAAA,SAAS,GAAGL,eAAe,CAACI,UAAhB,CAA2B;AACnCR,QAAAA;AADmC,OAA3B,CAAZ;AAGH;;AACD4C,IAAAA,UAAU,CAAC5C,KAAK,CAAC9B,OAAP,CAAV,GAA4B;AACxBiC,MAAAA,GAAG,EAAEH,KADmB;AAExBkC,MAAAA,gBAAgB,EAAGtD,KAAD,IAAgB;AAC9B,YAAI,CAACsB,oBAAL,EAA2B;AACvB,iBAAOtB,KAAP;AACH;;AACD,eAAOsB,oBAAoB,CAACrB,SAArB,CAA+B;AAAEmB,UAAAA,KAAF;AAASpB,UAAAA;AAAT,SAA/B,CAAP;AACH,OAPuB;AAQxB6B,MAAAA,SAAS,EAAEA,SAAS,IAAIT,KAAK,CAAC9B,OARN;AASxB+E,MAAAA,aAAa,EAAE;AATS,KAA5B;AAYA,WAAOL,UAAP;AACH,GAtBiC,EAsB/B,EAtB+B,CAAlC;AAwBA,SAAOG,KAAK,CAACzD,MAAN,CAAaqD,MAAb,CAAoB,CAACC,UAAD,EAAa5C,KAAb,KAAuB;AAC9C,UAAME,oBAAoB,GAAGN,qBAAqB,CAACI,KAAK,CAACP,IAAP,CAAlD;AACA,UAAMW,eAAe,GAAGP,gBAAgB,CAACG,KAAK,CAACP,IAAP,CAAxC;AACA,QAAIgB,SAAJ;;AACA,QAAIL,eAAJ,EAAqB;AACjBK,MAAAA,SAAS,GAAGL,eAAe,CAACI,UAAhB,CAA2B;AACnCR,QAAAA;AADmC,OAA3B,CAAZ;AAGH;;AACD,UAAMK,eAAe,GAAI,GAAExC,gBAAiB,IAAG4C,SAAS,IAAIT,KAAK,CAAC9B,OAAQ,EAA1E;AACA0E,IAAAA,UAAU,CAAC5C,KAAK,CAAC9B,OAAP,CAAV,GAA4B;AACxBiC,MAAAA,GAAG,EAAEH,KADmB;AAExBkC,MAAAA,gBAAgB,EAAGtD,KAAD,IAAgB;AAC9B,YAAI,CAACsB,oBAAL,EAA2B;AACvB,iBAAOtB,KAAP;AACH;;AACD,eAAOsB,oBAAoB,CAACrB,SAArB,CAA+B;AAAEmB,UAAAA,KAAF;AAASpB,UAAAA;AAAT,SAA/B,CAAP;AACH,OAPuB;AAQxB6B,MAAAA,SAAS,EAAEJ,eAAe,IAAIL,KAAK,CAAC9B;AARZ,KAA5B;AAWA,WAAO0E,UAAP;AACH,GAtBM,EAsBJtD,MAtBI,CAAP;AAuBH,CAhEM","sourcesContent":["import WebinyError from \"@webiny/error\";\nimport lodashSortBy from \"lodash.sortby\";\nimport dotProp from \"dot-prop\";\nimport {\n CmsContentEntry,\n CmsContentEntryListWhere,\n CmsContentModel,\n CmsContentModelField\n} from \"@webiny/api-headless-cms/types\";\nimport { Plugin } from \"@webiny/plugins/types\";\nimport { CmsFieldFilterPathPlugin, CmsFieldFilterValueTransformPlugin } from \"~/types\";\nimport { systemFields } from \"./systemFields\";\nimport { ValueFilterPlugin } from \"@webiny/db-dynamodb/plugins/definitions/ValueFilterPlugin\";\nimport { PluginsContainer } from \"@webiny/plugins\";\n\ninterface ModelField {\n def: CmsContentModelField;\n valueTransformer: (value: any) => any;\n valuePath: string;\n isSystemField?: boolean;\n}\n\ntype ModelFieldRecords = Record<string, ModelField>;\n\ninterface CreateFiltersArgs {\n plugins: PluginsContainer;\n where: CmsContentEntryListWhere;\n fields: ModelFieldRecords;\n}\n\ninterface ItemFilter {\n fieldId: string;\n path: string;\n filterPlugin: ValueFilterPlugin;\n negate: boolean;\n compareValue: any;\n transformValue: <I = any, O = any>(value: I) => O;\n}\n\ninterface FilterItemsArgs {\n items: CmsContentEntry[];\n where: CmsContentEntryListWhere;\n plugins: PluginsContainer;\n fields: ModelFieldRecords;\n}\n\nconst VALUES_ATTRIBUTE = \"values\";\n\nconst extractWhereArgs = (key: string) => {\n const result = key.split(\"_\");\n const fieldId = result.shift();\n const rawOp = result.length === 0 ? \"eq\" : result.join(\"_\");\n /**\n * When rawOp is not, it means it is equal negated so just return that.\n */\n if (rawOp === \"not\") {\n return {\n fieldId,\n operation: \"eq\",\n negate: true\n };\n }\n const negate = rawOp.match(\"not_\") !== null;\n const operation = rawOp.replace(\"not_\", \"\");\n return { fieldId, operation, negate };\n};\n\nconst transformValue = (value: any, transform: (value: any) => any): any => {\n if (Array.isArray(value)) {\n return value.map(v => transform(v));\n }\n return transform(value);\n};\n\nconst createFilters = (args: CreateFiltersArgs): ItemFilter[] => {\n const { where, plugins, fields } = args;\n const filterPlugins = getMappedPlugins<ValueFilterPlugin>({\n plugins,\n type: ValueFilterPlugin.type,\n property: \"operation\"\n });\n const transformValuePlugins = getMappedPlugins<CmsFieldFilterValueTransformPlugin>({\n plugins,\n type: \"cms-field-filter-value-transform\",\n property: \"fieldType\"\n });\n const valuePathPlugins = getMappedPlugins<CmsFieldFilterPathPlugin>({\n plugins,\n type: \"cms-field-filter-path\",\n property: \"fieldType\"\n });\n return Object.keys(where).map(key => {\n const { fieldId, operation, negate } = extractWhereArgs(key);\n\n const field: ModelField = fields[fieldId];\n if (!field) {\n throw new WebinyError(\n `There is no field with the fieldId \"${fieldId}\".`,\n \"FIELD_ERROR\",\n {\n fieldId\n }\n );\n }\n\n const transformValuePlugin: CmsFieldFilterValueTransformPlugin =\n transformValuePlugins[field.def.type];\n const valuePathPlugin = valuePathPlugins[field.def.type];\n let targetValuePath: string;\n /**\n * add the base path if field is not a system field\n * pathPlugin should not know about that\n */\n const basePath = systemFields[fieldId] ? \"\" : `${VALUES_ATTRIBUTE}.`;\n if (valuePathPlugin) {\n targetValuePath = valuePathPlugin.createPath({\n field: field.def\n });\n } else if (systemFields[fieldId]) {\n targetValuePath = fieldId;\n } else {\n targetValuePath = field.def.fieldId;\n }\n\n const valuePath = `${basePath}${targetValuePath}`;\n\n const filterPlugin = filterPlugins[operation];\n if (!filterPlugin) {\n throw new WebinyError(\n `There is no filter plugin for operation \"${operation}\".`,\n \"FILTER_PLUGIN_ERROR\",\n {\n operation\n }\n );\n }\n\n const transformValueCallable = (value: any) => {\n if (!transformValuePlugin) {\n return value;\n }\n return transformValuePlugin.transform({\n field: field.def,\n value\n });\n };\n\n return {\n fieldId,\n path: valuePath,\n filterPlugin,\n negate,\n compareValue: transformValue(where[key], transformValueCallable),\n transformValue: transformValueCallable\n };\n });\n};\n\nexport const filterItems = (args: FilterItemsArgs): CmsContentEntry[] => {\n const { items, where, plugins, fields } = args;\n\n const filters = createFilters({\n plugins,\n where,\n fields\n });\n return items.filter(item => {\n for (const filter of filters) {\n const value = transformValue(dotProp.get(item, filter.path), filter.transformValue);\n const matched = filter.filterPlugin.matches({\n value,\n compareValue: filter.compareValue\n });\n if ((filter.negate ? !matched : matched) === false) {\n return false;\n }\n }\n return true;\n });\n};\n\nconst extractSort = (\n sortBy: string,\n fields: ModelFieldRecords\n): { valuePath: string; reverse: boolean; fieldId: string } => {\n const result = sortBy.split(\"_\");\n if (result.length !== 2) {\n throw new WebinyError(\n \"Problem in determining the sorting for the entry items.\",\n \"SORT_ERROR\",\n {\n sortBy\n }\n );\n }\n const [fieldId, order] = result;\n\n const modelField = fields[fieldId];\n\n if (!modelField) {\n throw new WebinyError(\n \"Sorting field does not exist in the content model.\",\n \"SORTING_FIELD_ERROR\",\n {\n fieldId,\n fields\n }\n );\n }\n const valuePath = modelField.valuePath;\n return {\n fieldId,\n valuePath,\n reverse: order === \"DESC\"\n };\n};\n\ninterface SortEntryItemsArgs {\n items: CmsContentEntry[];\n sort: string[];\n fields: ModelFieldRecords;\n}\n\nexport const sortEntryItems = (args: SortEntryItemsArgs): CmsContentEntry[] => {\n const { items, sort = [], fields } = args;\n if (items.length <= 1) {\n return items;\n } else if (sort.length === 0) {\n sort.push(\"savedOn_DESC\");\n } else if (sort.length > 1) {\n throw new WebinyError(\"Sorting is limited to a single field.\", \"SORT_ERROR\", {\n sort: sort\n });\n }\n const [firstSort] = sort;\n if (!firstSort) {\n throw new WebinyError(\"Empty sort array item.\", \"SORT_ERROR\", {\n sort\n });\n }\n\n const { fieldId, valuePath, reverse } = extractSort(firstSort, fields);\n const field = fields[fieldId];\n\n const itemsToSort = items.map(item => {\n return {\n id: item.id,\n value: field.valueTransformer(dotProp.get(item, valuePath))\n };\n });\n const sortedItems: { id: string; value: any }[] = lodashSortBy(itemsToSort, \"value\");\n const newItems = sortedItems.map(s => {\n const item = items.find(i => i.id === s.id);\n if (item) {\n return item;\n }\n throw new WebinyError(\n \"Could not find item by given id after the sorting.\",\n \"SORTING_ITEMS_ERROR\",\n {\n id: s.id,\n sortingBy: fieldId,\n reverse\n }\n );\n });\n if (!reverse) {\n return newItems;\n }\n return newItems.reverse();\n};\n\nconst getMappedPlugins = <T extends Plugin>(args: {\n plugins: PluginsContainer;\n type: string;\n property: string;\n}): Record<string, T> => {\n const { plugins: pluginsContainer, type, property } = args;\n const plugins = pluginsContainer.byType<T>(type);\n if (plugins.length === 0) {\n throw new WebinyError(`There are no plugins of type \"${type}\".`, \"PLUGINS_ERROR\", {\n type\n });\n }\n return plugins.reduce((collection, plugin) => {\n const key = plugin[property];\n if (typeof key !== \"string\") {\n throw new WebinyError(\n \"Property to map the plugins on must be a string.\",\n \"PLUGIN_PROPERTY_ERROR\",\n {\n type,\n property\n }\n );\n }\n collection[key] = plugin;\n return collection;\n }, {});\n};\n\nexport const buildModelFields = ({\n plugins,\n model\n}: {\n plugins: PluginsContainer;\n model: CmsContentModel;\n}) => {\n const transformValuePlugins = getMappedPlugins<CmsFieldFilterValueTransformPlugin>({\n plugins,\n type: \"cms-field-filter-value-transform\",\n property: \"fieldType\"\n });\n const valuePathPlugins = getMappedPlugins<CmsFieldFilterPathPlugin>({\n plugins,\n type: \"cms-field-filter-path\",\n property: \"fieldType\"\n });\n const fields: ModelFieldRecords = Object.values(systemFields).reduce((collection, field) => {\n const transformValuePlugin = transformValuePlugins[field.type];\n const valuePathPlugin = valuePathPlugins[field.type];\n let valuePath: string;\n if (valuePathPlugin) {\n valuePath = valuePathPlugin.createPath({\n field\n });\n }\n collection[field.fieldId] = {\n def: field,\n valueTransformer: (value: any) => {\n if (!transformValuePlugin) {\n return value;\n }\n return transformValuePlugin.transform({ field, value });\n },\n valuePath: valuePath || field.fieldId,\n isSystemField: true\n };\n\n return collection;\n }, {} as ModelFieldRecords);\n\n return model.fields.reduce((collection, field) => {\n const transformValuePlugin = transformValuePlugins[field.type];\n const valuePathPlugin = valuePathPlugins[field.type];\n let valuePath: string;\n if (valuePathPlugin) {\n valuePath = valuePathPlugin.createPath({\n field\n });\n }\n const targetValuePath = `${VALUES_ATTRIBUTE}.${valuePath || field.fieldId}`;\n collection[field.fieldId] = {\n def: field,\n valueTransformer: (value: any) => {\n if (!transformValuePlugin) {\n return value;\n }\n return transformValuePlugin.transform({ field, value });\n },\n valuePath: targetValuePath || field.fieldId\n };\n\n return collection;\n }, fields);\n};\n"],"file":"utils.js"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@webiny/api-headless-cms-ddb",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.16.0-beta.2",
|
|
4
4
|
"main": "index.js",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"@webiny/api-headless-cms",
|
|
@@ -22,10 +22,10 @@
|
|
|
22
22
|
"license": "MIT",
|
|
23
23
|
"dependencies": {
|
|
24
24
|
"@babel/runtime": "7.15.3",
|
|
25
|
-
"@webiny/api-headless-cms": "5.
|
|
26
|
-
"@webiny/db-dynamodb": "5.
|
|
27
|
-
"@webiny/error": "5.
|
|
28
|
-
"@webiny/handler-db": "5.
|
|
25
|
+
"@webiny/api-headless-cms": "5.16.0-beta.2",
|
|
26
|
+
"@webiny/db-dynamodb": "5.16.0-beta.2",
|
|
27
|
+
"@webiny/error": "5.16.0-beta.2",
|
|
28
|
+
"@webiny/handler-db": "5.16.0-beta.2",
|
|
29
29
|
"aws-sdk": "2.868.0",
|
|
30
30
|
"dataloader": "2.0.0",
|
|
31
31
|
"dot-prop": "5.3.0",
|
|
@@ -40,9 +40,9 @@
|
|
|
40
40
|
"@babel/preset-env": "^7.5.5",
|
|
41
41
|
"@babel/preset-flow": "^7.0.0",
|
|
42
42
|
"@types/jsonpack": "^1.1.0",
|
|
43
|
-
"@webiny/cli": "^5.
|
|
44
|
-
"@webiny/plugins": "^5.
|
|
45
|
-
"@webiny/project-utils": "^5.
|
|
43
|
+
"@webiny/cli": "^5.16.0-beta.2",
|
|
44
|
+
"@webiny/plugins": "^5.16.0-beta.2",
|
|
45
|
+
"@webiny/project-utils": "^5.16.0-beta.2",
|
|
46
46
|
"jest": "^26.6.3",
|
|
47
47
|
"jest-dynalite": "^3.2.0",
|
|
48
48
|
"jest-environment-node": "^26.6.2",
|
|
@@ -57,5 +57,5 @@
|
|
|
57
57
|
"build": "yarn webiny run build",
|
|
58
58
|
"watch": "yarn webiny run watch"
|
|
59
59
|
},
|
|
60
|
-
"gitHead": "
|
|
60
|
+
"gitHead": "f8ca0ffc49737da9d2f797382c4df9c701d6f037"
|
|
61
61
|
}
|