@webiny/api-headless-cms 5.39.1 → 5.39.2-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/context.js +14 -26
  2. package/context.js.map +1 -1
  3. package/crud/AccessControl/AccessControl.d.ts +98 -0
  4. package/crud/AccessControl/AccessControl.js +542 -0
  5. package/crud/AccessControl/AccessControl.js.map +1 -0
  6. package/crud/AccessControl/README.md +47 -0
  7. package/crud/AccessControl/groups-own.png +0 -0
  8. package/crud/AccessControl/models-own.png +0 -0
  9. package/crud/contentEntry/entryDataFactories/createEntryData.d.ts +3 -3
  10. package/crud/contentEntry/entryDataFactories/createEntryData.js +21 -3
  11. package/crud/contentEntry/entryDataFactories/createEntryData.js.map +1 -1
  12. package/crud/contentEntry/entryDataFactories/createEntryRevisionFromData.d.ts +3 -1
  13. package/crud/contentEntry/entryDataFactories/createEntryRevisionFromData.js +54 -11
  14. package/crud/contentEntry/entryDataFactories/createEntryRevisionFromData.js.map +1 -1
  15. package/crud/contentEntry.crud.d.ts +2 -4
  16. package/crud/contentEntry.crud.js +106 -113
  17. package/crud/contentEntry.crud.js.map +1 -1
  18. package/crud/contentModel.crud.d.ts +2 -2
  19. package/crud/contentModel.crud.js +45 -31
  20. package/crud/contentModel.crud.js.map +1 -1
  21. package/crud/contentModelGroup.crud.d.ts +2 -2
  22. package/crud/contentModelGroup.crud.js +17 -28
  23. package/crud/contentModelGroup.crud.js.map +1 -1
  24. package/index.d.ts +2 -1
  25. package/index.js +24 -12
  26. package/index.js.map +1 -1
  27. package/package.json +19 -19
  28. package/plugins/CmsModelPlugin.d.ts +1 -1
  29. package/plugins/CmsModelPlugin.js +4 -3
  30. package/plugins/CmsModelPlugin.js.map +1 -1
  31. package/types.d.ts +12 -10
  32. package/types.js.map +1 -1
  33. package/utils/createModelField.d.ts +5 -0
  34. package/utils/createModelField.js +41 -0
  35. package/utils/createModelField.js.map +1 -0
  36. package/utils/isHeadlessCmsReady.d.ts +2 -0
  37. package/utils/isHeadlessCmsReady.js +23 -0
  38. package/utils/isHeadlessCmsReady.js.map +1 -0
  39. package/utils/access.d.ts +0 -9
  40. package/utils/access.js +0 -26
  41. package/utils/access.js.map +0 -1
  42. package/utils/permissions/EntriesPermissions.d.ts +0 -4
  43. package/utils/permissions/EntriesPermissions.js +0 -11
  44. package/utils/permissions/EntriesPermissions.js.map +0 -1
  45. package/utils/permissions/ModelGroupsPermissions.d.ts +0 -9
  46. package/utils/permissions/ModelGroupsPermissions.js +0 -50
  47. package/utils/permissions/ModelGroupsPermissions.js.map +0 -1
  48. package/utils/permissions/ModelsPermissions.d.ts +0 -22
  49. package/utils/permissions/ModelsPermissions.js +0 -90
  50. package/utils/permissions/ModelsPermissions.js.map +0 -1
@@ -2,7 +2,7 @@ import { CmsContext, CmsEntry, CmsModel, CreateCmsEntryInput, CreateCmsEntryOpti
2
2
  import { I18NLocale } from "@webiny/api-i18n/types";
3
3
  import { SecurityIdentity } from "@webiny/api-security/types";
4
4
  import { Tenant } from "@webiny/api-tenancy/types";
5
- import { EntriesPermissions } from "../../../utils/permissions/EntriesPermissions";
5
+ import { AccessControl } from "../../AccessControl/AccessControl";
6
6
  declare type CreateEntryDataParams = {
7
7
  model: CmsModel;
8
8
  rawInput: CreateCmsEntryInput;
@@ -11,9 +11,9 @@ declare type CreateEntryDataParams = {
11
11
  getIdentity: () => SecurityIdentity;
12
12
  getTenant: () => Tenant;
13
13
  getLocale: () => I18NLocale;
14
- entriesPermissions: EntriesPermissions;
14
+ accessControl: AccessControl;
15
15
  };
16
- export declare const createEntryData: ({ model, rawInput, options, context, getIdentity: getSecurityIdentity, getLocale, getTenant, entriesPermissions }: CreateEntryDataParams) => Promise<{
16
+ export declare const createEntryData: ({ model, rawInput, options, context, getIdentity: getSecurityIdentity, getLocale, getTenant, accessControl }: CreateEntryDataParams) => Promise<{
17
17
  entry: CmsEntry;
18
18
  input: Record<string, any>;
19
19
  }>;
@@ -21,7 +21,7 @@ const createEntryData = async ({
21
21
  getIdentity: getSecurityIdentity,
22
22
  getLocale,
23
23
  getTenant,
24
- entriesPermissions
24
+ accessControl
25
25
  }) => {
26
26
  const initialInput = mapAndCleanCreateInputData(model, rawInput);
27
27
  await (0, _entryDataValidation.validateModelEntryDataOrThrow)({
@@ -58,12 +58,14 @@ const createEntryData = async ({
58
58
  const status = rawInput.status || _statuses.STATUS_DRAFT;
59
59
  if (status !== _statuses.STATUS_DRAFT) {
60
60
  if (status === _statuses.STATUS_PUBLISHED) {
61
- await entriesPermissions.ensure({
61
+ await accessControl.ensureCanAccessEntry({
62
+ model,
62
63
  pw: "p"
63
64
  });
64
65
  } else if (status === _statuses.STATUS_UNPUBLISHED) {
65
66
  // If setting the status other than draft, we have to check if the user has permissions to publish.
66
- await entriesPermissions.ensure({
67
+ await accessControl.ensureCanAccessEntry({
68
+ model,
67
69
  pw: "u"
68
70
  });
69
71
  }
@@ -130,6 +132,22 @@ const createEntryData = async ({
130
132
  folderId: rawInput.wbyAco_location?.folderId || _constants.ROOT_FOLDER
131
133
  }
132
134
  };
135
+ if (status !== _statuses.STATUS_DRAFT) {
136
+ if (status === _statuses.STATUS_PUBLISHED) {
137
+ await accessControl.ensureCanAccessEntry({
138
+ model,
139
+ entry,
140
+ pw: "p"
141
+ });
142
+ } else if (status === _statuses.STATUS_UNPUBLISHED) {
143
+ // If setting the status other than draft, we have to check if the user has permissions to publish.
144
+ await accessControl.ensureCanAccessEntry({
145
+ model,
146
+ entry,
147
+ pw: "u"
148
+ });
149
+ }
150
+ }
133
151
  return {
134
152
  entry,
135
153
  input
@@ -1 +1 @@
1
- {"version":3,"names":["_date","require","_constants","_error","_interopRequireDefault","_entryDataValidation","_referenceFieldsMapping","_utils","_statuses","_identity","createEntryData","model","rawInput","options","context","getIdentity","getSecurityIdentity","getLocale","getTenant","entriesPermissions","initialInput","mapAndCleanCreateInputData","validateModelEntryDataOrThrow","data","skipValidators","input","referenceFieldsMapping","validateEntries","locale","id","entryId","version","createEntryId","currentIdentity","currentDateTime","Date","status","STATUS_DRAFT","STATUS_PUBLISHED","ensure","pw","STATUS_UNPUBLISHED","locked","revisionLevelPublishingMetaFields","revisionFirstPublishedOn","revisionLastPublishedOn","revisionFirstPublishedBy","revisionLastPublishedBy","entryLevelPublishingMetaFields","firstPublishedOn","lastPublishedOn","firstPublishedBy","lastPublishedBy","getDate","entry","webinyVersion","WEBINY_VERSION","tenant","modelId","code","createdOn","modifiedOn","savedOn","createdBy","modifiedBy","savedBy","revisionCreatedOn","revisionModifiedOn","revisionSavedOn","revisionCreatedBy","revisionModifiedBy","revisionSavedBy","values","location","folderId","wbyAco_location","ROOT_FOLDER","exports","convertDefaultValue","field","value","type","Boolean","Number","getDefaultValue","settings","multipleValues","defaultValue","undefined","predefinedValues","enabled","Array","isArray","selectedValue","find","selected","filter","map","fields","reduce","acc","fieldId","WebinyError","mdbid","match","createIdentifier"],"sources":["createEntryData.ts"],"sourcesContent":["import {\n CmsContext,\n CmsEntry,\n CmsModel,\n CmsModelField,\n CreateCmsEntryInput,\n CreateCmsEntryOptionsInput\n} from \"~/types\";\nimport { getDate } from \"~/utils/date\";\nimport { ROOT_FOLDER } from \"~/constants\";\nimport WebinyError from \"@webiny/error\";\nimport { validateModelEntryDataOrThrow } from \"~/crud/contentEntry/entryDataValidation\";\nimport { referenceFieldsMapping } from \"~/crud/contentEntry/referenceFieldsMapping\";\nimport { createIdentifier, mdbid } from \"@webiny/utils\";\nimport { STATUS_DRAFT, STATUS_PUBLISHED, STATUS_UNPUBLISHED } from \"./statuses\";\nimport { I18NLocale } from \"@webiny/api-i18n/types\";\nimport { SecurityIdentity } from \"@webiny/api-security/types\";\nimport { Tenant } from \"@webiny/api-tenancy/types\";\nimport { EntriesPermissions } from \"~/utils/permissions/EntriesPermissions\";\nimport { getIdentity } from \"~/utils/identity\";\n\ntype DefaultValue = boolean | number | string | null;\n\ntype CreateEntryDataParams = {\n model: CmsModel;\n rawInput: CreateCmsEntryInput;\n options?: CreateCmsEntryOptionsInput;\n context: CmsContext;\n getIdentity: () => SecurityIdentity;\n getTenant: () => Tenant;\n getLocale: () => I18NLocale;\n entriesPermissions: EntriesPermissions;\n};\n\nexport const createEntryData = async ({\n model,\n rawInput,\n options,\n context,\n getIdentity: getSecurityIdentity,\n getLocale,\n getTenant,\n entriesPermissions\n}: CreateEntryDataParams): Promise<{\n entry: CmsEntry;\n input: Record<string, any>;\n}> => {\n const initialInput = mapAndCleanCreateInputData(model, rawInput);\n\n await validateModelEntryDataOrThrow({\n context,\n model,\n data: initialInput,\n skipValidators: options?.skipValidators\n });\n\n const input = await referenceFieldsMapping({\n context,\n model,\n input: initialInput,\n validateEntries: true\n });\n\n const locale = getLocale();\n\n const { id, entryId, version } = createEntryId(rawInput);\n\n /**\n * There is a possibility that user sends an ID in the input, so we will use that one.\n * There is no check if the ID is unique or not, that is up to the user.\n */\n const currentIdentity = getSecurityIdentity();\n const currentDateTime = new Date();\n\n /**\n * Users can set the initial status of the entry. If so, we need to make\n * sure they have the required permissions and also that all the fields\n * are filled in correctly.\n */\n const status = rawInput.status || STATUS_DRAFT;\n if (status !== STATUS_DRAFT) {\n if (status === STATUS_PUBLISHED) {\n await entriesPermissions.ensure({ pw: \"p\" });\n } else if (status === STATUS_UNPUBLISHED) {\n // If setting the status other than draft, we have to check if the user has permissions to publish.\n await entriesPermissions.ensure({ pw: \"u\" });\n }\n }\n\n const locked = status !== STATUS_DRAFT;\n\n let revisionLevelPublishingMetaFields: Pick<\n CmsEntry,\n | \"revisionFirstPublishedOn\"\n | \"revisionLastPublishedOn\"\n | \"revisionFirstPublishedBy\"\n | \"revisionLastPublishedBy\"\n > = {\n revisionFirstPublishedOn: null,\n revisionLastPublishedOn: null,\n revisionFirstPublishedBy: null,\n revisionLastPublishedBy: null\n };\n\n let entryLevelPublishingMetaFields: Pick<\n CmsEntry,\n \"firstPublishedOn\" | \"lastPublishedOn\" | \"firstPublishedBy\" | \"lastPublishedBy\"\n > = {\n firstPublishedOn: null,\n lastPublishedOn: null,\n firstPublishedBy: null,\n lastPublishedBy: null\n };\n\n if (status === STATUS_PUBLISHED) {\n revisionLevelPublishingMetaFields = {\n revisionFirstPublishedOn: getDate(rawInput.revisionFirstPublishedOn, currentDateTime),\n revisionLastPublishedOn: getDate(rawInput.revisionLastPublishedOn, currentDateTime),\n revisionFirstPublishedBy: getIdentity(\n rawInput.revisionFirstPublishedBy,\n currentIdentity\n ),\n revisionLastPublishedBy: getIdentity(rawInput.revisionLastPublishedBy, currentIdentity)\n };\n\n entryLevelPublishingMetaFields = {\n firstPublishedOn: getDate(rawInput.firstPublishedOn, currentDateTime),\n lastPublishedOn: getDate(rawInput.lastPublishedOn, currentDateTime),\n firstPublishedBy: getIdentity(rawInput.firstPublishedBy, currentIdentity),\n lastPublishedBy: getIdentity(rawInput.lastPublishedBy, currentIdentity)\n };\n }\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\n /**\n * Entry-level meta fields. 👇\n */\n createdOn: getDate(rawInput.createdOn, currentDateTime),\n modifiedOn: getDate(rawInput.modifiedOn, null),\n savedOn: getDate(rawInput.savedOn, currentDateTime),\n createdBy: getIdentity(rawInput.createdBy, currentIdentity),\n modifiedBy: getIdentity(rawInput.modifiedBy, null),\n savedBy: getIdentity(rawInput.savedBy, currentIdentity),\n ...entryLevelPublishingMetaFields,\n\n /**\n * Revision-level meta fields. 👇\n */\n revisionCreatedOn: getDate(rawInput.revisionCreatedOn, currentDateTime),\n revisionModifiedOn: getDate(rawInput.revisionModifiedOn, null),\n revisionSavedOn: getDate(rawInput.revisionSavedOn, currentDateTime),\n revisionCreatedBy: getIdentity(rawInput.revisionCreatedBy, currentIdentity),\n revisionModifiedBy: getIdentity(rawInput.revisionModifiedBy, null),\n revisionSavedBy: getIdentity(rawInput.revisionSavedBy, currentIdentity),\n ...revisionLevelPublishingMetaFields,\n\n version,\n status,\n locked,\n values: input,\n location: {\n folderId: rawInput.wbyAco_location?.folderId || ROOT_FOLDER\n }\n };\n\n return { entry, input };\n};\n\n/**\n * Used for some fields to convert their values.\n */\nconst convertDefaultValue = (field: CmsModelField, value: DefaultValue): DefaultValue => {\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};\n\nconst getDefaultValue = (field: CmsModelField): (DefaultValue | DefaultValue[]) | undefined => {\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/**\n * Cleans and adds default values to create input data.\n */\nconst mapAndCleanCreateInputData = (model: CmsModel, input: CreateCmsEntryInput) => {\n return model.fields.reduce<CreateCmsEntryInput>((acc, field) => {\n /**\n * This should never happen, but let's make it sure.\n * The fix would be for the user to add the fieldId on the field definition.\n */\n if (!field.fieldId) {\n throw new WebinyError(\"Field does not have an fieldId.\", \"MISSING_FIELD_ID\", {\n field\n });\n }\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 }, {});\n};\n\nconst createEntryId = (input: CreateCmsEntryInput) => {\n let entryId = mdbid();\n if (input.id) {\n if (input.id.match(/^([a-zA-Z0-9])([a-zA-Z0-9\\-]+)([a-zA-Z0-9])$/) === null) {\n throw new WebinyError(\n \"The provided ID is not valid. It must be a string which can be A-Z, a-z, 0-9, - and it cannot start or end with a -.\",\n \"INVALID_ID\",\n {\n id: input.id\n }\n );\n }\n entryId = input.id;\n }\n const version = 1;\n return {\n entryId,\n version,\n id: createIdentifier({\n id: entryId,\n version\n })\n };\n};\n"],"mappings":"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"}
1
+ {"version":3,"names":["_date","require","_constants","_error","_interopRequireDefault","_entryDataValidation","_referenceFieldsMapping","_utils","_statuses","_identity","createEntryData","model","rawInput","options","context","getIdentity","getSecurityIdentity","getLocale","getTenant","accessControl","initialInput","mapAndCleanCreateInputData","validateModelEntryDataOrThrow","data","skipValidators","input","referenceFieldsMapping","validateEntries","locale","id","entryId","version","createEntryId","currentIdentity","currentDateTime","Date","status","STATUS_DRAFT","STATUS_PUBLISHED","ensureCanAccessEntry","pw","STATUS_UNPUBLISHED","locked","revisionLevelPublishingMetaFields","revisionFirstPublishedOn","revisionLastPublishedOn","revisionFirstPublishedBy","revisionLastPublishedBy","entryLevelPublishingMetaFields","firstPublishedOn","lastPublishedOn","firstPublishedBy","lastPublishedBy","getDate","entry","webinyVersion","WEBINY_VERSION","tenant","modelId","code","createdOn","modifiedOn","savedOn","createdBy","modifiedBy","savedBy","revisionCreatedOn","revisionModifiedOn","revisionSavedOn","revisionCreatedBy","revisionModifiedBy","revisionSavedBy","values","location","folderId","wbyAco_location","ROOT_FOLDER","exports","convertDefaultValue","field","value","type","Boolean","Number","getDefaultValue","settings","multipleValues","defaultValue","undefined","predefinedValues","enabled","Array","isArray","selectedValue","find","selected","filter","map","fields","reduce","acc","fieldId","WebinyError","mdbid","match","createIdentifier"],"sources":["createEntryData.ts"],"sourcesContent":["import {\n CmsContext,\n CmsEntry,\n CmsModel,\n CmsModelField,\n CreateCmsEntryInput,\n CreateCmsEntryOptionsInput\n} from \"~/types\";\nimport { getDate } from \"~/utils/date\";\nimport { ROOT_FOLDER } from \"~/constants\";\nimport WebinyError from \"@webiny/error\";\nimport { validateModelEntryDataOrThrow } from \"~/crud/contentEntry/entryDataValidation\";\nimport { referenceFieldsMapping } from \"~/crud/contentEntry/referenceFieldsMapping\";\nimport { createIdentifier, mdbid } from \"@webiny/utils\";\nimport { STATUS_DRAFT, STATUS_PUBLISHED, STATUS_UNPUBLISHED } from \"./statuses\";\nimport { I18NLocale } from \"@webiny/api-i18n/types\";\nimport { SecurityIdentity } from \"@webiny/api-security/types\";\nimport { Tenant } from \"@webiny/api-tenancy/types\";\nimport { getIdentity } from \"~/utils/identity\";\nimport { AccessControl } from \"~/crud/AccessControl/AccessControl\";\n\ntype DefaultValue = boolean | number | string | null;\n\ntype CreateEntryDataParams = {\n model: CmsModel;\n rawInput: CreateCmsEntryInput;\n options?: CreateCmsEntryOptionsInput;\n context: CmsContext;\n getIdentity: () => SecurityIdentity;\n getTenant: () => Tenant;\n getLocale: () => I18NLocale;\n accessControl: AccessControl;\n};\n\nexport const createEntryData = async ({\n model,\n rawInput,\n options,\n context,\n getIdentity: getSecurityIdentity,\n getLocale,\n getTenant,\n accessControl\n}: CreateEntryDataParams): Promise<{\n entry: CmsEntry;\n input: Record<string, any>;\n}> => {\n const initialInput = mapAndCleanCreateInputData(model, rawInput);\n\n await validateModelEntryDataOrThrow({\n context,\n model,\n data: initialInput,\n skipValidators: options?.skipValidators\n });\n\n const input = await referenceFieldsMapping({\n context,\n model,\n input: initialInput,\n validateEntries: true\n });\n\n const locale = getLocale();\n\n const { id, entryId, version } = createEntryId(rawInput);\n\n /**\n * There is a possibility that user sends an ID in the input, so we will use that one.\n * There is no check if the ID is unique or not, that is up to the user.\n */\n const currentIdentity = getSecurityIdentity();\n const currentDateTime = new Date();\n\n /**\n * Users can set the initial status of the entry. If so, we need to make\n * sure they have the required permissions and also that all the fields\n * are filled in correctly.\n */\n const status = rawInput.status || STATUS_DRAFT;\n if (status !== STATUS_DRAFT) {\n if (status === STATUS_PUBLISHED) {\n await accessControl.ensureCanAccessEntry({ model, pw: \"p\" });\n } else if (status === STATUS_UNPUBLISHED) {\n // If setting the status other than draft, we have to check if the user has permissions to publish.\n await accessControl.ensureCanAccessEntry({ model, pw: \"u\" });\n }\n }\n\n const locked = status !== STATUS_DRAFT;\n\n let revisionLevelPublishingMetaFields: Pick<\n CmsEntry,\n | \"revisionFirstPublishedOn\"\n | \"revisionLastPublishedOn\"\n | \"revisionFirstPublishedBy\"\n | \"revisionLastPublishedBy\"\n > = {\n revisionFirstPublishedOn: null,\n revisionLastPublishedOn: null,\n revisionFirstPublishedBy: null,\n revisionLastPublishedBy: null\n };\n\n let entryLevelPublishingMetaFields: Pick<\n CmsEntry,\n \"firstPublishedOn\" | \"lastPublishedOn\" | \"firstPublishedBy\" | \"lastPublishedBy\"\n > = {\n firstPublishedOn: null,\n lastPublishedOn: null,\n firstPublishedBy: null,\n lastPublishedBy: null\n };\n\n if (status === STATUS_PUBLISHED) {\n revisionLevelPublishingMetaFields = {\n revisionFirstPublishedOn: getDate(rawInput.revisionFirstPublishedOn, currentDateTime),\n revisionLastPublishedOn: getDate(rawInput.revisionLastPublishedOn, currentDateTime),\n revisionFirstPublishedBy: getIdentity(\n rawInput.revisionFirstPublishedBy,\n currentIdentity\n ),\n revisionLastPublishedBy: getIdentity(rawInput.revisionLastPublishedBy, currentIdentity)\n };\n\n entryLevelPublishingMetaFields = {\n firstPublishedOn: getDate(rawInput.firstPublishedOn, currentDateTime),\n lastPublishedOn: getDate(rawInput.lastPublishedOn, currentDateTime),\n firstPublishedBy: getIdentity(rawInput.firstPublishedBy, currentIdentity),\n lastPublishedBy: getIdentity(rawInput.lastPublishedBy, currentIdentity)\n };\n }\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\n /**\n * Entry-level meta fields. 👇\n */\n createdOn: getDate(rawInput.createdOn, currentDateTime),\n modifiedOn: getDate(rawInput.modifiedOn, null),\n savedOn: getDate(rawInput.savedOn, currentDateTime),\n createdBy: getIdentity(rawInput.createdBy, currentIdentity),\n modifiedBy: getIdentity(rawInput.modifiedBy, null),\n savedBy: getIdentity(rawInput.savedBy, currentIdentity),\n ...entryLevelPublishingMetaFields,\n\n /**\n * Revision-level meta fields. 👇\n */\n revisionCreatedOn: getDate(rawInput.revisionCreatedOn, currentDateTime),\n revisionModifiedOn: getDate(rawInput.revisionModifiedOn, null),\n revisionSavedOn: getDate(rawInput.revisionSavedOn, currentDateTime),\n revisionCreatedBy: getIdentity(rawInput.revisionCreatedBy, currentIdentity),\n revisionModifiedBy: getIdentity(rawInput.revisionModifiedBy, null),\n revisionSavedBy: getIdentity(rawInput.revisionSavedBy, currentIdentity),\n ...revisionLevelPublishingMetaFields,\n\n version,\n status,\n locked,\n values: input,\n location: {\n folderId: rawInput.wbyAco_location?.folderId || ROOT_FOLDER\n }\n };\n\n if (status !== STATUS_DRAFT) {\n if (status === STATUS_PUBLISHED) {\n await accessControl.ensureCanAccessEntry({ model, entry, pw: \"p\" });\n } else if (status === STATUS_UNPUBLISHED) {\n // If setting the status other than draft, we have to check if the user has permissions to publish.\n await accessControl.ensureCanAccessEntry({ model, entry, pw: \"u\" });\n }\n }\n\n return { entry, input };\n};\n\n/**\n * Used for some fields to convert their values.\n */\nconst convertDefaultValue = (field: CmsModelField, value: DefaultValue): DefaultValue => {\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};\n\nconst getDefaultValue = (field: CmsModelField): (DefaultValue | DefaultValue[]) | undefined => {\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/**\n * Cleans and adds default values to create input data.\n */\nconst mapAndCleanCreateInputData = (model: CmsModel, input: CreateCmsEntryInput) => {\n return model.fields.reduce<CreateCmsEntryInput>((acc, field) => {\n /**\n * This should never happen, but let's make it sure.\n * The fix would be for the user to add the fieldId on the field definition.\n */\n if (!field.fieldId) {\n throw new WebinyError(\"Field does not have an fieldId.\", \"MISSING_FIELD_ID\", {\n field\n });\n }\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 }, {});\n};\n\nconst createEntryId = (input: CreateCmsEntryInput) => {\n let entryId = mdbid();\n if (input.id) {\n if (input.id.match(/^([a-zA-Z0-9])([a-zA-Z0-9\\-]+)([a-zA-Z0-9])$/) === null) {\n throw new WebinyError(\n \"The provided ID is not valid. It must be a string which can be A-Z, a-z, 0-9, - and it cannot start or end with a -.\",\n \"INVALID_ID\",\n {\n id: input.id\n }\n );\n }\n entryId = input.id;\n }\n const version = 1;\n return {\n entryId,\n version,\n id: createIdentifier({\n id: entryId,\n version\n })\n };\n};\n"],"mappings":"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"}
@@ -2,6 +2,7 @@ import { CmsContext, CmsEntry, CmsModel, CreateCmsEntryInput, CreateCmsEntryOpti
2
2
  import { SecurityIdentity } from "@webiny/api-security/types";
3
3
  import { Tenant } from "@webiny/api-tenancy/types";
4
4
  import { I18NLocale } from "@webiny/api-i18n/types";
5
+ import { AccessControl } from "../../AccessControl/AccessControl";
5
6
  declare type CreateEntryRevisionFromDataParams = {
6
7
  sourceId: string;
7
8
  model: CmsModel;
@@ -13,8 +14,9 @@ declare type CreateEntryRevisionFromDataParams = {
13
14
  getLocale: () => I18NLocale;
14
15
  originalEntry: CmsEntry;
15
16
  latestStorageEntry: CmsEntry;
17
+ accessControl: AccessControl;
16
18
  };
17
- export declare const createEntryRevisionFromData: ({ sourceId, model, rawInput, options, context, getIdentity: getSecurityIdentity, originalEntry, latestStorageEntry }: CreateEntryRevisionFromDataParams) => Promise<{
19
+ export declare const createEntryRevisionFromData: ({ sourceId, model, rawInput, options, context, getIdentity: getSecurityIdentity, originalEntry, latestStorageEntry, accessControl }: CreateEntryRevisionFromDataParams) => Promise<{
18
20
  entry: CmsEntry;
19
21
  input: Record<string, any>;
20
22
  }>;
@@ -21,7 +21,8 @@ const createEntryRevisionFromData = async ({
21
21
  context,
22
22
  getIdentity: getSecurityIdentity,
23
23
  originalEntry,
24
- latestStorageEntry
24
+ latestStorageEntry,
25
+ accessControl
25
26
  }) => {
26
27
  /**
27
28
  * Make sure we only work with fields that are defined in the model.
@@ -51,6 +52,54 @@ const createEntryRevisionFromData = async ({
51
52
  } = increaseEntryIdVersion(latestId);
52
53
  const currentIdentity = getSecurityIdentity();
53
54
  const currentDateTime = new Date();
55
+
56
+ /**
57
+ * Users can set the initial status of the entry. If so, we need to make
58
+ * sure they have the required permissions and also that all the fields
59
+ * are filled in correctly.
60
+ */
61
+ const status = rawInput.status || _statuses.STATUS_DRAFT;
62
+ if (status !== _statuses.STATUS_DRAFT) {
63
+ if (status === _statuses.STATUS_PUBLISHED) {
64
+ await accessControl.ensureCanAccessEntry({
65
+ model,
66
+ pw: "p"
67
+ });
68
+ } else if (status === _statuses.STATUS_UNPUBLISHED) {
69
+ // If setting the status other than draft, we have to check if the user has permissions to publish.
70
+ await accessControl.ensureCanAccessEntry({
71
+ model,
72
+ pw: "u"
73
+ });
74
+ }
75
+ }
76
+ const locked = status !== _statuses.STATUS_DRAFT;
77
+ let revisionLevelPublishingMetaFields = {
78
+ revisionFirstPublishedOn: (0, _date.getDate)(rawInput.revisionFirstPublishedOn, null),
79
+ revisionLastPublishedOn: (0, _date.getDate)(rawInput.revisionLastPublishedOn, null),
80
+ revisionFirstPublishedBy: (0, _identity.getIdentity)(rawInput.revisionFirstPublishedBy, null),
81
+ revisionLastPublishedBy: (0, _identity.getIdentity)(rawInput.revisionLastPublishedBy, null)
82
+ };
83
+ let entryLevelPublishingMetaFields = {
84
+ firstPublishedOn: (0, _date.getDate)(rawInput.firstPublishedOn, latestStorageEntry.firstPublishedOn),
85
+ lastPublishedOn: (0, _date.getDate)(rawInput.lastPublishedOn, latestStorageEntry.lastPublishedOn),
86
+ firstPublishedBy: (0, _identity.getIdentity)(rawInput.firstPublishedBy, latestStorageEntry.firstPublishedBy),
87
+ lastPublishedBy: (0, _identity.getIdentity)(rawInput.lastPublishedBy, latestStorageEntry.lastPublishedBy)
88
+ };
89
+ if (status === _statuses.STATUS_PUBLISHED) {
90
+ revisionLevelPublishingMetaFields = {
91
+ revisionFirstPublishedOn: (0, _date.getDate)(rawInput.revisionFirstPublishedOn, currentDateTime),
92
+ revisionLastPublishedOn: (0, _date.getDate)(rawInput.revisionLastPublishedOn, currentDateTime),
93
+ revisionFirstPublishedBy: (0, _identity.getIdentity)(rawInput.revisionFirstPublishedBy, currentIdentity),
94
+ revisionLastPublishedBy: (0, _identity.getIdentity)(rawInput.revisionLastPublishedBy, currentIdentity)
95
+ };
96
+ entryLevelPublishingMetaFields = {
97
+ firstPublishedOn: (0, _date.getDate)(rawInput.firstPublishedOn, latestStorageEntry.firstPublishedOn),
98
+ lastPublishedOn: (0, _date.getDate)(rawInput.lastPublishedOn, currentDateTime),
99
+ firstPublishedBy: (0, _identity.getIdentity)(rawInput.firstPublishedBy, latestStorageEntry.firstPublishedBy),
100
+ lastPublishedBy: (0, _identity.getIdentity)(rawInput.lastPublishedBy, currentIdentity)
101
+ };
102
+ }
54
103
  const entry = {
55
104
  ...originalEntry,
56
105
  id,
@@ -61,28 +110,22 @@ const createEntryRevisionFromData = async ({
61
110
  createdOn: (0, _date.getDate)(rawInput.createdOn, latestStorageEntry.createdOn),
62
111
  savedOn: (0, _date.getDate)(rawInput.savedOn, currentDateTime),
63
112
  modifiedOn: (0, _date.getDate)(rawInput.modifiedOn, currentDateTime),
64
- firstPublishedOn: (0, _date.getDate)(rawInput.firstPublishedOn, latestStorageEntry.firstPublishedOn),
65
- lastPublishedOn: (0, _date.getDate)(rawInput.lastPublishedOn, latestStorageEntry.lastPublishedOn),
66
113
  createdBy: (0, _identity.getIdentity)(rawInput.createdBy, latestStorageEntry.createdBy),
67
114
  savedBy: (0, _identity.getIdentity)(rawInput.savedBy, currentIdentity),
68
115
  modifiedBy: (0, _identity.getIdentity)(rawInput.modifiedBy, currentIdentity),
69
- firstPublishedBy: (0, _identity.getIdentity)(rawInput.firstPublishedBy, latestStorageEntry.firstPublishedBy),
70
- lastPublishedBy: (0, _identity.getIdentity)(rawInput.lastPublishedBy, latestStorageEntry.lastPublishedBy),
116
+ ...entryLevelPublishingMetaFields,
71
117
  /**
72
118
  * Revision-level meta fields. 👇
73
119
  */
74
120
  revisionCreatedOn: (0, _date.getDate)(rawInput.revisionCreatedOn, currentDateTime),
75
121
  revisionSavedOn: (0, _date.getDate)(rawInput.revisionSavedOn, currentDateTime),
76
122
  revisionModifiedOn: (0, _date.getDate)(rawInput.revisionModifiedOn, null),
77
- revisionFirstPublishedOn: (0, _date.getDate)(rawInput.revisionFirstPublishedOn, null),
78
- revisionLastPublishedOn: (0, _date.getDate)(rawInput.revisionLastPublishedOn, null),
79
123
  revisionCreatedBy: (0, _identity.getIdentity)(rawInput.revisionCreatedBy, currentIdentity),
80
124
  revisionSavedBy: (0, _identity.getIdentity)(rawInput.revisionSavedBy, currentIdentity),
81
125
  revisionModifiedBy: (0, _identity.getIdentity)(rawInput.revisionModifiedBy, null),
82
- revisionFirstPublishedBy: (0, _identity.getIdentity)(rawInput.revisionFirstPublishedBy, null),
83
- revisionLastPublishedBy: (0, _identity.getIdentity)(rawInput.revisionLastPublishedBy, null),
84
- locked: false,
85
- status: _statuses.STATUS_DRAFT,
126
+ ...revisionLevelPublishingMetaFields,
127
+ locked,
128
+ status,
86
129
  values
87
130
  };
88
131
  return {
@@ -1 +1 @@
1
- {"version":3,"names":["_date","require","_identity","_mapAndCleanUpdatedInputData","_entryDataValidation","_referenceFieldsMapping","_utils","_error","_interopRequireDefault","_statuses","createEntryRevisionFromData","sourceId","model","rawInput","options","context","getIdentity","getSecurityIdentity","originalEntry","latestStorageEntry","input","mapAndCleanUpdatedInputData","initialValues","values","validateModelEntryDataOrThrow","data","entry","skipValidators","referenceFieldsMapping","validateEntries","latestId","id","version","nextVersion","increaseEntryIdVersion","currentIdentity","currentDateTime","Date","createdOn","getDate","savedOn","modifiedOn","firstPublishedOn","lastPublishedOn","createdBy","savedBy","modifiedBy","firstPublishedBy","lastPublishedBy","revisionCreatedOn","revisionSavedOn","revisionModifiedOn","revisionFirstPublishedOn","revisionLastPublishedOn","revisionCreatedBy","revisionSavedBy","revisionModifiedBy","revisionFirstPublishedBy","revisionLastPublishedBy","locked","status","STATUS_DRAFT","exports","entryId","parseIdentifier","WebinyError","createIdentifier"],"sources":["createEntryRevisionFromData.ts"],"sourcesContent":["import {\n CmsContext,\n CmsEntry,\n CmsModel,\n CreateCmsEntryInput,\n CreateCmsEntryOptionsInput\n} from \"~/types\";\nimport { getDate } from \"~/utils/date\";\nimport { getIdentity } from \"~/utils/identity\";\nimport { SecurityIdentity } from \"@webiny/api-security/types\";\nimport { Tenant } from \"@webiny/api-tenancy/types\";\nimport { I18NLocale } from \"@webiny/api-i18n/types\";\nimport { mapAndCleanUpdatedInputData } from \".//mapAndCleanUpdatedInputData\";\nimport { validateModelEntryDataOrThrow } from \"../entryDataValidation\";\nimport { referenceFieldsMapping } from \"../referenceFieldsMapping\";\nimport { createIdentifier, parseIdentifier } from \"@webiny/utils\";\nimport WebinyError from \"@webiny/error\";\nimport { STATUS_DRAFT } from \"./statuses\";\n\ntype CreateEntryRevisionFromDataParams = {\n sourceId: string;\n model: CmsModel;\n rawInput: CreateCmsEntryInput;\n options?: CreateCmsEntryOptionsInput;\n context: CmsContext;\n getIdentity: () => SecurityIdentity;\n getTenant: () => Tenant;\n getLocale: () => I18NLocale;\n originalEntry: CmsEntry;\n latestStorageEntry: CmsEntry;\n};\n\nexport const createEntryRevisionFromData = async ({\n sourceId,\n model,\n rawInput,\n options,\n context,\n getIdentity: getSecurityIdentity,\n originalEntry,\n latestStorageEntry\n}: CreateEntryRevisionFromDataParams): Promise<{\n entry: CmsEntry;\n input: Record<string, any>;\n}> => {\n /**\n * Make sure we only work with fields that are defined in the model.\n */\n const input = mapAndCleanUpdatedInputData(model, rawInput);\n\n const initialValues = {\n ...originalEntry.values,\n ...input\n };\n\n await validateModelEntryDataOrThrow({\n context,\n model,\n data: initialValues,\n entry: originalEntry,\n skipValidators: options?.skipValidators\n });\n\n const values = await referenceFieldsMapping({\n context,\n model,\n input: initialValues,\n validateEntries: false\n });\n\n const latestId = latestStorageEntry ? latestStorageEntry.id : sourceId;\n const { id, version: nextVersion } = increaseEntryIdVersion(latestId);\n\n const currentIdentity = getSecurityIdentity();\n const currentDateTime = new Date();\n\n const entry: CmsEntry = {\n ...originalEntry,\n id,\n version: nextVersion,\n\n /**\n * Entry-level meta fields. 👇\n */\n createdOn: getDate(rawInput.createdOn, latestStorageEntry.createdOn),\n savedOn: getDate(rawInput.savedOn, currentDateTime),\n modifiedOn: getDate(rawInput.modifiedOn, currentDateTime),\n firstPublishedOn: getDate(rawInput.firstPublishedOn, latestStorageEntry.firstPublishedOn),\n lastPublishedOn: getDate(rawInput.lastPublishedOn, latestStorageEntry.lastPublishedOn),\n createdBy: getIdentity(rawInput.createdBy, latestStorageEntry.createdBy),\n savedBy: getIdentity(rawInput.savedBy, currentIdentity),\n modifiedBy: getIdentity(rawInput.modifiedBy, currentIdentity),\n firstPublishedBy: getIdentity(\n rawInput.firstPublishedBy,\n latestStorageEntry.firstPublishedBy\n ),\n lastPublishedBy: getIdentity(rawInput.lastPublishedBy, latestStorageEntry.lastPublishedBy),\n\n /**\n * Revision-level meta fields. 👇\n */\n revisionCreatedOn: getDate(rawInput.revisionCreatedOn, currentDateTime),\n revisionSavedOn: getDate(rawInput.revisionSavedOn, currentDateTime),\n revisionModifiedOn: getDate(rawInput.revisionModifiedOn, null),\n revisionFirstPublishedOn: getDate(rawInput.revisionFirstPublishedOn, null),\n revisionLastPublishedOn: getDate(rawInput.revisionLastPublishedOn, null),\n revisionCreatedBy: getIdentity(rawInput.revisionCreatedBy, currentIdentity),\n revisionSavedBy: getIdentity(rawInput.revisionSavedBy, currentIdentity),\n revisionModifiedBy: getIdentity(rawInput.revisionModifiedBy, null),\n revisionFirstPublishedBy: getIdentity(rawInput.revisionFirstPublishedBy, null),\n revisionLastPublishedBy: getIdentity(rawInput.revisionLastPublishedBy, null),\n\n locked: false,\n status: STATUS_DRAFT,\n values\n };\n\n return { entry, input };\n};\n\nconst increaseEntryIdVersion = (id: string) => {\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"],"mappings":"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"}
1
+ {"version":3,"names":["_date","require","_identity","_mapAndCleanUpdatedInputData","_entryDataValidation","_referenceFieldsMapping","_utils","_error","_interopRequireDefault","_statuses","createEntryRevisionFromData","sourceId","model","rawInput","options","context","getIdentity","getSecurityIdentity","originalEntry","latestStorageEntry","accessControl","input","mapAndCleanUpdatedInputData","initialValues","values","validateModelEntryDataOrThrow","data","entry","skipValidators","referenceFieldsMapping","validateEntries","latestId","id","version","nextVersion","increaseEntryIdVersion","currentIdentity","currentDateTime","Date","status","STATUS_DRAFT","STATUS_PUBLISHED","ensureCanAccessEntry","pw","STATUS_UNPUBLISHED","locked","revisionLevelPublishingMetaFields","revisionFirstPublishedOn","getDate","revisionLastPublishedOn","revisionFirstPublishedBy","revisionLastPublishedBy","entryLevelPublishingMetaFields","firstPublishedOn","lastPublishedOn","firstPublishedBy","lastPublishedBy","createdOn","savedOn","modifiedOn","createdBy","savedBy","modifiedBy","revisionCreatedOn","revisionSavedOn","revisionModifiedOn","revisionCreatedBy","revisionSavedBy","revisionModifiedBy","exports","entryId","parseIdentifier","WebinyError","createIdentifier"],"sources":["createEntryRevisionFromData.ts"],"sourcesContent":["import {\n CmsContext,\n CmsEntry,\n CmsModel,\n CreateCmsEntryInput,\n CreateCmsEntryOptionsInput\n} from \"~/types\";\nimport { getDate } from \"~/utils/date\";\nimport { getIdentity } from \"~/utils/identity\";\nimport { SecurityIdentity } from \"@webiny/api-security/types\";\nimport { Tenant } from \"@webiny/api-tenancy/types\";\nimport { I18NLocale } from \"@webiny/api-i18n/types\";\nimport { mapAndCleanUpdatedInputData } from \".//mapAndCleanUpdatedInputData\";\nimport { validateModelEntryDataOrThrow } from \"../entryDataValidation\";\nimport { referenceFieldsMapping } from \"../referenceFieldsMapping\";\nimport { createIdentifier, parseIdentifier } from \"@webiny/utils\";\nimport WebinyError from \"@webiny/error\";\nimport { STATUS_DRAFT, STATUS_PUBLISHED, STATUS_UNPUBLISHED } from \"./statuses\";\nimport { AccessControl } from \"~/crud/AccessControl/AccessControl\";\n\ntype CreateEntryRevisionFromDataParams = {\n sourceId: string;\n model: CmsModel;\n rawInput: CreateCmsEntryInput;\n options?: CreateCmsEntryOptionsInput;\n context: CmsContext;\n getIdentity: () => SecurityIdentity;\n getTenant: () => Tenant;\n getLocale: () => I18NLocale;\n originalEntry: CmsEntry;\n latestStorageEntry: CmsEntry;\n accessControl: AccessControl;\n};\n\nexport const createEntryRevisionFromData = async ({\n sourceId,\n model,\n rawInput,\n options,\n context,\n getIdentity: getSecurityIdentity,\n originalEntry,\n latestStorageEntry,\n accessControl\n}: CreateEntryRevisionFromDataParams): Promise<{\n entry: CmsEntry;\n input: Record<string, any>;\n}> => {\n /**\n * Make sure we only work with fields that are defined in the model.\n */\n const input = mapAndCleanUpdatedInputData(model, rawInput);\n\n const initialValues = {\n ...originalEntry.values,\n ...input\n };\n\n await validateModelEntryDataOrThrow({\n context,\n model,\n data: initialValues,\n entry: originalEntry,\n skipValidators: options?.skipValidators\n });\n\n const values = await referenceFieldsMapping({\n context,\n model,\n input: initialValues,\n validateEntries: false\n });\n\n const latestId = latestStorageEntry ? latestStorageEntry.id : sourceId;\n const { id, version: nextVersion } = increaseEntryIdVersion(latestId);\n\n const currentIdentity = getSecurityIdentity();\n const currentDateTime = new Date();\n\n /**\n * Users can set the initial status of the entry. If so, we need to make\n * sure they have the required permissions and also that all the fields\n * are filled in correctly.\n */\n const status = rawInput.status || STATUS_DRAFT;\n if (status !== STATUS_DRAFT) {\n if (status === STATUS_PUBLISHED) {\n await accessControl.ensureCanAccessEntry({ model, pw: \"p\" });\n } else if (status === STATUS_UNPUBLISHED) {\n // If setting the status other than draft, we have to check if the user has permissions to publish.\n await accessControl.ensureCanAccessEntry({ model, pw: \"u\" });\n }\n }\n\n const locked = status !== STATUS_DRAFT;\n\n let revisionLevelPublishingMetaFields: Pick<\n CmsEntry,\n | \"revisionFirstPublishedOn\"\n | \"revisionLastPublishedOn\"\n | \"revisionFirstPublishedBy\"\n | \"revisionLastPublishedBy\"\n > = {\n revisionFirstPublishedOn: getDate(rawInput.revisionFirstPublishedOn, null),\n revisionLastPublishedOn: getDate(rawInput.revisionLastPublishedOn, null),\n revisionFirstPublishedBy: getIdentity(rawInput.revisionFirstPublishedBy, null),\n revisionLastPublishedBy: getIdentity(rawInput.revisionLastPublishedBy, null)\n };\n\n let entryLevelPublishingMetaFields: Pick<\n CmsEntry,\n \"firstPublishedOn\" | \"lastPublishedOn\" | \"firstPublishedBy\" | \"lastPublishedBy\"\n > = {\n firstPublishedOn: getDate(rawInput.firstPublishedOn, latestStorageEntry.firstPublishedOn),\n lastPublishedOn: getDate(rawInput.lastPublishedOn, latestStorageEntry.lastPublishedOn),\n firstPublishedBy: getIdentity(\n rawInput.firstPublishedBy,\n latestStorageEntry.firstPublishedBy\n ),\n lastPublishedBy: getIdentity(rawInput.lastPublishedBy, latestStorageEntry.lastPublishedBy)\n };\n\n if (status === STATUS_PUBLISHED) {\n revisionLevelPublishingMetaFields = {\n revisionFirstPublishedOn: getDate(rawInput.revisionFirstPublishedOn, currentDateTime),\n revisionLastPublishedOn: getDate(rawInput.revisionLastPublishedOn, currentDateTime),\n revisionFirstPublishedBy: getIdentity(\n rawInput.revisionFirstPublishedBy,\n currentIdentity\n ),\n revisionLastPublishedBy: getIdentity(rawInput.revisionLastPublishedBy, currentIdentity)\n };\n\n entryLevelPublishingMetaFields = {\n firstPublishedOn: getDate(\n rawInput.firstPublishedOn,\n latestStorageEntry.firstPublishedOn\n ),\n lastPublishedOn: getDate(rawInput.lastPublishedOn, currentDateTime),\n firstPublishedBy: getIdentity(\n rawInput.firstPublishedBy,\n latestStorageEntry.firstPublishedBy\n ),\n lastPublishedBy: getIdentity(rawInput.lastPublishedBy, currentIdentity)\n };\n }\n\n const entry: CmsEntry = {\n ...originalEntry,\n id,\n version: nextVersion,\n\n /**\n * Entry-level meta fields. 👇\n */\n createdOn: getDate(rawInput.createdOn, latestStorageEntry.createdOn),\n savedOn: getDate(rawInput.savedOn, currentDateTime),\n modifiedOn: getDate(rawInput.modifiedOn, currentDateTime),\n createdBy: getIdentity(rawInput.createdBy, latestStorageEntry.createdBy),\n savedBy: getIdentity(rawInput.savedBy, currentIdentity),\n modifiedBy: getIdentity(rawInput.modifiedBy, currentIdentity),\n ...entryLevelPublishingMetaFields,\n\n /**\n * Revision-level meta fields. 👇\n */\n revisionCreatedOn: getDate(rawInput.revisionCreatedOn, currentDateTime),\n revisionSavedOn: getDate(rawInput.revisionSavedOn, currentDateTime),\n revisionModifiedOn: getDate(rawInput.revisionModifiedOn, null),\n revisionCreatedBy: getIdentity(rawInput.revisionCreatedBy, currentIdentity),\n revisionSavedBy: getIdentity(rawInput.revisionSavedBy, currentIdentity),\n revisionModifiedBy: getIdentity(rawInput.revisionModifiedBy, null),\n ...revisionLevelPublishingMetaFields,\n\n locked,\n status,\n values\n };\n\n return { entry, input };\n};\n\nconst increaseEntryIdVersion = (id: string) => {\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"],"mappings":"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"}
@@ -2,12 +2,10 @@ import { CmsContext, CmsEntryContext, HeadlessCmsStorageOperations } from "../ty
2
2
  import { SecurityIdentity } from "@webiny/api-security/types";
3
3
  import { Tenant } from "@webiny/api-tenancy/types";
4
4
  import { I18NLocale } from "@webiny/api-i18n/types";
5
- import { EntriesPermissions } from "../utils/permissions/EntriesPermissions";
6
- import { ModelsPermissions } from "../utils/permissions/ModelsPermissions";
5
+ import { AccessControl } from "./AccessControl/AccessControl";
7
6
  interface CreateContentEntryCrudParams {
8
7
  storageOperations: HeadlessCmsStorageOperations;
9
- entriesPermissions: EntriesPermissions;
10
- modelsPermissions: ModelsPermissions;
8
+ accessControl: AccessControl;
11
9
  context: CmsContext;
12
10
  getIdentity: () => SecurityIdentity;
13
11
  getTenant: () => Tenant;