@webiny/api-headless-cms 5.26.0-beta.2 → 5.27.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -625,7 +625,6 @@ const createContentEntryCrud = params => {
625
625
  validateEntries: false
626
626
  });
627
627
  utils.checkOwnership(context, permission, originalEntry);
628
- const latestEntry = latestStorageEntry ? await (0, _entryStorage.entryFromStorageTransform)(context, model, latestStorageEntry) : null;
629
628
  const identity = context.security.getIdentity();
630
629
  const latestId = latestStorageEntry ? latestStorageEntry.id : sourceId;
631
630
  const {
@@ -661,9 +660,7 @@ const createContentEntryCrud = params => {
661
660
  storageEntry = await (0, _entryStorage.entryToStorageTransform)(context, model, entry);
662
661
  const result = await storageOperations.entries.createRevisionFrom(model, {
663
662
  entry,
664
- storageEntry,
665
- latestEntry,
666
- latestStorageEntry
663
+ storageEntry
667
664
  });
668
665
  await onAfterEntryCreateRevision.publish({
669
666
  input,
@@ -1 +1 @@
1
- {"version":3,"sources":["contentEntry.crud.ts"],"names":["STATUS_DRAFT","STATUS_PUBLISHED","STATUS_UNPUBLISHED","STATUS_CHANGES_REQUESTED","STATUS_REVIEW_REQUESTED","convertDefaultValue","field","value","type","Boolean","Number","getDefaultValue","settings","multipleValues","defaultValue","undefined","predefinedValues","enabled","Array","isArray","values","selectedValue","find","selected","filter","map","cleanInputData","model","input","fields","reduce","acc","fieldId","cleanUpdatedInputData","createEntryId","version","entryId","id","increaseEntryIdVersion","WebinyError","getSearchableFields","params","plugins","fieldPluginMap","byType","collection","fieldType","plugin","fullTextSearch","length","includes","createContentEntryCrud","storageOperations","context","getIdentity","getTenant","onBeforeEntryCreate","onAfterEntryCreate","onBeforeEntryCreateRevision","onAfterEntryCreateRevision","onBeforeEntryUpdate","onAfterEntryUpdate","onBeforeEntryPublish","onAfterEntryPublish","onBeforeEntryUnpublish","onAfterEntryUnpublish","onBeforeEntryRequestChanges","onAfterEntryRequestChanges","onBeforeEntryRequestReview","onAfterEntryRequestReview","onBeforeEntryDelete","onAfterEntryDelete","onBeforeEntryDeleteRevision","onAfterEntryDeleteRevision","onBeforeEntryGet","onBeforeEntryList","checkEntryPermissions","check","utils","checkPermissions","deleteEntry","entry","publish","entries","delete","ex","message","code","getEntriesByIds","ids","permission","rwd","checkModelAccess","getByIds","validateOwnership","getEntryById","where","NotFoundError","getPublishedEntriesByIds","getPublishedByIds","getLatestEntriesByIds","getLatestByIds","getEntryRevisions","getRevisions","getEntry","sort","items","cms","listEntries","limit","initialWhere","ownedBy","own","latest","published","hasMoreItems","totalCount","cursor","list","meta","listLatestEntries","listPublishedEntries","createEntry","inputData","initialInput","data","validateEntries","identity","security","locale","getLocale","owner","displayName","webinyVersion","WEBINY_VERSION","tenant","modelId","createdOn","Date","toISOString","savedOn","createdBy","locked","status","storageEntry","result","create","error","createEntryRevisionFrom","sourceId","uniqueId","originalStorageEntry","getRevisionById","latestStorageEntry","getLatestRevisionByEntryId","originalEntry","initialValues","checkOwnership","latestEntry","latestId","nextVersion","publishedOn","original","createRevisionFrom","updateEntry","update","republishEntry","deleteEntryRevision","revisionId","storageEntryToDelete","previousStorageEntry","getPreviousRevision","latestEntryRevisionId","entryToDelete","entryToSetAsLatest","storageEntryToSetAsLatest","deleteRevision","publishEntry","pw","currentDate","requestEntryChanges","requestChanges","requestEntryReview","latestEntryRevision","allowedStatuses","requestReview","unpublishEntry","getPublishedRevisionByEntryId","unpublish"],"mappings":"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","sourcesContent":["/**\n * Package mdbid does not have types.\n */\n// @ts-ignore\nimport mdbid from \"mdbid\";\nimport { NotFoundError } from \"@webiny/handler-graphql\";\nimport {\n CmsEntryContext,\n CmsEntryPermission,\n CmsEntry,\n CmsModel,\n CmsContext,\n CmsStorageEntry,\n HeadlessCmsStorageOperations,\n BeforeEntryCreateTopicParams,\n AfterEntryCreateTopicParams,\n BeforeEntryUpdateTopicParams,\n AfterEntryUpdateTopicParams,\n AfterEntryDeleteTopicParams,\n BeforeEntryDeleteTopicParams,\n BeforeEntryCreateRevisionTopicParams,\n AfterEntryCreateRevisionTopicParams,\n BeforeEntryPublishTopicParams,\n AfterEntryPublishTopicParams,\n BeforeEntryUnpublishTopicParams,\n AfterEntryUnpublishTopicParams,\n BeforeEntryRequestChangesTopicParams,\n AfterEntryRequestChangesTopicParams,\n BeforeEntryRequestReviewTopicParams,\n AfterEntryRequestReviewTopicParams,\n BeforeEntryDeleteRevisionTopicParams,\n AfterEntryDeleteRevisionTopicParams,\n BeforeEntryGetTopicParams,\n BeforeEntryListTopicParams,\n CmsEntryListWhere,\n UpdateCmsEntryInput,\n CreateCmsEntryInput,\n CmsModelField,\n CreatedBy,\n CmsModelFieldToGraphQLPlugin\n} from \"~/types\";\nimport * as utils from \"~/utils\";\nimport { validateModelEntryData } from \"./contentEntry/entryDataValidation\";\nimport WebinyError from \"@webiny/error\";\nimport { SecurityIdentity } from \"@webiny/api-security/types\";\nimport { createTopic } from \"@webiny/pubsub\";\nimport { assignBeforeEntryCreate } from \"./contentEntry/beforeCreate\";\nimport { assignBeforeEntryUpdate } from \"./contentEntry/beforeUpdate\";\nimport { createIdentifier, parseIdentifier } from \"@webiny/utils\";\nimport {\n entryFromStorageTransform,\n entryToStorageTransform\n} from \"~/content/plugins/utils/entryStorage\";\nimport { assignAfterEntryDelete } from \"~/content/plugins/crud/contentEntry/afterDelete\";\nimport { referenceFieldsMapping } from \"./contentEntry/referenceFieldsMapping\";\nimport { PluginsContainer } from \"@webiny/plugins\";\nimport { Tenant } from \"@webiny/api-tenancy/types\";\n\nexport const STATUS_DRAFT = \"draft\";\nexport const STATUS_PUBLISHED = \"published\";\nexport const STATUS_UNPUBLISHED = \"unpublished\";\nexport const STATUS_CHANGES_REQUESTED = \"changesRequested\";\nexport const STATUS_REVIEW_REQUESTED = \"reviewRequested\";\n\n/**\n * Used for some fields to convert their values.\n */\nconst convertDefaultValue = (field: CmsModelField, value: any): string | number | boolean => {\n switch (field.type) {\n case \"boolean\":\n return Boolean(value);\n case \"number\":\n return Number(value);\n default:\n return value;\n }\n};\nconst getDefaultValue = (field: CmsModelField): any => {\n const { settings, multipleValues } = field;\n if (settings && settings.defaultValue !== undefined) {\n return convertDefaultValue(field, settings.defaultValue);\n }\n const { predefinedValues } = field;\n if (\n !predefinedValues ||\n !predefinedValues.enabled ||\n Array.isArray(predefinedValues.values) === false\n ) {\n return undefined;\n }\n if (!multipleValues) {\n const selectedValue = predefinedValues.values.find(value => {\n return !!value.selected;\n });\n if (selectedValue) {\n return convertDefaultValue(field, selectedValue.value);\n }\n return undefined;\n }\n return predefinedValues.values\n .filter(({ selected }) => !!selected)\n .map(({ value }) => {\n return convertDefaultValue(field, value);\n });\n};\n/**\n * Cleans and adds default values to create input data.\n */\nconst cleanInputData = (model: CmsModel, input: CreateCmsEntryInput): CreateCmsEntryInput => {\n return model.fields.reduce((acc, field) => {\n const value = input[field.fieldId];\n /**\n * We set the default value on create input if value is not defined.\n */\n acc[field.fieldId] = value === undefined ? getDefaultValue(field) : value;\n return acc;\n }, {} as CreateCmsEntryInput);\n};\n/**\n * Cleans the update input entry data.\n */\nconst cleanUpdatedInputData = (\n model: CmsModel,\n input: UpdateCmsEntryInput\n): UpdateCmsEntryInput => {\n return model.fields.reduce((acc, field) => {\n /**\n * We cannot set default value here because user might want to updated only certain field values.\n */\n if (input[field.fieldId] === undefined) {\n return acc;\n }\n acc[field.fieldId] = input[field.fieldId];\n return acc;\n }, {} as CreateCmsEntryInput);\n};\n\ninterface DeleteEntryParams {\n model: CmsModel;\n entry: CmsEntry;\n}\n\ninterface EntryIdResult {\n /**\n * A generated id that will connect all the entry records.\n */\n entryId: string;\n /**\n * Version of the entry.\n */\n version: number;\n /**\n * Combination of entryId and version.\n */\n id: string;\n}\n\nconst createEntryId = (version: number): EntryIdResult => {\n const entryId = mdbid();\n return {\n entryId,\n version,\n id: createIdentifier({\n id: entryId,\n version\n })\n };\n};\n\nconst increaseEntryIdVersion = (id: string): EntryIdResult => {\n const { id: entryId, version } = parseIdentifier(id);\n if (!version) {\n throw new WebinyError(\n \"Cannot increase version on the ID without the version part.\",\n \"WRONG_ID\",\n {\n id\n }\n );\n }\n return {\n entryId,\n version: version + 1,\n id: createIdentifier({\n id: entryId,\n version: version + 1\n })\n };\n};\n\ninterface GetSearchableFieldsParams {\n plugins: PluginsContainer;\n model: CmsModel;\n fields?: string[];\n}\nconst getSearchableFields = (params: GetSearchableFieldsParams): string[] => {\n const { plugins, model, fields } = params;\n\n const fieldPluginMap = plugins\n .byType<CmsModelFieldToGraphQLPlugin>(\"cms-model-field-to-graphql\")\n .reduce((collection, field) => {\n collection[field.fieldType] = field;\n return collection;\n }, {} as Record<string, CmsModelFieldToGraphQLPlugin>);\n\n return model.fields\n .filter(field => {\n const plugin = fieldPluginMap[field.type];\n if (!plugin) {\n return false;\n } else if (!plugin.fullTextSearch) {\n return false;\n } else if (!fields || fields.length === 0) {\n return true;\n }\n return fields.includes(field.fieldId);\n })\n .map(field => field.fieldId);\n};\n\nexport interface CreateContentEntryCrudParams {\n storageOperations: HeadlessCmsStorageOperations;\n context: CmsContext;\n getIdentity: () => SecurityIdentity;\n getTenant: () => Tenant;\n}\n\nexport const createContentEntryCrud = (params: CreateContentEntryCrudParams): CmsEntryContext => {\n const { storageOperations, context, getIdentity, getTenant } = params;\n\n const onBeforeEntryCreate = createTopic<BeforeEntryCreateTopicParams>();\n const onAfterEntryCreate = createTopic<AfterEntryCreateTopicParams>();\n const onBeforeEntryCreateRevision = createTopic<BeforeEntryCreateRevisionTopicParams>();\n const onAfterEntryCreateRevision = createTopic<AfterEntryCreateRevisionTopicParams>();\n const onBeforeEntryUpdate = createTopic<BeforeEntryUpdateTopicParams>();\n const onAfterEntryUpdate = createTopic<AfterEntryUpdateTopicParams>();\n const onBeforeEntryPublish = createTopic<BeforeEntryPublishTopicParams>();\n const onAfterEntryPublish = createTopic<AfterEntryPublishTopicParams>();\n const onBeforeEntryUnpublish = createTopic<BeforeEntryUnpublishTopicParams>();\n const onAfterEntryUnpublish = createTopic<AfterEntryUnpublishTopicParams>();\n const onBeforeEntryRequestChanges = createTopic<BeforeEntryRequestChangesTopicParams>();\n const onAfterEntryRequestChanges = createTopic<AfterEntryRequestChangesTopicParams>();\n const onBeforeEntryRequestReview = createTopic<BeforeEntryRequestReviewTopicParams>();\n const onAfterEntryRequestReview = createTopic<AfterEntryRequestReviewTopicParams>();\n const onBeforeEntryDelete = createTopic<BeforeEntryDeleteTopicParams>();\n const onAfterEntryDelete = createTopic<AfterEntryDeleteTopicParams>();\n const onBeforeEntryDeleteRevision = createTopic<BeforeEntryDeleteRevisionTopicParams>();\n const onAfterEntryDeleteRevision = createTopic<AfterEntryDeleteRevisionTopicParams>();\n const onBeforeEntryGet = createTopic<BeforeEntryGetTopicParams>();\n const onBeforeEntryList = createTopic<BeforeEntryListTopicParams>();\n\n /**\n * We need to assign some default behaviors.\n */\n assignBeforeEntryCreate({\n context,\n onBeforeEntryCreate\n });\n assignBeforeEntryUpdate({\n context,\n onBeforeEntryUpdate\n });\n assignAfterEntryDelete({\n context,\n onAfterEntryDelete\n });\n\n const checkEntryPermissions = (check: {\n rwd?: string;\n pw?: string;\n }): Promise<CmsEntryPermission> => {\n return utils.checkPermissions(context, \"cms.contentEntry\", check);\n };\n\n /**\n * A helper to delete the entire entry.\n */\n const deleteEntry = async (params: DeleteEntryParams): Promise<void> => {\n const { model, entry } = params;\n try {\n await onBeforeEntryDelete.publish({\n entry,\n model\n });\n\n await storageOperations.entries.delete(model, {\n entry\n });\n\n await onAfterEntryDelete.publish({\n entry,\n model\n });\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not delete entry.\",\n ex.code || \"DELETE_ERROR\",\n {\n entry\n }\n );\n }\n };\n /**\n * A helper to get entries by revision IDs\n */\n const getEntriesByIds = async (model: CmsModel, ids: string[]) => {\n const permission = await checkEntryPermissions({ rwd: \"r\" });\n await utils.checkModelAccess(context, model);\n\n const entries = await storageOperations.entries.getByIds(model, {\n ids\n });\n\n return entries.filter(entry => utils.validateOwnership(context, permission, entry));\n };\n\n return {\n onBeforeEntryCreate,\n onAfterEntryCreate,\n onBeforeEntryCreateRevision,\n onAfterEntryCreateRevision,\n onBeforeEntryUpdate,\n onAfterEntryUpdate,\n onBeforeEntryDelete,\n onAfterEntryDelete,\n onBeforeEntryDeleteRevision,\n onAfterEntryDeleteRevision,\n onBeforeEntryPublish,\n onAfterEntryPublish,\n onBeforeEntryUnpublish,\n onAfterEntryUnpublish,\n onBeforeEntryRequestChanges,\n onAfterEntryRequestChanges,\n onBeforeEntryRequestReview,\n onAfterEntryRequestReview,\n onBeforeEntryGet,\n onBeforeEntryList,\n /**\n * Get entries by exact revision IDs from the database.\n */\n getEntriesByIds: getEntriesByIds,\n /**\n * Get a single entry by revision ID from the database.\n */\n getEntryById: async (model, id) => {\n const where: CmsEntryListWhere = {\n id\n };\n await onBeforeEntryGet.publish({\n where,\n model\n });\n const [entry] = await getEntriesByIds(model, [id]);\n if (!entry) {\n throw new NotFoundError(`Entry by ID \"${id}\" not found.`);\n }\n return entry;\n },\n /**\n * Get published revisions by entry IDs.\n */\n getPublishedEntriesByIds: async (model: CmsModel, ids: string[]) => {\n const permission = await checkEntryPermissions({ rwd: \"r\" });\n await utils.checkModelAccess(context, model);\n\n const entries = await storageOperations.entries.getPublishedByIds(model, {\n ids\n });\n\n return entries.filter(entry => utils.validateOwnership(context, permission, entry));\n },\n /**\n * Get latest revisions by entry IDs.\n */\n getLatestEntriesByIds: async (model: CmsModel, ids: string[]) => {\n const permission = await checkEntryPermissions({ rwd: \"r\" });\n await utils.checkModelAccess(context, model);\n\n const entries = await storageOperations.entries.getLatestByIds(model, {\n ids\n });\n\n return entries.filter(entry => utils.validateOwnership(context, permission, entry));\n },\n\n getEntryRevisions: async (model, entryId) => {\n return storageOperations.entries.getRevisions(model, {\n id: entryId\n });\n },\n /**\n * TODO determine if this method is required at all.\n *\n * @internal\n */\n getEntry: async (model, params) => {\n await checkEntryPermissions({ rwd: \"r\" });\n\n const { where, sort } = params;\n\n await onBeforeEntryGet.publish({\n where,\n model\n });\n\n const [items] = await context.cms.listEntries(model, {\n where,\n sort,\n limit: 1\n });\n\n if (items.length === 0) {\n throw new NotFoundError(`Entry not found!`);\n }\n return items[0];\n },\n /**\n * @description Should not be used directly. Internal use only!\n *\n * @internal\n */\n listEntries: async (model: CmsModel, params) => {\n const permission = await checkEntryPermissions({ rwd: \"r\" });\n await utils.checkModelAccess(context, model);\n\n const { where: initialWhere } = params;\n /**\n * We always assign tenant and locale because we do not allow one model to have content through multiple tenants.\n */\n const where: CmsEntryListWhere = {\n ...initialWhere\n };\n /**\n * Possibly only get records which are owned by current user.\n * Or if searching for the owner set that value - in the case that user can see other entries than their own.\n */\n const ownedBy = permission.own ? getIdentity().id : where.ownedBy;\n if (ownedBy !== undefined) {\n where.ownedBy = ownedBy;\n }\n /**\n * Where must contain either latest or published keys.\n * We cannot list entries without one of those\n */\n if (where.latest && where.published) {\n throw new WebinyError(\n \"Cannot list entries that are both published and latest.\",\n \"LIST_ENTRIES_ERROR\",\n {\n where\n }\n );\n } else if (!where.latest && !where.published) {\n throw new WebinyError(\n \"Cannot list entries if we do not have latest or published defined.\",\n \"LIST_ENTRIES_ERROR\",\n {\n where\n }\n );\n }\n\n await onBeforeEntryList.publish({\n where,\n model\n });\n\n const fields = getSearchableFields({\n model,\n plugins: context.plugins,\n fields: params.fields || []\n });\n\n const { hasMoreItems, totalCount, cursor, items } =\n await storageOperations.entries.list(model, {\n ...params,\n where,\n fields\n });\n\n const meta = {\n hasMoreItems,\n totalCount,\n /**\n * Cursor should be null if there are no more items to load.\n * Just make sure of that, disregarding what is returned from the storageOperations.entries.list method.\n */\n cursor: hasMoreItems ? cursor : null\n };\n\n return [items, meta];\n },\n listLatestEntries: async function (model, params) {\n const where = params?.where || ({} as CmsEntryListWhere);\n\n return context.cms.listEntries(model, {\n sort: [\"createdOn_DESC\"],\n ...(params || {}),\n where: {\n ...where,\n latest: true\n }\n });\n },\n listPublishedEntries: async function (model, params) {\n const where = params?.where || ({} as CmsEntryListWhere);\n\n return context.cms.listEntries(model, {\n sort: [\"createdOn_DESC\"],\n ...(params || {}),\n where: {\n ...where,\n published: true\n }\n });\n },\n createEntry: async (model, inputData) => {\n await checkEntryPermissions({ rwd: \"w\" });\n await utils.checkModelAccess(context, model);\n\n /**\n * Make sure we only work with fields that are defined in the model.\n */\n const initialInput = cleanInputData(model, inputData);\n\n await validateModelEntryData({\n context,\n model,\n data: initialInput\n });\n\n const input = await referenceFieldsMapping({\n context,\n model,\n input: initialInput,\n validateEntries: true\n });\n\n const identity = context.security.getIdentity();\n const locale = context.cms.getLocale();\n\n const owner: CreatedBy = {\n id: identity.id,\n displayName: identity.displayName,\n type: identity.type\n };\n\n const { id, entryId, version } = createEntryId(1);\n\n const entry: CmsEntry = {\n webinyVersion: context.WEBINY_VERSION,\n tenant: getTenant().id,\n entryId,\n id,\n modelId: model.modelId,\n locale: locale.code,\n createdOn: new Date().toISOString(),\n savedOn: new Date().toISOString(),\n createdBy: owner,\n ownedBy: owner,\n version,\n locked: false,\n status: STATUS_DRAFT,\n values: input\n };\n\n let storageEntry: CmsStorageEntry | null = null;\n try {\n await onBeforeEntryCreate.publish({\n entry,\n input,\n model\n });\n\n storageEntry = await entryToStorageTransform(context, model, entry);\n const result = await storageOperations.entries.create(model, {\n entry,\n storageEntry\n });\n\n await onAfterEntryCreate.publish({\n entry,\n storageEntry: result,\n model,\n input\n });\n\n return result;\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not create content entry.\",\n ex.code || \"CREATE_ENTRY_ERROR\",\n ex.data || {\n error: ex,\n input,\n entry,\n storageEntry\n }\n );\n }\n },\n createEntryRevisionFrom: async (model, sourceId, inputData) => {\n const permission = await checkEntryPermissions({ rwd: \"w\" });\n await utils.checkModelAccess(context, model);\n\n /**\n * Make sure we only work with fields that are defined in the model.\n */\n const input = cleanUpdatedInputData(model, inputData);\n\n /**\n * Entries are identified by a common parent ID + Revision number.\n */\n const { id: uniqueId } = parseIdentifier(sourceId);\n\n const originalStorageEntry = await storageOperations.entries.getRevisionById(model, {\n id: sourceId\n });\n const latestStorageEntry = await storageOperations.entries.getLatestRevisionByEntryId(\n model,\n {\n id: uniqueId\n }\n );\n\n if (!originalStorageEntry) {\n throw new NotFoundError(\n `Entry \"${sourceId}\" of model \"${model.modelId}\" was not found.`\n );\n }\n\n /**\n * We need to convert data from DB to its original form before using it further.\n */\n const originalEntry = await entryFromStorageTransform(\n context,\n model,\n originalStorageEntry\n );\n\n const initialValues = {\n ...originalEntry.values,\n ...input\n };\n\n await validateModelEntryData({\n context,\n model,\n data: initialValues,\n entry: originalEntry\n });\n\n const values = await referenceFieldsMapping({\n context,\n model,\n input: initialValues,\n validateEntries: false\n });\n\n utils.checkOwnership(context, permission, originalEntry);\n\n const latestEntry = latestStorageEntry\n ? await entryFromStorageTransform(context, model, latestStorageEntry)\n : null;\n\n const identity = context.security.getIdentity();\n\n const latestId = latestStorageEntry ? latestStorageEntry.id : sourceId;\n const { id, version: nextVersion } = increaseEntryIdVersion(latestId);\n\n const entry: CmsEntry = {\n ...originalEntry,\n id,\n version: nextVersion,\n savedOn: new Date().toISOString(),\n createdOn: new Date().toISOString(),\n createdBy: {\n id: identity.id,\n displayName: identity.displayName,\n type: identity.type\n },\n locked: false,\n publishedOn: undefined,\n status: STATUS_DRAFT,\n values\n };\n\n let storageEntry: CmsStorageEntry | null = null;\n\n try {\n await onBeforeEntryCreateRevision.publish({\n input,\n entry,\n original: originalEntry,\n model\n });\n\n storageEntry = await entryToStorageTransform(context, model, entry);\n\n const result = await storageOperations.entries.createRevisionFrom(model, {\n entry,\n storageEntry,\n latestEntry,\n latestStorageEntry\n });\n\n await onAfterEntryCreateRevision.publish({\n input,\n entry,\n model,\n original: originalEntry,\n storageEntry: result\n });\n return result;\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not create entry from existing one.\",\n ex.code || \"CREATE_FROM_REVISION_ERROR\",\n {\n error: ex,\n entry,\n storageEntry,\n originalEntry,\n originalStorageEntry\n }\n );\n }\n },\n updateEntry: async (model, id, inputData) => {\n const permission = await checkEntryPermissions({ rwd: \"w\" });\n await utils.checkModelAccess(context, model);\n\n /**\n * Make sure we only work with fields that are defined in the model.\n */\n const input = cleanUpdatedInputData(model, inputData);\n\n /**\n * The entry we are going to update.\n */\n const originalStorageEntry = await storageOperations.entries.getRevisionById(model, {\n id\n });\n\n if (!originalStorageEntry) {\n throw new NotFoundError(`Entry \"${id}\" of model \"${model.modelId}\" was not found.`);\n }\n\n if (originalStorageEntry.locked) {\n throw new WebinyError(\n `Cannot update entry because it's locked.`,\n \"CONTENT_ENTRY_UPDATE_ERROR\"\n );\n }\n\n const originalEntry = await entryFromStorageTransform(\n context,\n model,\n originalStorageEntry\n );\n\n await validateModelEntryData({\n context,\n model,\n data: input,\n entry: originalEntry\n });\n\n utils.checkOwnership(context, permission, originalEntry);\n\n const initialValues = {\n /**\n * Existing values from the database, transformed back to original, of course.\n */\n ...originalEntry.values,\n /**\n * Add new values.\n */\n ...input\n };\n\n const values = await referenceFieldsMapping({\n context,\n model,\n input: initialValues,\n validateEntries: false\n });\n\n /**\n * We always send the full entry to the hooks and storage operations update.\n */\n const entry: CmsEntry = {\n ...originalEntry,\n savedOn: new Date().toISOString(),\n values\n };\n\n let storageEntry: CmsStorageEntry | null = null;\n\n try {\n await onBeforeEntryUpdate.publish({\n entry,\n model,\n input,\n original: originalEntry\n });\n\n storageEntry = await entryToStorageTransform(context, model, entry);\n\n const result = await storageOperations.entries.update(model, {\n entry,\n storageEntry\n });\n\n await onAfterEntryUpdate.publish({\n entry,\n storageEntry: result,\n model,\n input,\n original: originalEntry\n });\n return result;\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not update existing entry.\",\n ex.code || \"UPDATE_ERROR\",\n {\n error: ex,\n entry,\n storageEntry,\n originalEntry,\n input\n }\n );\n }\n },\n republishEntry: async (model, id) => {\n await checkEntryPermissions({ rwd: \"w\" });\n await utils.checkModelAccess(context, model);\n /**\n * Fetch the entry from the storage.\n */\n const originalStorageEntry = await storageOperations.entries.getRevisionById(model, {\n id\n });\n if (!originalStorageEntry) {\n throw new NotFoundError(`Entry \"${id}\" was not found!`);\n }\n\n const originalEntry = await entryFromStorageTransform(\n context,\n model,\n originalStorageEntry\n );\n /**\n * We can only process published entries.\n */\n if (originalEntry.status !== \"published\") {\n throw new WebinyError(\n \"Entry with given ID is not published!\",\n \"NOT_PUBLISHED_ERROR\",\n {\n id,\n original: originalEntry\n }\n );\n }\n\n const values = await referenceFieldsMapping({\n context,\n model,\n input: originalEntry.values,\n validateEntries: false\n });\n\n const entry: CmsEntry = {\n ...originalEntry,\n savedOn: new Date().toISOString(),\n webinyVersion: context.WEBINY_VERSION,\n values\n };\n\n const storageEntry = await entryToStorageTransform(context, model, entry);\n /**\n * First we need to update existing entry.\n */\n try {\n await storageOperations.entries.update(model, {\n entry,\n storageEntry\n });\n } catch (ex) {\n throw new WebinyError(\n \"Could not update existing entry with new data while re-publishing.\",\n \"REPUBLISH_UPDATE_ERROR\",\n {\n entry\n }\n );\n }\n /**\n * Then we move onto publishing it again.\n */\n try {\n return await storageOperations.entries.publish(model, {\n entry,\n storageEntry\n });\n } catch (ex) {\n throw new WebinyError(\n \"Could not publish existing entry while re-publishing.\",\n \"REPUBLISH_PUBLISH_ERROR\",\n {\n entry\n }\n );\n }\n },\n deleteEntryRevision: async (model, revisionId) => {\n const permission = await checkEntryPermissions({ rwd: \"d\" });\n await utils.checkModelAccess(context, model);\n\n const { id: entryId, version } = parseIdentifier(revisionId);\n\n const storageEntryToDelete = await storageOperations.entries.getRevisionById(model, {\n id: revisionId\n });\n const latestStorageEntry = await storageOperations.entries.getLatestRevisionByEntryId(\n model,\n {\n id: entryId\n }\n );\n const previousStorageEntry = await storageOperations.entries.getPreviousRevision(\n model,\n {\n entryId,\n version: version as number\n }\n );\n\n if (!storageEntryToDelete) {\n throw new NotFoundError(`Entry \"${revisionId}\" was not found!`);\n }\n\n utils.checkOwnership(context, permission, storageEntryToDelete);\n\n const latestEntryRevisionId = latestStorageEntry ? latestStorageEntry.id : null;\n\n const entryToDelete = await entryFromStorageTransform(\n context,\n model,\n storageEntryToDelete\n );\n /**\n * If targeted record is the latest entry record and there is no previous one, we need to run full delete with hooks.\n * At this point deleteRevision hooks are not fired.\n */\n if (entryToDelete.id === latestEntryRevisionId && !previousStorageEntry) {\n return await deleteEntry({\n model,\n entry: entryToDelete\n });\n }\n /**\n * If targeted record is latest entry revision, set the previous one as the new latest\n */\n let entryToSetAsLatest: CmsEntry | null = null;\n let storageEntryToSetAsLatest: CmsStorageEntry | null = null;\n if (entryToDelete.id === latestEntryRevisionId && previousStorageEntry) {\n entryToSetAsLatest = await entryFromStorageTransform(\n context,\n model,\n previousStorageEntry\n );\n storageEntryToSetAsLatest = previousStorageEntry;\n }\n\n try {\n await onBeforeEntryDeleteRevision.publish({\n entry: entryToDelete,\n model\n });\n\n await storageOperations.entries.deleteRevision(model, {\n entry: entryToDelete,\n storageEntry: storageEntryToDelete,\n latestEntry: entryToSetAsLatest,\n latestStorageEntry: storageEntryToSetAsLatest\n });\n\n await onAfterEntryDeleteRevision.publish({\n entry: entryToDelete,\n model\n });\n } catch (ex) {\n throw new WebinyError(ex.message, ex.code || \"DELETE_REVISION_ERROR\", {\n error: ex,\n entry: entryToDelete,\n storageEntry: storageEntryToDelete,\n latestEntry: entryToSetAsLatest,\n latestStorageEntry: storageEntryToSetAsLatest\n });\n }\n },\n deleteEntry: async (model, entryId) => {\n const permission = await checkEntryPermissions({ rwd: \"d\" });\n await utils.checkModelAccess(context, model);\n\n const storageEntry = await storageOperations.entries.getLatestRevisionByEntryId(model, {\n id: entryId\n });\n\n if (!storageEntry) {\n throw new NotFoundError(`Entry \"${entryId}\" was not found!`);\n }\n\n utils.checkOwnership(context, permission, storageEntry);\n\n const entry = await entryFromStorageTransform(context, model, storageEntry);\n\n return await deleteEntry({\n model,\n entry\n });\n },\n publishEntry: async (model, id) => {\n const permission = await checkEntryPermissions({ pw: \"p\" });\n await utils.checkModelAccess(context, model);\n\n const originalStorageEntry = await storageOperations.entries.getRevisionById(model, {\n id\n });\n\n if (!originalStorageEntry) {\n throw new NotFoundError(\n `Entry \"${id}\" in the model \"${model.modelId}\" was not found.`\n );\n }\n\n utils.checkOwnership(context, permission, originalStorageEntry);\n\n const originalEntry = await entryFromStorageTransform(\n context,\n model,\n originalStorageEntry\n );\n\n const currentDate = new Date().toISOString();\n const entry: CmsEntry = {\n ...originalEntry,\n status: STATUS_PUBLISHED,\n locked: true,\n savedOn: currentDate,\n publishedOn: currentDate\n };\n\n let storageEntry: CmsStorageEntry | null = null;\n\n try {\n await onBeforeEntryPublish.publish({\n entry,\n model\n });\n\n storageEntry = await entryToStorageTransform(context, model, entry);\n const result = await storageOperations.entries.publish(model, {\n entry,\n storageEntry\n });\n\n await onAfterEntryPublish.publish({\n entry,\n storageEntry: result,\n model\n });\n return result;\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not publish entry.\",\n ex.code || \"PUBLISH_ERROR\",\n {\n error: ex,\n entry,\n storageEntry,\n originalEntry,\n originalStorageEntry\n }\n );\n }\n },\n requestEntryChanges: async (model, id) => {\n const permission = await checkEntryPermissions({ pw: \"c\" });\n\n const originalStorageEntry = await storageOperations.entries.getRevisionById(model, {\n id\n });\n\n if (!originalStorageEntry) {\n throw new NotFoundError(`Entry \"${id}\" of model \"${model.modelId}\" was not found.`);\n }\n\n const originalEntry = await entryFromStorageTransform(\n context,\n model,\n originalStorageEntry\n );\n\n if (originalEntry.status !== STATUS_REVIEW_REQUESTED) {\n throw new WebinyError(\n \"Cannot request changes on an entry that's not under review.\",\n \"ENTRY_NOT_UNDER_REVIEW\"\n );\n }\n\n const identity = context.security.getIdentity();\n if (originalEntry.ownedBy.id === identity.id) {\n throw new WebinyError(\n \"You cannot request changes on your own entry.\",\n \"CANNOT_REQUEST_CHANGES_ON_OWN_ENTRY\"\n );\n }\n\n utils.checkOwnership(context, permission, originalEntry);\n\n const entry: CmsEntry = {\n ...originalEntry,\n status: STATUS_CHANGES_REQUESTED\n };\n\n let storageEntry: CmsStorageEntry | null = null;\n\n try {\n await onBeforeEntryRequestChanges.publish({\n entry,\n model\n });\n\n storageEntry = await entryToStorageTransform(context, model, entry);\n\n const result = await storageOperations.entries.requestChanges(model, {\n entry,\n storageEntry\n });\n\n await onAfterEntryRequestChanges.publish({\n entry,\n storageEntry: result,\n model\n });\n\n return result;\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not request changes for the entry.\",\n ex.code || \"REQUEST_CHANGES_ERROR\",\n {\n entry,\n originalEntry\n }\n );\n }\n },\n requestEntryReview: async (model, id) => {\n const permission = await checkEntryPermissions({ pw: \"r\" });\n const { id: entryId } = parseIdentifier(id);\n\n const originalStorageEntry = await storageOperations.entries.getRevisionById(model, {\n id\n });\n const latestEntryRevision = await storageOperations.entries.getLatestRevisionByEntryId(\n model,\n {\n id: entryId\n }\n );\n\n if (!originalStorageEntry) {\n throw new NotFoundError(`Entry \"${id}\" of model \"${model.modelId}\" was not found.`);\n } else if (!latestEntryRevision) {\n throw new NotFoundError(`Entry \"${id}\" does not have latest record`);\n }\n\n const originalEntry = await entryFromStorageTransform(\n context,\n model,\n originalStorageEntry\n );\n\n const allowedStatuses = [STATUS_DRAFT, STATUS_CHANGES_REQUESTED];\n if (!allowedStatuses.includes(originalEntry.status)) {\n throw new WebinyError(\n \"Cannot request review - entry is not a draft nor was a change request issued.\",\n \"REQUEST_REVIEW_ERROR\",\n {\n entry: originalEntry\n }\n );\n }\n\n utils.checkOwnership(context, permission, originalEntry);\n\n const entry: CmsEntry = {\n ...originalEntry,\n status: STATUS_REVIEW_REQUESTED\n };\n\n let storageEntry: CmsStorageEntry | null = null;\n\n try {\n await onBeforeEntryRequestReview.publish({\n entry,\n model\n });\n\n storageEntry = await entryToStorageTransform(context, model, entry);\n\n const result = await storageOperations.entries.requestReview(model, {\n entry,\n storageEntry\n });\n\n await onAfterEntryRequestReview.publish({\n entry,\n storageEntry: result,\n model\n });\n\n return result;\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not request review on the entry.\",\n ex.code || \"REQUEST_REVIEW_ERROR\",\n {\n originalEntry,\n entry\n }\n );\n }\n },\n unpublishEntry: async (model, id) => {\n const permission = await checkEntryPermissions({ pw: \"u\" });\n\n const { id: entryId } = parseIdentifier(id);\n\n const originalStorageEntry =\n await storageOperations.entries.getPublishedRevisionByEntryId(model, {\n id: entryId\n });\n\n if (!originalStorageEntry) {\n throw new NotFoundError(`Entry \"${id}\" of model \"${model.modelId}\" was not found.`);\n }\n\n if (originalStorageEntry.id !== id) {\n throw new WebinyError(`Entry is not published.`, \"UNPUBLISH_ERROR\", {\n entry: originalStorageEntry\n });\n }\n\n utils.checkOwnership(context, permission, originalStorageEntry);\n\n const originalEntry = await entryFromStorageTransform(\n context,\n model,\n originalStorageEntry\n );\n\n const entry: CmsEntry = {\n ...originalEntry,\n status: STATUS_UNPUBLISHED\n };\n\n let storageEntry: CmsStorageEntry | null = null;\n\n try {\n await onBeforeEntryUnpublish.publish({\n entry,\n model\n });\n\n storageEntry = await entryToStorageTransform(context, model, entry);\n\n const result = await storageOperations.entries.unpublish(model, {\n entry,\n storageEntry\n });\n\n await onAfterEntryUnpublish.publish({\n entry,\n storageEntry: result,\n model\n });\n\n return result;\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not unpublish entry.\",\n ex.code || \"UNPUBLISH_ERROR\",\n {\n originalEntry,\n originalStorageEntry,\n entry,\n storageEntry\n }\n );\n }\n }\n };\n};\n"]}
1
+ {"version":3,"sources":["contentEntry.crud.ts"],"names":["STATUS_DRAFT","STATUS_PUBLISHED","STATUS_UNPUBLISHED","STATUS_CHANGES_REQUESTED","STATUS_REVIEW_REQUESTED","convertDefaultValue","field","value","type","Boolean","Number","getDefaultValue","settings","multipleValues","defaultValue","undefined","predefinedValues","enabled","Array","isArray","values","selectedValue","find","selected","filter","map","cleanInputData","model","input","fields","reduce","acc","fieldId","cleanUpdatedInputData","createEntryId","version","entryId","id","increaseEntryIdVersion","WebinyError","getSearchableFields","params","plugins","fieldPluginMap","byType","collection","fieldType","plugin","fullTextSearch","length","includes","createContentEntryCrud","storageOperations","context","getIdentity","getTenant","onBeforeEntryCreate","onAfterEntryCreate","onBeforeEntryCreateRevision","onAfterEntryCreateRevision","onBeforeEntryUpdate","onAfterEntryUpdate","onBeforeEntryPublish","onAfterEntryPublish","onBeforeEntryUnpublish","onAfterEntryUnpublish","onBeforeEntryRequestChanges","onAfterEntryRequestChanges","onBeforeEntryRequestReview","onAfterEntryRequestReview","onBeforeEntryDelete","onAfterEntryDelete","onBeforeEntryDeleteRevision","onAfterEntryDeleteRevision","onBeforeEntryGet","onBeforeEntryList","checkEntryPermissions","check","utils","checkPermissions","deleteEntry","entry","publish","entries","delete","ex","message","code","getEntriesByIds","ids","permission","rwd","checkModelAccess","getByIds","validateOwnership","getEntryById","where","NotFoundError","getPublishedEntriesByIds","getPublishedByIds","getLatestEntriesByIds","getLatestByIds","getEntryRevisions","getRevisions","getEntry","sort","items","cms","listEntries","limit","initialWhere","ownedBy","own","latest","published","hasMoreItems","totalCount","cursor","list","meta","listLatestEntries","listPublishedEntries","createEntry","inputData","initialInput","data","validateEntries","identity","security","locale","getLocale","owner","displayName","webinyVersion","WEBINY_VERSION","tenant","modelId","createdOn","Date","toISOString","savedOn","createdBy","locked","status","storageEntry","result","create","error","createEntryRevisionFrom","sourceId","uniqueId","originalStorageEntry","getRevisionById","latestStorageEntry","getLatestRevisionByEntryId","originalEntry","initialValues","checkOwnership","latestId","nextVersion","publishedOn","original","createRevisionFrom","updateEntry","update","republishEntry","deleteEntryRevision","revisionId","storageEntryToDelete","previousStorageEntry","getPreviousRevision","latestEntryRevisionId","entryToDelete","entryToSetAsLatest","storageEntryToSetAsLatest","deleteRevision","latestEntry","publishEntry","pw","currentDate","requestEntryChanges","requestChanges","requestEntryReview","latestEntryRevision","allowedStatuses","requestReview","unpublishEntry","getPublishedRevisionByEntryId","unpublish"],"mappings":"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","sourcesContent":["/**\n * Package mdbid does not have types.\n */\n// @ts-ignore\nimport mdbid from \"mdbid\";\nimport { NotFoundError } from \"@webiny/handler-graphql\";\nimport {\n CmsEntryContext,\n CmsEntryPermission,\n CmsEntry,\n CmsModel,\n CmsContext,\n CmsStorageEntry,\n HeadlessCmsStorageOperations,\n BeforeEntryCreateTopicParams,\n AfterEntryCreateTopicParams,\n BeforeEntryUpdateTopicParams,\n AfterEntryUpdateTopicParams,\n AfterEntryDeleteTopicParams,\n BeforeEntryDeleteTopicParams,\n BeforeEntryCreateRevisionTopicParams,\n AfterEntryCreateRevisionTopicParams,\n BeforeEntryPublishTopicParams,\n AfterEntryPublishTopicParams,\n BeforeEntryUnpublishTopicParams,\n AfterEntryUnpublishTopicParams,\n BeforeEntryRequestChangesTopicParams,\n AfterEntryRequestChangesTopicParams,\n BeforeEntryRequestReviewTopicParams,\n AfterEntryRequestReviewTopicParams,\n BeforeEntryDeleteRevisionTopicParams,\n AfterEntryDeleteRevisionTopicParams,\n BeforeEntryGetTopicParams,\n BeforeEntryListTopicParams,\n CmsEntryListWhere,\n UpdateCmsEntryInput,\n CreateCmsEntryInput,\n CmsModelField,\n CreatedBy,\n CmsModelFieldToGraphQLPlugin\n} from \"~/types\";\nimport * as utils from \"~/utils\";\nimport { validateModelEntryData } from \"./contentEntry/entryDataValidation\";\nimport WebinyError from \"@webiny/error\";\nimport { SecurityIdentity } from \"@webiny/api-security/types\";\nimport { createTopic } from \"@webiny/pubsub\";\nimport { assignBeforeEntryCreate } from \"./contentEntry/beforeCreate\";\nimport { assignBeforeEntryUpdate } from \"./contentEntry/beforeUpdate\";\nimport { createIdentifier, parseIdentifier } from \"@webiny/utils\";\nimport {\n entryFromStorageTransform,\n entryToStorageTransform\n} from \"~/content/plugins/utils/entryStorage\";\nimport { assignAfterEntryDelete } from \"~/content/plugins/crud/contentEntry/afterDelete\";\nimport { referenceFieldsMapping } from \"./contentEntry/referenceFieldsMapping\";\nimport { PluginsContainer } from \"@webiny/plugins\";\nimport { Tenant } from \"@webiny/api-tenancy/types\";\n\nexport const STATUS_DRAFT = \"draft\";\nexport const STATUS_PUBLISHED = \"published\";\nexport const STATUS_UNPUBLISHED = \"unpublished\";\nexport const STATUS_CHANGES_REQUESTED = \"changesRequested\";\nexport const STATUS_REVIEW_REQUESTED = \"reviewRequested\";\n\n/**\n * Used for some fields to convert their values.\n */\nconst convertDefaultValue = (field: CmsModelField, value: any): string | number | boolean => {\n switch (field.type) {\n case \"boolean\":\n return Boolean(value);\n case \"number\":\n return Number(value);\n default:\n return value;\n }\n};\nconst getDefaultValue = (field: CmsModelField): any => {\n const { settings, multipleValues } = field;\n if (settings && settings.defaultValue !== undefined) {\n return convertDefaultValue(field, settings.defaultValue);\n }\n const { predefinedValues } = field;\n if (\n !predefinedValues ||\n !predefinedValues.enabled ||\n Array.isArray(predefinedValues.values) === false\n ) {\n return undefined;\n }\n if (!multipleValues) {\n const selectedValue = predefinedValues.values.find(value => {\n return !!value.selected;\n });\n if (selectedValue) {\n return convertDefaultValue(field, selectedValue.value);\n }\n return undefined;\n }\n return predefinedValues.values\n .filter(({ selected }) => !!selected)\n .map(({ value }) => {\n return convertDefaultValue(field, value);\n });\n};\n/**\n * Cleans and adds default values to create input data.\n */\nconst cleanInputData = (model: CmsModel, input: CreateCmsEntryInput): CreateCmsEntryInput => {\n return model.fields.reduce((acc, field) => {\n const value = input[field.fieldId];\n /**\n * We set the default value on create input if value is not defined.\n */\n acc[field.fieldId] = value === undefined ? getDefaultValue(field) : value;\n return acc;\n }, {} as CreateCmsEntryInput);\n};\n/**\n * Cleans the update input entry data.\n */\nconst cleanUpdatedInputData = (\n model: CmsModel,\n input: UpdateCmsEntryInput\n): UpdateCmsEntryInput => {\n return model.fields.reduce((acc, field) => {\n /**\n * We cannot set default value here because user might want to updated only certain field values.\n */\n if (input[field.fieldId] === undefined) {\n return acc;\n }\n acc[field.fieldId] = input[field.fieldId];\n return acc;\n }, {} as CreateCmsEntryInput);\n};\n\ninterface DeleteEntryParams {\n model: CmsModel;\n entry: CmsEntry;\n}\n\ninterface EntryIdResult {\n /**\n * A generated id that will connect all the entry records.\n */\n entryId: string;\n /**\n * Version of the entry.\n */\n version: number;\n /**\n * Combination of entryId and version.\n */\n id: string;\n}\n\nconst createEntryId = (version: number): EntryIdResult => {\n const entryId = mdbid();\n return {\n entryId,\n version,\n id: createIdentifier({\n id: entryId,\n version\n })\n };\n};\n\nconst increaseEntryIdVersion = (id: string): EntryIdResult => {\n const { id: entryId, version } = parseIdentifier(id);\n if (!version) {\n throw new WebinyError(\n \"Cannot increase version on the ID without the version part.\",\n \"WRONG_ID\",\n {\n id\n }\n );\n }\n return {\n entryId,\n version: version + 1,\n id: createIdentifier({\n id: entryId,\n version: version + 1\n })\n };\n};\n\ninterface GetSearchableFieldsParams {\n plugins: PluginsContainer;\n model: CmsModel;\n fields?: string[];\n}\nconst getSearchableFields = (params: GetSearchableFieldsParams): string[] => {\n const { plugins, model, fields } = params;\n\n const fieldPluginMap = plugins\n .byType<CmsModelFieldToGraphQLPlugin>(\"cms-model-field-to-graphql\")\n .reduce((collection, field) => {\n collection[field.fieldType] = field;\n return collection;\n }, {} as Record<string, CmsModelFieldToGraphQLPlugin>);\n\n return model.fields\n .filter(field => {\n const plugin = fieldPluginMap[field.type];\n if (!plugin) {\n return false;\n } else if (!plugin.fullTextSearch) {\n return false;\n } else if (!fields || fields.length === 0) {\n return true;\n }\n return fields.includes(field.fieldId);\n })\n .map(field => field.fieldId);\n};\n\nexport interface CreateContentEntryCrudParams {\n storageOperations: HeadlessCmsStorageOperations;\n context: CmsContext;\n getIdentity: () => SecurityIdentity;\n getTenant: () => Tenant;\n}\n\nexport const createContentEntryCrud = (params: CreateContentEntryCrudParams): CmsEntryContext => {\n const { storageOperations, context, getIdentity, getTenant } = params;\n\n const onBeforeEntryCreate = createTopic<BeforeEntryCreateTopicParams>();\n const onAfterEntryCreate = createTopic<AfterEntryCreateTopicParams>();\n const onBeforeEntryCreateRevision = createTopic<BeforeEntryCreateRevisionTopicParams>();\n const onAfterEntryCreateRevision = createTopic<AfterEntryCreateRevisionTopicParams>();\n const onBeforeEntryUpdate = createTopic<BeforeEntryUpdateTopicParams>();\n const onAfterEntryUpdate = createTopic<AfterEntryUpdateTopicParams>();\n const onBeforeEntryPublish = createTopic<BeforeEntryPublishTopicParams>();\n const onAfterEntryPublish = createTopic<AfterEntryPublishTopicParams>();\n const onBeforeEntryUnpublish = createTopic<BeforeEntryUnpublishTopicParams>();\n const onAfterEntryUnpublish = createTopic<AfterEntryUnpublishTopicParams>();\n const onBeforeEntryRequestChanges = createTopic<BeforeEntryRequestChangesTopicParams>();\n const onAfterEntryRequestChanges = createTopic<AfterEntryRequestChangesTopicParams>();\n const onBeforeEntryRequestReview = createTopic<BeforeEntryRequestReviewTopicParams>();\n const onAfterEntryRequestReview = createTopic<AfterEntryRequestReviewTopicParams>();\n const onBeforeEntryDelete = createTopic<BeforeEntryDeleteTopicParams>();\n const onAfterEntryDelete = createTopic<AfterEntryDeleteTopicParams>();\n const onBeforeEntryDeleteRevision = createTopic<BeforeEntryDeleteRevisionTopicParams>();\n const onAfterEntryDeleteRevision = createTopic<AfterEntryDeleteRevisionTopicParams>();\n const onBeforeEntryGet = createTopic<BeforeEntryGetTopicParams>();\n const onBeforeEntryList = createTopic<BeforeEntryListTopicParams>();\n\n /**\n * We need to assign some default behaviors.\n */\n assignBeforeEntryCreate({\n context,\n onBeforeEntryCreate\n });\n assignBeforeEntryUpdate({\n context,\n onBeforeEntryUpdate\n });\n assignAfterEntryDelete({\n context,\n onAfterEntryDelete\n });\n\n const checkEntryPermissions = (check: {\n rwd?: string;\n pw?: string;\n }): Promise<CmsEntryPermission> => {\n return utils.checkPermissions(context, \"cms.contentEntry\", check);\n };\n\n /**\n * A helper to delete the entire entry.\n */\n const deleteEntry = async (params: DeleteEntryParams): Promise<void> => {\n const { model, entry } = params;\n try {\n await onBeforeEntryDelete.publish({\n entry,\n model\n });\n\n await storageOperations.entries.delete(model, {\n entry\n });\n\n await onAfterEntryDelete.publish({\n entry,\n model\n });\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not delete entry.\",\n ex.code || \"DELETE_ERROR\",\n {\n entry\n }\n );\n }\n };\n /**\n * A helper to get entries by revision IDs\n */\n const getEntriesByIds = async (model: CmsModel, ids: string[]) => {\n const permission = await checkEntryPermissions({ rwd: \"r\" });\n await utils.checkModelAccess(context, model);\n\n const entries = await storageOperations.entries.getByIds(model, {\n ids\n });\n\n return entries.filter(entry => utils.validateOwnership(context, permission, entry));\n };\n\n return {\n onBeforeEntryCreate,\n onAfterEntryCreate,\n onBeforeEntryCreateRevision,\n onAfterEntryCreateRevision,\n onBeforeEntryUpdate,\n onAfterEntryUpdate,\n onBeforeEntryDelete,\n onAfterEntryDelete,\n onBeforeEntryDeleteRevision,\n onAfterEntryDeleteRevision,\n onBeforeEntryPublish,\n onAfterEntryPublish,\n onBeforeEntryUnpublish,\n onAfterEntryUnpublish,\n onBeforeEntryRequestChanges,\n onAfterEntryRequestChanges,\n onBeforeEntryRequestReview,\n onAfterEntryRequestReview,\n onBeforeEntryGet,\n onBeforeEntryList,\n /**\n * Get entries by exact revision IDs from the database.\n */\n getEntriesByIds: getEntriesByIds,\n /**\n * Get a single entry by revision ID from the database.\n */\n getEntryById: async (model, id) => {\n const where: CmsEntryListWhere = {\n id\n };\n await onBeforeEntryGet.publish({\n where,\n model\n });\n const [entry] = await getEntriesByIds(model, [id]);\n if (!entry) {\n throw new NotFoundError(`Entry by ID \"${id}\" not found.`);\n }\n return entry;\n },\n /**\n * Get published revisions by entry IDs.\n */\n getPublishedEntriesByIds: async (model: CmsModel, ids: string[]) => {\n const permission = await checkEntryPermissions({ rwd: \"r\" });\n await utils.checkModelAccess(context, model);\n\n const entries = await storageOperations.entries.getPublishedByIds(model, {\n ids\n });\n\n return entries.filter(entry => utils.validateOwnership(context, permission, entry));\n },\n /**\n * Get latest revisions by entry IDs.\n */\n getLatestEntriesByIds: async (model: CmsModel, ids: string[]) => {\n const permission = await checkEntryPermissions({ rwd: \"r\" });\n await utils.checkModelAccess(context, model);\n\n const entries = await storageOperations.entries.getLatestByIds(model, {\n ids\n });\n\n return entries.filter(entry => utils.validateOwnership(context, permission, entry));\n },\n\n getEntryRevisions: async (model, entryId) => {\n return storageOperations.entries.getRevisions(model, {\n id: entryId\n });\n },\n /**\n * TODO determine if this method is required at all.\n *\n * @internal\n */\n getEntry: async (model, params) => {\n await checkEntryPermissions({ rwd: \"r\" });\n\n const { where, sort } = params;\n\n await onBeforeEntryGet.publish({\n where,\n model\n });\n\n const [items] = await context.cms.listEntries(model, {\n where,\n sort,\n limit: 1\n });\n\n if (items.length === 0) {\n throw new NotFoundError(`Entry not found!`);\n }\n return items[0];\n },\n /**\n * @description Should not be used directly. Internal use only!\n *\n * @internal\n */\n listEntries: async (model: CmsModel, params) => {\n const permission = await checkEntryPermissions({ rwd: \"r\" });\n await utils.checkModelAccess(context, model);\n\n const { where: initialWhere } = params;\n /**\n * We always assign tenant and locale because we do not allow one model to have content through multiple tenants.\n */\n const where: CmsEntryListWhere = {\n ...initialWhere\n };\n /**\n * Possibly only get records which are owned by current user.\n * Or if searching for the owner set that value - in the case that user can see other entries than their own.\n */\n const ownedBy = permission.own ? getIdentity().id : where.ownedBy;\n if (ownedBy !== undefined) {\n where.ownedBy = ownedBy;\n }\n /**\n * Where must contain either latest or published keys.\n * We cannot list entries without one of those\n */\n if (where.latest && where.published) {\n throw new WebinyError(\n \"Cannot list entries that are both published and latest.\",\n \"LIST_ENTRIES_ERROR\",\n {\n where\n }\n );\n } else if (!where.latest && !where.published) {\n throw new WebinyError(\n \"Cannot list entries if we do not have latest or published defined.\",\n \"LIST_ENTRIES_ERROR\",\n {\n where\n }\n );\n }\n\n await onBeforeEntryList.publish({\n where,\n model\n });\n\n const fields = getSearchableFields({\n model,\n plugins: context.plugins,\n fields: params.fields || []\n });\n\n const { hasMoreItems, totalCount, cursor, items } =\n await storageOperations.entries.list(model, {\n ...params,\n where,\n fields\n });\n\n const meta = {\n hasMoreItems,\n totalCount,\n /**\n * Cursor should be null if there are no more items to load.\n * Just make sure of that, disregarding what is returned from the storageOperations.entries.list method.\n */\n cursor: hasMoreItems ? cursor : null\n };\n\n return [items, meta];\n },\n listLatestEntries: async function (model, params) {\n const where = params?.where || ({} as CmsEntryListWhere);\n\n return context.cms.listEntries(model, {\n sort: [\"createdOn_DESC\"],\n ...(params || {}),\n where: {\n ...where,\n latest: true\n }\n });\n },\n listPublishedEntries: async function (model, params) {\n const where = params?.where || ({} as CmsEntryListWhere);\n\n return context.cms.listEntries(model, {\n sort: [\"createdOn_DESC\"],\n ...(params || {}),\n where: {\n ...where,\n published: true\n }\n });\n },\n createEntry: async (model, inputData) => {\n await checkEntryPermissions({ rwd: \"w\" });\n await utils.checkModelAccess(context, model);\n\n /**\n * Make sure we only work with fields that are defined in the model.\n */\n const initialInput = cleanInputData(model, inputData);\n\n await validateModelEntryData({\n context,\n model,\n data: initialInput\n });\n\n const input = await referenceFieldsMapping({\n context,\n model,\n input: initialInput,\n validateEntries: true\n });\n\n const identity = context.security.getIdentity();\n const locale = context.cms.getLocale();\n\n const owner: CreatedBy = {\n id: identity.id,\n displayName: identity.displayName,\n type: identity.type\n };\n\n const { id, entryId, version } = createEntryId(1);\n\n const entry: CmsEntry = {\n webinyVersion: context.WEBINY_VERSION,\n tenant: getTenant().id,\n entryId,\n id,\n modelId: model.modelId,\n locale: locale.code,\n createdOn: new Date().toISOString(),\n savedOn: new Date().toISOString(),\n createdBy: owner,\n ownedBy: owner,\n version,\n locked: false,\n status: STATUS_DRAFT,\n values: input\n };\n\n let storageEntry: CmsStorageEntry | null = null;\n try {\n await onBeforeEntryCreate.publish({\n entry,\n input,\n model\n });\n\n storageEntry = await entryToStorageTransform(context, model, entry);\n const result = await storageOperations.entries.create(model, {\n entry,\n storageEntry\n });\n\n await onAfterEntryCreate.publish({\n entry,\n storageEntry: result,\n model,\n input\n });\n\n return result;\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not create content entry.\",\n ex.code || \"CREATE_ENTRY_ERROR\",\n ex.data || {\n error: ex,\n input,\n entry,\n storageEntry\n }\n );\n }\n },\n createEntryRevisionFrom: async (model, sourceId, inputData) => {\n const permission = await checkEntryPermissions({ rwd: \"w\" });\n await utils.checkModelAccess(context, model);\n\n /**\n * Make sure we only work with fields that are defined in the model.\n */\n const input = cleanUpdatedInputData(model, inputData);\n\n /**\n * Entries are identified by a common parent ID + Revision number.\n */\n const { id: uniqueId } = parseIdentifier(sourceId);\n\n const originalStorageEntry = await storageOperations.entries.getRevisionById(model, {\n id: sourceId\n });\n const latestStorageEntry = await storageOperations.entries.getLatestRevisionByEntryId(\n model,\n {\n id: uniqueId\n }\n );\n\n if (!originalStorageEntry) {\n throw new NotFoundError(\n `Entry \"${sourceId}\" of model \"${model.modelId}\" was not found.`\n );\n }\n\n /**\n * We need to convert data from DB to its original form before using it further.\n */\n const originalEntry = await entryFromStorageTransform(\n context,\n model,\n originalStorageEntry\n );\n\n const initialValues = {\n ...originalEntry.values,\n ...input\n };\n\n await validateModelEntryData({\n context,\n model,\n data: initialValues,\n entry: originalEntry\n });\n\n const values = await referenceFieldsMapping({\n context,\n model,\n input: initialValues,\n validateEntries: false\n });\n\n utils.checkOwnership(context, permission, originalEntry);\n\n const identity = context.security.getIdentity();\n\n const latestId = latestStorageEntry ? latestStorageEntry.id : sourceId;\n const { id, version: nextVersion } = increaseEntryIdVersion(latestId);\n\n const entry: CmsEntry = {\n ...originalEntry,\n id,\n version: nextVersion,\n savedOn: new Date().toISOString(),\n createdOn: new Date().toISOString(),\n createdBy: {\n id: identity.id,\n displayName: identity.displayName,\n type: identity.type\n },\n locked: false,\n publishedOn: undefined,\n status: STATUS_DRAFT,\n values\n };\n\n let storageEntry: CmsStorageEntry | null = null;\n\n try {\n await onBeforeEntryCreateRevision.publish({\n input,\n entry,\n original: originalEntry,\n model\n });\n\n storageEntry = await entryToStorageTransform(context, model, entry);\n\n const result = await storageOperations.entries.createRevisionFrom(model, {\n entry,\n storageEntry\n });\n\n await onAfterEntryCreateRevision.publish({\n input,\n entry,\n model,\n original: originalEntry,\n storageEntry: result\n });\n return result;\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not create entry from existing one.\",\n ex.code || \"CREATE_FROM_REVISION_ERROR\",\n {\n error: ex,\n entry,\n storageEntry,\n originalEntry,\n originalStorageEntry\n }\n );\n }\n },\n updateEntry: async (model, id, inputData) => {\n const permission = await checkEntryPermissions({ rwd: \"w\" });\n await utils.checkModelAccess(context, model);\n\n /**\n * Make sure we only work with fields that are defined in the model.\n */\n const input = cleanUpdatedInputData(model, inputData);\n\n /**\n * The entry we are going to update.\n */\n const originalStorageEntry = await storageOperations.entries.getRevisionById(model, {\n id\n });\n\n if (!originalStorageEntry) {\n throw new NotFoundError(`Entry \"${id}\" of model \"${model.modelId}\" was not found.`);\n }\n\n if (originalStorageEntry.locked) {\n throw new WebinyError(\n `Cannot update entry because it's locked.`,\n \"CONTENT_ENTRY_UPDATE_ERROR\"\n );\n }\n\n const originalEntry = await entryFromStorageTransform(\n context,\n model,\n originalStorageEntry\n );\n\n await validateModelEntryData({\n context,\n model,\n data: input,\n entry: originalEntry\n });\n\n utils.checkOwnership(context, permission, originalEntry);\n\n const initialValues = {\n /**\n * Existing values from the database, transformed back to original, of course.\n */\n ...originalEntry.values,\n /**\n * Add new values.\n */\n ...input\n };\n\n const values = await referenceFieldsMapping({\n context,\n model,\n input: initialValues,\n validateEntries: false\n });\n\n /**\n * We always send the full entry to the hooks and storage operations update.\n */\n const entry: CmsEntry = {\n ...originalEntry,\n savedOn: new Date().toISOString(),\n values\n };\n\n let storageEntry: CmsStorageEntry | null = null;\n\n try {\n await onBeforeEntryUpdate.publish({\n entry,\n model,\n input,\n original: originalEntry\n });\n\n storageEntry = await entryToStorageTransform(context, model, entry);\n\n const result = await storageOperations.entries.update(model, {\n entry,\n storageEntry\n });\n\n await onAfterEntryUpdate.publish({\n entry,\n storageEntry: result,\n model,\n input,\n original: originalEntry\n });\n return result;\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not update existing entry.\",\n ex.code || \"UPDATE_ERROR\",\n {\n error: ex,\n entry,\n storageEntry,\n originalEntry,\n input\n }\n );\n }\n },\n republishEntry: async (model, id) => {\n await checkEntryPermissions({ rwd: \"w\" });\n await utils.checkModelAccess(context, model);\n /**\n * Fetch the entry from the storage.\n */\n const originalStorageEntry = await storageOperations.entries.getRevisionById(model, {\n id\n });\n if (!originalStorageEntry) {\n throw new NotFoundError(`Entry \"${id}\" was not found!`);\n }\n\n const originalEntry = await entryFromStorageTransform(\n context,\n model,\n originalStorageEntry\n );\n /**\n * We can only process published entries.\n */\n if (originalEntry.status !== \"published\") {\n throw new WebinyError(\n \"Entry with given ID is not published!\",\n \"NOT_PUBLISHED_ERROR\",\n {\n id,\n original: originalEntry\n }\n );\n }\n\n const values = await referenceFieldsMapping({\n context,\n model,\n input: originalEntry.values,\n validateEntries: false\n });\n\n const entry: CmsEntry = {\n ...originalEntry,\n savedOn: new Date().toISOString(),\n webinyVersion: context.WEBINY_VERSION,\n values\n };\n\n const storageEntry = await entryToStorageTransform(context, model, entry);\n /**\n * First we need to update existing entry.\n */\n try {\n await storageOperations.entries.update(model, {\n entry,\n storageEntry\n });\n } catch (ex) {\n throw new WebinyError(\n \"Could not update existing entry with new data while re-publishing.\",\n \"REPUBLISH_UPDATE_ERROR\",\n {\n entry\n }\n );\n }\n /**\n * Then we move onto publishing it again.\n */\n try {\n return await storageOperations.entries.publish(model, {\n entry,\n storageEntry\n });\n } catch (ex) {\n throw new WebinyError(\n \"Could not publish existing entry while re-publishing.\",\n \"REPUBLISH_PUBLISH_ERROR\",\n {\n entry\n }\n );\n }\n },\n deleteEntryRevision: async (model, revisionId) => {\n const permission = await checkEntryPermissions({ rwd: \"d\" });\n await utils.checkModelAccess(context, model);\n\n const { id: entryId, version } = parseIdentifier(revisionId);\n\n const storageEntryToDelete = await storageOperations.entries.getRevisionById(model, {\n id: revisionId\n });\n const latestStorageEntry = await storageOperations.entries.getLatestRevisionByEntryId(\n model,\n {\n id: entryId\n }\n );\n const previousStorageEntry = await storageOperations.entries.getPreviousRevision(\n model,\n {\n entryId,\n version: version as number\n }\n );\n\n if (!storageEntryToDelete) {\n throw new NotFoundError(`Entry \"${revisionId}\" was not found!`);\n }\n\n utils.checkOwnership(context, permission, storageEntryToDelete);\n\n const latestEntryRevisionId = latestStorageEntry ? latestStorageEntry.id : null;\n\n const entryToDelete = await entryFromStorageTransform(\n context,\n model,\n storageEntryToDelete\n );\n /**\n * If targeted record is the latest entry record and there is no previous one, we need to run full delete with hooks.\n * At this point deleteRevision hooks are not fired.\n */\n if (entryToDelete.id === latestEntryRevisionId && !previousStorageEntry) {\n return await deleteEntry({\n model,\n entry: entryToDelete\n });\n }\n /**\n * If targeted record is latest entry revision, set the previous one as the new latest\n */\n let entryToSetAsLatest: CmsEntry | null = null;\n let storageEntryToSetAsLatest: CmsStorageEntry | null = null;\n if (entryToDelete.id === latestEntryRevisionId && previousStorageEntry) {\n entryToSetAsLatest = await entryFromStorageTransform(\n context,\n model,\n previousStorageEntry\n );\n storageEntryToSetAsLatest = previousStorageEntry;\n }\n\n try {\n await onBeforeEntryDeleteRevision.publish({\n entry: entryToDelete,\n model\n });\n\n await storageOperations.entries.deleteRevision(model, {\n entry: entryToDelete,\n storageEntry: storageEntryToDelete,\n latestEntry: entryToSetAsLatest,\n latestStorageEntry: storageEntryToSetAsLatest\n });\n\n await onAfterEntryDeleteRevision.publish({\n entry: entryToDelete,\n model\n });\n } catch (ex) {\n throw new WebinyError(ex.message, ex.code || \"DELETE_REVISION_ERROR\", {\n error: ex,\n entry: entryToDelete,\n storageEntry: storageEntryToDelete,\n latestEntry: entryToSetAsLatest,\n latestStorageEntry: storageEntryToSetAsLatest\n });\n }\n },\n deleteEntry: async (model, entryId) => {\n const permission = await checkEntryPermissions({ rwd: \"d\" });\n await utils.checkModelAccess(context, model);\n\n const storageEntry = await storageOperations.entries.getLatestRevisionByEntryId(model, {\n id: entryId\n });\n\n if (!storageEntry) {\n throw new NotFoundError(`Entry \"${entryId}\" was not found!`);\n }\n\n utils.checkOwnership(context, permission, storageEntry);\n\n const entry = await entryFromStorageTransform(context, model, storageEntry);\n\n return await deleteEntry({\n model,\n entry\n });\n },\n publishEntry: async (model, id) => {\n const permission = await checkEntryPermissions({ pw: \"p\" });\n await utils.checkModelAccess(context, model);\n\n const originalStorageEntry = await storageOperations.entries.getRevisionById(model, {\n id\n });\n\n if (!originalStorageEntry) {\n throw new NotFoundError(\n `Entry \"${id}\" in the model \"${model.modelId}\" was not found.`\n );\n }\n\n utils.checkOwnership(context, permission, originalStorageEntry);\n\n const originalEntry = await entryFromStorageTransform(\n context,\n model,\n originalStorageEntry\n );\n\n const currentDate = new Date().toISOString();\n const entry: CmsEntry = {\n ...originalEntry,\n status: STATUS_PUBLISHED,\n locked: true,\n savedOn: currentDate,\n publishedOn: currentDate\n };\n\n let storageEntry: CmsStorageEntry | null = null;\n\n try {\n await onBeforeEntryPublish.publish({\n entry,\n model\n });\n\n storageEntry = await entryToStorageTransform(context, model, entry);\n const result = await storageOperations.entries.publish(model, {\n entry,\n storageEntry\n });\n\n await onAfterEntryPublish.publish({\n entry,\n storageEntry: result,\n model\n });\n return result;\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not publish entry.\",\n ex.code || \"PUBLISH_ERROR\",\n {\n error: ex,\n entry,\n storageEntry,\n originalEntry,\n originalStorageEntry\n }\n );\n }\n },\n requestEntryChanges: async (model, id) => {\n const permission = await checkEntryPermissions({ pw: \"c\" });\n\n const originalStorageEntry = await storageOperations.entries.getRevisionById(model, {\n id\n });\n\n if (!originalStorageEntry) {\n throw new NotFoundError(`Entry \"${id}\" of model \"${model.modelId}\" was not found.`);\n }\n\n const originalEntry = await entryFromStorageTransform(\n context,\n model,\n originalStorageEntry\n );\n\n if (originalEntry.status !== STATUS_REVIEW_REQUESTED) {\n throw new WebinyError(\n \"Cannot request changes on an entry that's not under review.\",\n \"ENTRY_NOT_UNDER_REVIEW\"\n );\n }\n\n const identity = context.security.getIdentity();\n if (originalEntry.ownedBy.id === identity.id) {\n throw new WebinyError(\n \"You cannot request changes on your own entry.\",\n \"CANNOT_REQUEST_CHANGES_ON_OWN_ENTRY\"\n );\n }\n\n utils.checkOwnership(context, permission, originalEntry);\n\n const entry: CmsEntry = {\n ...originalEntry,\n status: STATUS_CHANGES_REQUESTED\n };\n\n let storageEntry: CmsStorageEntry | null = null;\n\n try {\n await onBeforeEntryRequestChanges.publish({\n entry,\n model\n });\n\n storageEntry = await entryToStorageTransform(context, model, entry);\n\n const result = await storageOperations.entries.requestChanges(model, {\n entry,\n storageEntry\n });\n\n await onAfterEntryRequestChanges.publish({\n entry,\n storageEntry: result,\n model\n });\n\n return result;\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not request changes for the entry.\",\n ex.code || \"REQUEST_CHANGES_ERROR\",\n {\n entry,\n originalEntry\n }\n );\n }\n },\n requestEntryReview: async (model, id) => {\n const permission = await checkEntryPermissions({ pw: \"r\" });\n const { id: entryId } = parseIdentifier(id);\n\n const originalStorageEntry = await storageOperations.entries.getRevisionById(model, {\n id\n });\n const latestEntryRevision = await storageOperations.entries.getLatestRevisionByEntryId(\n model,\n {\n id: entryId\n }\n );\n\n if (!originalStorageEntry) {\n throw new NotFoundError(`Entry \"${id}\" of model \"${model.modelId}\" was not found.`);\n } else if (!latestEntryRevision) {\n throw new NotFoundError(`Entry \"${id}\" does not have latest record`);\n }\n\n const originalEntry = await entryFromStorageTransform(\n context,\n model,\n originalStorageEntry\n );\n\n const allowedStatuses = [STATUS_DRAFT, STATUS_CHANGES_REQUESTED];\n if (!allowedStatuses.includes(originalEntry.status)) {\n throw new WebinyError(\n \"Cannot request review - entry is not a draft nor was a change request issued.\",\n \"REQUEST_REVIEW_ERROR\",\n {\n entry: originalEntry\n }\n );\n }\n\n utils.checkOwnership(context, permission, originalEntry);\n\n const entry: CmsEntry = {\n ...originalEntry,\n status: STATUS_REVIEW_REQUESTED\n };\n\n let storageEntry: CmsStorageEntry | null = null;\n\n try {\n await onBeforeEntryRequestReview.publish({\n entry,\n model\n });\n\n storageEntry = await entryToStorageTransform(context, model, entry);\n\n const result = await storageOperations.entries.requestReview(model, {\n entry,\n storageEntry\n });\n\n await onAfterEntryRequestReview.publish({\n entry,\n storageEntry: result,\n model\n });\n\n return result;\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not request review on the entry.\",\n ex.code || \"REQUEST_REVIEW_ERROR\",\n {\n originalEntry,\n entry\n }\n );\n }\n },\n unpublishEntry: async (model, id) => {\n const permission = await checkEntryPermissions({ pw: \"u\" });\n\n const { id: entryId } = parseIdentifier(id);\n\n const originalStorageEntry =\n await storageOperations.entries.getPublishedRevisionByEntryId(model, {\n id: entryId\n });\n\n if (!originalStorageEntry) {\n throw new NotFoundError(`Entry \"${id}\" of model \"${model.modelId}\" was not found.`);\n }\n\n if (originalStorageEntry.id !== id) {\n throw new WebinyError(`Entry is not published.`, \"UNPUBLISH_ERROR\", {\n entry: originalStorageEntry\n });\n }\n\n utils.checkOwnership(context, permission, originalStorageEntry);\n\n const originalEntry = await entryFromStorageTransform(\n context,\n model,\n originalStorageEntry\n );\n\n const entry: CmsEntry = {\n ...originalEntry,\n status: STATUS_UNPUBLISHED\n };\n\n let storageEntry: CmsStorageEntry | null = null;\n\n try {\n await onBeforeEntryUnpublish.publish({\n entry,\n model\n });\n\n storageEntry = await entryToStorageTransform(context, model, entry);\n\n const result = await storageOperations.entries.unpublish(model, {\n entry,\n storageEntry\n });\n\n await onAfterEntryUnpublish.publish({\n entry,\n storageEntry: result,\n model\n });\n\n return result;\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not unpublish entry.\",\n ex.code || \"UNPUBLISH_ERROR\",\n {\n originalEntry,\n originalStorageEntry,\n entry,\n storageEntry\n }\n );\n }\n }\n };\n};\n"]}
@@ -42,7 +42,8 @@ const getContentModelTitleFieldId = (fields, titleFieldId) => {
42
42
 
43
43
  if (!target) {
44
44
  throw new _error.default(`Field does not exist in the model.`, "VALIDATION_ERROR", {
45
- fieldId: titleFieldId
45
+ fieldId: titleFieldId,
46
+ fields
46
47
  });
47
48
  }
48
49
 
@@ -1 +1 @@
1
- {"version":3,"sources":["beforeUpdate.ts"],"names":["defaultTitleFieldId","allowedTitleFieldTypes","getContentModelTitleFieldId","fields","titleFieldId","titleField","find","field","type","multipleValues","fieldId","target","f","WebinyError","includes","join","extractInvalidField","model","err","sdl","source","body","line","lineNumber","locations","sdlLines","split","sdlLine","gqlType","i","match","invalidField","undefined","Array","isArray","fieldRegex","RegExp","matched","message","data","modelId","code","assignBeforeModelUpdate","params","onBeforeModelUpdate","plugins","subscribe","modelPlugin","byType","CmsModelPlugin","item","contentModel","lockedFields","fieldTypePlugins","length","fieldType","Error","schema","reduce","acc","pl","cmsLockedFieldPlugins","lockedField","existingField","lockedFieldsByType","filter","plugin","checkLockedField"],"mappings":"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","sourcesContent":["import { Topic } from \"@webiny/pubsub/types\";\nimport gql from \"graphql-tag\";\nimport {\n BeforeModelUpdateTopicParams,\n CmsModel,\n CmsModelField,\n CmsModelFieldToGraphQLPlugin,\n CmsModelLockedFieldPlugin,\n HeadlessCmsStorageOperations\n} from \"~/types\";\nimport { PluginsContainer } from \"@webiny/plugins\";\nimport WebinyError from \"@webiny/error\";\nimport { CmsModelPlugin } from \"~/content/plugins/CmsModelPlugin\";\nimport { createManageSDL } from \"~/content/plugins/schema/createManageSDL\";\nimport { GraphQLError } from \"graphql\";\n\nconst defaultTitleFieldId = \"id\";\n\nconst allowedTitleFieldTypes = [\"text\", \"number\"];\n\nconst getContentModelTitleFieldId = (fields: CmsModelField[], titleFieldId?: string): string => {\n // if there is no title field defined either in input data or existing content model data\n // we will take first text field that has no multiple values enabled\n // or if initial titleFieldId is the default one also try to find first available text field\n if (!titleFieldId || titleFieldId === defaultTitleFieldId) {\n const titleField = fields.find(field => {\n return field.type === \"text\" && !field.multipleValues;\n });\n return titleField ? titleField.fieldId : defaultTitleFieldId;\n }\n // check existing titleFieldId for existence in the model\n // for correct type\n // and that it is not multiple values field\n const target = fields.find(f => f.fieldId === titleFieldId);\n if (!target) {\n throw new WebinyError(`Field does not exist in the model.`, \"VALIDATION_ERROR\", {\n fieldId: titleFieldId\n });\n }\n\n if (allowedTitleFieldTypes.includes(target.type) === false) {\n throw new WebinyError(\n `Only ${allowedTitleFieldTypes.join(\n \", \"\n )} and id fields can be used as an entry title.`,\n \"ENTRY_TITLE_FIELD_TYPE\",\n {\n fieldId: target.fieldId,\n type: target.type\n }\n );\n }\n\n if (target.multipleValues) {\n throw new WebinyError(\n `Fields that accept multiple values cannot be used as the entry title.`,\n \"ENTRY_TITLE_FIELD_TYPE\",\n {\n fieldId: target.fieldId,\n type: target.type\n }\n );\n }\n\n return target.fieldId;\n};\n\ninterface AssignBeforeModelUpdateParams {\n onBeforeModelUpdate: Topic<BeforeModelUpdateTopicParams>;\n storageOperations: HeadlessCmsStorageOperations;\n plugins: PluginsContainer;\n}\n\nconst extractInvalidField = (model: CmsModel, err: GraphQLError) => {\n const sdl = err.source?.body || \"\";\n\n // Find the invalid type\n const { line: lineNumber } = err.locations\n ? err.locations[0]\n : {\n line: 0\n };\n const sdlLines = sdl.split(\"\\n\");\n let sdlLine;\n let gqlType;\n for (let i = lineNumber; i > 0; i--) {\n if (sdlLine && sdlLine.includes(\"type \")) {\n gqlType = sdlLine.match(/type\\s+(.*?)\\s+{/);\n break;\n }\n\n sdlLine = sdlLines[i];\n }\n\n let invalidField: string | undefined = undefined;\n if (Array.isArray(gqlType)) {\n const fieldRegex = new RegExp(`([^\\\\s+].*?):\\\\s+\\\\[?${gqlType[1]}!?\\\\]?`);\n\n const matched = sdl.match(fieldRegex);\n if (matched) {\n invalidField = matched[1];\n }\n }\n\n let message = `See more details in the browser console.`;\n if (invalidField) {\n message = `Please review the definition of \"${invalidField}\" field.`;\n }\n\n return {\n data: {\n modelId: model.modelId,\n sdl,\n invalidField\n },\n code: \"INVALID_MODEL_DEFINITION\",\n message: [`Model \"${model.modelId}\" was not saved!`, message].join(\"\\n\")\n };\n};\n\nexport const assignBeforeModelUpdate = (params: AssignBeforeModelUpdateParams) => {\n const { onBeforeModelUpdate, plugins } = params;\n\n onBeforeModelUpdate.subscribe(async params => {\n const { model } = params;\n\n const modelPlugin = plugins\n .byType<CmsModelPlugin>(CmsModelPlugin.type)\n .find(item => item.contentModel.modelId === model.modelId);\n\n if (modelPlugin) {\n throw new WebinyError(\n \"Content models defined via plugins cannot be updated.\",\n \"CONTENT_MODEL_UPDATE_ERROR\",\n {\n modelId: model.modelId\n }\n );\n }\n\n const { titleFieldId } = model;\n\n // There should be fields/locked fields in either model or data to be updated.\n const { fields = [], lockedFields = [] } = model;\n\n // Let's inspect the fields of the received content model. We prevent saving of a content model if it\n // contains a field for which a \"cms-model-field-to-graphql\" plugin does not exist on the backend.\n const fieldTypePlugins = plugins.byType<CmsModelFieldToGraphQLPlugin>(\n \"cms-model-field-to-graphql\"\n );\n\n for (let i = 0; i < fields.length; i++) {\n const field = fields[i];\n if (!fieldTypePlugins.find(item => item.fieldType === field.type)) {\n throw new Error(\n `Cannot update content model because of the unknown \"${field.type}\" field.`\n );\n }\n }\n\n if (fields.length) {\n // Make sure that this model can be safely converted to a GraphQL SDL\n const schema = createManageSDL({\n model,\n fieldTypePlugins: fieldTypePlugins.reduce(\n (acc, pl) => ({ ...acc, [pl.fieldType]: pl }),\n {}\n )\n });\n\n try {\n gql(schema);\n } catch (err) {\n throw new WebinyError(extractInvalidField(model, err));\n }\n }\n\n model.titleFieldId = getContentModelTitleFieldId(fields, titleFieldId);\n\n const cmsLockedFieldPlugins =\n plugins.byType<CmsModelLockedFieldPlugin>(\"cms-model-locked-field\");\n\n // We must not allow removal or changes in fields that are already in use in content entries.\n for (const lockedField of lockedFields) {\n const existingField = fields.find(item => item.fieldId === lockedField.fieldId);\n if (!existingField) {\n throw new WebinyError(\n `Cannot remove the field \"${lockedField.fieldId}\" because it's already in use in created content.`,\n \"ENTRY_FIELD_USED\"\n );\n }\n\n if (lockedField.multipleValues !== existingField.multipleValues) {\n throw new WebinyError(\n `Cannot change \"multipleValues\" for the \"${lockedField.fieldId}\" field because it's already in use in created content.`,\n \"ENTRY_FIELD_USED\"\n );\n }\n\n if (lockedField.type !== existingField.type) {\n throw new WebinyError(\n `Cannot change field type for the \"${lockedField.fieldId}\" field because it's already in use in created content.`,\n \"ENTRY_FIELD_USED\"\n );\n }\n\n // Check `lockedField` invariant for specific field\n const lockedFieldsByType = cmsLockedFieldPlugins.filter(\n pl => pl.fieldType === lockedField.type\n );\n for (const plugin of lockedFieldsByType) {\n if (typeof plugin.checkLockedField !== \"function\") {\n continue;\n }\n plugin.checkLockedField({\n lockedField,\n field: existingField\n });\n }\n }\n });\n};\n"]}
1
+ {"version":3,"sources":["beforeUpdate.ts"],"names":["defaultTitleFieldId","allowedTitleFieldTypes","getContentModelTitleFieldId","fields","titleFieldId","titleField","find","field","type","multipleValues","fieldId","target","f","WebinyError","includes","join","extractInvalidField","model","err","sdl","source","body","line","lineNumber","locations","sdlLines","split","sdlLine","gqlType","i","match","invalidField","undefined","Array","isArray","fieldRegex","RegExp","matched","message","data","modelId","code","assignBeforeModelUpdate","params","onBeforeModelUpdate","plugins","subscribe","modelPlugin","byType","CmsModelPlugin","item","contentModel","lockedFields","fieldTypePlugins","length","fieldType","Error","schema","reduce","acc","pl","cmsLockedFieldPlugins","lockedField","existingField","lockedFieldsByType","filter","plugin","checkLockedField"],"mappings":"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","sourcesContent":["import { Topic } from \"@webiny/pubsub/types\";\nimport gql from \"graphql-tag\";\nimport {\n BeforeModelUpdateTopicParams,\n CmsModel,\n CmsModelField,\n CmsModelFieldToGraphQLPlugin,\n CmsModelLockedFieldPlugin,\n HeadlessCmsStorageOperations\n} from \"~/types\";\nimport { PluginsContainer } from \"@webiny/plugins\";\nimport WebinyError from \"@webiny/error\";\nimport { CmsModelPlugin } from \"~/content/plugins/CmsModelPlugin\";\nimport { createManageSDL } from \"~/content/plugins/schema/createManageSDL\";\nimport { GraphQLError } from \"graphql\";\n\nconst defaultTitleFieldId = \"id\";\n\nconst allowedTitleFieldTypes = [\"text\", \"number\"];\n\nconst getContentModelTitleFieldId = (fields: CmsModelField[], titleFieldId?: string): string => {\n // if there is no title field defined either in input data or existing content model data\n // we will take first text field that has no multiple values enabled\n // or if initial titleFieldId is the default one also try to find first available text field\n if (!titleFieldId || titleFieldId === defaultTitleFieldId) {\n const titleField = fields.find(field => {\n return field.type === \"text\" && !field.multipleValues;\n });\n return titleField ? titleField.fieldId : defaultTitleFieldId;\n }\n // check existing titleFieldId for existence in the model\n // for correct type\n // and that it is not multiple values field\n const target = fields.find(f => f.fieldId === titleFieldId);\n if (!target) {\n throw new WebinyError(`Field does not exist in the model.`, \"VALIDATION_ERROR\", {\n fieldId: titleFieldId,\n fields\n });\n }\n\n if (allowedTitleFieldTypes.includes(target.type) === false) {\n throw new WebinyError(\n `Only ${allowedTitleFieldTypes.join(\n \", \"\n )} and id fields can be used as an entry title.`,\n \"ENTRY_TITLE_FIELD_TYPE\",\n {\n fieldId: target.fieldId,\n type: target.type\n }\n );\n }\n\n if (target.multipleValues) {\n throw new WebinyError(\n `Fields that accept multiple values cannot be used as the entry title.`,\n \"ENTRY_TITLE_FIELD_TYPE\",\n {\n fieldId: target.fieldId,\n type: target.type\n }\n );\n }\n\n return target.fieldId;\n};\n\ninterface AssignBeforeModelUpdateParams {\n onBeforeModelUpdate: Topic<BeforeModelUpdateTopicParams>;\n storageOperations: HeadlessCmsStorageOperations;\n plugins: PluginsContainer;\n}\n\nconst extractInvalidField = (model: CmsModel, err: GraphQLError) => {\n const sdl = err.source?.body || \"\";\n\n // Find the invalid type\n const { line: lineNumber } = err.locations\n ? err.locations[0]\n : {\n line: 0\n };\n const sdlLines = sdl.split(\"\\n\");\n let sdlLine;\n let gqlType;\n for (let i = lineNumber; i > 0; i--) {\n if (sdlLine && sdlLine.includes(\"type \")) {\n gqlType = sdlLine.match(/type\\s+(.*?)\\s+{/);\n break;\n }\n\n sdlLine = sdlLines[i];\n }\n\n let invalidField: string | undefined = undefined;\n if (Array.isArray(gqlType)) {\n const fieldRegex = new RegExp(`([^\\\\s+].*?):\\\\s+\\\\[?${gqlType[1]}!?\\\\]?`);\n\n const matched = sdl.match(fieldRegex);\n if (matched) {\n invalidField = matched[1];\n }\n }\n\n let message = `See more details in the browser console.`;\n if (invalidField) {\n message = `Please review the definition of \"${invalidField}\" field.`;\n }\n\n return {\n data: {\n modelId: model.modelId,\n sdl,\n invalidField\n },\n code: \"INVALID_MODEL_DEFINITION\",\n message: [`Model \"${model.modelId}\" was not saved!`, message].join(\"\\n\")\n };\n};\n\nexport const assignBeforeModelUpdate = (params: AssignBeforeModelUpdateParams) => {\n const { onBeforeModelUpdate, plugins } = params;\n\n onBeforeModelUpdate.subscribe(async params => {\n const { model } = params;\n\n const modelPlugin = plugins\n .byType<CmsModelPlugin>(CmsModelPlugin.type)\n .find(item => item.contentModel.modelId === model.modelId);\n\n if (modelPlugin) {\n throw new WebinyError(\n \"Content models defined via plugins cannot be updated.\",\n \"CONTENT_MODEL_UPDATE_ERROR\",\n {\n modelId: model.modelId\n }\n );\n }\n\n const { titleFieldId } = model;\n\n // There should be fields/locked fields in either model or data to be updated.\n const { fields = [], lockedFields = [] } = model;\n\n // Let's inspect the fields of the received content model. We prevent saving of a content model if it\n // contains a field for which a \"cms-model-field-to-graphql\" plugin does not exist on the backend.\n const fieldTypePlugins = plugins.byType<CmsModelFieldToGraphQLPlugin>(\n \"cms-model-field-to-graphql\"\n );\n\n for (let i = 0; i < fields.length; i++) {\n const field = fields[i];\n if (!fieldTypePlugins.find(item => item.fieldType === field.type)) {\n throw new Error(\n `Cannot update content model because of the unknown \"${field.type}\" field.`\n );\n }\n }\n\n if (fields.length) {\n // Make sure that this model can be safely converted to a GraphQL SDL\n const schema = createManageSDL({\n model,\n fieldTypePlugins: fieldTypePlugins.reduce(\n (acc, pl) => ({ ...acc, [pl.fieldType]: pl }),\n {}\n )\n });\n\n try {\n gql(schema);\n } catch (err) {\n throw new WebinyError(extractInvalidField(model, err));\n }\n }\n\n model.titleFieldId = getContentModelTitleFieldId(fields, titleFieldId);\n\n const cmsLockedFieldPlugins =\n plugins.byType<CmsModelLockedFieldPlugin>(\"cms-model-locked-field\");\n\n // We must not allow removal or changes in fields that are already in use in content entries.\n for (const lockedField of lockedFields) {\n const existingField = fields.find(item => item.fieldId === lockedField.fieldId);\n if (!existingField) {\n throw new WebinyError(\n `Cannot remove the field \"${lockedField.fieldId}\" because it's already in use in created content.`,\n \"ENTRY_FIELD_USED\"\n );\n }\n\n if (lockedField.multipleValues !== existingField.multipleValues) {\n throw new WebinyError(\n `Cannot change \"multipleValues\" for the \"${lockedField.fieldId}\" field because it's already in use in created content.`,\n \"ENTRY_FIELD_USED\"\n );\n }\n\n if (lockedField.type !== existingField.type) {\n throw new WebinyError(\n `Cannot change field type for the \"${lockedField.fieldId}\" field because it's already in use in created content.`,\n \"ENTRY_FIELD_USED\"\n );\n }\n\n // Check `lockedField` invariant for specific field\n const lockedFieldsByType = cmsLockedFieldPlugins.filter(\n pl => pl.fieldType === lockedField.type\n );\n for (const plugin of lockedFieldsByType) {\n if (typeof plugin.checkLockedField !== \"function\") {\n continue;\n }\n plugin.checkLockedField({\n lockedField,\n field: existingField\n });\n }\n }\n });\n};\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webiny/api-headless-cms",
3
- "version": "5.26.0-beta.2",
3
+ "version": "5.27.0-beta.0",
4
4
  "main": "index.js",
5
5
  "keywords": [
6
6
  "cms:base"
@@ -21,22 +21,22 @@
21
21
  "@babel/runtime": "7.16.7",
22
22
  "@commodo/fields": "1.1.2-beta.20",
23
23
  "@graphql-tools/schema": "7.1.5",
24
- "@webiny/api-file-manager": "5.26.0-beta.2",
25
- "@webiny/api-i18n": "5.26.0-beta.2",
26
- "@webiny/api-i18n-ddb": "5.26.0-beta.2",
27
- "@webiny/api-security": "5.26.0-beta.2",
28
- "@webiny/api-tenancy": "5.26.0-beta.2",
29
- "@webiny/api-upgrade": "5.26.0-beta.2",
30
- "@webiny/error": "5.26.0-beta.2",
31
- "@webiny/handler": "5.26.0-beta.2",
32
- "@webiny/handler-aws": "5.26.0-beta.2",
33
- "@webiny/handler-db": "5.26.0-beta.2",
34
- "@webiny/handler-graphql": "5.26.0-beta.2",
35
- "@webiny/handler-http": "5.26.0-beta.2",
36
- "@webiny/plugins": "5.26.0-beta.2",
37
- "@webiny/pubsub": "5.26.0-beta.2",
38
- "@webiny/utils": "5.26.0-beta.2",
39
- "@webiny/validation": "5.26.0-beta.2",
24
+ "@webiny/api-file-manager": "5.27.0-beta.0",
25
+ "@webiny/api-i18n": "5.27.0-beta.0",
26
+ "@webiny/api-i18n-ddb": "5.27.0-beta.0",
27
+ "@webiny/api-security": "5.27.0-beta.0",
28
+ "@webiny/api-tenancy": "5.27.0-beta.0",
29
+ "@webiny/api-upgrade": "5.27.0-beta.0",
30
+ "@webiny/error": "5.27.0-beta.0",
31
+ "@webiny/handler": "5.27.0-beta.0",
32
+ "@webiny/handler-aws": "5.27.0-beta.0",
33
+ "@webiny/handler-db": "5.27.0-beta.0",
34
+ "@webiny/handler-graphql": "5.27.0-beta.0",
35
+ "@webiny/handler-http": "5.27.0-beta.0",
36
+ "@webiny/plugins": "5.27.0-beta.0",
37
+ "@webiny/pubsub": "5.27.0-beta.0",
38
+ "@webiny/utils": "5.27.0-beta.0",
39
+ "@webiny/validation": "5.27.0-beta.0",
40
40
  "boolean": "3.1.4",
41
41
  "commodo-fields-object": "1.0.6",
42
42
  "dataloader": "2.0.0",
@@ -54,10 +54,10 @@
54
54
  "@babel/core": "^7.16.0",
55
55
  "@babel/preset-env": "^7.16.4",
56
56
  "@babel/preset-flow": "^7.16.0",
57
- "@webiny/api-security-so-ddb": "^5.26.0-beta.2",
58
- "@webiny/api-tenancy-so-ddb": "^5.26.0-beta.2",
59
- "@webiny/cli": "^5.26.0-beta.2",
60
- "@webiny/project-utils": "^5.26.0-beta.2",
57
+ "@webiny/api-security-so-ddb": "^5.27.0-beta.0",
58
+ "@webiny/api-tenancy-so-ddb": "^5.27.0-beta.0",
59
+ "@webiny/cli": "^5.27.0-beta.0",
60
+ "@webiny/project-utils": "^5.27.0-beta.0",
61
61
  "apollo-graphql": "^0.9.5",
62
62
  "get-yarn-workspaces": "^1.0.2",
63
63
  "graphql": "^15.7.2",
@@ -77,5 +77,5 @@
77
77
  "build": "yarn webiny run build",
78
78
  "watch": "yarn webiny run watch"
79
79
  },
80
- "gitHead": "2bf6b56823a2ccb4e95ad747564d2a240d5043ab"
80
+ "gitHead": "9e557dd294ae37cf84f17e0e8158c2ed16e2d415"
81
81
  }
package/types.d.ts CHANGED
@@ -1912,14 +1912,6 @@ export interface CmsEntryStorageOperationsCreateParams<T extends CmsStorageEntry
1912
1912
  storageEntry: T;
1913
1913
  }
1914
1914
  export interface CmsEntryStorageOperationsCreateRevisionFromParams<T extends CmsStorageEntry = CmsStorageEntry> {
1915
- /**
1916
- * Latest entry, used to calculate the new version.
1917
- */
1918
- latestEntry: CmsEntry | null;
1919
- /**
1920
- * Latest entry, used to calculate the new version, directly from storage, with transformations.
1921
- */
1922
- latestStorageEntry: T | null;
1923
1915
  /**
1924
1916
  * Real entry, with no transformations on it.
1925
1917
  */
package/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["types.ts"],"names":["CONTENT_ENTRY_STATUS"],"mappings":";;;;;;;AAoDA;AACA;AACA;AACA;AACA;;AAoBA;AACA;AACA;AACA;AACA;;AAYA;AACA;AACA;AACA;AACA;;AASA;AACA;AACA;AACA;AACA;AACA;;AA4FA;AACA;AACA;;AAUA;AACA;AACA;AACA;AACA;AACA;;AAgCA;AACA;AACA;AACA;AACA;AACA;AACA;;AAqBA;AACA;AACA;AACA;AACA;AACA;AACA;;AAyBA;AACA;AACA;AACA;AACA;AACA;AACA;;AAiBA;AACA;AACA;AACA;AACA;AACA;;AA6EA;AACA;AACA;;AAoBA;AACA;AACA;AACA;AACA;;AA8NA;AACA;AACA;AACA;AACA;AACA;AACA;;AAoBA;AACA;AACA;;AAKA;AACA;AACA;AACA;AACA;;AAgBA;AACA;AACA;AACA;AACA;;AAgBA;AACA;AACA;AACA;AACA;;AAuCA;AACA;AACA;AACA;AACA;AACA;;AAQA;AACA;AACA;AACA;AACA;AACA;;AAQA;AACA;AACA;AACA;AACA;AACA;;AAgDA;AACA;AACA;AACA;AACA;AACA;;AASA;AACA;AACA;AACA;;AAKA;AACA;AACA;AACA;;AAKA;AACA;AACA;AACA;;AAMA;AACA;AACA;AACA;;AAMA;AACA;AACA;AACA;;AAKA;AACA;AACA;AACA;;AAKA;AACA;AACA;AACA;AACA;AACA;;AAqCA;AACA;AACA;AACA;AACA;AACA;;AAYA;AACA;AACA;AACA;AACA;AACA;;AAoBA;AACA;AACA;AACA;AACA;AACA;;AAQA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAsDA;AACA;AACA;AACA;AACA;AACA;;AAoCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAkBA;AACA;AACA;AACA;AACA;AACA;;AA6EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AA4EA;AACA;AACA;AACA;AACA;AACA;;AAgEA;AACA;AACA;AACA;AACA;;AAkBA;AACA;AACA;AACA;AACA;AACA;;AAiEA;AACA;AACA;AACA;AACA;AACA;;AAGA;AACA;AACA;AACA;AACA;AACA;;AAMA;AACA;AACA;AACA;AACA;AACA;;AAUA;AACA;AACA;AACA;AACA;AACA;;AAiIA;AACA;AACA;AACA;;AAKA;AACA;AACA;AACA;;AAKA;AACA;AACA;AACA;;AAIA;AACA;AACA;AACA;AACA;AACA;;AAqHA;AACA;AACA;AACA;AACA;AACA;;AAKA;AACA;AACA;AACA;AACA;AACA;;AAKA;AACA;AACA;AACA;AACA;AACqE;;AAErE;AACA;AACA;AACA;AACA;;AAKA;AACA;AACA;AACA;AACA;AACA;;AAgBA;AACA;AACA;AACA;AACA;AACA;;AAUA;AACA;AACA;AACA;AACA;AACA;;AA6CA;AACA;AACA;AACA;AACA;;AAoDA;AACA;AACA;AACA;AACA;;AA4NA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;IA2HYA,oB;;;WAAAA,oB;AAAAA,EAAAA,oB;AAAAA,EAAAA,oB;AAAAA,EAAAA,oB;AAAAA,EAAAA,oB;AAAAA,EAAAA,oB;GAAAA,oB,oCAAAA,oB","sourcesContent":["import { Plugin } from \"@webiny/plugins/types\";\nimport { I18NContext, I18NLocale } from \"@webiny/api-i18n/types\";\nimport { Context } from \"@webiny/handler/types\";\nimport { TenancyContext } from \"@webiny/api-tenancy/types\";\nimport {\n GraphQLFieldResolver,\n GraphQLSchemaDefinition,\n Resolvers\n} from \"@webiny/handler-graphql/types\";\nimport { SecurityPermission } from \"@webiny/api-security/types\";\nimport { HttpContext } from \"@webiny/handler-http/types\";\nimport { DbContext } from \"@webiny/handler-db/types\";\nimport { FileManagerContext } from \"@webiny/api-file-manager/types\";\nimport { UpgradePlugin } from \"@webiny/api-upgrade/types\";\nimport { Topic } from \"@webiny/pubsub/types\";\n\nexport type ApiEndpoint = \"manage\" | \"preview\" | \"read\";\nexport interface HeadlessCms\n extends CmsSettingsContext,\n CmsSystemContext,\n CmsGroupContext,\n CmsModelContext,\n CmsEntryContext {\n /**\n * API type\n */\n type: ApiEndpoint;\n /**\n * Requested locale\n */\n locale: string;\n /**\n * returns an instance of current locale\n */\n getLocale: () => I18NLocale;\n /**\n * Means this request is a READ API\n */\n READ: boolean;\n /**\n * Means this request is a MANAGE API\n */\n MANAGE: boolean;\n /**\n * Means this request is a PREVIEW API\n */\n PREVIEW: boolean;\n /**\n * The storage operations loaded for current context.\n */\n storageOperations: HeadlessCmsStorageOperations;\n}\n/**\n * @description This combines all contexts used in the CMS into a single one.\n *\n * @category Context\n */\nexport interface CmsContext\n extends Context,\n DbContext,\n HttpContext,\n I18NContext,\n FileManagerContext,\n TenancyContext {\n cms: HeadlessCms;\n}\n\ninterface CmsModelFieldPredefinedValuesValue {\n value: string;\n label: string;\n /**\n * Default selected predefined value.\n */\n selected?: boolean;\n}\n\n/**\n * Object containing content model field predefined options and values.\n *\n * @category CmsModelField\n */\nexport interface CmsModelFieldPredefinedValues {\n /**\n * Are predefined field values enabled?\n */\n enabled: boolean;\n /**\n * Predefined values array.\n */\n values: CmsModelFieldPredefinedValuesValue[];\n}\n\n/**\n * Object containing content model field renderer options.\n *\n * @category CmsModelField\n */\ninterface CmsModelFieldRenderer {\n /**\n * Name of the field renderer. Must have one in field renderer plugins.\n * Can be blank to let automatically determine the renderer.\n */\n name: string;\n}\n\n/**\n * A definition for content model field. This type exists on the app side as well.\n *\n * @category ModelField\n * @category Database model\n */\nexport interface CmsModelField {\n /**\n * A generated unique ID for the model field.\n * MUST be absolute unique throughout the models.\n * Must be in form of a-zA-Z0-9.\n *\n * We generate a unique id value when you're building a model via UI,\n * but when user is creating a model via a plugin it is up to them to be careful about this.\n */\n id: string;\n /**\n * A type of the field\n */\n type: string;\n /**\n * A unique field ID for mapping values.\n * Must in form of a-zA-Z0-9.\n *\n * We generate a unique fieldId value when you're building a model via UI,\n * but when user is creating a model via a plugin it is up to them to be careful about this.\n */\n fieldId: string;\n /**\n * A label for the field\n */\n label: string;\n /**\n * Text below the field to clarify what is it meant to be in the field value\n */\n helpText?: string | null;\n /**\n * Text to be displayed in the field\n */\n placeholderText?: string | null;\n /**\n * Are predefined values enabled? And list of them\n */\n predefinedValues?: CmsModelFieldPredefinedValues;\n /**\n * Field renderer. Blank if determined automatically.\n */\n renderer?: CmsModelFieldRenderer;\n /**\n * List of validations for the field\n *\n * @default []\n */\n validation?: CmsModelFieldValidation[];\n /**\n * List of validations for the list of values, when a field is set to accept a list of values.\n * These validations will be applied to the entire list, and `validation` (see above) will be applied\n * to each individual value in the list.\n *\n * @default []\n */\n listValidation?: CmsModelFieldValidation[];\n /**\n * Is this a multiple values field?\n *\n */\n multipleValues?: boolean;\n /**\n * Any user defined settings.\n *\n * @default {}\n */\n settings?: {\n /**\n * Predefined values (text, number)\n * The default value for the field in case it is not predefined values field.\n */\n defaultValue?: string | number | null | undefined;\n /**\n * Object field.\n */\n fields?: CmsModelField[];\n /**\n * Ref field.\n */\n models?: Pick<CmsModel, \"modelId\">[];\n /**\n * Date field.\n */\n type?: string;\n /**\n * There are a lot of other settings that are possible to add so we keep the type opened.\n */\n [key: string]: any;\n };\n}\n\n/**\n * A definition for dateTime field to show possible type of the field in settings.\n */\nexport interface CmsModelDateTimeField extends CmsModelField {\n /**\n * Settings object for the field. Contains type property.\n */\n settings: {\n type: \"time\" | \"date\" | \"dateTimeWithoutTimezone\" | \"dateTimeWithTimezone\";\n };\n}\n\n/**\n * Arguments for the field validator validate method.\n *\n * @category ModelField\n * @category FieldValidation\n */\nexport interface CmsModelFieldValidatorValidateParams<T = any> {\n /**\n * A value to be validated.\n */\n value: T;\n /**\n * Options from the CmsModelField validations.\n *\n * @see CmsModelField.validation\n * @see CmsModelField.listValidation\n */\n validator: CmsModelFieldValidation;\n /**\n * An instance of the current context.\n */\n context: CmsContext;\n /**\n * Field being validated.\n */\n field: CmsModelField;\n /**\n * An instance of the content model being validated.\n */\n model: CmsModel;\n /**\n * If entry is sent it means it is an update operation.\n * First usage is for the unique field value.\n */\n entry?: CmsEntry;\n}\n\n/**\n * Definition for the field validator.\n *\n * @category Plugin\n * @category ModelField\n * @category FieldValidation\n */\nexport interface CmsModelFieldValidatorPlugin extends Plugin {\n /**\n * A plugin type.\n */\n type: \"cms-model-field-validator\";\n /**\n * Actual validator definition.\n */\n validator: {\n /**\n * Name of the validator.\n */\n name: string;\n /**\n * Validation method.\n */\n validate(params: CmsModelFieldValidatorValidateParams): Promise<boolean>;\n };\n}\n\n/**\n * A pattern validator for the content entry field value.\n *\n * @category Plugin\n * @category ModelField\n * @category FieldValidation\n */\nexport interface CmsModelFieldPatternValidatorPlugin extends Plugin {\n /**\n * A plugin type\n */\n type: \"cms-model-field-validator-pattern\";\n /**\n * A pattern object for the validator.\n */\n pattern: {\n /**\n * name of the pattern.\n */\n name: string;\n /**\n * RegExp of the validator.\n */\n regex: string;\n /**\n * RegExp flags\n */\n flags: string;\n };\n}\n\n/**\n * Locked field in the content model\n *\n * @see CmsModel.lockedFields\n *\n * @category ModelField\n */\nexport interface LockedField {\n /**\n * Locked field ID - one used for mapping values.\n */\n fieldId: string;\n /**\n * Is the field multiple values field?\n */\n multipleValues: boolean;\n /**\n * Field type.\n */\n type: string;\n [key: string]: any;\n}\n\n/**\n * Cms Model defining an entry.\n *\n * @category Database model\n * @category CmsModel\n */\nexport interface CmsModel {\n /**\n * Name of the content model.\n */\n name: string;\n /**\n * Unique ID for the content model. Created from name if not defined by user.\n */\n modelId: string;\n /**\n * Model tenant.\n */\n tenant: string;\n /**\n * Locale this model belongs to.\n */\n locale: string;\n /**\n * Cms Group reference object.\n */\n group: {\n /**\n * Generated ID of the group\n */\n id: string;\n /**\n * Name of the group\n */\n name: string;\n };\n /**\n * Description for the content model.\n */\n description: string;\n /**\n * Date created\n */\n createdOn?: string;\n /**\n * Date saved. Changes on both save and create.\n */\n savedOn?: string;\n /**\n * CreatedBy object wrapper. Contains id, name and type of the user.\n */\n createdBy?: CreatedBy;\n /**\n * List of fields defining entry values.\n */\n fields: CmsModelField[];\n /**\n * Admin UI field layout\n *\n * ```ts\n * layout: [\n * [field1id, field2id],\n * [field3id]\n * ]\n * ```\n */\n layout: string[][];\n /**\n * List of locked fields. Updated when entry is saved and a field has been used.\n */\n lockedFields?: LockedField[];\n /**\n * The field that is being displayed as entry title.\n * It is picked as first available text field. Or user can select own field.\n */\n titleFieldId: string;\n /**\n * The version of Webiny which this record was stored with.\n */\n webinyVersion: string;\n}\n\n/**\n * @category ModelField\n */\nexport interface CmsModelFieldDefinition {\n fields: string;\n typeDefs?: string;\n}\n\ninterface CmsModelFieldToGraphQLCreateResolverParams {\n models: CmsModel[];\n model: CmsModel;\n graphQLType: string;\n field: CmsModelField;\n createFieldResolvers: any;\n}\nexport interface CmsModelFieldToGraphQLCreateResolver {\n (params: CmsModelFieldToGraphQLCreateResolverParams):\n | GraphQLFieldResolver\n | { resolver: GraphQLFieldResolver | null; typeResolvers: Resolvers<CmsContext> }\n | false;\n}\n\n/**\n * @category Plugin\n * @category ModelField\n * @category GraphQL\n */\nexport interface CmsModelFieldToGraphQLPlugin extends Plugin {\n /**\n * A plugin type\n */\n type: \"cms-model-field-to-graphql\";\n /**\n * Field type name which must be exact as the one in `CmsEditorFieldTypePlugin` plugin.\n *\n * ```ts\n * fieldType: \"myField\"\n * ```\n */\n fieldType: string;\n /**\n * Is the field searchable via the GraphQL?\n *\n * ```ts\n * isSearchable: false\n * ```\n */\n isSearchable: boolean;\n /**\n * Is the field searchable via full text search?\n *\n * Field is not full text searchable by default.\n * ```ts\n * fullTextSearch: false\n * ```\n */\n fullTextSearch?: boolean;\n /**\n * Is the field sortable via the GraphQL?\n *\n * ```ts\n * isSortable: true\n * ```\n */\n isSortable: boolean;\n /**\n * Read API methods.\n */\n read: {\n /**\n * Definition for get filtering for GraphQL.\n *\n * ```ts\n * read: {\n * createGetFilters({ field }) {\n * return `${field.fieldId}: MyField`;\n * }\n * }\n * ```\n */\n createGetFilters?(params: { model: CmsModel; field: CmsModelField }): string;\n /**\n * Definition for list filtering for GraphQL.\n *\n * ```ts\n * read: {\n * createListFilters({ field }) {\n * return `\n * ${field.fieldId}: MyType\n * ${field.fieldId}_not: MyType\n * ${field.fieldId}_in: [MyType]\n * ${field.fieldId}_not_in: [MyType]\n * `;\n * }\n * }\n * ```\n */\n createListFilters?(params: { model: CmsModel; field: CmsModelField }): string;\n /**\n * Definition of the field type for GraphQL - be aware if multiple values is selected.\n *\n * ```ts\n * read: {\n * createTypeField({ field }) {\n * if (field.multipleValues) {\n * return `${field.fieldId}: [MyFieldType]`;\n * }\n *\n * return `${field.fieldId}: MyField`;\n * }\n * }\n * ```\n */\n createTypeField(params: {\n model: CmsModel;\n field: CmsModelField;\n fieldTypePlugins: CmsFieldTypePlugins;\n }): CmsModelFieldDefinition | string | null;\n /**\n * Definition for field resolver.\n * By default it is simple return of the `instance.values[fieldId]` but if required, users can define their own.\n *\n * ```ts\n * read: {\n * createResolver({ field }) {\n * return instance => {\n * return instance.values[field.fieldId];\n * };\n * }\n * }\n * ```\n */\n createResolver?: CmsModelFieldToGraphQLCreateResolver;\n /**\n * Read API schema definitions for the field and resolvers for them.\n *\n * ```ts\n * read: {\n * createSchema() {\n * return {\n * typeDefs: `\n * myField {\n * id\n * date\n * }\n * `,\n * resolvers: {}\n * }\n * }\n * }\n * ```\n */\n createSchema?: (params: { models: CmsModel[] }) => GraphQLSchemaDefinition<CmsContext>;\n };\n manage: {\n /**\n * Definition for list filtering for GraphQL.\n *\n * ```ts\n * manage: {\n * createListFilters({ field }) {\n * return `\n * ${field.fieldId}: MyType\n * ${field.fieldId}_not: MyType\n * ${field.fieldId}_in: [MyType]\n * ${field.fieldId}_not_in: [MyType]\n * `;\n * }\n * }\n * ```\n */\n createListFilters?: (params: { model: CmsModel; field: CmsModelField }) => string;\n /**\n * Manage API schema definitions for the field and resolvers for them. Probably similar to `read.createSchema`.\n *\n * ```ts\n * createSchema() {\n * return {\n * typeDefs: `\n * myField {\n * id\n * date\n * }\n * `,\n * resolvers: {}\n * }\n * }\n * ```\n */\n createSchema?: (params: { models: CmsModel[] }) => GraphQLSchemaDefinition<CmsContext>;\n /**\n * Definition of the field type for GraphQL - be aware if multiple values is selected. Probably same as `read.createTypeField`.\n *\n * ```ts\n * manage: {\n * createTypeField({ field }) {\n * if (field.multipleValues) {\n * return field.fieldId + \": [MyType]\";\n * }\n *\n * return field.fieldId + \": MyType\";\n * }\n * }\n * ```\n */\n createTypeField: (params: {\n model: CmsModel;\n field: CmsModelField;\n fieldTypePlugins: CmsFieldTypePlugins;\n }) => CmsModelFieldDefinition | string | null;\n /**\n * Definition for input GraphQL field type.\n *\n * ```ts\n * manage: {\n * createInputField({ field }) {\n * if (field.multipleValues) {\n * return field.fieldId + \": [MyField]\";\n * }\n *\n * return field.fieldId + \": MyField\";\n * }\n * }\n * ```\n */\n createInputField: (params: {\n model: CmsModel;\n field: CmsModelField;\n fieldTypePlugins: CmsFieldTypePlugins;\n }) => CmsModelFieldDefinition | string | null;\n /**\n * Definition for field resolver.\n * By default it is simple return of the `instance.values[fieldId]` but if required, users can define their own.\n *\n * ```ts\n * manage: {\n * createResolver({ field }) {\n * return instance => {\n * return instance.values[field.fieldId];\n * };\n * }\n * }\n * ```\n */\n createResolver?: CmsModelFieldToGraphQLCreateResolver;\n };\n}\n\n/**\n * Check for content model locked field.\n * A custom plugin definable by the user.\n *\n * @category CmsModel\n * @category Plugin\n */\nexport interface CmsModelLockedFieldPlugin extends Plugin {\n /**\n * A plugin type\n */\n type: \"cms-model-locked-field\";\n /**\n * A unique identifier of the field type (text, number, json, myField, ...).\n */\n fieldType: string;\n /**\n * A method to check if field really is locked.\n */\n checkLockedField?: (params: { lockedField: LockedField; field: CmsModelField }) => void;\n /**\n * A method to get the locked field data.\n */\n getLockedFieldData?: (params: { field: CmsModelField }) => Record<string, any>;\n}\n\n/**\n * @category ModelField\n */\nexport interface CmsFieldTypePlugins {\n [key: string]: CmsModelFieldToGraphQLPlugin;\n}\n\n/**\n * A interface describing the reference to a user that created some data in the database.\n *\n * @category General\n */\nexport interface CreatedBy {\n /**\n * ID if the user.\n */\n id: string;\n /**\n * Full name of the user.\n */\n displayName: string | null;\n /**\n * Type of the user (admin, user)\n */\n type: string;\n}\n\n/**\n * Representation of settings database model.\n *\n * @category Database model\n */\nexport interface CmsSettings {\n /**\n * Last content model change. Used to cache GraphQL schema.\n */\n contentModelLastChange: Date;\n /**\n * Settings tenant.\n */\n tenant: string;\n /**\n * Settings locale.\n */\n locale: string;\n}\n\n/**\n * Settings CRUD in context.\n *\n * @category Context\n */\nexport interface CmsSettingsContext {\n /**\n * Gets settings model from the database.\n */\n getSettings: () => Promise<CmsSettings | null>;\n /**\n * Updates settings model with a new date.\n */\n updateModelLastChange: () => Promise<void>;\n /**\n * Get the datetime when content model last changed.\n */\n getModelLastChange: () => Promise<Date>;\n}\n\nexport interface BeforeInstallTopicParams {\n tenant: string;\n locale: string;\n}\n\nexport interface AfterInstallTopicParams {\n tenant: string;\n locale: string;\n}\n\nexport type CmsSystemContext = {\n getSystemVersion: () => Promise<string | null>;\n setSystemVersion: (version: string) => Promise<void>;\n getReadAPIKey(): Promise<string | null>;\n installSystem: () => Promise<void>;\n upgradeSystem: (version: string) => Promise<boolean>;\n /**\n * Events\n */\n onBeforeSystemInstall: Topic<BeforeInstallTopicParams>;\n onAfterSystemInstall: Topic<AfterInstallTopicParams>;\n};\n\n/**\n * A GraphQL params.data parameter received when creating content model group.\n *\n * @category CmsGroup\n * @category GraphQL params\n */\nexport interface CmsGroupCreateInput {\n name: string;\n slug?: string;\n description?: string;\n icon: string;\n}\n\n/**\n * A GraphQL params.data parameter received when updating content model group.\n *\n * @category CmsGroup\n * @category GraphQL params\n */\nexport interface CmsGroupUpdateInput {\n name?: string;\n slug?: string;\n description?: string;\n icon?: string;\n}\n\n/**\n * A representation of content model group in the database.\n *\n * @category CmsGroup\n * @category Database model\n */\nexport interface CmsGroup {\n /**\n * Generated ID.\n */\n id: string;\n /**\n * Name of the group.\n */\n name: string;\n /**\n * Slug for the group. Must be unique.\n */\n slug: string;\n /**\n * Group tenant.\n */\n tenant: string;\n /**\n * Locale this group belongs to.\n */\n locale: string;\n /**\n * Description for the group.\n */\n description: string;\n /**\n * Icon for the group. In a form of \"ico/ico\".\n */\n icon: string;\n /**\n * CreatedBy reference object.\n */\n createdBy?: CreatedBy;\n /**\n * Date group was created on.\n */\n createdOn?: string;\n /**\n * Date group was created or changed on.\n */\n savedOn?: string;\n /**\n * Which Webiny version was this record stored with.\n */\n webinyVersion: string;\n}\n\n/**\n * A data.where parameter received when listing content model groups.\n *\n * @category CmsGroup\n * @category GraphQL params\n */\nexport interface CmsGroupListParams {\n where: {\n tenant: string;\n locale: string;\n [key: string]: any;\n };\n}\n\n/**\n * @category CmsGroup\n * @category Topic\n */\nexport interface BeforeGroupCreateTopicParams {\n group: CmsGroup;\n}\n\n/**\n * @category CmsGroup\n * @category Topic\n */\nexport interface AfterGroupCreateTopicParams {\n group: CmsGroup;\n}\n\n/**\n * @category CmsGroup\n * @category Topic\n */\nexport interface BeforeGroupUpdateTopicParams {\n original: CmsGroup;\n group: CmsGroup;\n}\n\n/**\n * @category CmsGroup\n * @category Topic\n */\nexport interface AfterGroupUpdateTopicParams {\n original: CmsGroup;\n group: CmsGroup;\n}\n\n/**\n * @category CmsGroup\n * @category Topic\n */\nexport interface BeforeGroupDeleteTopicParams {\n group: CmsGroup;\n}\n\n/**\n * @category CmsGroup\n * @category Topic\n */\nexport interface AfterGroupDeleteTopicParams {\n group: CmsGroup;\n}\n\n/**\n * Cms Group in context.\n *\n * @category Context\n * @category CmsGroup\n */\nexport interface CmsGroupContext {\n /**\n * Gets content model group by given id.\n */\n getGroup: (id: string) => Promise<CmsGroup | null>;\n /**\n * List all content model groups. Filterable via params.\n */\n listGroups: (params?: CmsGroupListParams) => Promise<CmsGroup[]>;\n /**\n * Create a new content model group.\n */\n createGroup: (data: CmsGroupCreateInput) => Promise<CmsGroup>;\n /**\n * Update existing content model group.\n */\n updateGroup: (id: string, data: CmsGroupUpdateInput) => Promise<CmsGroup>;\n /**\n * Delete content model group by given id.\n */\n deleteGroup: (id: string) => Promise<boolean>;\n /**\n * Clear the cached groups.\n */\n clearGroupsCache: () => void;\n /**\n * Events.\n */\n onBeforeGroupCreate: Topic<BeforeGroupCreateTopicParams>;\n onAfterGroupCreate: Topic<AfterGroupCreateTopicParams>;\n onBeforeGroupUpdate: Topic<BeforeGroupUpdateTopicParams>;\n onAfterGroupUpdate: Topic<AfterGroupUpdateTopicParams>;\n onBeforeGroupDelete: Topic<BeforeGroupDeleteTopicParams>;\n onAfterGroupDelete: Topic<AfterGroupDeleteTopicParams>;\n}\n\n/**\n * Definition for content model field validator.\n *\n * @category ModelField\n * @category FieldValidation\n */\nexport interface CmsModelFieldValidation {\n name: string;\n message: string;\n settings?: {\n value?: string | number;\n values?: string[];\n preset?: string;\n [key: string]: any;\n };\n}\n\n/**\n * A GraphQL params.data parameter received when creating content model.\n *\n * @category GraphQL params\n * @category CmsModel\n */\nexport interface CmsModelCreateInput {\n /**\n * Name of the content model.\n */\n name: string;\n /**\n * Unique ID of the content model. Created from name if not sent by the user. Cannot be changed.\n */\n modelId?: string;\n /**\n * Description of the content model.\n */\n description?: string;\n /**\n * Group where to put the content model in.\n */\n group: string;\n}\n\n/**\n * A GraphQL params.data parameter received when creating content model from existing model.\n *\n * @category GraphQL params\n * @category CmsModel\n */\nexport interface CmsModelCreateFromInput extends CmsModelCreateInput {\n /**\n * Locale into which we want to clone the model into.\n */\n locale?: string;\n}\n\n/**\n * A definition for content model field received from the user.\n *\n * Input type for `CmsModelField`.\n * @see CmsModelField\n *\n * @category GraphQL params\n * @category ModelField\n */\nexport interface CmsModelFieldInput {\n /**\n * Generated ID.\n */\n id: string;\n /**\n * Type of the field. A plugin for the field must be defined.\n * @see CmsModelFieldToGraphQLPlugin\n */\n type: string;\n /**\n * A unique ID for the field. Values will be mapped via this value.\n * This field MUST be in range of \"a-zA-Z\".\n */\n fieldId: string;\n /**\n * Label for the field.\n */\n label: string;\n /**\n * Text to display below the field to help user what to write in the field.\n */\n helpText?: string;\n /**\n * Text to display in the field.\n */\n placeholderText?: string;\n /**\n * Are multiple values allowed?\n */\n multipleValues?: boolean;\n /**\n * Predefined values options for the field. Check the reference for more information.\n */\n predefinedValues?: CmsModelFieldPredefinedValues;\n /**\n * Renderer options for the field. Check the reference for more information.\n */\n renderer?: CmsModelFieldRenderer;\n /**\n * List of validations for the field.\n */\n validation?: CmsModelFieldValidation[];\n /**\n * @see CmsModelField.listValidation\n */\n listValidation: CmsModelFieldValidation[];\n /**\n * User defined settings.\n */\n settings?: Record<string, any>;\n}\n\n/**\n * A GraphQL params.data parameter received when updating content model.\n *\n * @category GraphQL params\n * @category CmsModel\n */\nexport interface CmsModelUpdateInput {\n /**\n * A new content model name.\n */\n name?: string;\n /**\n * A group we want to move the model to.\n */\n group?: string;\n /**\n * A new description of the content model.\n */\n description?: string;\n /**\n * A list of content model fields to define the entry values.\n */\n fields: CmsModelFieldInput[];\n /**\n * Admin UI field layout\n *\n * ```ts\n * layout: [\n * [field1id, field2id],\n * [field3id]\n * ]\n * ```\n */\n layout: string[][];\n /**\n * The field that is being displayed as entry title.\n * It is picked as first available text field. Or user can select own field.\n */\n titleFieldId?: string;\n}\n\n/**\n * A plugin to load a CmsModelManager.\n *\n * @see CmsModelManager\n *\n * @category Plugin\n * @category CmsModel\n * @category CmsEntry\n */\nexport interface ModelManagerPlugin extends Plugin {\n /**\n * A plugin type.\n */\n type: \"cms-content-model-manager\";\n /**\n * Specific model CmsModelManager loader. Can target exact modelId(s).\n * Be aware that if you define multiple plugins without `modelId`, last one will run.\n */\n modelId?: string[] | string;\n /**\n * Create a CmsModelManager for specific type - or new default one.\n * For reference in how is this plugin run check [contentModelManagerFactory](https://github.com/webiny/webiny-js/blob/f15676/packages/api-headless-cms/src/content/plugins/CRUD/contentModel/contentModelManagerFactory.ts)\n */\n create: (context: CmsContext, model: CmsModel) => Promise<CmsModelManager>;\n}\n\n/**\n * A content entry definition for and from the database.\n *\n * @category Database model\n * @category CmsEntry\n */\nexport interface CmsEntry {\n /**\n * A version of the webiny this entry was created with.\n * This can be used when upgrading the system so we know which entries to update.\n */\n webinyVersion: string;\n /**\n * Tenant id which is this entry for. Can be used in case of shared storage.\n */\n tenant: string;\n /**\n * Generated ID of the entry. It is shared across all the records in the database that represent a single entry.\n * So version 1, 2, ..., 2371 will have the same value in this field to link them together.\n */\n entryId: string;\n /**\n * Generated ID + version of the entry.\n */\n id: string;\n /**\n * CreatedBy object reference.\n */\n createdBy: CreatedBy;\n /**\n * OwnedBy object reference. Can be different from CreatedBy.\n */\n ownedBy: CreatedBy;\n /**\n * A string of Date.toISOString() type.\n * Populated on creation.\n */\n createdOn: string;\n /**\n * A string of Date.toISOString() type.\n * Populated every time entry is saved.\n */\n savedOn: string;\n /**\n * Model ID of the definition for the entry.\n * @see CmsModel\n */\n modelId: string;\n /**\n * A locale of the entry.\n * @see I18NLocale.code\n */\n locale: string;\n /**\n * A string of Date.toISOString() type - if published.\n * Populated when entry is published.\n */\n publishedOn?: string;\n /**\n * A revision version of the entry.\n */\n version: number;\n /**\n * Is the entry locked?\n */\n locked: boolean;\n /**\n * Status type of the entry.\n */\n status: CmsEntryStatus;\n /**\n * A mapped fieldId -> value object.\n *\n * @see CmsModelField\n */\n values: Record<string, any>;\n}\n\nexport interface CmsStorageEntry extends CmsEntry {\n [key: string]: any;\n}\n\n/**\n * A definition for content model manager to be used in the code.\n * The default one uses `CmsEntryContext` methods internally, but devs can change to what every they want.\n *\n * @see CmsEntryContext\n *\n * @category Context\n * @category CmsEntry\n * @category CmsModel\n */\nexport interface CmsModelManager {\n /**\n * List only published entries in the content model.\n */\n listPublished: (params: CmsEntryListParams) => Promise<[CmsEntry[], CmsEntryMeta]>;\n /**\n * List latest entries in the content model. Used for administration.\n */\n listLatest: (params: CmsEntryListParams) => Promise<[CmsEntry[], CmsEntryMeta]>;\n /**\n * Get a list of published entries by the ID list.\n */\n getPublishedByIds: (ids: string[]) => Promise<CmsEntry[]>;\n /**\n * Get a list of latest entries by the ID list.\n */\n getLatestByIds: (ids: string[]) => Promise<CmsEntry[]>;\n /**\n * Get an entry filtered by given params. Will always get one.\n */\n get: (id: string) => Promise<CmsEntry>;\n /**\n * Create a entry.\n */\n create: (data: CreateCmsEntryInput) => Promise<CmsEntry>;\n /**\n * Update a entry.\n */\n update: (id: string, data: UpdateCmsEntryInput) => Promise<CmsEntry>;\n /**\n * Delete a entry.\n */\n delete: (id: string) => Promise<void>;\n}\n\nexport interface BeforeModelCreateTopicParams {\n input: CmsModelCreateInput;\n model: CmsModel;\n}\nexport interface AfterModelCreateTopicParams {\n input: CmsModelCreateInput;\n model: CmsModel;\n}\nexport interface BeforeModelCreateFromTopicParams {\n input: CmsModelCreateInput;\n original: CmsModel;\n model: CmsModel;\n}\nexport interface AfterModelCreateFromTopicParams {\n input: CmsModelCreateInput;\n original: CmsModel;\n model: CmsModel;\n}\nexport interface BeforeModelUpdateTopicParams {\n input: CmsModelUpdateInput;\n original: CmsModel;\n model: CmsModel;\n}\nexport interface AfterModelUpdateTopicParams {\n input: CmsModelUpdateInput;\n original: CmsModel;\n model: CmsModel;\n}\nexport interface BeforeModelDeleteTopicParams {\n model: CmsModel;\n}\nexport interface AfterModelDeleteTopicParams {\n model: CmsModel;\n}\n\nexport interface CmsModelUpdateDirectParams {\n model: CmsModel;\n original: CmsModel;\n}\n\n/**\n * Cms Model in the context.\n *\n * @category Context\n * @category CmsModel\n */\nexport interface CmsModelContext {\n /**\n * Get a single content model.\n */\n getModel: (modelId: string) => Promise<CmsModel | null>;\n /**\n * Get all content models.\n */\n listModels: () => Promise<CmsModel[]>;\n /**\n * Create a content model.\n */\n createModel: (data: CmsModelCreateInput) => Promise<CmsModel>;\n /**\n * Create a content model from the given model - clone.\n */\n createModelFrom: (modelId: string, data: CmsModelCreateFromInput) => Promise<CmsModel>;\n /**\n * Update content model without data validation. Used internally.\n * @hidden\n */\n updateModelDirect: (params: CmsModelUpdateDirectParams) => Promise<CmsModel>;\n /**\n * Update content model.\n */\n updateModel: (modelId: string, data: CmsModelUpdateInput) => Promise<CmsModel>;\n /**\n * Delete content model. Should not allow deletion if there are entries connected to it.\n */\n deleteModel: (modelId: string) => Promise<void>;\n /**\n * Get a instance of CmsModelManager for given content modelId.\n *\n * @see CmsModelManager\n *\n * @deprecated use the getEntryManager() method instead\n */\n getModelManager: (model: CmsModel | string) => Promise<CmsModelManager>;\n getEntryManager: (model: CmsModel | string) => Promise<CmsModelManager>;\n /**\n * Get all content model managers mapped by modelId.\n * @see CmsModelManager\n * @deprecated use getEntryManagers instead\n */\n getManagers: () => Map<string, CmsModelManager>;\n getEntryManagers: () => Map<string, CmsModelManager>;\n /**\n * Clear all the model caches.\n */\n clearModelsCache: () => void;\n /**\n * Events.\n */\n onBeforeModelCreate: Topic<BeforeModelCreateTopicParams>;\n onAfterModelCreate: Topic<AfterModelCreateTopicParams>;\n onBeforeModelCreateFrom: Topic<BeforeModelCreateFromTopicParams>;\n onAfterModelCreateFrom: Topic<AfterModelCreateFromTopicParams>;\n onBeforeModelUpdate: Topic<BeforeModelUpdateTopicParams>;\n onAfterModelUpdate: Topic<AfterModelUpdateTopicParams>;\n onBeforeModelDelete: Topic<BeforeModelDeleteTopicParams>;\n onAfterModelDelete: Topic<AfterModelDeleteTopicParams>;\n}\n\n/**\n * Available statuses for content entry.\n *\n * @category CmsEntry\n */\nexport type CmsEntryStatus =\n | \"published\"\n | \"unpublished\"\n | \"reviewRequested\"\n | \"changesRequested\"\n | \"draft\";\n\nexport interface CmsEntryListWhereRef {\n id?: string;\n id_in?: string[];\n id_not?: string;\n id_not_in?: string[];\n entryId?: string;\n entryId_not?: string;\n entryId_in?: string[];\n entryId_not_in?: string[];\n}\n/**\n * Entry listing where params.\n *\n * @category CmsEntry\n * @category GraphQL params\n */\nexport interface CmsEntryListWhere {\n /**\n * Fields.\n */\n id?: string;\n id_in?: string[];\n id_not?: string;\n id_not_in?: string[];\n /**\n * Generated ID without the version.\n */\n entryId?: string;\n entryId_not?: string;\n entryId_in?: string[];\n entryId_not_in?: string[];\n /**\n * Contains the owner of the entry. An \"owner\" is the identity who originally created the entry.\n * Subsequent revisions can be created by other identities, and those will be stored in `createdBy`,\n * but the `owner` is always the original author of the entry.\n *\n * Can be sent via the API or set internal if user can see only their own entries.\n */\n ownedBy?: string;\n ownedBy_not?: string;\n ownedBy_in?: string[];\n ownedBy_not_in?: string[];\n /**\n * Who created the entry?\n */\n createdBy?: string;\n createdBy_not?: string;\n createdBy_in?: string[];\n createdBy_not_in?: string[];\n /**\n * Version of the entry.\n *\n * It is not meant to be used via the API.\n * @internal\n */\n version?: number;\n version_lt?: number;\n version_gt?: number;\n /**\n * Each storage operations implementation MUST determine how to use this field.\n * In SQL, it can be a `published` field, and in DynamoDB it can be an SK.\n *\n * It is not meant to be used via the API.\n * @internal\n */\n published?: boolean;\n /**\n * Each storage operations implementation MUST determine how to use this field.\n * In SQL, it can be a `latest` field, and in DynamoDB it can be an SK.\n *\n * It is not meant to be used via the API.\n * @internal\n */\n latest?: boolean;\n /**\n * This is to allow querying by any content model field defined by the user.\n */\n [key: string]: any | CmsEntryListWhereRef;\n}\n\n/**\n * Entry listing sort.\n *\n * @category CmsEntry\n * @category GraphQL params\n */\nexport type CmsEntryListSort = string[];\n\n/**\n * Get entry GraphQL resolver params.\n *\n * @category CmsEntry\n * @category GraphQL params\n */\nexport interface CmsEntryGetParams {\n where: CmsEntryListWhere;\n sort?: CmsEntryListSort;\n}\n\n/**\n * List entries GraphQL resolver params.\n *\n * @category CmsEntry\n * @category GraphQL params\n */\nexport interface CmsEntryListParams {\n where?: CmsEntryListWhere;\n sort?: CmsEntryListSort;\n search?: string;\n fields?: string[];\n limit?: number;\n after?: string | null;\n}\n\n/**\n * Meta information for GraphQL output.\n *\n * @category CmsEntry\n * @category GraphQL output\n */\nexport interface CmsEntryMeta {\n /**\n * A cursor for pagination.\n */\n cursor: string | null;\n /**\n * Is there more items to load?\n */\n hasMoreItems: boolean;\n /**\n * Total count of the items in the storage.\n */\n totalCount: number;\n}\n\nexport interface BeforeEntryCreateTopicParams {\n input: CreateCmsEntryInput;\n entry: CmsEntry;\n model: CmsModel;\n}\nexport interface AfterEntryCreateTopicParams {\n input: CreateCmsEntryInput;\n entry: CmsEntry;\n model: CmsModel;\n storageEntry: CmsEntry;\n}\n\nexport interface BeforeEntryCreateRevisionTopicParams {\n input: CreateFromCmsEntryInput;\n entry: CmsEntry;\n original: CmsEntry;\n model: CmsModel;\n}\n\nexport interface AfterEntryCreateRevisionTopicParams {\n input: CreateFromCmsEntryInput;\n entry: CmsEntry;\n original: CmsEntry;\n model: CmsModel;\n storageEntry: CmsEntry;\n}\n\nexport interface BeforeEntryUpdateTopicParams {\n input: UpdateCmsEntryInput;\n original: CmsEntry;\n entry: CmsEntry;\n model: CmsModel;\n}\nexport interface AfterEntryUpdateTopicParams {\n input: UpdateCmsEntryInput;\n original: CmsEntry;\n entry: CmsEntry;\n model: CmsModel;\n storageEntry: CmsEntry;\n}\n\nexport interface BeforeEntryPublishTopicParams {\n entry: CmsEntry;\n model: CmsModel;\n}\n\nexport interface AfterEntryPublishTopicParams {\n entry: CmsEntry;\n model: CmsModel;\n storageEntry: CmsEntry;\n}\n\nexport interface BeforeEntryUnpublishTopicParams {\n entry: CmsEntry;\n model: CmsModel;\n}\n\nexport interface AfterEntryUnpublishTopicParams {\n entry: CmsEntry;\n model: CmsModel;\n storageEntry: CmsEntry;\n}\n\nexport interface BeforeEntryRequestChangesTopicParams {\n entry: CmsEntry;\n model: CmsModel;\n}\n\nexport interface AfterEntryRequestChangesTopicParams {\n entry: CmsEntry;\n model: CmsModel;\n storageEntry: CmsEntry;\n}\n\nexport interface BeforeEntryRequestReviewTopicParams {\n entry: CmsEntry;\n model: CmsModel;\n}\n\nexport interface AfterEntryRequestReviewTopicParams {\n entry: CmsEntry;\n model: CmsModel;\n storageEntry: CmsEntry;\n}\n\nexport interface BeforeEntryDeleteTopicParams {\n entry: CmsEntry;\n model: CmsModel;\n}\nexport interface AfterEntryDeleteTopicParams {\n entry: CmsEntry;\n model: CmsModel;\n}\n\nexport interface BeforeEntryDeleteRevisionTopicParams {\n entry: CmsEntry;\n model: CmsModel;\n}\nexport interface AfterEntryDeleteRevisionTopicParams {\n entry: CmsEntry;\n model: CmsModel;\n}\n\nexport interface BeforeEntryGetTopicParams {\n model: CmsModel;\n where: CmsEntryListWhere;\n}\n\nexport interface BeforeEntryListTopicParams {\n where: CmsEntryListWhere;\n model: CmsModel;\n}\n\n/**\n * @category Context\n * @category CmsEntry\n */\nexport interface CreateCmsEntryInput {\n [key: string]: any;\n}\n\n/**\n * @category Context\n * @category CmsEntry\n */\nexport interface CreateFromCmsEntryInput {\n [key: string]: any;\n}\n\n/**\n * @category Context\n * @category CmsEntry\n */\nexport interface UpdateCmsEntryInput {\n [key: string]: any;\n}\n/**\n * Cms Entry CRUD methods in the context.\n *\n * @category Context\n * @category CmsEntry\n */\nexport interface CmsEntryContext {\n /**\n * Get a single content entry for a model.\n */\n getEntry: (model: CmsModel, params: CmsEntryGetParams) => Promise<CmsEntry | null>;\n /**\n * Get a list of entries for a model by a given ID (revision).\n */\n getEntriesByIds: (model: CmsModel, revisions: string[]) => Promise<CmsEntry[]>;\n /**\n * Get the entry for a model by a given ID.\n */\n getEntryById: (model: CmsModel, revision: string) => Promise<CmsEntry>;\n /**\n * List entries for a model. Internal method used by get, listLatest and listPublished.\n */\n listEntries: (\n model: CmsModel,\n params: CmsEntryListParams\n ) => Promise<[CmsEntry[], CmsEntryMeta]>;\n /**\n * Lists latest entries. Used for manage API.\n */\n listLatestEntries: (\n model: CmsModel,\n params?: CmsEntryListParams\n ) => Promise<[CmsEntry[], CmsEntryMeta]>;\n /**\n * List published entries. Used for read API.\n */\n listPublishedEntries: (\n model: CmsModel,\n params?: CmsEntryListParams\n ) => Promise<[CmsEntry[], CmsEntryMeta]>;\n /**\n * List published entries by IDs.\n */\n getPublishedEntriesByIds: (model: CmsModel, ids: string[]) => Promise<CmsEntry[]>;\n /**\n * List latest entries by IDs.\n */\n getLatestEntriesByIds: (model: CmsModel, ids: string[]) => Promise<CmsEntry[]>;\n /**\n * Create a new content entry.\n */\n createEntry: (model: CmsModel, input: CreateCmsEntryInput) => Promise<CmsEntry>;\n /**\n * Create a new entry from already existing entry.\n */\n createEntryRevisionFrom: (\n model: CmsModel,\n id: string,\n input: CreateFromCmsEntryInput\n ) => Promise<CmsEntry>;\n /**\n * Update existing entry.\n */\n updateEntry: (model: CmsModel, id: string, input: UpdateCmsEntryInput) => Promise<CmsEntry>;\n /**\n * Method that republishes entry with given identifier.\n * @internal\n */\n republishEntry: (model: CmsModel, id: string) => Promise<CmsEntry>;\n /**\n * Delete only a certain revision of the entry.\n */\n deleteEntryRevision: (model: CmsModel, id: string) => Promise<void>;\n /**\n * Delete entry with all its revisions.\n */\n deleteEntry: (model: CmsModel, id: string) => Promise<void>;\n /**\n * Publish entry.\n */\n publishEntry: (model: CmsModel, id: string) => Promise<CmsEntry>;\n /**\n * Unpublish entry.\n */\n unpublishEntry: (model: CmsModel, id: string) => Promise<CmsEntry>;\n /**\n * Request a review for the entry.\n */\n requestEntryReview: (model: CmsModel, id: string) => Promise<CmsEntry>;\n /**\n * Request changes for the entry.\n */\n requestEntryChanges: (model: CmsModel, id: string) => Promise<CmsEntry>;\n /**\n * Get all entry revisions.\n */\n getEntryRevisions: (model: CmsModel, id: string) => Promise<CmsEntry[]>;\n /**\n * Events.\n */\n onBeforeEntryCreate: Topic<BeforeEntryCreateTopicParams>;\n onAfterEntryCreate: Topic<AfterEntryCreateTopicParams>;\n onBeforeEntryCreateRevision: Topic<BeforeEntryCreateRevisionTopicParams>;\n onAfterEntryCreateRevision: Topic<AfterEntryCreateRevisionTopicParams>;\n onBeforeEntryUpdate: Topic<BeforeEntryUpdateTopicParams>;\n onAfterEntryUpdate: Topic<AfterEntryUpdateTopicParams>;\n onBeforeEntryDelete: Topic<BeforeEntryDeleteTopicParams>;\n onAfterEntryDelete: Topic<AfterEntryDeleteTopicParams>;\n onBeforeEntryDeleteRevision: Topic<BeforeEntryDeleteRevisionTopicParams>;\n onAfterEntryDeleteRevision: Topic<AfterEntryDeleteRevisionTopicParams>;\n onBeforeEntryPublish: Topic<BeforeEntryPublishTopicParams>;\n onAfterEntryPublish: Topic<AfterEntryPublishTopicParams>;\n onBeforeEntryUnpublish: Topic<BeforeEntryUnpublishTopicParams>;\n onAfterEntryUnpublish: Topic<AfterEntryUnpublishTopicParams>;\n onBeforeEntryRequestChanges: Topic<BeforeEntryRequestChangesTopicParams>;\n onAfterEntryRequestChanges: Topic<AfterEntryRequestChangesTopicParams>;\n onBeforeEntryRequestReview: Topic<BeforeEntryRequestReviewTopicParams>;\n onAfterEntryRequestReview: Topic<AfterEntryRequestReviewTopicParams>;\n onBeforeEntryGet: Topic<BeforeEntryGetTopicParams>;\n onBeforeEntryList: Topic<BeforeEntryListTopicParams>;\n}\n\n/**\n * Parameters for CmsEntryResolverFactory.\n *\n * @category GraphQL resolver\n * @category CmsEntry\n */\ninterface CmsEntryResolverFactoryParams {\n model: CmsModel;\n}\n\n/**\n * A type for EntryResolvers. Used when creating get, list, update, publish, ...etc.\n *\n * @category GraphQL resolver\n * @category CmsEntry\n */\nexport type CmsEntryResolverFactory<TSource = any, TArgs = any, TContext = CmsContext> = {\n (params: CmsEntryResolverFactoryParams): GraphQLFieldResolver<TSource, TArgs, TContext>;\n};\n\n/**\n * Settings security permission.\n *\n * @category SecurityPermission\n */\nexport interface CmsSettingsPermission extends SecurityPermission {} // eslint-disable-line\n\n/**\n * A base security permission for CMS.\n *\n * @category SecurityPermission\n */\nexport interface BaseCmsSecurityPermission extends SecurityPermission {\n own?: boolean;\n rwd: string | number;\n}\n/**\n * A security permission for content model.\n *\n * @category SecurityPermission\n * @category CmsModel\n */\nexport interface CmsModelPermission extends BaseCmsSecurityPermission {\n /**\n * A object representing `key: model.modelId` values where key is locale code.\n */\n models?: {\n [key: string]: string[];\n };\n /**\n * A object representing `key: group.id` values where key is locale code.\n */\n groups?: {\n [key: string]: string[];\n };\n}\n\n/**\n * The security permission for content model groups.\n *\n * @category SecurityPermission\n * @category CmsGroup\n */\nexport interface CmsGroupPermission extends BaseCmsSecurityPermission {\n /**\n * A object representing `key: group.id` values where key is locale code.\n */\n groups?: {\n [key: string]: string[];\n };\n}\n\n/**\n * The security permission for content entry.\n *\n * @category SecurityPermission\n * @category CmsEntry\n */\nexport interface CmsEntryPermission extends BaseCmsSecurityPermission {\n pw?: string;\n /**\n * A object representing `key: model.modelId` values where key is locale code.\n */\n models?: {\n [key: string]: string[];\n };\n /**\n * A object representing `key: group.id` values where key is locale code.\n */\n groups?: {\n [key: string]: string[];\n };\n}\n\nexport interface CmsGroupStorageOperationsGetParams {\n id: string;\n tenant: string;\n locale: string;\n}\n\nexport interface CmsGroupStorageOperationsListWhereParams {\n tenant: string;\n locale: string;\n [key: string]: any;\n}\nexport interface CmsGroupStorageOperationsListParams {\n where: CmsGroupStorageOperationsListWhereParams;\n sort?: string[];\n}\n\nexport interface CmsGroupStorageOperationsCreateParams {\n group: CmsGroup;\n}\n\nexport interface CmsGroupStorageOperationsUpdateParams {\n group: CmsGroup;\n}\n\nexport interface CmsGroupStorageOperationsDeleteParams {\n group: CmsGroup;\n}\n\n/**\n * Description of the CmsGroup CRUD operations.\n * If user wants to add another database to the application, this is how it is done.\n * This is just plain read, update, write, delete and list - no authentication or permission checks.\n */\nexport interface CmsGroupStorageOperations {\n /**\n * Gets content model group by given id.\n */\n get: (params: CmsGroupStorageOperationsGetParams) => Promise<CmsGroup | null>;\n /**\n * List all content model groups. Filterable via params.\n */\n list: (params: CmsGroupStorageOperationsListParams) => Promise<CmsGroup[]>;\n /**\n * Create a new content model group.\n */\n create: (params: CmsGroupStorageOperationsCreateParams) => Promise<CmsGroup>;\n /**\n * Update existing content model group.\n */\n update: (params: CmsGroupStorageOperationsUpdateParams) => Promise<CmsGroup>;\n /**\n * Delete the content model group.\n */\n delete: (params: CmsGroupStorageOperationsDeleteParams) => Promise<CmsGroup>;\n}\n\nexport interface CmsModelStorageOperationsGetParams {\n tenant: string;\n locale: string;\n modelId: string;\n}\n\nexport interface CmsModelStorageOperationsListWhereParams {\n tenant: string;\n locale: string;\n [key: string]: string;\n}\n\nexport interface CmsModelStorageOperationsListParams {\n where: CmsModelStorageOperationsListWhereParams;\n}\n\nexport interface CmsModelStorageOperationsCreateParams {\n model: CmsModel;\n}\n\nexport interface CmsModelStorageOperationsUpdateParams {\n model: CmsModel;\n}\n\nexport interface CmsModelStorageOperationsDeleteParams {\n model: CmsModel;\n}\n\n/**\n * Description of the CmsModel storage operations.\n * If user wants to add another database to the application, this is how it is done.\n * This is just plain read, update, write, delete and list - no authentication or permission checks.\n */\nexport interface CmsModelStorageOperations {\n /**\n * Gets content model by given id.\n */\n get: (params: CmsModelStorageOperationsGetParams) => Promise<CmsModel | null>;\n /**\n * List all content models. Filterable via params.\n */\n list: (params: CmsModelStorageOperationsListParams) => Promise<CmsModel[]>;\n /**\n * Create a new content model.\n */\n create: (params: CmsModelStorageOperationsCreateParams) => Promise<CmsModel>;\n /**\n * Update existing content model.\n */\n update: (params: CmsModelStorageOperationsUpdateParams) => Promise<CmsModel>;\n /**\n * Delete the content model.\n */\n delete: (params: CmsModelStorageOperationsDeleteParams) => Promise<CmsModel>;\n}\n\nexport interface CmsEntryStorageOperationsGetParams {\n where: CmsEntryListWhere;\n sort?: CmsEntryListSort;\n limit?: number;\n}\n\nexport interface CmsEntryStorageOperationsListParams {\n where: CmsEntryListWhere;\n sort?: CmsEntryListSort;\n search?: string;\n fields?: string[];\n limit?: number;\n after?: string | null;\n}\n\nexport interface CmsEntryStorageOperationsCreateParams<\n T extends CmsStorageEntry = CmsStorageEntry\n> {\n /**\n * Real entry, with no transformations on it.\n */\n entry: CmsEntry;\n /**\n * Entry prepared for the storage.\n */\n storageEntry: T;\n}\n\nexport interface CmsEntryStorageOperationsCreateRevisionFromParams<\n T extends CmsStorageEntry = CmsStorageEntry\n> {\n /**\n * Latest entry, used to calculate the new version.\n */\n latestEntry: CmsEntry | null;\n /**\n * Latest entry, used to calculate the new version, directly from storage, with transformations.\n */\n latestStorageEntry: T | null;\n /**\n * Real entry, with no transformations on it.\n */\n entry: CmsEntry;\n /**\n * Entry prepared for the storage.\n */\n storageEntry: T;\n}\n\nexport interface CmsEntryStorageOperationsUpdateParams<\n T extends CmsStorageEntry = CmsStorageEntry\n> {\n /**\n * Real entry, with no transformations on it.\n */\n entry: CmsEntry;\n /**\n * Entry prepared for the storage.\n */\n storageEntry: T;\n}\n\nexport interface CmsEntryStorageOperationsDeleteRevisionParams<\n T extends CmsStorageEntry = CmsStorageEntry\n> {\n /**\n * Entry that was deleted.\n */\n entry: CmsEntry;\n /**\n * Entry that was deleted, directly from storage, with transformations.\n */\n storageEntry: T;\n /**\n * Entry that was set as latest.\n */\n latestEntry: CmsEntry | null;\n /**\n * Entry that was set as latest, directly from storage, with transformations.\n */\n latestStorageEntry: T | null;\n}\n\nexport interface CmsEntryStorageOperationsDeleteParams {\n /**\n * Entry that is going to be deleted.\n */\n entry: CmsEntry;\n}\n\nexport interface CmsEntryStorageOperationsPublishParams<\n T extends CmsStorageEntry = CmsStorageEntry\n> {\n /**\n * The modified entry that is going to be saved as published.\n * Entry is in its original form.\n */\n entry: CmsEntry;\n /**\n * The modified entry and prepared for the storage.\n */\n storageEntry: T;\n}\n\nexport interface CmsEntryStorageOperationsUnpublishParams<\n T extends CmsStorageEntry = CmsStorageEntry\n> {\n /**\n * The modified entry that is going to be saved as unpublished.\n */\n entry: CmsEntry;\n /**\n * The modified entry that is going to be saved as unpublished, with transformations on it.\n */\n storageEntry: T;\n}\n\nexport interface CmsEntryStorageOperationsRequestChangesParams<\n T extends CmsStorageEntry = CmsStorageEntry\n> {\n /**\n * Entry data updated with the required properties.\n */\n entry: CmsEntry;\n /**\n * Entry that is prepared for the storageOperations, with the transformations.\n */\n storageEntry: T;\n}\n\nexport interface CmsEntryStorageOperationsRequestReviewParams<\n T extends CmsStorageEntry = CmsStorageEntry\n> {\n /**\n * Entry that is prepared for the storageOperations.\n */\n entry: CmsEntry;\n /**\n * Entry that is prepared for the storageOperations, with the transformations.\n */\n storageEntry: T;\n}\n\nexport interface CmsEntryStorageOperationsGetByIdsParams {\n ids: readonly string[];\n}\n\nexport interface CmsEntryStorageOperationsGetLatestByIdsParams {\n ids: readonly string[];\n}\n\nexport interface CmsEntryStorageOperationsGetPublishedByIdsParams {\n ids: readonly string[];\n}\n\nexport interface CmsEntryStorageOperationsGetRevisionsParams {\n id: string;\n}\n\nexport interface CmsEntryStorageOperationsGetRevisionParams {\n id: string;\n}\n\nexport interface CmsEntryStorageOperationsGetPublishedRevisionParams {\n id: string;\n}\nexport interface CmsEntryStorageOperationsGetLatestRevisionParams {\n id: string;\n}\n\nexport interface CmsEntryStorageOperationsGetPreviousRevisionParams {\n entryId: string;\n version: number;\n}\n\nexport interface CmsEntryStorageOperationsListResponse<\n T extends CmsStorageEntry = CmsStorageEntry\n> {\n /**\n * Has more items to load with the current filtering?\n */\n hasMoreItems: boolean;\n /**\n * Items loaded with current filtering.\n */\n items: T[];\n /**\n * Pointer for where to start the new item set.\n */\n cursor: string | null;\n /**\n * Total amount of items with the current filter.\n */\n totalCount: number;\n}\n\n/**\n * Description of the CmsModel storage operations.\n * If user wants to add another database to the application, this is how it is done.\n * This is just plain read, update, write, delete and list - no authentication or permission checks.\n *\n *\n * @category StorageOperations\n * @category CmsEntry\n */\nexport interface CmsEntryStorageOperations<T extends CmsStorageEntry = CmsStorageEntry> {\n /**\n * Get all the entries of the ids.\n */\n getByIds: (model: CmsModel, params: CmsEntryStorageOperationsGetByIdsParams) => Promise<T[]>;\n /**\n * Get all the published entries of the ids.\n */\n getPublishedByIds: (\n model: CmsModel,\n params: CmsEntryStorageOperationsGetPublishedByIdsParams\n ) => Promise<T[]>;\n /**\n * Get all the latest entries of the ids.\n */\n getLatestByIds: (\n model: CmsModel,\n params: CmsEntryStorageOperationsGetLatestByIdsParams\n ) => Promise<T[]>;\n /**\n * Get all revisions of the given entry id.\n */\n getRevisions: (\n model: CmsModel,\n params: CmsEntryStorageOperationsGetRevisionsParams\n ) => Promise<T[]>;\n /**\n * Get all revisions of all of the given IDs.\n */\n // getAllRevisionsByIds: (\n // model: CmsModel,\n // params: CmsEntryStorageOperationsGetAllRevisionsParams\n // ) => Promise<T[]>;\n /**\n * Get the entry by the given revision id.\n */\n getRevisionById: (\n model: CmsModel,\n params: CmsEntryStorageOperationsGetRevisionParams\n ) => Promise<T | null>;\n /**\n * Get the published entry by given entryId.\n */\n getPublishedRevisionByEntryId: (\n model: CmsModel,\n params: CmsEntryStorageOperationsGetPublishedRevisionParams\n ) => Promise<T | null>;\n /**\n * Get the latest entry by given entryId.\n */\n getLatestRevisionByEntryId: (\n model: CmsModel,\n params: CmsEntryStorageOperationsGetLatestRevisionParams\n ) => Promise<T | null>;\n /**\n * Get the revision of the entry before given one.\n */\n getPreviousRevision: (\n model: CmsModel,\n params: CmsEntryStorageOperationsGetPreviousRevisionParams\n ) => Promise<T | null>;\n /**\n * Gets entry by given params.\n */\n get: (model: CmsModel, params: CmsEntryStorageOperationsGetParams) => Promise<T | null>;\n /**\n * List all entries. Filterable via params.\n */\n list: (\n model: CmsModel,\n params: CmsEntryStorageOperationsListParams\n ) => Promise<CmsEntryStorageOperationsListResponse<T>>;\n /**\n * Create a new entry.\n */\n create: (model: CmsModel, params: CmsEntryStorageOperationsCreateParams<T>) => Promise<T>;\n /**\n * Create a new entry from existing one.\n */\n createRevisionFrom: (\n model: CmsModel,\n params: CmsEntryStorageOperationsCreateRevisionFromParams<T>\n ) => Promise<T>;\n /**\n * Update existing entry.\n */\n update: (model: CmsModel, params: CmsEntryStorageOperationsUpdateParams<T>) => Promise<T>;\n /**\n * Delete the entry revision.\n */\n deleteRevision: (\n model: CmsModel,\n params: CmsEntryStorageOperationsDeleteRevisionParams<T>\n ) => Promise<void>;\n /**\n * Delete the entry.\n */\n delete: (model: CmsModel, params: CmsEntryStorageOperationsDeleteParams) => Promise<void>;\n /**\n * Publish the entry.\n */\n publish: (model: CmsModel, params: CmsEntryStorageOperationsPublishParams<T>) => Promise<T>;\n /**\n * Unpublish the entry.\n */\n unpublish: (model: CmsModel, params: CmsEntryStorageOperationsUnpublishParams<T>) => Promise<T>;\n /**\n * Request changes the entry.\n */\n requestChanges: (\n model: CmsModel,\n params: CmsEntryStorageOperationsRequestChangesParams<T>\n ) => Promise<T>;\n /**\n * Request review the entry.\n */\n requestReview: (\n model: CmsModel,\n params: CmsEntryStorageOperationsRequestReviewParams<T>\n ) => Promise<CmsEntry>;\n}\n\nexport enum CONTENT_ENTRY_STATUS {\n DRAFT = \"draft\",\n PUBLISHED = \"published\",\n UNPUBLISHED = \"unpublished\",\n CHANGES_REQUESTED = \"changesRequested\",\n REVIEW_REQUESTED = \"reviewRequested\"\n}\n\nexport interface CmsSettingsStorageOperationsGetParams {\n locale: string;\n tenant: string;\n}\n\nexport interface CmsSettingsStorageOperationsCreateParams {\n settings: CmsSettings;\n}\n\nexport interface CmsSettingsStorageOperationsUpdateParams {\n settings: CmsSettings;\n}\n\nexport interface CmsSettingsStorageOperations {\n /**\n * Get the settings from the storage.\n */\n get: (params: CmsSettingsStorageOperationsGetParams) => Promise<CmsSettings | null>;\n /**\n * Create settings in the storage.\n */\n create: (params: CmsSettingsStorageOperationsCreateParams) => Promise<CmsSettings>;\n /**\n * Update the settings in the storage.\n */\n update: (params: CmsSettingsStorageOperationsUpdateParams) => Promise<CmsSettings>;\n}\n\nexport interface CmsSystem {\n version?: string;\n readAPIKey?: string;\n /**\n * System tenant.\n */\n tenant: string;\n}\n\nexport interface CmsSystemStorageOperationsGetParams {\n tenant: string;\n}\n\nexport interface CmsSystemStorageOperationsCreateParams {\n system: CmsSystem;\n}\n\nexport interface CmsSystemStorageOperationsUpdateParams {\n system: CmsSystem;\n}\n\nexport interface CmsSystemStorageOperations {\n /**\n * Get the system data.\n */\n get: (params: CmsSystemStorageOperationsGetParams) => Promise<CmsSystem | null>;\n /**\n * Create the system info in the storage.\n */\n create: (params: CmsSystemStorageOperationsCreateParams) => Promise<CmsSystem>;\n /**\n * Update the system info in the storage.\n */\n update: (params: CmsSystemStorageOperationsUpdateParams) => Promise<CmsSystem>;\n}\n\nexport interface HeadlessCmsStorageOperations {\n system: CmsSystemStorageOperations;\n settings: CmsSettingsStorageOperations;\n groups: CmsGroupStorageOperations;\n models: CmsModelStorageOperations;\n entries: CmsEntryStorageOperations;\n /**\n * Either attach something from the storage operations or run something in it.\n */\n beforeInit?: (context: CmsContext) => Promise<void>;\n init?: (context: CmsContext) => Promise<void>;\n /**\n * An upgrade to run if necessary.\n */\n upgrade?: UpgradePlugin | null;\n}\n"]}
1
+ {"version":3,"sources":["types.ts"],"names":["CONTENT_ENTRY_STATUS"],"mappings":";;;;;;;AAoDA;AACA;AACA;AACA;AACA;;AAoBA;AACA;AACA;AACA;AACA;;AAYA;AACA;AACA;AACA;AACA;;AASA;AACA;AACA;AACA;AACA;AACA;;AA4FA;AACA;AACA;;AAUA;AACA;AACA;AACA;AACA;AACA;;AAgCA;AACA;AACA;AACA;AACA;AACA;AACA;;AAqBA;AACA;AACA;AACA;AACA;AACA;AACA;;AAyBA;AACA;AACA;AACA;AACA;AACA;AACA;;AAiBA;AACA;AACA;AACA;AACA;AACA;;AA6EA;AACA;AACA;;AAoBA;AACA;AACA;AACA;AACA;;AA8NA;AACA;AACA;AACA;AACA;AACA;AACA;;AAoBA;AACA;AACA;;AAKA;AACA;AACA;AACA;AACA;;AAgBA;AACA;AACA;AACA;AACA;;AAgBA;AACA;AACA;AACA;AACA;;AAuCA;AACA;AACA;AACA;AACA;AACA;;AAQA;AACA;AACA;AACA;AACA;AACA;;AAQA;AACA;AACA;AACA;AACA;AACA;;AAgDA;AACA;AACA;AACA;AACA;AACA;;AASA;AACA;AACA;AACA;;AAKA;AACA;AACA;AACA;;AAKA;AACA;AACA;AACA;;AAMA;AACA;AACA;AACA;;AAMA;AACA;AACA;AACA;;AAKA;AACA;AACA;AACA;;AAKA;AACA;AACA;AACA;AACA;AACA;;AAqCA;AACA;AACA;AACA;AACA;AACA;;AAYA;AACA;AACA;AACA;AACA;AACA;;AAoBA;AACA;AACA;AACA;AACA;AACA;;AAQA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAsDA;AACA;AACA;AACA;AACA;AACA;;AAoCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAkBA;AACA;AACA;AACA;AACA;AACA;;AA6EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AA4EA;AACA;AACA;AACA;AACA;AACA;;AAgEA;AACA;AACA;AACA;AACA;;AAkBA;AACA;AACA;AACA;AACA;AACA;;AAiEA;AACA;AACA;AACA;AACA;AACA;;AAGA;AACA;AACA;AACA;AACA;AACA;;AAMA;AACA;AACA;AACA;AACA;AACA;;AAUA;AACA;AACA;AACA;AACA;AACA;;AAiIA;AACA;AACA;AACA;;AAKA;AACA;AACA;AACA;;AAKA;AACA;AACA;AACA;;AAIA;AACA;AACA;AACA;AACA;AACA;;AAqHA;AACA;AACA;AACA;AACA;AACA;;AAKA;AACA;AACA;AACA;AACA;AACA;;AAKA;AACA;AACA;AACA;AACA;AACqE;;AAErE;AACA;AACA;AACA;AACA;;AAKA;AACA;AACA;AACA;AACA;AACA;;AAgBA;AACA;AACA;AACA;AACA;AACA;;AAUA;AACA;AACA;AACA;AACA;AACA;;AA6CA;AACA;AACA;AACA;AACA;;AAoDA;AACA;AACA;AACA;AACA;;AAoNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;IA2HYA,oB;;;WAAAA,oB;AAAAA,EAAAA,oB;AAAAA,EAAAA,oB;AAAAA,EAAAA,oB;AAAAA,EAAAA,oB;AAAAA,EAAAA,oB;GAAAA,oB,oCAAAA,oB","sourcesContent":["import { Plugin } from \"@webiny/plugins/types\";\nimport { I18NContext, I18NLocale } from \"@webiny/api-i18n/types\";\nimport { Context } from \"@webiny/handler/types\";\nimport { TenancyContext } from \"@webiny/api-tenancy/types\";\nimport {\n GraphQLFieldResolver,\n GraphQLSchemaDefinition,\n Resolvers\n} from \"@webiny/handler-graphql/types\";\nimport { SecurityPermission } from \"@webiny/api-security/types\";\nimport { HttpContext } from \"@webiny/handler-http/types\";\nimport { DbContext } from \"@webiny/handler-db/types\";\nimport { FileManagerContext } from \"@webiny/api-file-manager/types\";\nimport { UpgradePlugin } from \"@webiny/api-upgrade/types\";\nimport { Topic } from \"@webiny/pubsub/types\";\n\nexport type ApiEndpoint = \"manage\" | \"preview\" | \"read\";\nexport interface HeadlessCms\n extends CmsSettingsContext,\n CmsSystemContext,\n CmsGroupContext,\n CmsModelContext,\n CmsEntryContext {\n /**\n * API type\n */\n type: ApiEndpoint;\n /**\n * Requested locale\n */\n locale: string;\n /**\n * returns an instance of current locale\n */\n getLocale: () => I18NLocale;\n /**\n * Means this request is a READ API\n */\n READ: boolean;\n /**\n * Means this request is a MANAGE API\n */\n MANAGE: boolean;\n /**\n * Means this request is a PREVIEW API\n */\n PREVIEW: boolean;\n /**\n * The storage operations loaded for current context.\n */\n storageOperations: HeadlessCmsStorageOperations;\n}\n/**\n * @description This combines all contexts used in the CMS into a single one.\n *\n * @category Context\n */\nexport interface CmsContext\n extends Context,\n DbContext,\n HttpContext,\n I18NContext,\n FileManagerContext,\n TenancyContext {\n cms: HeadlessCms;\n}\n\ninterface CmsModelFieldPredefinedValuesValue {\n value: string;\n label: string;\n /**\n * Default selected predefined value.\n */\n selected?: boolean;\n}\n\n/**\n * Object containing content model field predefined options and values.\n *\n * @category CmsModelField\n */\nexport interface CmsModelFieldPredefinedValues {\n /**\n * Are predefined field values enabled?\n */\n enabled: boolean;\n /**\n * Predefined values array.\n */\n values: CmsModelFieldPredefinedValuesValue[];\n}\n\n/**\n * Object containing content model field renderer options.\n *\n * @category CmsModelField\n */\ninterface CmsModelFieldRenderer {\n /**\n * Name of the field renderer. Must have one in field renderer plugins.\n * Can be blank to let automatically determine the renderer.\n */\n name: string;\n}\n\n/**\n * A definition for content model field. This type exists on the app side as well.\n *\n * @category ModelField\n * @category Database model\n */\nexport interface CmsModelField {\n /**\n * A generated unique ID for the model field.\n * MUST be absolute unique throughout the models.\n * Must be in form of a-zA-Z0-9.\n *\n * We generate a unique id value when you're building a model via UI,\n * but when user is creating a model via a plugin it is up to them to be careful about this.\n */\n id: string;\n /**\n * A type of the field\n */\n type: string;\n /**\n * A unique field ID for mapping values.\n * Must in form of a-zA-Z0-9.\n *\n * We generate a unique fieldId value when you're building a model via UI,\n * but when user is creating a model via a plugin it is up to them to be careful about this.\n */\n fieldId: string;\n /**\n * A label for the field\n */\n label: string;\n /**\n * Text below the field to clarify what is it meant to be in the field value\n */\n helpText?: string | null;\n /**\n * Text to be displayed in the field\n */\n placeholderText?: string | null;\n /**\n * Are predefined values enabled? And list of them\n */\n predefinedValues?: CmsModelFieldPredefinedValues;\n /**\n * Field renderer. Blank if determined automatically.\n */\n renderer?: CmsModelFieldRenderer;\n /**\n * List of validations for the field\n *\n * @default []\n */\n validation?: CmsModelFieldValidation[];\n /**\n * List of validations for the list of values, when a field is set to accept a list of values.\n * These validations will be applied to the entire list, and `validation` (see above) will be applied\n * to each individual value in the list.\n *\n * @default []\n */\n listValidation?: CmsModelFieldValidation[];\n /**\n * Is this a multiple values field?\n *\n */\n multipleValues?: boolean;\n /**\n * Any user defined settings.\n *\n * @default {}\n */\n settings?: {\n /**\n * Predefined values (text, number)\n * The default value for the field in case it is not predefined values field.\n */\n defaultValue?: string | number | null | undefined;\n /**\n * Object field.\n */\n fields?: CmsModelField[];\n /**\n * Ref field.\n */\n models?: Pick<CmsModel, \"modelId\">[];\n /**\n * Date field.\n */\n type?: string;\n /**\n * There are a lot of other settings that are possible to add so we keep the type opened.\n */\n [key: string]: any;\n };\n}\n\n/**\n * A definition for dateTime field to show possible type of the field in settings.\n */\nexport interface CmsModelDateTimeField extends CmsModelField {\n /**\n * Settings object for the field. Contains type property.\n */\n settings: {\n type: \"time\" | \"date\" | \"dateTimeWithoutTimezone\" | \"dateTimeWithTimezone\";\n };\n}\n\n/**\n * Arguments for the field validator validate method.\n *\n * @category ModelField\n * @category FieldValidation\n */\nexport interface CmsModelFieldValidatorValidateParams<T = any> {\n /**\n * A value to be validated.\n */\n value: T;\n /**\n * Options from the CmsModelField validations.\n *\n * @see CmsModelField.validation\n * @see CmsModelField.listValidation\n */\n validator: CmsModelFieldValidation;\n /**\n * An instance of the current context.\n */\n context: CmsContext;\n /**\n * Field being validated.\n */\n field: CmsModelField;\n /**\n * An instance of the content model being validated.\n */\n model: CmsModel;\n /**\n * If entry is sent it means it is an update operation.\n * First usage is for the unique field value.\n */\n entry?: CmsEntry;\n}\n\n/**\n * Definition for the field validator.\n *\n * @category Plugin\n * @category ModelField\n * @category FieldValidation\n */\nexport interface CmsModelFieldValidatorPlugin extends Plugin {\n /**\n * A plugin type.\n */\n type: \"cms-model-field-validator\";\n /**\n * Actual validator definition.\n */\n validator: {\n /**\n * Name of the validator.\n */\n name: string;\n /**\n * Validation method.\n */\n validate(params: CmsModelFieldValidatorValidateParams): Promise<boolean>;\n };\n}\n\n/**\n * A pattern validator for the content entry field value.\n *\n * @category Plugin\n * @category ModelField\n * @category FieldValidation\n */\nexport interface CmsModelFieldPatternValidatorPlugin extends Plugin {\n /**\n * A plugin type\n */\n type: \"cms-model-field-validator-pattern\";\n /**\n * A pattern object for the validator.\n */\n pattern: {\n /**\n * name of the pattern.\n */\n name: string;\n /**\n * RegExp of the validator.\n */\n regex: string;\n /**\n * RegExp flags\n */\n flags: string;\n };\n}\n\n/**\n * Locked field in the content model\n *\n * @see CmsModel.lockedFields\n *\n * @category ModelField\n */\nexport interface LockedField {\n /**\n * Locked field ID - one used for mapping values.\n */\n fieldId: string;\n /**\n * Is the field multiple values field?\n */\n multipleValues: boolean;\n /**\n * Field type.\n */\n type: string;\n [key: string]: any;\n}\n\n/**\n * Cms Model defining an entry.\n *\n * @category Database model\n * @category CmsModel\n */\nexport interface CmsModel {\n /**\n * Name of the content model.\n */\n name: string;\n /**\n * Unique ID for the content model. Created from name if not defined by user.\n */\n modelId: string;\n /**\n * Model tenant.\n */\n tenant: string;\n /**\n * Locale this model belongs to.\n */\n locale: string;\n /**\n * Cms Group reference object.\n */\n group: {\n /**\n * Generated ID of the group\n */\n id: string;\n /**\n * Name of the group\n */\n name: string;\n };\n /**\n * Description for the content model.\n */\n description: string;\n /**\n * Date created\n */\n createdOn?: string;\n /**\n * Date saved. Changes on both save and create.\n */\n savedOn?: string;\n /**\n * CreatedBy object wrapper. Contains id, name and type of the user.\n */\n createdBy?: CreatedBy;\n /**\n * List of fields defining entry values.\n */\n fields: CmsModelField[];\n /**\n * Admin UI field layout\n *\n * ```ts\n * layout: [\n * [field1id, field2id],\n * [field3id]\n * ]\n * ```\n */\n layout: string[][];\n /**\n * List of locked fields. Updated when entry is saved and a field has been used.\n */\n lockedFields?: LockedField[];\n /**\n * The field that is being displayed as entry title.\n * It is picked as first available text field. Or user can select own field.\n */\n titleFieldId: string;\n /**\n * The version of Webiny which this record was stored with.\n */\n webinyVersion: string;\n}\n\n/**\n * @category ModelField\n */\nexport interface CmsModelFieldDefinition {\n fields: string;\n typeDefs?: string;\n}\n\ninterface CmsModelFieldToGraphQLCreateResolverParams {\n models: CmsModel[];\n model: CmsModel;\n graphQLType: string;\n field: CmsModelField;\n createFieldResolvers: any;\n}\nexport interface CmsModelFieldToGraphQLCreateResolver {\n (params: CmsModelFieldToGraphQLCreateResolverParams):\n | GraphQLFieldResolver\n | { resolver: GraphQLFieldResolver | null; typeResolvers: Resolvers<CmsContext> }\n | false;\n}\n\n/**\n * @category Plugin\n * @category ModelField\n * @category GraphQL\n */\nexport interface CmsModelFieldToGraphQLPlugin extends Plugin {\n /**\n * A plugin type\n */\n type: \"cms-model-field-to-graphql\";\n /**\n * Field type name which must be exact as the one in `CmsEditorFieldTypePlugin` plugin.\n *\n * ```ts\n * fieldType: \"myField\"\n * ```\n */\n fieldType: string;\n /**\n * Is the field searchable via the GraphQL?\n *\n * ```ts\n * isSearchable: false\n * ```\n */\n isSearchable: boolean;\n /**\n * Is the field searchable via full text search?\n *\n * Field is not full text searchable by default.\n * ```ts\n * fullTextSearch: false\n * ```\n */\n fullTextSearch?: boolean;\n /**\n * Is the field sortable via the GraphQL?\n *\n * ```ts\n * isSortable: true\n * ```\n */\n isSortable: boolean;\n /**\n * Read API methods.\n */\n read: {\n /**\n * Definition for get filtering for GraphQL.\n *\n * ```ts\n * read: {\n * createGetFilters({ field }) {\n * return `${field.fieldId}: MyField`;\n * }\n * }\n * ```\n */\n createGetFilters?(params: { model: CmsModel; field: CmsModelField }): string;\n /**\n * Definition for list filtering for GraphQL.\n *\n * ```ts\n * read: {\n * createListFilters({ field }) {\n * return `\n * ${field.fieldId}: MyType\n * ${field.fieldId}_not: MyType\n * ${field.fieldId}_in: [MyType]\n * ${field.fieldId}_not_in: [MyType]\n * `;\n * }\n * }\n * ```\n */\n createListFilters?(params: { model: CmsModel; field: CmsModelField }): string;\n /**\n * Definition of the field type for GraphQL - be aware if multiple values is selected.\n *\n * ```ts\n * read: {\n * createTypeField({ field }) {\n * if (field.multipleValues) {\n * return `${field.fieldId}: [MyFieldType]`;\n * }\n *\n * return `${field.fieldId}: MyField`;\n * }\n * }\n * ```\n */\n createTypeField(params: {\n model: CmsModel;\n field: CmsModelField;\n fieldTypePlugins: CmsFieldTypePlugins;\n }): CmsModelFieldDefinition | string | null;\n /**\n * Definition for field resolver.\n * By default it is simple return of the `instance.values[fieldId]` but if required, users can define their own.\n *\n * ```ts\n * read: {\n * createResolver({ field }) {\n * return instance => {\n * return instance.values[field.fieldId];\n * };\n * }\n * }\n * ```\n */\n createResolver?: CmsModelFieldToGraphQLCreateResolver;\n /**\n * Read API schema definitions for the field and resolvers for them.\n *\n * ```ts\n * read: {\n * createSchema() {\n * return {\n * typeDefs: `\n * myField {\n * id\n * date\n * }\n * `,\n * resolvers: {}\n * }\n * }\n * }\n * ```\n */\n createSchema?: (params: { models: CmsModel[] }) => GraphQLSchemaDefinition<CmsContext>;\n };\n manage: {\n /**\n * Definition for list filtering for GraphQL.\n *\n * ```ts\n * manage: {\n * createListFilters({ field }) {\n * return `\n * ${field.fieldId}: MyType\n * ${field.fieldId}_not: MyType\n * ${field.fieldId}_in: [MyType]\n * ${field.fieldId}_not_in: [MyType]\n * `;\n * }\n * }\n * ```\n */\n createListFilters?: (params: { model: CmsModel; field: CmsModelField }) => string;\n /**\n * Manage API schema definitions for the field and resolvers for them. Probably similar to `read.createSchema`.\n *\n * ```ts\n * createSchema() {\n * return {\n * typeDefs: `\n * myField {\n * id\n * date\n * }\n * `,\n * resolvers: {}\n * }\n * }\n * ```\n */\n createSchema?: (params: { models: CmsModel[] }) => GraphQLSchemaDefinition<CmsContext>;\n /**\n * Definition of the field type for GraphQL - be aware if multiple values is selected. Probably same as `read.createTypeField`.\n *\n * ```ts\n * manage: {\n * createTypeField({ field }) {\n * if (field.multipleValues) {\n * return field.fieldId + \": [MyType]\";\n * }\n *\n * return field.fieldId + \": MyType\";\n * }\n * }\n * ```\n */\n createTypeField: (params: {\n model: CmsModel;\n field: CmsModelField;\n fieldTypePlugins: CmsFieldTypePlugins;\n }) => CmsModelFieldDefinition | string | null;\n /**\n * Definition for input GraphQL field type.\n *\n * ```ts\n * manage: {\n * createInputField({ field }) {\n * if (field.multipleValues) {\n * return field.fieldId + \": [MyField]\";\n * }\n *\n * return field.fieldId + \": MyField\";\n * }\n * }\n * ```\n */\n createInputField: (params: {\n model: CmsModel;\n field: CmsModelField;\n fieldTypePlugins: CmsFieldTypePlugins;\n }) => CmsModelFieldDefinition | string | null;\n /**\n * Definition for field resolver.\n * By default it is simple return of the `instance.values[fieldId]` but if required, users can define their own.\n *\n * ```ts\n * manage: {\n * createResolver({ field }) {\n * return instance => {\n * return instance.values[field.fieldId];\n * };\n * }\n * }\n * ```\n */\n createResolver?: CmsModelFieldToGraphQLCreateResolver;\n };\n}\n\n/**\n * Check for content model locked field.\n * A custom plugin definable by the user.\n *\n * @category CmsModel\n * @category Plugin\n */\nexport interface CmsModelLockedFieldPlugin extends Plugin {\n /**\n * A plugin type\n */\n type: \"cms-model-locked-field\";\n /**\n * A unique identifier of the field type (text, number, json, myField, ...).\n */\n fieldType: string;\n /**\n * A method to check if field really is locked.\n */\n checkLockedField?: (params: { lockedField: LockedField; field: CmsModelField }) => void;\n /**\n * A method to get the locked field data.\n */\n getLockedFieldData?: (params: { field: CmsModelField }) => Record<string, any>;\n}\n\n/**\n * @category ModelField\n */\nexport interface CmsFieldTypePlugins {\n [key: string]: CmsModelFieldToGraphQLPlugin;\n}\n\n/**\n * A interface describing the reference to a user that created some data in the database.\n *\n * @category General\n */\nexport interface CreatedBy {\n /**\n * ID if the user.\n */\n id: string;\n /**\n * Full name of the user.\n */\n displayName: string | null;\n /**\n * Type of the user (admin, user)\n */\n type: string;\n}\n\n/**\n * Representation of settings database model.\n *\n * @category Database model\n */\nexport interface CmsSettings {\n /**\n * Last content model change. Used to cache GraphQL schema.\n */\n contentModelLastChange: Date;\n /**\n * Settings tenant.\n */\n tenant: string;\n /**\n * Settings locale.\n */\n locale: string;\n}\n\n/**\n * Settings CRUD in context.\n *\n * @category Context\n */\nexport interface CmsSettingsContext {\n /**\n * Gets settings model from the database.\n */\n getSettings: () => Promise<CmsSettings | null>;\n /**\n * Updates settings model with a new date.\n */\n updateModelLastChange: () => Promise<void>;\n /**\n * Get the datetime when content model last changed.\n */\n getModelLastChange: () => Promise<Date>;\n}\n\nexport interface BeforeInstallTopicParams {\n tenant: string;\n locale: string;\n}\n\nexport interface AfterInstallTopicParams {\n tenant: string;\n locale: string;\n}\n\nexport type CmsSystemContext = {\n getSystemVersion: () => Promise<string | null>;\n setSystemVersion: (version: string) => Promise<void>;\n getReadAPIKey(): Promise<string | null>;\n installSystem: () => Promise<void>;\n upgradeSystem: (version: string) => Promise<boolean>;\n /**\n * Events\n */\n onBeforeSystemInstall: Topic<BeforeInstallTopicParams>;\n onAfterSystemInstall: Topic<AfterInstallTopicParams>;\n};\n\n/**\n * A GraphQL params.data parameter received when creating content model group.\n *\n * @category CmsGroup\n * @category GraphQL params\n */\nexport interface CmsGroupCreateInput {\n name: string;\n slug?: string;\n description?: string;\n icon: string;\n}\n\n/**\n * A GraphQL params.data parameter received when updating content model group.\n *\n * @category CmsGroup\n * @category GraphQL params\n */\nexport interface CmsGroupUpdateInput {\n name?: string;\n slug?: string;\n description?: string;\n icon?: string;\n}\n\n/**\n * A representation of content model group in the database.\n *\n * @category CmsGroup\n * @category Database model\n */\nexport interface CmsGroup {\n /**\n * Generated ID.\n */\n id: string;\n /**\n * Name of the group.\n */\n name: string;\n /**\n * Slug for the group. Must be unique.\n */\n slug: string;\n /**\n * Group tenant.\n */\n tenant: string;\n /**\n * Locale this group belongs to.\n */\n locale: string;\n /**\n * Description for the group.\n */\n description: string;\n /**\n * Icon for the group. In a form of \"ico/ico\".\n */\n icon: string;\n /**\n * CreatedBy reference object.\n */\n createdBy?: CreatedBy;\n /**\n * Date group was created on.\n */\n createdOn?: string;\n /**\n * Date group was created or changed on.\n */\n savedOn?: string;\n /**\n * Which Webiny version was this record stored with.\n */\n webinyVersion: string;\n}\n\n/**\n * A data.where parameter received when listing content model groups.\n *\n * @category CmsGroup\n * @category GraphQL params\n */\nexport interface CmsGroupListParams {\n where: {\n tenant: string;\n locale: string;\n [key: string]: any;\n };\n}\n\n/**\n * @category CmsGroup\n * @category Topic\n */\nexport interface BeforeGroupCreateTopicParams {\n group: CmsGroup;\n}\n\n/**\n * @category CmsGroup\n * @category Topic\n */\nexport interface AfterGroupCreateTopicParams {\n group: CmsGroup;\n}\n\n/**\n * @category CmsGroup\n * @category Topic\n */\nexport interface BeforeGroupUpdateTopicParams {\n original: CmsGroup;\n group: CmsGroup;\n}\n\n/**\n * @category CmsGroup\n * @category Topic\n */\nexport interface AfterGroupUpdateTopicParams {\n original: CmsGroup;\n group: CmsGroup;\n}\n\n/**\n * @category CmsGroup\n * @category Topic\n */\nexport interface BeforeGroupDeleteTopicParams {\n group: CmsGroup;\n}\n\n/**\n * @category CmsGroup\n * @category Topic\n */\nexport interface AfterGroupDeleteTopicParams {\n group: CmsGroup;\n}\n\n/**\n * Cms Group in context.\n *\n * @category Context\n * @category CmsGroup\n */\nexport interface CmsGroupContext {\n /**\n * Gets content model group by given id.\n */\n getGroup: (id: string) => Promise<CmsGroup | null>;\n /**\n * List all content model groups. Filterable via params.\n */\n listGroups: (params?: CmsGroupListParams) => Promise<CmsGroup[]>;\n /**\n * Create a new content model group.\n */\n createGroup: (data: CmsGroupCreateInput) => Promise<CmsGroup>;\n /**\n * Update existing content model group.\n */\n updateGroup: (id: string, data: CmsGroupUpdateInput) => Promise<CmsGroup>;\n /**\n * Delete content model group by given id.\n */\n deleteGroup: (id: string) => Promise<boolean>;\n /**\n * Clear the cached groups.\n */\n clearGroupsCache: () => void;\n /**\n * Events.\n */\n onBeforeGroupCreate: Topic<BeforeGroupCreateTopicParams>;\n onAfterGroupCreate: Topic<AfterGroupCreateTopicParams>;\n onBeforeGroupUpdate: Topic<BeforeGroupUpdateTopicParams>;\n onAfterGroupUpdate: Topic<AfterGroupUpdateTopicParams>;\n onBeforeGroupDelete: Topic<BeforeGroupDeleteTopicParams>;\n onAfterGroupDelete: Topic<AfterGroupDeleteTopicParams>;\n}\n\n/**\n * Definition for content model field validator.\n *\n * @category ModelField\n * @category FieldValidation\n */\nexport interface CmsModelFieldValidation {\n name: string;\n message: string;\n settings?: {\n value?: string | number;\n values?: string[];\n preset?: string;\n [key: string]: any;\n };\n}\n\n/**\n * A GraphQL params.data parameter received when creating content model.\n *\n * @category GraphQL params\n * @category CmsModel\n */\nexport interface CmsModelCreateInput {\n /**\n * Name of the content model.\n */\n name: string;\n /**\n * Unique ID of the content model. Created from name if not sent by the user. Cannot be changed.\n */\n modelId?: string;\n /**\n * Description of the content model.\n */\n description?: string;\n /**\n * Group where to put the content model in.\n */\n group: string;\n}\n\n/**\n * A GraphQL params.data parameter received when creating content model from existing model.\n *\n * @category GraphQL params\n * @category CmsModel\n */\nexport interface CmsModelCreateFromInput extends CmsModelCreateInput {\n /**\n * Locale into which we want to clone the model into.\n */\n locale?: string;\n}\n\n/**\n * A definition for content model field received from the user.\n *\n * Input type for `CmsModelField`.\n * @see CmsModelField\n *\n * @category GraphQL params\n * @category ModelField\n */\nexport interface CmsModelFieldInput {\n /**\n * Generated ID.\n */\n id: string;\n /**\n * Type of the field. A plugin for the field must be defined.\n * @see CmsModelFieldToGraphQLPlugin\n */\n type: string;\n /**\n * A unique ID for the field. Values will be mapped via this value.\n * This field MUST be in range of \"a-zA-Z\".\n */\n fieldId: string;\n /**\n * Label for the field.\n */\n label: string;\n /**\n * Text to display below the field to help user what to write in the field.\n */\n helpText?: string;\n /**\n * Text to display in the field.\n */\n placeholderText?: string;\n /**\n * Are multiple values allowed?\n */\n multipleValues?: boolean;\n /**\n * Predefined values options for the field. Check the reference for more information.\n */\n predefinedValues?: CmsModelFieldPredefinedValues;\n /**\n * Renderer options for the field. Check the reference for more information.\n */\n renderer?: CmsModelFieldRenderer;\n /**\n * List of validations for the field.\n */\n validation?: CmsModelFieldValidation[];\n /**\n * @see CmsModelField.listValidation\n */\n listValidation: CmsModelFieldValidation[];\n /**\n * User defined settings.\n */\n settings?: Record<string, any>;\n}\n\n/**\n * A GraphQL params.data parameter received when updating content model.\n *\n * @category GraphQL params\n * @category CmsModel\n */\nexport interface CmsModelUpdateInput {\n /**\n * A new content model name.\n */\n name?: string;\n /**\n * A group we want to move the model to.\n */\n group?: string;\n /**\n * A new description of the content model.\n */\n description?: string;\n /**\n * A list of content model fields to define the entry values.\n */\n fields: CmsModelFieldInput[];\n /**\n * Admin UI field layout\n *\n * ```ts\n * layout: [\n * [field1id, field2id],\n * [field3id]\n * ]\n * ```\n */\n layout: string[][];\n /**\n * The field that is being displayed as entry title.\n * It is picked as first available text field. Or user can select own field.\n */\n titleFieldId?: string;\n}\n\n/**\n * A plugin to load a CmsModelManager.\n *\n * @see CmsModelManager\n *\n * @category Plugin\n * @category CmsModel\n * @category CmsEntry\n */\nexport interface ModelManagerPlugin extends Plugin {\n /**\n * A plugin type.\n */\n type: \"cms-content-model-manager\";\n /**\n * Specific model CmsModelManager loader. Can target exact modelId(s).\n * Be aware that if you define multiple plugins without `modelId`, last one will run.\n */\n modelId?: string[] | string;\n /**\n * Create a CmsModelManager for specific type - or new default one.\n * For reference in how is this plugin run check [contentModelManagerFactory](https://github.com/webiny/webiny-js/blob/f15676/packages/api-headless-cms/src/content/plugins/CRUD/contentModel/contentModelManagerFactory.ts)\n */\n create: (context: CmsContext, model: CmsModel) => Promise<CmsModelManager>;\n}\n\n/**\n * A content entry definition for and from the database.\n *\n * @category Database model\n * @category CmsEntry\n */\nexport interface CmsEntry {\n /**\n * A version of the webiny this entry was created with.\n * This can be used when upgrading the system so we know which entries to update.\n */\n webinyVersion: string;\n /**\n * Tenant id which is this entry for. Can be used in case of shared storage.\n */\n tenant: string;\n /**\n * Generated ID of the entry. It is shared across all the records in the database that represent a single entry.\n * So version 1, 2, ..., 2371 will have the same value in this field to link them together.\n */\n entryId: string;\n /**\n * Generated ID + version of the entry.\n */\n id: string;\n /**\n * CreatedBy object reference.\n */\n createdBy: CreatedBy;\n /**\n * OwnedBy object reference. Can be different from CreatedBy.\n */\n ownedBy: CreatedBy;\n /**\n * A string of Date.toISOString() type.\n * Populated on creation.\n */\n createdOn: string;\n /**\n * A string of Date.toISOString() type.\n * Populated every time entry is saved.\n */\n savedOn: string;\n /**\n * Model ID of the definition for the entry.\n * @see CmsModel\n */\n modelId: string;\n /**\n * A locale of the entry.\n * @see I18NLocale.code\n */\n locale: string;\n /**\n * A string of Date.toISOString() type - if published.\n * Populated when entry is published.\n */\n publishedOn?: string;\n /**\n * A revision version of the entry.\n */\n version: number;\n /**\n * Is the entry locked?\n */\n locked: boolean;\n /**\n * Status type of the entry.\n */\n status: CmsEntryStatus;\n /**\n * A mapped fieldId -> value object.\n *\n * @see CmsModelField\n */\n values: Record<string, any>;\n}\n\nexport interface CmsStorageEntry extends CmsEntry {\n [key: string]: any;\n}\n\n/**\n * A definition for content model manager to be used in the code.\n * The default one uses `CmsEntryContext` methods internally, but devs can change to what every they want.\n *\n * @see CmsEntryContext\n *\n * @category Context\n * @category CmsEntry\n * @category CmsModel\n */\nexport interface CmsModelManager {\n /**\n * List only published entries in the content model.\n */\n listPublished: (params: CmsEntryListParams) => Promise<[CmsEntry[], CmsEntryMeta]>;\n /**\n * List latest entries in the content model. Used for administration.\n */\n listLatest: (params: CmsEntryListParams) => Promise<[CmsEntry[], CmsEntryMeta]>;\n /**\n * Get a list of published entries by the ID list.\n */\n getPublishedByIds: (ids: string[]) => Promise<CmsEntry[]>;\n /**\n * Get a list of latest entries by the ID list.\n */\n getLatestByIds: (ids: string[]) => Promise<CmsEntry[]>;\n /**\n * Get an entry filtered by given params. Will always get one.\n */\n get: (id: string) => Promise<CmsEntry>;\n /**\n * Create a entry.\n */\n create: (data: CreateCmsEntryInput) => Promise<CmsEntry>;\n /**\n * Update a entry.\n */\n update: (id: string, data: UpdateCmsEntryInput) => Promise<CmsEntry>;\n /**\n * Delete a entry.\n */\n delete: (id: string) => Promise<void>;\n}\n\nexport interface BeforeModelCreateTopicParams {\n input: CmsModelCreateInput;\n model: CmsModel;\n}\nexport interface AfterModelCreateTopicParams {\n input: CmsModelCreateInput;\n model: CmsModel;\n}\nexport interface BeforeModelCreateFromTopicParams {\n input: CmsModelCreateInput;\n original: CmsModel;\n model: CmsModel;\n}\nexport interface AfterModelCreateFromTopicParams {\n input: CmsModelCreateInput;\n original: CmsModel;\n model: CmsModel;\n}\nexport interface BeforeModelUpdateTopicParams {\n input: CmsModelUpdateInput;\n original: CmsModel;\n model: CmsModel;\n}\nexport interface AfterModelUpdateTopicParams {\n input: CmsModelUpdateInput;\n original: CmsModel;\n model: CmsModel;\n}\nexport interface BeforeModelDeleteTopicParams {\n model: CmsModel;\n}\nexport interface AfterModelDeleteTopicParams {\n model: CmsModel;\n}\n\nexport interface CmsModelUpdateDirectParams {\n model: CmsModel;\n original: CmsModel;\n}\n\n/**\n * Cms Model in the context.\n *\n * @category Context\n * @category CmsModel\n */\nexport interface CmsModelContext {\n /**\n * Get a single content model.\n */\n getModel: (modelId: string) => Promise<CmsModel | null>;\n /**\n * Get all content models.\n */\n listModels: () => Promise<CmsModel[]>;\n /**\n * Create a content model.\n */\n createModel: (data: CmsModelCreateInput) => Promise<CmsModel>;\n /**\n * Create a content model from the given model - clone.\n */\n createModelFrom: (modelId: string, data: CmsModelCreateFromInput) => Promise<CmsModel>;\n /**\n * Update content model without data validation. Used internally.\n * @hidden\n */\n updateModelDirect: (params: CmsModelUpdateDirectParams) => Promise<CmsModel>;\n /**\n * Update content model.\n */\n updateModel: (modelId: string, data: CmsModelUpdateInput) => Promise<CmsModel>;\n /**\n * Delete content model. Should not allow deletion if there are entries connected to it.\n */\n deleteModel: (modelId: string) => Promise<void>;\n /**\n * Get a instance of CmsModelManager for given content modelId.\n *\n * @see CmsModelManager\n *\n * @deprecated use the getEntryManager() method instead\n */\n getModelManager: (model: CmsModel | string) => Promise<CmsModelManager>;\n getEntryManager: (model: CmsModel | string) => Promise<CmsModelManager>;\n /**\n * Get all content model managers mapped by modelId.\n * @see CmsModelManager\n * @deprecated use getEntryManagers instead\n */\n getManagers: () => Map<string, CmsModelManager>;\n getEntryManagers: () => Map<string, CmsModelManager>;\n /**\n * Clear all the model caches.\n */\n clearModelsCache: () => void;\n /**\n * Events.\n */\n onBeforeModelCreate: Topic<BeforeModelCreateTopicParams>;\n onAfterModelCreate: Topic<AfterModelCreateTopicParams>;\n onBeforeModelCreateFrom: Topic<BeforeModelCreateFromTopicParams>;\n onAfterModelCreateFrom: Topic<AfterModelCreateFromTopicParams>;\n onBeforeModelUpdate: Topic<BeforeModelUpdateTopicParams>;\n onAfterModelUpdate: Topic<AfterModelUpdateTopicParams>;\n onBeforeModelDelete: Topic<BeforeModelDeleteTopicParams>;\n onAfterModelDelete: Topic<AfterModelDeleteTopicParams>;\n}\n\n/**\n * Available statuses for content entry.\n *\n * @category CmsEntry\n */\nexport type CmsEntryStatus =\n | \"published\"\n | \"unpublished\"\n | \"reviewRequested\"\n | \"changesRequested\"\n | \"draft\";\n\nexport interface CmsEntryListWhereRef {\n id?: string;\n id_in?: string[];\n id_not?: string;\n id_not_in?: string[];\n entryId?: string;\n entryId_not?: string;\n entryId_in?: string[];\n entryId_not_in?: string[];\n}\n/**\n * Entry listing where params.\n *\n * @category CmsEntry\n * @category GraphQL params\n */\nexport interface CmsEntryListWhere {\n /**\n * Fields.\n */\n id?: string;\n id_in?: string[];\n id_not?: string;\n id_not_in?: string[];\n /**\n * Generated ID without the version.\n */\n entryId?: string;\n entryId_not?: string;\n entryId_in?: string[];\n entryId_not_in?: string[];\n /**\n * Contains the owner of the entry. An \"owner\" is the identity who originally created the entry.\n * Subsequent revisions can be created by other identities, and those will be stored in `createdBy`,\n * but the `owner` is always the original author of the entry.\n *\n * Can be sent via the API or set internal if user can see only their own entries.\n */\n ownedBy?: string;\n ownedBy_not?: string;\n ownedBy_in?: string[];\n ownedBy_not_in?: string[];\n /**\n * Who created the entry?\n */\n createdBy?: string;\n createdBy_not?: string;\n createdBy_in?: string[];\n createdBy_not_in?: string[];\n /**\n * Version of the entry.\n *\n * It is not meant to be used via the API.\n * @internal\n */\n version?: number;\n version_lt?: number;\n version_gt?: number;\n /**\n * Each storage operations implementation MUST determine how to use this field.\n * In SQL, it can be a `published` field, and in DynamoDB it can be an SK.\n *\n * It is not meant to be used via the API.\n * @internal\n */\n published?: boolean;\n /**\n * Each storage operations implementation MUST determine how to use this field.\n * In SQL, it can be a `latest` field, and in DynamoDB it can be an SK.\n *\n * It is not meant to be used via the API.\n * @internal\n */\n latest?: boolean;\n /**\n * This is to allow querying by any content model field defined by the user.\n */\n [key: string]: any | CmsEntryListWhereRef;\n}\n\n/**\n * Entry listing sort.\n *\n * @category CmsEntry\n * @category GraphQL params\n */\nexport type CmsEntryListSort = string[];\n\n/**\n * Get entry GraphQL resolver params.\n *\n * @category CmsEntry\n * @category GraphQL params\n */\nexport interface CmsEntryGetParams {\n where: CmsEntryListWhere;\n sort?: CmsEntryListSort;\n}\n\n/**\n * List entries GraphQL resolver params.\n *\n * @category CmsEntry\n * @category GraphQL params\n */\nexport interface CmsEntryListParams {\n where?: CmsEntryListWhere;\n sort?: CmsEntryListSort;\n search?: string;\n fields?: string[];\n limit?: number;\n after?: string | null;\n}\n\n/**\n * Meta information for GraphQL output.\n *\n * @category CmsEntry\n * @category GraphQL output\n */\nexport interface CmsEntryMeta {\n /**\n * A cursor for pagination.\n */\n cursor: string | null;\n /**\n * Is there more items to load?\n */\n hasMoreItems: boolean;\n /**\n * Total count of the items in the storage.\n */\n totalCount: number;\n}\n\nexport interface BeforeEntryCreateTopicParams {\n input: CreateCmsEntryInput;\n entry: CmsEntry;\n model: CmsModel;\n}\nexport interface AfterEntryCreateTopicParams {\n input: CreateCmsEntryInput;\n entry: CmsEntry;\n model: CmsModel;\n storageEntry: CmsEntry;\n}\n\nexport interface BeforeEntryCreateRevisionTopicParams {\n input: CreateFromCmsEntryInput;\n entry: CmsEntry;\n original: CmsEntry;\n model: CmsModel;\n}\n\nexport interface AfterEntryCreateRevisionTopicParams {\n input: CreateFromCmsEntryInput;\n entry: CmsEntry;\n original: CmsEntry;\n model: CmsModel;\n storageEntry: CmsEntry;\n}\n\nexport interface BeforeEntryUpdateTopicParams {\n input: UpdateCmsEntryInput;\n original: CmsEntry;\n entry: CmsEntry;\n model: CmsModel;\n}\nexport interface AfterEntryUpdateTopicParams {\n input: UpdateCmsEntryInput;\n original: CmsEntry;\n entry: CmsEntry;\n model: CmsModel;\n storageEntry: CmsEntry;\n}\n\nexport interface BeforeEntryPublishTopicParams {\n entry: CmsEntry;\n model: CmsModel;\n}\n\nexport interface AfterEntryPublishTopicParams {\n entry: CmsEntry;\n model: CmsModel;\n storageEntry: CmsEntry;\n}\n\nexport interface BeforeEntryUnpublishTopicParams {\n entry: CmsEntry;\n model: CmsModel;\n}\n\nexport interface AfterEntryUnpublishTopicParams {\n entry: CmsEntry;\n model: CmsModel;\n storageEntry: CmsEntry;\n}\n\nexport interface BeforeEntryRequestChangesTopicParams {\n entry: CmsEntry;\n model: CmsModel;\n}\n\nexport interface AfterEntryRequestChangesTopicParams {\n entry: CmsEntry;\n model: CmsModel;\n storageEntry: CmsEntry;\n}\n\nexport interface BeforeEntryRequestReviewTopicParams {\n entry: CmsEntry;\n model: CmsModel;\n}\n\nexport interface AfterEntryRequestReviewTopicParams {\n entry: CmsEntry;\n model: CmsModel;\n storageEntry: CmsEntry;\n}\n\nexport interface BeforeEntryDeleteTopicParams {\n entry: CmsEntry;\n model: CmsModel;\n}\nexport interface AfterEntryDeleteTopicParams {\n entry: CmsEntry;\n model: CmsModel;\n}\n\nexport interface BeforeEntryDeleteRevisionTopicParams {\n entry: CmsEntry;\n model: CmsModel;\n}\nexport interface AfterEntryDeleteRevisionTopicParams {\n entry: CmsEntry;\n model: CmsModel;\n}\n\nexport interface BeforeEntryGetTopicParams {\n model: CmsModel;\n where: CmsEntryListWhere;\n}\n\nexport interface BeforeEntryListTopicParams {\n where: CmsEntryListWhere;\n model: CmsModel;\n}\n\n/**\n * @category Context\n * @category CmsEntry\n */\nexport interface CreateCmsEntryInput {\n [key: string]: any;\n}\n\n/**\n * @category Context\n * @category CmsEntry\n */\nexport interface CreateFromCmsEntryInput {\n [key: string]: any;\n}\n\n/**\n * @category Context\n * @category CmsEntry\n */\nexport interface UpdateCmsEntryInput {\n [key: string]: any;\n}\n/**\n * Cms Entry CRUD methods in the context.\n *\n * @category Context\n * @category CmsEntry\n */\nexport interface CmsEntryContext {\n /**\n * Get a single content entry for a model.\n */\n getEntry: (model: CmsModel, params: CmsEntryGetParams) => Promise<CmsEntry | null>;\n /**\n * Get a list of entries for a model by a given ID (revision).\n */\n getEntriesByIds: (model: CmsModel, revisions: string[]) => Promise<CmsEntry[]>;\n /**\n * Get the entry for a model by a given ID.\n */\n getEntryById: (model: CmsModel, revision: string) => Promise<CmsEntry>;\n /**\n * List entries for a model. Internal method used by get, listLatest and listPublished.\n */\n listEntries: (\n model: CmsModel,\n params: CmsEntryListParams\n ) => Promise<[CmsEntry[], CmsEntryMeta]>;\n /**\n * Lists latest entries. Used for manage API.\n */\n listLatestEntries: (\n model: CmsModel,\n params?: CmsEntryListParams\n ) => Promise<[CmsEntry[], CmsEntryMeta]>;\n /**\n * List published entries. Used for read API.\n */\n listPublishedEntries: (\n model: CmsModel,\n params?: CmsEntryListParams\n ) => Promise<[CmsEntry[], CmsEntryMeta]>;\n /**\n * List published entries by IDs.\n */\n getPublishedEntriesByIds: (model: CmsModel, ids: string[]) => Promise<CmsEntry[]>;\n /**\n * List latest entries by IDs.\n */\n getLatestEntriesByIds: (model: CmsModel, ids: string[]) => Promise<CmsEntry[]>;\n /**\n * Create a new content entry.\n */\n createEntry: (model: CmsModel, input: CreateCmsEntryInput) => Promise<CmsEntry>;\n /**\n * Create a new entry from already existing entry.\n */\n createEntryRevisionFrom: (\n model: CmsModel,\n id: string,\n input: CreateFromCmsEntryInput\n ) => Promise<CmsEntry>;\n /**\n * Update existing entry.\n */\n updateEntry: (model: CmsModel, id: string, input: UpdateCmsEntryInput) => Promise<CmsEntry>;\n /**\n * Method that republishes entry with given identifier.\n * @internal\n */\n republishEntry: (model: CmsModel, id: string) => Promise<CmsEntry>;\n /**\n * Delete only a certain revision of the entry.\n */\n deleteEntryRevision: (model: CmsModel, id: string) => Promise<void>;\n /**\n * Delete entry with all its revisions.\n */\n deleteEntry: (model: CmsModel, id: string) => Promise<void>;\n /**\n * Publish entry.\n */\n publishEntry: (model: CmsModel, id: string) => Promise<CmsEntry>;\n /**\n * Unpublish entry.\n */\n unpublishEntry: (model: CmsModel, id: string) => Promise<CmsEntry>;\n /**\n * Request a review for the entry.\n */\n requestEntryReview: (model: CmsModel, id: string) => Promise<CmsEntry>;\n /**\n * Request changes for the entry.\n */\n requestEntryChanges: (model: CmsModel, id: string) => Promise<CmsEntry>;\n /**\n * Get all entry revisions.\n */\n getEntryRevisions: (model: CmsModel, id: string) => Promise<CmsEntry[]>;\n /**\n * Events.\n */\n onBeforeEntryCreate: Topic<BeforeEntryCreateTopicParams>;\n onAfterEntryCreate: Topic<AfterEntryCreateTopicParams>;\n onBeforeEntryCreateRevision: Topic<BeforeEntryCreateRevisionTopicParams>;\n onAfterEntryCreateRevision: Topic<AfterEntryCreateRevisionTopicParams>;\n onBeforeEntryUpdate: Topic<BeforeEntryUpdateTopicParams>;\n onAfterEntryUpdate: Topic<AfterEntryUpdateTopicParams>;\n onBeforeEntryDelete: Topic<BeforeEntryDeleteTopicParams>;\n onAfterEntryDelete: Topic<AfterEntryDeleteTopicParams>;\n onBeforeEntryDeleteRevision: Topic<BeforeEntryDeleteRevisionTopicParams>;\n onAfterEntryDeleteRevision: Topic<AfterEntryDeleteRevisionTopicParams>;\n onBeforeEntryPublish: Topic<BeforeEntryPublishTopicParams>;\n onAfterEntryPublish: Topic<AfterEntryPublishTopicParams>;\n onBeforeEntryUnpublish: Topic<BeforeEntryUnpublishTopicParams>;\n onAfterEntryUnpublish: Topic<AfterEntryUnpublishTopicParams>;\n onBeforeEntryRequestChanges: Topic<BeforeEntryRequestChangesTopicParams>;\n onAfterEntryRequestChanges: Topic<AfterEntryRequestChangesTopicParams>;\n onBeforeEntryRequestReview: Topic<BeforeEntryRequestReviewTopicParams>;\n onAfterEntryRequestReview: Topic<AfterEntryRequestReviewTopicParams>;\n onBeforeEntryGet: Topic<BeforeEntryGetTopicParams>;\n onBeforeEntryList: Topic<BeforeEntryListTopicParams>;\n}\n\n/**\n * Parameters for CmsEntryResolverFactory.\n *\n * @category GraphQL resolver\n * @category CmsEntry\n */\ninterface CmsEntryResolverFactoryParams {\n model: CmsModel;\n}\n\n/**\n * A type for EntryResolvers. Used when creating get, list, update, publish, ...etc.\n *\n * @category GraphQL resolver\n * @category CmsEntry\n */\nexport type CmsEntryResolverFactory<TSource = any, TArgs = any, TContext = CmsContext> = {\n (params: CmsEntryResolverFactoryParams): GraphQLFieldResolver<TSource, TArgs, TContext>;\n};\n\n/**\n * Settings security permission.\n *\n * @category SecurityPermission\n */\nexport interface CmsSettingsPermission extends SecurityPermission {} // eslint-disable-line\n\n/**\n * A base security permission for CMS.\n *\n * @category SecurityPermission\n */\nexport interface BaseCmsSecurityPermission extends SecurityPermission {\n own?: boolean;\n rwd: string | number;\n}\n/**\n * A security permission for content model.\n *\n * @category SecurityPermission\n * @category CmsModel\n */\nexport interface CmsModelPermission extends BaseCmsSecurityPermission {\n /**\n * A object representing `key: model.modelId` values where key is locale code.\n */\n models?: {\n [key: string]: string[];\n };\n /**\n * A object representing `key: group.id` values where key is locale code.\n */\n groups?: {\n [key: string]: string[];\n };\n}\n\n/**\n * The security permission for content model groups.\n *\n * @category SecurityPermission\n * @category CmsGroup\n */\nexport interface CmsGroupPermission extends BaseCmsSecurityPermission {\n /**\n * A object representing `key: group.id` values where key is locale code.\n */\n groups?: {\n [key: string]: string[];\n };\n}\n\n/**\n * The security permission for content entry.\n *\n * @category SecurityPermission\n * @category CmsEntry\n */\nexport interface CmsEntryPermission extends BaseCmsSecurityPermission {\n pw?: string;\n /**\n * A object representing `key: model.modelId` values where key is locale code.\n */\n models?: {\n [key: string]: string[];\n };\n /**\n * A object representing `key: group.id` values where key is locale code.\n */\n groups?: {\n [key: string]: string[];\n };\n}\n\nexport interface CmsGroupStorageOperationsGetParams {\n id: string;\n tenant: string;\n locale: string;\n}\n\nexport interface CmsGroupStorageOperationsListWhereParams {\n tenant: string;\n locale: string;\n [key: string]: any;\n}\nexport interface CmsGroupStorageOperationsListParams {\n where: CmsGroupStorageOperationsListWhereParams;\n sort?: string[];\n}\n\nexport interface CmsGroupStorageOperationsCreateParams {\n group: CmsGroup;\n}\n\nexport interface CmsGroupStorageOperationsUpdateParams {\n group: CmsGroup;\n}\n\nexport interface CmsGroupStorageOperationsDeleteParams {\n group: CmsGroup;\n}\n\n/**\n * Description of the CmsGroup CRUD operations.\n * If user wants to add another database to the application, this is how it is done.\n * This is just plain read, update, write, delete and list - no authentication or permission checks.\n */\nexport interface CmsGroupStorageOperations {\n /**\n * Gets content model group by given id.\n */\n get: (params: CmsGroupStorageOperationsGetParams) => Promise<CmsGroup | null>;\n /**\n * List all content model groups. Filterable via params.\n */\n list: (params: CmsGroupStorageOperationsListParams) => Promise<CmsGroup[]>;\n /**\n * Create a new content model group.\n */\n create: (params: CmsGroupStorageOperationsCreateParams) => Promise<CmsGroup>;\n /**\n * Update existing content model group.\n */\n update: (params: CmsGroupStorageOperationsUpdateParams) => Promise<CmsGroup>;\n /**\n * Delete the content model group.\n */\n delete: (params: CmsGroupStorageOperationsDeleteParams) => Promise<CmsGroup>;\n}\n\nexport interface CmsModelStorageOperationsGetParams {\n tenant: string;\n locale: string;\n modelId: string;\n}\n\nexport interface CmsModelStorageOperationsListWhereParams {\n tenant: string;\n locale: string;\n [key: string]: string;\n}\n\nexport interface CmsModelStorageOperationsListParams {\n where: CmsModelStorageOperationsListWhereParams;\n}\n\nexport interface CmsModelStorageOperationsCreateParams {\n model: CmsModel;\n}\n\nexport interface CmsModelStorageOperationsUpdateParams {\n model: CmsModel;\n}\n\nexport interface CmsModelStorageOperationsDeleteParams {\n model: CmsModel;\n}\n\n/**\n * Description of the CmsModel storage operations.\n * If user wants to add another database to the application, this is how it is done.\n * This is just plain read, update, write, delete and list - no authentication or permission checks.\n */\nexport interface CmsModelStorageOperations {\n /**\n * Gets content model by given id.\n */\n get: (params: CmsModelStorageOperationsGetParams) => Promise<CmsModel | null>;\n /**\n * List all content models. Filterable via params.\n */\n list: (params: CmsModelStorageOperationsListParams) => Promise<CmsModel[]>;\n /**\n * Create a new content model.\n */\n create: (params: CmsModelStorageOperationsCreateParams) => Promise<CmsModel>;\n /**\n * Update existing content model.\n */\n update: (params: CmsModelStorageOperationsUpdateParams) => Promise<CmsModel>;\n /**\n * Delete the content model.\n */\n delete: (params: CmsModelStorageOperationsDeleteParams) => Promise<CmsModel>;\n}\n\nexport interface CmsEntryStorageOperationsGetParams {\n where: CmsEntryListWhere;\n sort?: CmsEntryListSort;\n limit?: number;\n}\n\nexport interface CmsEntryStorageOperationsListParams {\n where: CmsEntryListWhere;\n sort?: CmsEntryListSort;\n search?: string;\n fields?: string[];\n limit?: number;\n after?: string | null;\n}\n\nexport interface CmsEntryStorageOperationsCreateParams<\n T extends CmsStorageEntry = CmsStorageEntry\n> {\n /**\n * Real entry, with no transformations on it.\n */\n entry: CmsEntry;\n /**\n * Entry prepared for the storage.\n */\n storageEntry: T;\n}\n\nexport interface CmsEntryStorageOperationsCreateRevisionFromParams<\n T extends CmsStorageEntry = CmsStorageEntry\n> {\n /**\n * Real entry, with no transformations on it.\n */\n entry: CmsEntry;\n /**\n * Entry prepared for the storage.\n */\n storageEntry: T;\n}\n\nexport interface CmsEntryStorageOperationsUpdateParams<\n T extends CmsStorageEntry = CmsStorageEntry\n> {\n /**\n * Real entry, with no transformations on it.\n */\n entry: CmsEntry;\n /**\n * Entry prepared for the storage.\n */\n storageEntry: T;\n}\n\nexport interface CmsEntryStorageOperationsDeleteRevisionParams<\n T extends CmsStorageEntry = CmsStorageEntry\n> {\n /**\n * Entry that was deleted.\n */\n entry: CmsEntry;\n /**\n * Entry that was deleted, directly from storage, with transformations.\n */\n storageEntry: T;\n /**\n * Entry that was set as latest.\n */\n latestEntry: CmsEntry | null;\n /**\n * Entry that was set as latest, directly from storage, with transformations.\n */\n latestStorageEntry: T | null;\n}\n\nexport interface CmsEntryStorageOperationsDeleteParams {\n /**\n * Entry that is going to be deleted.\n */\n entry: CmsEntry;\n}\n\nexport interface CmsEntryStorageOperationsPublishParams<\n T extends CmsStorageEntry = CmsStorageEntry\n> {\n /**\n * The modified entry that is going to be saved as published.\n * Entry is in its original form.\n */\n entry: CmsEntry;\n /**\n * The modified entry and prepared for the storage.\n */\n storageEntry: T;\n}\n\nexport interface CmsEntryStorageOperationsUnpublishParams<\n T extends CmsStorageEntry = CmsStorageEntry\n> {\n /**\n * The modified entry that is going to be saved as unpublished.\n */\n entry: CmsEntry;\n /**\n * The modified entry that is going to be saved as unpublished, with transformations on it.\n */\n storageEntry: T;\n}\n\nexport interface CmsEntryStorageOperationsRequestChangesParams<\n T extends CmsStorageEntry = CmsStorageEntry\n> {\n /**\n * Entry data updated with the required properties.\n */\n entry: CmsEntry;\n /**\n * Entry that is prepared for the storageOperations, with the transformations.\n */\n storageEntry: T;\n}\n\nexport interface CmsEntryStorageOperationsRequestReviewParams<\n T extends CmsStorageEntry = CmsStorageEntry\n> {\n /**\n * Entry that is prepared for the storageOperations.\n */\n entry: CmsEntry;\n /**\n * Entry that is prepared for the storageOperations, with the transformations.\n */\n storageEntry: T;\n}\n\nexport interface CmsEntryStorageOperationsGetByIdsParams {\n ids: readonly string[];\n}\n\nexport interface CmsEntryStorageOperationsGetLatestByIdsParams {\n ids: readonly string[];\n}\n\nexport interface CmsEntryStorageOperationsGetPublishedByIdsParams {\n ids: readonly string[];\n}\n\nexport interface CmsEntryStorageOperationsGetRevisionsParams {\n id: string;\n}\n\nexport interface CmsEntryStorageOperationsGetRevisionParams {\n id: string;\n}\n\nexport interface CmsEntryStorageOperationsGetPublishedRevisionParams {\n id: string;\n}\nexport interface CmsEntryStorageOperationsGetLatestRevisionParams {\n id: string;\n}\n\nexport interface CmsEntryStorageOperationsGetPreviousRevisionParams {\n entryId: string;\n version: number;\n}\n\nexport interface CmsEntryStorageOperationsListResponse<\n T extends CmsStorageEntry = CmsStorageEntry\n> {\n /**\n * Has more items to load with the current filtering?\n */\n hasMoreItems: boolean;\n /**\n * Items loaded with current filtering.\n */\n items: T[];\n /**\n * Pointer for where to start the new item set.\n */\n cursor: string | null;\n /**\n * Total amount of items with the current filter.\n */\n totalCount: number;\n}\n\n/**\n * Description of the CmsModel storage operations.\n * If user wants to add another database to the application, this is how it is done.\n * This is just plain read, update, write, delete and list - no authentication or permission checks.\n *\n *\n * @category StorageOperations\n * @category CmsEntry\n */\nexport interface CmsEntryStorageOperations<T extends CmsStorageEntry = CmsStorageEntry> {\n /**\n * Get all the entries of the ids.\n */\n getByIds: (model: CmsModel, params: CmsEntryStorageOperationsGetByIdsParams) => Promise<T[]>;\n /**\n * Get all the published entries of the ids.\n */\n getPublishedByIds: (\n model: CmsModel,\n params: CmsEntryStorageOperationsGetPublishedByIdsParams\n ) => Promise<T[]>;\n /**\n * Get all the latest entries of the ids.\n */\n getLatestByIds: (\n model: CmsModel,\n params: CmsEntryStorageOperationsGetLatestByIdsParams\n ) => Promise<T[]>;\n /**\n * Get all revisions of the given entry id.\n */\n getRevisions: (\n model: CmsModel,\n params: CmsEntryStorageOperationsGetRevisionsParams\n ) => Promise<T[]>;\n /**\n * Get all revisions of all of the given IDs.\n */\n // getAllRevisionsByIds: (\n // model: CmsModel,\n // params: CmsEntryStorageOperationsGetAllRevisionsParams\n // ) => Promise<T[]>;\n /**\n * Get the entry by the given revision id.\n */\n getRevisionById: (\n model: CmsModel,\n params: CmsEntryStorageOperationsGetRevisionParams\n ) => Promise<T | null>;\n /**\n * Get the published entry by given entryId.\n */\n getPublishedRevisionByEntryId: (\n model: CmsModel,\n params: CmsEntryStorageOperationsGetPublishedRevisionParams\n ) => Promise<T | null>;\n /**\n * Get the latest entry by given entryId.\n */\n getLatestRevisionByEntryId: (\n model: CmsModel,\n params: CmsEntryStorageOperationsGetLatestRevisionParams\n ) => Promise<T | null>;\n /**\n * Get the revision of the entry before given one.\n */\n getPreviousRevision: (\n model: CmsModel,\n params: CmsEntryStorageOperationsGetPreviousRevisionParams\n ) => Promise<T | null>;\n /**\n * Gets entry by given params.\n */\n get: (model: CmsModel, params: CmsEntryStorageOperationsGetParams) => Promise<T | null>;\n /**\n * List all entries. Filterable via params.\n */\n list: (\n model: CmsModel,\n params: CmsEntryStorageOperationsListParams\n ) => Promise<CmsEntryStorageOperationsListResponse<T>>;\n /**\n * Create a new entry.\n */\n create: (model: CmsModel, params: CmsEntryStorageOperationsCreateParams<T>) => Promise<T>;\n /**\n * Create a new entry from existing one.\n */\n createRevisionFrom: (\n model: CmsModel,\n params: CmsEntryStorageOperationsCreateRevisionFromParams<T>\n ) => Promise<T>;\n /**\n * Update existing entry.\n */\n update: (model: CmsModel, params: CmsEntryStorageOperationsUpdateParams<T>) => Promise<T>;\n /**\n * Delete the entry revision.\n */\n deleteRevision: (\n model: CmsModel,\n params: CmsEntryStorageOperationsDeleteRevisionParams<T>\n ) => Promise<void>;\n /**\n * Delete the entry.\n */\n delete: (model: CmsModel, params: CmsEntryStorageOperationsDeleteParams) => Promise<void>;\n /**\n * Publish the entry.\n */\n publish: (model: CmsModel, params: CmsEntryStorageOperationsPublishParams<T>) => Promise<T>;\n /**\n * Unpublish the entry.\n */\n unpublish: (model: CmsModel, params: CmsEntryStorageOperationsUnpublishParams<T>) => Promise<T>;\n /**\n * Request changes the entry.\n */\n requestChanges: (\n model: CmsModel,\n params: CmsEntryStorageOperationsRequestChangesParams<T>\n ) => Promise<T>;\n /**\n * Request review the entry.\n */\n requestReview: (\n model: CmsModel,\n params: CmsEntryStorageOperationsRequestReviewParams<T>\n ) => Promise<CmsEntry>;\n}\n\nexport enum CONTENT_ENTRY_STATUS {\n DRAFT = \"draft\",\n PUBLISHED = \"published\",\n UNPUBLISHED = \"unpublished\",\n CHANGES_REQUESTED = \"changesRequested\",\n REVIEW_REQUESTED = \"reviewRequested\"\n}\n\nexport interface CmsSettingsStorageOperationsGetParams {\n locale: string;\n tenant: string;\n}\n\nexport interface CmsSettingsStorageOperationsCreateParams {\n settings: CmsSettings;\n}\n\nexport interface CmsSettingsStorageOperationsUpdateParams {\n settings: CmsSettings;\n}\n\nexport interface CmsSettingsStorageOperations {\n /**\n * Get the settings from the storage.\n */\n get: (params: CmsSettingsStorageOperationsGetParams) => Promise<CmsSettings | null>;\n /**\n * Create settings in the storage.\n */\n create: (params: CmsSettingsStorageOperationsCreateParams) => Promise<CmsSettings>;\n /**\n * Update the settings in the storage.\n */\n update: (params: CmsSettingsStorageOperationsUpdateParams) => Promise<CmsSettings>;\n}\n\nexport interface CmsSystem {\n version?: string;\n readAPIKey?: string;\n /**\n * System tenant.\n */\n tenant: string;\n}\n\nexport interface CmsSystemStorageOperationsGetParams {\n tenant: string;\n}\n\nexport interface CmsSystemStorageOperationsCreateParams {\n system: CmsSystem;\n}\n\nexport interface CmsSystemStorageOperationsUpdateParams {\n system: CmsSystem;\n}\n\nexport interface CmsSystemStorageOperations {\n /**\n * Get the system data.\n */\n get: (params: CmsSystemStorageOperationsGetParams) => Promise<CmsSystem | null>;\n /**\n * Create the system info in the storage.\n */\n create: (params: CmsSystemStorageOperationsCreateParams) => Promise<CmsSystem>;\n /**\n * Update the system info in the storage.\n */\n update: (params: CmsSystemStorageOperationsUpdateParams) => Promise<CmsSystem>;\n}\n\nexport interface HeadlessCmsStorageOperations {\n system: CmsSystemStorageOperations;\n settings: CmsSettingsStorageOperations;\n groups: CmsGroupStorageOperations;\n models: CmsModelStorageOperations;\n entries: CmsEntryStorageOperations;\n /**\n * Either attach something from the storage operations or run something in it.\n */\n beforeInit?: (context: CmsContext) => Promise<void>;\n init?: (context: CmsContext) => Promise<void>;\n /**\n * An upgrade to run if necessary.\n */\n upgrade?: UpgradePlugin | null;\n}\n"]}