@webiny/api-headless-cms 5.41.0-dbt.0 → 5.41.1-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. package/constants.d.ts +1 -0
  2. package/constants.js +2 -1
  3. package/constants.js.map +1 -1
  4. package/crud/contentEntry/afterDelete.js +7 -1
  5. package/crud/contentEntry/afterDelete.js.map +1 -1
  6. package/crud/contentEntry/useCases/DeleteEntry/TransformEntryMoveToBin.js +0 -8
  7. package/crud/contentEntry/useCases/DeleteEntry/TransformEntryMoveToBin.js.map +1 -1
  8. package/crud/contentEntry/useCases/RestoreEntryFromBin/TransformEntryRestoreFromBin.js +0 -8
  9. package/crud/contentEntry/useCases/RestoreEntryFromBin/TransformEntryRestoreFromBin.js.map +1 -1
  10. package/crud/contentModel/beforeDelete.js +31 -0
  11. package/crud/contentModel/beforeDelete.js.map +1 -1
  12. package/crud/contentModel/validation.d.ts +146 -146
  13. package/crud/contentModel.crud.js +8 -1
  14. package/crud/contentModel.crud.js.map +1 -1
  15. package/crud/contentModelGroup/validation.d.ts +1 -1
  16. package/export/crud/sanitize.d.ts +1 -1
  17. package/export/crud/sanitize.js +2 -1
  18. package/export/crud/sanitize.js.map +1 -1
  19. package/export/types.d.ts +1 -1
  20. package/export/types.js.map +1 -1
  21. package/graphql/createExecutableSchema.js +14 -7
  22. package/graphql/createExecutableSchema.js.map +1 -1
  23. package/graphql/graphQLHandlerFactory.d.ts +2 -2
  24. package/graphql/graphQLHandlerFactory.js.map +1 -1
  25. package/graphql/index.d.ts +2 -1
  26. package/graphql/index.js +1 -1
  27. package/graphql/index.js.map +1 -1
  28. package/graphql/schema/contentEntries.js.map +1 -1
  29. package/graphql/schema/createFieldResolvers.d.ts +1 -1
  30. package/graphql/schema/createFieldResolvers.js +1 -3
  31. package/graphql/schema/createFieldResolvers.js.map +1 -1
  32. package/graphql/schema/createManageSDL.js.map +1 -1
  33. package/graphql/schema/createReadSDL.js.map +1 -1
  34. package/graphql/schema/createSingularResolvers.d.ts +13 -0
  35. package/graphql/schema/createSingularResolvers.js +56 -0
  36. package/graphql/schema/createSingularResolvers.js.map +1 -0
  37. package/graphql/schema/createSingularSDL.d.ts +12 -0
  38. package/graphql/schema/createSingularSDL.js +95 -0
  39. package/graphql/schema/createSingularSDL.js.map +1 -0
  40. package/graphql/schema/resolvers/singular/resolveGet.d.ts +7 -0
  41. package/graphql/schema/resolvers/singular/resolveGet.js +21 -0
  42. package/graphql/schema/resolvers/singular/resolveGet.js.map +1 -0
  43. package/graphql/schema/resolvers/singular/resolveUpdate.d.ts +8 -0
  44. package/graphql/schema/resolvers/singular/resolveUpdate.js +21 -0
  45. package/graphql/schema/resolvers/singular/resolveUpdate.js.map +1 -0
  46. package/graphql/schema/schemaPlugins.js +23 -0
  47. package/graphql/schema/schemaPlugins.js.map +1 -1
  48. package/index.d.ts +4 -1
  49. package/index.js +25 -1
  50. package/index.js.map +1 -1
  51. package/modelManager/DefaultCmsModelManager.d.ts +4 -4
  52. package/modelManager/DefaultCmsModelManager.js +13 -13
  53. package/modelManager/DefaultCmsModelManager.js.map +1 -1
  54. package/modelManager/SingletonModelManager.d.ts +12 -0
  55. package/modelManager/SingletonModelManager.js +48 -0
  56. package/modelManager/SingletonModelManager.js.map +1 -0
  57. package/modelManager/index.d.ts +1 -0
  58. package/modelManager/index.js +15 -0
  59. package/modelManager/index.js.map +1 -1
  60. package/package.json +23 -22
  61. package/plugins/CmsModelPlugin.js +1 -1
  62. package/plugins/CmsModelPlugin.js.map +1 -1
  63. package/types/modelField.d.ts +2 -1
  64. package/types/modelField.js.map +1 -1
  65. package/types/types.d.ts +22 -6
  66. package/types/types.js.map +1 -1
  67. package/utils/contentEntryTraverser/ContentEntryTraverser.d.ts +4 -1
  68. package/utils/contentEntryTraverser/ContentEntryTraverser.js.map +1 -1
  69. package/utils/contentModelAst/CmsModelToAstConverter.d.ts +1 -1
  70. package/utils/contentModelAst/CmsModelToAstConverter.js.map +1 -1
  71. package/utils/getSchemaFromFieldPlugins.js +3 -2
  72. package/utils/getSchemaFromFieldPlugins.js.map +1 -1
  73. package/utils/index.d.ts +1 -0
  74. package/utils/index.js +11 -0
  75. package/utils/index.js.map +1 -1
  76. package/utils/modelFieldTraverser/ModelFieldTraverser.d.ts +16 -0
  77. package/utils/modelFieldTraverser/ModelFieldTraverser.js +41 -0
  78. package/utils/modelFieldTraverser/ModelFieldTraverser.js.map +1 -0
  79. package/utils/modelFieldTraverser/index.d.ts +1 -0
  80. package/utils/modelFieldTraverser/index.js +18 -0
  81. package/utils/modelFieldTraverser/index.js.map +1 -0
package/constants.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import { CmsIdentity } from "./types";
2
2
  export declare const ROOT_FOLDER = "root";
3
+ export declare const CMS_MODEL_SINGLETON_TAG = "singleton";
3
4
  export declare const ENTRY_META_FIELDS: readonly ["createdOn", "modifiedOn", "savedOn", "deletedOn", "restoredOn", "firstPublishedOn", "lastPublishedOn", "createdBy", "modifiedBy", "savedBy", "deletedBy", "restoredBy", "firstPublishedBy", "lastPublishedBy", "revisionCreatedOn", "revisionModifiedOn", "revisionSavedOn", "revisionDeletedOn", "revisionRestoredOn", "revisionFirstPublishedOn", "revisionLastPublishedOn", "revisionCreatedBy", "revisionModifiedBy", "revisionSavedBy", "revisionDeletedBy", "revisionRestoredBy", "revisionFirstPublishedBy", "revisionLastPublishedBy"];
4
5
  export type EntryMetaFieldName = (typeof ENTRY_META_FIELDS)[number];
5
6
  export interface RecordWithEntryMetaFields {
package/constants.js CHANGED
@@ -3,8 +3,9 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.pickEntryMetaFields = exports.isRevisionEntryMetaField = exports.isRestoredEntryMetaField = exports.isNullableEntryMetaField = exports.isNonNullableEntryMetaField = exports.isIdentityEntryMetaField = exports.isEntryLevelEntryMetaField = exports.isDeletedEntryMetaField = exports.isDateTimeEntryMetaField = exports.ROOT_FOLDER = exports.ENTRY_META_FIELDS = void 0;
6
+ exports.pickEntryMetaFields = exports.isRevisionEntryMetaField = exports.isRestoredEntryMetaField = exports.isNullableEntryMetaField = exports.isNonNullableEntryMetaField = exports.isIdentityEntryMetaField = exports.isEntryLevelEntryMetaField = exports.isDeletedEntryMetaField = exports.isDateTimeEntryMetaField = exports.ROOT_FOLDER = exports.ENTRY_META_FIELDS = exports.CMS_MODEL_SINGLETON_TAG = void 0;
7
7
  const ROOT_FOLDER = exports.ROOT_FOLDER = "root";
8
+ const CMS_MODEL_SINGLETON_TAG = exports.CMS_MODEL_SINGLETON_TAG = "singleton";
8
9
 
9
10
  // Content entries - xOn and xBy meta fields.
10
11
  const ENTRY_META_FIELDS = exports.ENTRY_META_FIELDS = [
package/constants.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"names":["ROOT_FOLDER","exports","ENTRY_META_FIELDS","pickEntryMetaFields","object","filter","pickedEntryMetaFields","entryMetaFieldName","fieldExists","undefined","mustPick","Object","assign","isNullableEntryMetaField","fieldName","lcFieldName","toLowerCase","includes","isNonNullableEntryMetaField","isDateTimeEntryMetaField","endsWith","isIdentityEntryMetaField","isRevisionEntryMetaField","startsWith","isEntryLevelEntryMetaField","isDeletedEntryMetaField","isRestoredEntryMetaField"],"sources":["constants.ts"],"sourcesContent":["import { CmsIdentity } from \"~/types\";\n\nexport const ROOT_FOLDER = \"root\";\n\n// Content entries - xOn and xBy meta fields.\nexport const ENTRY_META_FIELDS = [\n // Entry-level meta fields.\n \"createdOn\",\n \"modifiedOn\",\n \"savedOn\",\n \"deletedOn\",\n \"restoredOn\",\n \"firstPublishedOn\",\n \"lastPublishedOn\",\n \"createdBy\",\n \"modifiedBy\",\n \"savedBy\",\n \"deletedBy\",\n \"restoredBy\",\n \"firstPublishedBy\",\n \"lastPublishedBy\",\n\n // Revision-level meta fields.\n \"revisionCreatedOn\",\n \"revisionModifiedOn\",\n \"revisionSavedOn\",\n \"revisionDeletedOn\",\n \"revisionRestoredOn\",\n \"revisionFirstPublishedOn\",\n \"revisionLastPublishedOn\",\n \"revisionCreatedBy\",\n \"revisionModifiedBy\",\n \"revisionSavedBy\",\n \"revisionDeletedBy\",\n \"revisionRestoredBy\",\n \"revisionFirstPublishedBy\",\n \"revisionLastPublishedBy\"\n] as const;\n\nexport type EntryMetaFieldName = (typeof ENTRY_META_FIELDS)[number];\n\nexport interface RecordWithEntryMetaFields {\n revisionCreatedOn: string;\n revisionSavedOn: string;\n revisionModifiedOn: string | null;\n revisionDeletedOn: string | null;\n revisionRestoredOn: string | null;\n revisionFirstPublishedOn: string | null;\n revisionLastPublishedOn: string | null;\n revisionCreatedBy: CmsIdentity;\n revisionSavedBy: CmsIdentity;\n revisionModifiedBy: CmsIdentity | null;\n revisionDeletedBy: CmsIdentity | null;\n revisionRestoredBy: CmsIdentity | null;\n revisionFirstPublishedBy: CmsIdentity | null;\n revisionLastPublishedBy: CmsIdentity | null;\n\n // Entry-level meta fields.\n createdOn: string;\n savedOn: string;\n modifiedOn: string | null;\n deletedOn: string | null;\n restoredOn: string | null;\n firstPublishedOn: string | null;\n lastPublishedOn: string | null;\n createdBy: CmsIdentity;\n savedBy: CmsIdentity;\n modifiedBy: CmsIdentity | null;\n deletedBy: CmsIdentity | null;\n restoredBy: CmsIdentity | null;\n firstPublishedBy: CmsIdentity | null;\n lastPublishedBy: CmsIdentity | null;\n}\n\nexport const pickEntryMetaFields = (\n object: Partial<RecordWithEntryMetaFields>,\n filter?: (fieldName: EntryMetaFieldName | string) => boolean\n) => {\n const pickedEntryMetaFields: Partial<RecordWithEntryMetaFields> = {};\n for (const entryMetaFieldName of ENTRY_META_FIELDS) {\n const fieldExists = entryMetaFieldName in object;\n if (!fieldExists) {\n object[entryMetaFieldName] = undefined;\n }\n\n const mustPick = !filter || filter(entryMetaFieldName);\n if (mustPick) {\n Object.assign(pickedEntryMetaFields, {\n [entryMetaFieldName]: object[entryMetaFieldName]\n });\n }\n }\n\n return pickedEntryMetaFields;\n};\n\nexport const isNullableEntryMetaField = (fieldName: string) => {\n // Only modifiedX, publishedX, deletedX fields are nullable.\n const lcFieldName = fieldName.toLowerCase();\n return (\n lcFieldName.includes(\"modified\") ||\n lcFieldName.includes(\"published\") ||\n lcFieldName.includes(\"deleted\") ||\n lcFieldName.includes(\"restored\")\n );\n};\n\nexport const isNonNullableEntryMetaField = (fieldName: string) => {\n return !isNullableEntryMetaField(fieldName);\n};\n\nexport const isDateTimeEntryMetaField = (fieldName: string) => {\n // Only field ending with \"On\" are date/time fields.\n return fieldName.endsWith(\"On\");\n};\n\nexport const isIdentityEntryMetaField = (fieldName: string) => {\n // Only field ending with \"On\" are date/time fields.\n return fieldName.endsWith(\"By\");\n};\n\nexport const isRevisionEntryMetaField = (fieldName: string) => {\n return (\n ENTRY_META_FIELDS.includes(fieldName as EntryMetaFieldName) &&\n fieldName.startsWith(\"revision\")\n );\n};\n\nexport const isEntryLevelEntryMetaField = (fieldName: string) => {\n return (\n ENTRY_META_FIELDS.includes(fieldName as EntryMetaFieldName) &&\n !fieldName.startsWith(\"revision\")\n );\n};\n\nexport const isDeletedEntryMetaField = (fieldName: string) => {\n return (\n ENTRY_META_FIELDS.includes(fieldName as EntryMetaFieldName) && fieldName.includes(\"deleted\")\n );\n};\n\nexport const isRestoredEntryMetaField = (fieldName: string) => {\n return (\n ENTRY_META_FIELDS.includes(fieldName as EntryMetaFieldName) &&\n fieldName.includes(\"restored\")\n );\n};\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["ROOT_FOLDER","exports","CMS_MODEL_SINGLETON_TAG","ENTRY_META_FIELDS","pickEntryMetaFields","object","filter","pickedEntryMetaFields","entryMetaFieldName","fieldExists","undefined","mustPick","Object","assign","isNullableEntryMetaField","fieldName","lcFieldName","toLowerCase","includes","isNonNullableEntryMetaField","isDateTimeEntryMetaField","endsWith","isIdentityEntryMetaField","isRevisionEntryMetaField","startsWith","isEntryLevelEntryMetaField","isDeletedEntryMetaField","isRestoredEntryMetaField"],"sources":["constants.ts"],"sourcesContent":["import { CmsIdentity } from \"~/types\";\n\nexport const ROOT_FOLDER = \"root\";\n\nexport const CMS_MODEL_SINGLETON_TAG = \"singleton\";\n\n// Content entries - xOn and xBy meta fields.\nexport const ENTRY_META_FIELDS = [\n // Entry-level meta fields.\n \"createdOn\",\n \"modifiedOn\",\n \"savedOn\",\n \"deletedOn\",\n \"restoredOn\",\n \"firstPublishedOn\",\n \"lastPublishedOn\",\n \"createdBy\",\n \"modifiedBy\",\n \"savedBy\",\n \"deletedBy\",\n \"restoredBy\",\n \"firstPublishedBy\",\n \"lastPublishedBy\",\n\n // Revision-level meta fields.\n \"revisionCreatedOn\",\n \"revisionModifiedOn\",\n \"revisionSavedOn\",\n \"revisionDeletedOn\",\n \"revisionRestoredOn\",\n \"revisionFirstPublishedOn\",\n \"revisionLastPublishedOn\",\n \"revisionCreatedBy\",\n \"revisionModifiedBy\",\n \"revisionSavedBy\",\n \"revisionDeletedBy\",\n \"revisionRestoredBy\",\n \"revisionFirstPublishedBy\",\n \"revisionLastPublishedBy\"\n] as const;\n\nexport type EntryMetaFieldName = (typeof ENTRY_META_FIELDS)[number];\n\nexport interface RecordWithEntryMetaFields {\n revisionCreatedOn: string;\n revisionSavedOn: string;\n revisionModifiedOn: string | null;\n revisionDeletedOn: string | null;\n revisionRestoredOn: string | null;\n revisionFirstPublishedOn: string | null;\n revisionLastPublishedOn: string | null;\n revisionCreatedBy: CmsIdentity;\n revisionSavedBy: CmsIdentity;\n revisionModifiedBy: CmsIdentity | null;\n revisionDeletedBy: CmsIdentity | null;\n revisionRestoredBy: CmsIdentity | null;\n revisionFirstPublishedBy: CmsIdentity | null;\n revisionLastPublishedBy: CmsIdentity | null;\n\n // Entry-level meta fields.\n createdOn: string;\n savedOn: string;\n modifiedOn: string | null;\n deletedOn: string | null;\n restoredOn: string | null;\n firstPublishedOn: string | null;\n lastPublishedOn: string | null;\n createdBy: CmsIdentity;\n savedBy: CmsIdentity;\n modifiedBy: CmsIdentity | null;\n deletedBy: CmsIdentity | null;\n restoredBy: CmsIdentity | null;\n firstPublishedBy: CmsIdentity | null;\n lastPublishedBy: CmsIdentity | null;\n}\n\nexport const pickEntryMetaFields = (\n object: Partial<RecordWithEntryMetaFields>,\n filter?: (fieldName: EntryMetaFieldName | string) => boolean\n) => {\n const pickedEntryMetaFields: Partial<RecordWithEntryMetaFields> = {};\n for (const entryMetaFieldName of ENTRY_META_FIELDS) {\n const fieldExists = entryMetaFieldName in object;\n if (!fieldExists) {\n object[entryMetaFieldName] = undefined;\n }\n\n const mustPick = !filter || filter(entryMetaFieldName);\n if (mustPick) {\n Object.assign(pickedEntryMetaFields, {\n [entryMetaFieldName]: object[entryMetaFieldName]\n });\n }\n }\n\n return pickedEntryMetaFields;\n};\n\nexport const isNullableEntryMetaField = (fieldName: string) => {\n // Only modifiedX, publishedX, deletedX fields are nullable.\n const lcFieldName = fieldName.toLowerCase();\n return (\n lcFieldName.includes(\"modified\") ||\n lcFieldName.includes(\"published\") ||\n lcFieldName.includes(\"deleted\") ||\n lcFieldName.includes(\"restored\")\n );\n};\n\nexport const isNonNullableEntryMetaField = (fieldName: string) => {\n return !isNullableEntryMetaField(fieldName);\n};\n\nexport const isDateTimeEntryMetaField = (fieldName: string) => {\n // Only field ending with \"On\" are date/time fields.\n return fieldName.endsWith(\"On\");\n};\n\nexport const isIdentityEntryMetaField = (fieldName: string) => {\n // Only field ending with \"On\" are date/time fields.\n return fieldName.endsWith(\"By\");\n};\n\nexport const isRevisionEntryMetaField = (fieldName: string) => {\n return (\n ENTRY_META_FIELDS.includes(fieldName as EntryMetaFieldName) &&\n fieldName.startsWith(\"revision\")\n );\n};\n\nexport const isEntryLevelEntryMetaField = (fieldName: string) => {\n return (\n ENTRY_META_FIELDS.includes(fieldName as EntryMetaFieldName) &&\n !fieldName.startsWith(\"revision\")\n );\n};\n\nexport const isDeletedEntryMetaField = (fieldName: string) => {\n return (\n ENTRY_META_FIELDS.includes(fieldName as EntryMetaFieldName) && fieldName.includes(\"deleted\")\n );\n};\n\nexport const isRestoredEntryMetaField = (fieldName: string) => {\n return (\n ENTRY_META_FIELDS.includes(fieldName as EntryMetaFieldName) &&\n fieldName.includes(\"restored\")\n );\n};\n"],"mappings":";;;;;;AAEO,MAAMA,WAAW,GAAAC,OAAA,CAAAD,WAAA,GAAG,MAAM;AAE1B,MAAME,uBAAuB,GAAAD,OAAA,CAAAC,uBAAA,GAAG,WAAW;;AAElD;AACO,MAAMC,iBAAiB,GAAAF,OAAA,CAAAE,iBAAA,GAAG;AAC7B;AACA,WAAW,EACX,YAAY,EACZ,SAAS,EACT,WAAW,EACX,YAAY,EACZ,kBAAkB,EAClB,iBAAiB,EACjB,WAAW,EACX,YAAY,EACZ,SAAS,EACT,WAAW,EACX,YAAY,EACZ,kBAAkB,EAClB,iBAAiB;AAEjB;AACA,mBAAmB,EACnB,oBAAoB,EACpB,iBAAiB,EACjB,mBAAmB,EACnB,oBAAoB,EACpB,0BAA0B,EAC1B,yBAAyB,EACzB,mBAAmB,EACnB,oBAAoB,EACpB,iBAAiB,EACjB,mBAAmB,EACnB,oBAAoB,EACpB,0BAA0B,EAC1B,yBAAyB,CACnB;AAqCH,MAAMC,mBAAmB,GAAGA,CAC/BC,MAA0C,EAC1CC,MAA4D,KAC3D;EACD,MAAMC,qBAAyD,GAAG,CAAC,CAAC;EACpE,KAAK,MAAMC,kBAAkB,IAAIL,iBAAiB,EAAE;IAChD,MAAMM,WAAW,IAAGD,kBAAkB,IAAIH,MAAM;IAChD,IAAI,CAACI,WAAW,EAAE;MACdJ,MAAM,CAACG,kBAAkB,CAAC,GAAGE,SAAS;IAC1C;IAEA,MAAMC,QAAQ,GAAG,CAACL,MAAM,IAAIA,MAAM,CAACE,kBAAkB,CAAC;IACtD,IAAIG,QAAQ,EAAE;MACVC,MAAM,CAACC,MAAM,CAACN,qBAAqB,EAAE;QACjC,CAACC,kBAAkB,GAAGH,MAAM,CAACG,kBAAkB;MACnD,CAAC,CAAC;IACN;EACJ;EAEA,OAAOD,qBAAqB;AAChC,CAAC;AAACN,OAAA,CAAAG,mBAAA,GAAAA,mBAAA;AAEK,MAAMU,wBAAwB,GAAIC,SAAiB,IAAK;EAC3D;EACA,MAAMC,WAAW,GAAGD,SAAS,CAACE,WAAW,CAAC,CAAC;EAC3C,OACID,WAAW,CAACE,QAAQ,CAAC,UAAU,CAAC,IAChCF,WAAW,CAACE,QAAQ,CAAC,WAAW,CAAC,IACjCF,WAAW,CAACE,QAAQ,CAAC,SAAS,CAAC,IAC/BF,WAAW,CAACE,QAAQ,CAAC,UAAU,CAAC;AAExC,CAAC;AAACjB,OAAA,CAAAa,wBAAA,GAAAA,wBAAA;AAEK,MAAMK,2BAA2B,GAAIJ,SAAiB,IAAK;EAC9D,OAAO,CAACD,wBAAwB,CAACC,SAAS,CAAC;AAC/C,CAAC;AAACd,OAAA,CAAAkB,2BAAA,GAAAA,2BAAA;AAEK,MAAMC,wBAAwB,GAAIL,SAAiB,IAAK;EAC3D;EACA,OAAOA,SAAS,CAACM,QAAQ,CAAC,IAAI,CAAC;AACnC,CAAC;AAACpB,OAAA,CAAAmB,wBAAA,GAAAA,wBAAA;AAEK,MAAME,wBAAwB,GAAIP,SAAiB,IAAK;EAC3D;EACA,OAAOA,SAAS,CAACM,QAAQ,CAAC,IAAI,CAAC;AACnC,CAAC;AAACpB,OAAA,CAAAqB,wBAAA,GAAAA,wBAAA;AAEK,MAAMC,wBAAwB,GAAIR,SAAiB,IAAK;EAC3D,OACIZ,iBAAiB,CAACe,QAAQ,CAACH,SAA+B,CAAC,IAC3DA,SAAS,CAACS,UAAU,CAAC,UAAU,CAAC;AAExC,CAAC;AAACvB,OAAA,CAAAsB,wBAAA,GAAAA,wBAAA;AAEK,MAAME,0BAA0B,GAAIV,SAAiB,IAAK;EAC7D,OACIZ,iBAAiB,CAACe,QAAQ,CAACH,SAA+B,CAAC,IAC3D,CAACA,SAAS,CAACS,UAAU,CAAC,UAAU,CAAC;AAEzC,CAAC;AAACvB,OAAA,CAAAwB,0BAAA,GAAAA,0BAAA;AAEK,MAAMC,uBAAuB,GAAIX,SAAiB,IAAK;EAC1D,OACIZ,iBAAiB,CAACe,QAAQ,CAACH,SAA+B,CAAC,IAAIA,SAAS,CAACG,QAAQ,CAAC,SAAS,CAAC;AAEpG,CAAC;AAACjB,OAAA,CAAAyB,uBAAA,GAAAA,uBAAA;AAEK,MAAMC,wBAAwB,GAAIZ,SAAiB,IAAK;EAC3D,OACIZ,iBAAiB,CAACe,QAAQ,CAACH,SAA+B,CAAC,IAC3DA,SAAS,CAACG,QAAQ,CAAC,UAAU,CAAC;AAEtC,CAAC;AAACjB,OAAA,CAAA0B,wBAAA,GAAAA,wBAAA","ignoreList":[]}
@@ -13,8 +13,14 @@ const assignAfterEntryDelete = params => {
13
13
  onEntryAfterDelete.subscribe(async params => {
14
14
  const {
15
15
  entry,
16
- model
16
+ model,
17
+ permanent
17
18
  } = params;
19
+
20
+ // If the entry is being moved to the trash, we keep the model fields locked because the entry can be restored.
21
+ if (!permanent) {
22
+ return;
23
+ }
18
24
  const {
19
25
  items
20
26
  } = await context.cms.storageOperations.entries.list(model, {
@@ -1 +1 @@
1
- {"version":3,"names":["_markLockedFields","require","assignAfterEntryDelete","params","context","onEntryAfterDelete","subscribe","entry","model","items","cms","storageOperations","entries","list","where","entryId_not","entryId","latest","limit","length","markUnlockedFields","exports"],"sources":["afterDelete.ts"],"sourcesContent":["import { Topic } from \"@webiny/pubsub/types\";\nimport { OnEntryAfterDeleteTopicParams, CmsContext } from \"~/types\";\nimport { markUnlockedFields } from \"./markLockedFields\";\n\ninterface AssignAfterEntryDeleteParams {\n context: CmsContext;\n onEntryAfterDelete: Topic<OnEntryAfterDeleteTopicParams>;\n}\nexport const assignAfterEntryDelete = (params: AssignAfterEntryDeleteParams) => {\n const { context, onEntryAfterDelete } = params;\n\n onEntryAfterDelete.subscribe(async params => {\n const { entry, model } = params;\n\n const { items } = await context.cms.storageOperations.entries.list(model, {\n where: {\n entryId_not: entry.entryId,\n latest: true\n },\n limit: 1\n });\n if (items.length > 0) {\n return;\n }\n await markUnlockedFields({\n context,\n model\n });\n });\n};\n"],"mappings":";;;;;;AAEA,IAAAA,iBAAA,GAAAC,OAAA;AAMO,MAAMC,sBAAsB,GAAIC,MAAoC,IAAK;EAC5E,MAAM;IAAEC,OAAO;IAAEC;EAAmB,CAAC,GAAGF,MAAM;EAE9CE,kBAAkB,CAACC,SAAS,CAAC,MAAMH,MAAM,IAAI;IACzC,MAAM;MAAEI,KAAK;MAAEC;IAAM,CAAC,GAAGL,MAAM;IAE/B,MAAM;MAAEM;IAAM,CAAC,GAAG,MAAML,OAAO,CAACM,GAAG,CAACC,iBAAiB,CAACC,OAAO,CAACC,IAAI,CAACL,KAAK,EAAE;MACtEM,KAAK,EAAE;QACHC,WAAW,EAAER,KAAK,CAACS,OAAO;QAC1BC,MAAM,EAAE;MACZ,CAAC;MACDC,KAAK,EAAE;IACX,CAAC,CAAC;IACF,IAAIT,KAAK,CAACU,MAAM,GAAG,CAAC,EAAE;MAClB;IACJ;IACA,MAAM,IAAAC,oCAAkB,EAAC;MACrBhB,OAAO;MACPI;IACJ,CAAC,CAAC;EACN,CAAC,CAAC;AACN,CAAC;AAACa,OAAA,CAAAnB,sBAAA,GAAAA,sBAAA","ignoreList":[]}
1
+ {"version":3,"names":["_markLockedFields","require","assignAfterEntryDelete","params","context","onEntryAfterDelete","subscribe","entry","model","permanent","items","cms","storageOperations","entries","list","where","entryId_not","entryId","latest","limit","length","markUnlockedFields","exports"],"sources":["afterDelete.ts"],"sourcesContent":["import { Topic } from \"@webiny/pubsub/types\";\nimport { OnEntryAfterDeleteTopicParams, CmsContext } from \"~/types\";\nimport { markUnlockedFields } from \"./markLockedFields\";\n\ninterface AssignAfterEntryDeleteParams {\n context: CmsContext;\n onEntryAfterDelete: Topic<OnEntryAfterDeleteTopicParams>;\n}\nexport const assignAfterEntryDelete = (params: AssignAfterEntryDeleteParams) => {\n const { context, onEntryAfterDelete } = params;\n\n onEntryAfterDelete.subscribe(async params => {\n const { entry, model, permanent } = params;\n\n // If the entry is being moved to the trash, we keep the model fields locked because the entry can be restored.\n if (!permanent) {\n return;\n }\n const { items } = await context.cms.storageOperations.entries.list(model, {\n where: {\n entryId_not: entry.entryId,\n latest: true\n },\n limit: 1\n });\n if (items.length > 0) {\n return;\n }\n await markUnlockedFields({\n context,\n model\n });\n });\n};\n"],"mappings":";;;;;;AAEA,IAAAA,iBAAA,GAAAC,OAAA;AAMO,MAAMC,sBAAsB,GAAIC,MAAoC,IAAK;EAC5E,MAAM;IAAEC,OAAO;IAAEC;EAAmB,CAAC,GAAGF,MAAM;EAE9CE,kBAAkB,CAACC,SAAS,CAAC,MAAMH,MAAM,IAAI;IACzC,MAAM;MAAEI,KAAK;MAAEC,KAAK;MAAEC;IAAU,CAAC,GAAGN,MAAM;;IAE1C;IACA,IAAI,CAACM,SAAS,EAAE;MACZ;IACJ;IACA,MAAM;MAAEC;IAAM,CAAC,GAAG,MAAMN,OAAO,CAACO,GAAG,CAACC,iBAAiB,CAACC,OAAO,CAACC,IAAI,CAACN,KAAK,EAAE;MACtEO,KAAK,EAAE;QACHC,WAAW,EAAET,KAAK,CAACU,OAAO;QAC1BC,MAAM,EAAE;MACZ,CAAC;MACDC,KAAK,EAAE;IACX,CAAC,CAAC;IACF,IAAIT,KAAK,CAACU,MAAM,GAAG,CAAC,EAAE;MAClB;IACJ;IACA,MAAM,IAAAC,oCAAkB,EAAC;MACrBjB,OAAO;MACPI;IACJ,CAAC,CAAC;EACN,CAAC,CAAC;AACN,CAAC;AAACc,OAAA,CAAApB,sBAAA,GAAAA,sBAAA","ignoreList":[]}
@@ -7,7 +7,6 @@ exports.TransformEntryMoveToBin = void 0;
7
7
  var _entryStorage = require("../../../../utils/entryStorage");
8
8
  var _date = require("../../../../utils/date");
9
9
  var _identity = require("../../../../utils/identity");
10
- var _entryDataValidation = require("../../entryDataValidation");
11
10
  var _constants = require("../../../../constants");
12
11
  class TransformEntryMoveToBin {
13
12
  constructor(context, getIdentity) {
@@ -24,13 +23,6 @@ class TransformEntryMoveToBin {
24
23
  };
25
24
  }
26
25
  async createDeleteEntryData(model, originalEntry) {
27
- await (0, _entryDataValidation.validateModelEntryDataOrThrow)({
28
- context: this.context,
29
- model,
30
- data: originalEntry.values,
31
- entry: originalEntry,
32
- skipValidators: ["required"]
33
- });
34
26
  const currentDateTime = new Date().toISOString();
35
27
  const currentIdentity = this.getIdentity();
36
28
  const entry = {
@@ -1 +1 @@
1
- {"version":3,"names":["_entryStorage","require","_date","_identity","_entryDataValidation","_constants","TransformEntryMoveToBin","constructor","context","getIdentity","execute","model","initialEntry","originalEntry","entryFromStorageTransform","entry","createDeleteEntryData","storageEntry","entryToStorageTransform","validateModelEntryDataOrThrow","data","values","skipValidators","currentDateTime","Date","toISOString","currentIdentity","wbyDeleted","location","folderId","ROOT_FOLDER","binOriginalFolderId","deletedOn","getDate","deletedBy","revisionDeletedOn","revisionDeletedBy","exports"],"sources":["TransformEntryMoveToBin.ts"],"sourcesContent":["import { SecurityIdentity } from \"@webiny/api-security/types\";\nimport { entryFromStorageTransform, entryToStorageTransform } from \"~/utils/entryStorage\";\nimport { getDate } from \"~/utils/date\";\nimport { getIdentity } from \"~/utils/identity\";\nimport { validateModelEntryDataOrThrow } from \"~/crud/contentEntry/entryDataValidation\";\nimport { CmsContext, CmsEntry, CmsEntryStorageOperationsMoveToBinParams, CmsModel } from \"~/types\";\nimport { ROOT_FOLDER } from \"~/constants\";\n\nexport class TransformEntryMoveToBin {\n private context: CmsContext;\n private getIdentity: () => SecurityIdentity;\n\n constructor(context: CmsContext, getIdentity: () => SecurityIdentity) {\n this.context = context;\n this.getIdentity = getIdentity;\n }\n async execute(\n model: CmsModel,\n initialEntry: CmsEntry\n ): Promise<CmsEntryStorageOperationsMoveToBinParams> {\n const originalEntry = await entryFromStorageTransform(this.context, model, initialEntry);\n const entry = await this.createDeleteEntryData(model, originalEntry);\n const storageEntry = await entryToStorageTransform(this.context, model, entry);\n\n return {\n entry,\n storageEntry\n };\n }\n\n private async createDeleteEntryData(model: CmsModel, originalEntry: CmsEntry) {\n await validateModelEntryDataOrThrow({\n context: this.context,\n model,\n data: originalEntry.values,\n entry: originalEntry,\n skipValidators: [\"required\"]\n });\n\n const currentDateTime = new Date().toISOString();\n const currentIdentity = this.getIdentity();\n\n const entry: CmsEntry = {\n ...originalEntry,\n wbyDeleted: true,\n\n /**\n * Entry location fields. 👇\n */\n location: {\n folderId: ROOT_FOLDER\n },\n binOriginalFolderId: originalEntry.location?.folderId,\n\n /**\n * Entry-level meta fields. 👇\n */\n deletedOn: getDate(currentDateTime, null),\n deletedBy: getIdentity(currentIdentity, null),\n\n /**\n * Revision-level meta fields. 👇\n */\n revisionDeletedOn: getDate(currentDateTime, null),\n revisionDeletedBy: getIdentity(currentIdentity, null)\n };\n\n return entry;\n }\n}\n"],"mappings":";;;;;;AACA,IAAAA,aAAA,GAAAC,OAAA;AACA,IAAAC,KAAA,GAAAD,OAAA;AACA,IAAAE,SAAA,GAAAF,OAAA;AACA,IAAAG,oBAAA,GAAAH,OAAA;AAEA,IAAAI,UAAA,GAAAJ,OAAA;AAEO,MAAMK,uBAAuB,CAAC;EAIjCC,WAAWA,CAACC,OAAmB,EAAEC,WAAmC,EAAE;IAClE,IAAI,CAACD,OAAO,GAAGA,OAAO;IACtB,IAAI,CAACC,WAAW,GAAGA,WAAW;EAClC;EACA,MAAMC,OAAOA,CACTC,KAAe,EACfC,YAAsB,EAC2B;IACjD,MAAMC,aAAa,GAAG,MAAM,IAAAC,uCAAyB,EAAC,IAAI,CAACN,OAAO,EAAEG,KAAK,EAAEC,YAAY,CAAC;IACxF,MAAMG,KAAK,GAAG,MAAM,IAAI,CAACC,qBAAqB,CAACL,KAAK,EAAEE,aAAa,CAAC;IACpE,MAAMI,YAAY,GAAG,MAAM,IAAAC,qCAAuB,EAAC,IAAI,CAACV,OAAO,EAAEG,KAAK,EAAEI,KAAK,CAAC;IAE9E,OAAO;MACHA,KAAK;MACLE;IACJ,CAAC;EACL;EAEA,MAAcD,qBAAqBA,CAACL,KAAe,EAAEE,aAAuB,EAAE;IAC1E,MAAM,IAAAM,kDAA6B,EAAC;MAChCX,OAAO,EAAE,IAAI,CAACA,OAAO;MACrBG,KAAK;MACLS,IAAI,EAAEP,aAAa,CAACQ,MAAM;MAC1BN,KAAK,EAAEF,aAAa;MACpBS,cAAc,EAAE,CAAC,UAAU;IAC/B,CAAC,CAAC;IAEF,MAAMC,eAAe,GAAG,IAAIC,IAAI,CAAC,CAAC,CAACC,WAAW,CAAC,CAAC;IAChD,MAAMC,eAAe,GAAG,IAAI,CAACjB,WAAW,CAAC,CAAC;IAE1C,MAAMM,KAAe,GAAG;MACpB,GAAGF,aAAa;MAChBc,UAAU,EAAE,IAAI;MAEhB;AACZ;AACA;MACYC,QAAQ,EAAE;QACNC,QAAQ,EAAEC;MACd,CAAC;MACDC,mBAAmB,EAAElB,aAAa,CAACe,QAAQ,EAAEC,QAAQ;MAErD;AACZ;AACA;MACYG,SAAS,EAAE,IAAAC,aAAO,EAACV,eAAe,EAAE,IAAI,CAAC;MACzCW,SAAS,EAAE,IAAAzB,qBAAW,EAACiB,eAAe,EAAE,IAAI,CAAC;MAE7C;AACZ;AACA;MACYS,iBAAiB,EAAE,IAAAF,aAAO,EAACV,eAAe,EAAE,IAAI,CAAC;MACjDa,iBAAiB,EAAE,IAAA3B,qBAAW,EAACiB,eAAe,EAAE,IAAI;IACxD,CAAC;IAED,OAAOX,KAAK;EAChB;AACJ;AAACsB,OAAA,CAAA/B,uBAAA,GAAAA,uBAAA","ignoreList":[]}
1
+ {"version":3,"names":["_entryStorage","require","_date","_identity","_constants","TransformEntryMoveToBin","constructor","context","getIdentity","execute","model","initialEntry","originalEntry","entryFromStorageTransform","entry","createDeleteEntryData","storageEntry","entryToStorageTransform","currentDateTime","Date","toISOString","currentIdentity","wbyDeleted","location","folderId","ROOT_FOLDER","binOriginalFolderId","deletedOn","getDate","deletedBy","revisionDeletedOn","revisionDeletedBy","exports"],"sources":["TransformEntryMoveToBin.ts"],"sourcesContent":["import { SecurityIdentity } from \"@webiny/api-security/types\";\nimport { entryFromStorageTransform, entryToStorageTransform } from \"~/utils/entryStorage\";\nimport { getDate } from \"~/utils/date\";\nimport { getIdentity } from \"~/utils/identity\";\nimport { CmsContext, CmsEntry, CmsEntryStorageOperationsMoveToBinParams, CmsModel } from \"~/types\";\nimport { ROOT_FOLDER } from \"~/constants\";\n\nexport class TransformEntryMoveToBin {\n private context: CmsContext;\n private getIdentity: () => SecurityIdentity;\n\n constructor(context: CmsContext, getIdentity: () => SecurityIdentity) {\n this.context = context;\n this.getIdentity = getIdentity;\n }\n async execute(\n model: CmsModel,\n initialEntry: CmsEntry\n ): Promise<CmsEntryStorageOperationsMoveToBinParams> {\n const originalEntry = await entryFromStorageTransform(this.context, model, initialEntry);\n const entry = await this.createDeleteEntryData(model, originalEntry);\n const storageEntry = await entryToStorageTransform(this.context, model, entry);\n\n return {\n entry,\n storageEntry\n };\n }\n\n private async createDeleteEntryData(model: CmsModel, originalEntry: CmsEntry) {\n const currentDateTime = new Date().toISOString();\n const currentIdentity = this.getIdentity();\n\n const entry: CmsEntry = {\n ...originalEntry,\n wbyDeleted: true,\n\n /**\n * Entry location fields. 👇\n */\n location: {\n folderId: ROOT_FOLDER\n },\n binOriginalFolderId: originalEntry.location?.folderId,\n\n /**\n * Entry-level meta fields. 👇\n */\n deletedOn: getDate(currentDateTime, null),\n deletedBy: getIdentity(currentIdentity, null),\n\n /**\n * Revision-level meta fields. 👇\n */\n revisionDeletedOn: getDate(currentDateTime, null),\n revisionDeletedBy: getIdentity(currentIdentity, null)\n };\n\n return entry;\n }\n}\n"],"mappings":";;;;;;AACA,IAAAA,aAAA,GAAAC,OAAA;AACA,IAAAC,KAAA,GAAAD,OAAA;AACA,IAAAE,SAAA,GAAAF,OAAA;AAEA,IAAAG,UAAA,GAAAH,OAAA;AAEO,MAAMI,uBAAuB,CAAC;EAIjCC,WAAWA,CAACC,OAAmB,EAAEC,WAAmC,EAAE;IAClE,IAAI,CAACD,OAAO,GAAGA,OAAO;IACtB,IAAI,CAACC,WAAW,GAAGA,WAAW;EAClC;EACA,MAAMC,OAAOA,CACTC,KAAe,EACfC,YAAsB,EAC2B;IACjD,MAAMC,aAAa,GAAG,MAAM,IAAAC,uCAAyB,EAAC,IAAI,CAACN,OAAO,EAAEG,KAAK,EAAEC,YAAY,CAAC;IACxF,MAAMG,KAAK,GAAG,MAAM,IAAI,CAACC,qBAAqB,CAACL,KAAK,EAAEE,aAAa,CAAC;IACpE,MAAMI,YAAY,GAAG,MAAM,IAAAC,qCAAuB,EAAC,IAAI,CAACV,OAAO,EAAEG,KAAK,EAAEI,KAAK,CAAC;IAE9E,OAAO;MACHA,KAAK;MACLE;IACJ,CAAC;EACL;EAEA,MAAcD,qBAAqBA,CAACL,KAAe,EAAEE,aAAuB,EAAE;IAC1E,MAAMM,eAAe,GAAG,IAAIC,IAAI,CAAC,CAAC,CAACC,WAAW,CAAC,CAAC;IAChD,MAAMC,eAAe,GAAG,IAAI,CAACb,WAAW,CAAC,CAAC;IAE1C,MAAMM,KAAe,GAAG;MACpB,GAAGF,aAAa;MAChBU,UAAU,EAAE,IAAI;MAEhB;AACZ;AACA;MACYC,QAAQ,EAAE;QACNC,QAAQ,EAAEC;MACd,CAAC;MACDC,mBAAmB,EAAEd,aAAa,CAACW,QAAQ,EAAEC,QAAQ;MAErD;AACZ;AACA;MACYG,SAAS,EAAE,IAAAC,aAAO,EAACV,eAAe,EAAE,IAAI,CAAC;MACzCW,SAAS,EAAE,IAAArB,qBAAW,EAACa,eAAe,EAAE,IAAI,CAAC;MAE7C;AACZ;AACA;MACYS,iBAAiB,EAAE,IAAAF,aAAO,EAACV,eAAe,EAAE,IAAI,CAAC;MACjDa,iBAAiB,EAAE,IAAAvB,qBAAW,EAACa,eAAe,EAAE,IAAI;IACxD,CAAC;IAED,OAAOP,KAAK;EAChB;AACJ;AAACkB,OAAA,CAAA3B,uBAAA,GAAAA,uBAAA","ignoreList":[]}
@@ -7,7 +7,6 @@ exports.TransformEntryRestoreFromBin = void 0;
7
7
  var _entryStorage = require("../../../../utils/entryStorage");
8
8
  var _date = require("../../../../utils/date");
9
9
  var _identity = require("../../../../utils/identity");
10
- var _entryDataValidation = require("../../entryDataValidation");
11
10
  class TransformEntryRestoreFromBin {
12
11
  constructor(context, getIdentity) {
13
12
  this.context = context;
@@ -23,13 +22,6 @@ class TransformEntryRestoreFromBin {
23
22
  };
24
23
  }
25
24
  async createRestoreFromBinEntryData(model, originalEntry) {
26
- await (0, _entryDataValidation.validateModelEntryDataOrThrow)({
27
- context: this.context,
28
- model,
29
- data: originalEntry.values,
30
- entry: originalEntry,
31
- skipValidators: ["required"]
32
- });
33
25
  const currentDateTime = new Date().toISOString();
34
26
  const currentIdentity = this.getIdentity();
35
27
  const entry = {
@@ -1 +1 @@
1
- {"version":3,"names":["_entryStorage","require","_date","_identity","_entryDataValidation","TransformEntryRestoreFromBin","constructor","context","getIdentity","execute","model","initialEntry","originalEntry","entryFromStorageTransform","entry","createRestoreFromBinEntryData","storageEntry","entryToStorageTransform","validateModelEntryDataOrThrow","data","values","skipValidators","currentDateTime","Date","toISOString","currentIdentity","wbyDeleted","location","folderId","binOriginalFolderId","restoredOn","getDate","restoredBy","revisionRestoredOn","revisionRestoredBy","exports"],"sources":["TransformEntryRestoreFromBin.ts"],"sourcesContent":["import { SecurityIdentity } from \"@webiny/api-security/types\";\nimport { entryFromStorageTransform, entryToStorageTransform } from \"~/utils/entryStorage\";\nimport { getDate } from \"~/utils/date\";\nimport { getIdentity } from \"~/utils/identity\";\nimport { validateModelEntryDataOrThrow } from \"~/crud/contentEntry/entryDataValidation\";\nimport { CmsContext, CmsEntry, CmsEntryStorageOperationsMoveToBinParams, CmsModel } from \"~/types\";\n\nexport class TransformEntryRestoreFromBin {\n private context: CmsContext;\n private getIdentity: () => SecurityIdentity;\n\n constructor(context: CmsContext, getIdentity: () => SecurityIdentity) {\n this.context = context;\n this.getIdentity = getIdentity;\n }\n async execute(\n model: CmsModel,\n initialEntry: CmsEntry\n ): Promise<CmsEntryStorageOperationsMoveToBinParams> {\n const originalEntry = await entryFromStorageTransform(this.context, model, initialEntry);\n const entry = await this.createRestoreFromBinEntryData(model, originalEntry);\n const storageEntry = await entryToStorageTransform(this.context, model, entry);\n\n return {\n entry,\n storageEntry\n };\n }\n\n private async createRestoreFromBinEntryData(model: CmsModel, originalEntry: CmsEntry) {\n await validateModelEntryDataOrThrow({\n context: this.context,\n model,\n data: originalEntry.values,\n entry: originalEntry,\n skipValidators: [\"required\"]\n });\n\n const currentDateTime = new Date().toISOString();\n const currentIdentity = this.getIdentity();\n\n const entry: CmsEntry = {\n ...originalEntry,\n wbyDeleted: false,\n\n /**\n * Entry location fields. 👇\n */\n location: {\n folderId: originalEntry.binOriginalFolderId\n },\n binOriginalFolderId: null,\n\n /**\n * Entry-level meta fields. 👇\n */\n restoredOn: getDate(currentDateTime, null),\n restoredBy: getIdentity(currentIdentity, null),\n\n /**\n * Revision-level meta fields. 👇\n */\n revisionRestoredOn: getDate(currentDateTime, null),\n revisionRestoredBy: getIdentity(currentIdentity, null)\n };\n\n return entry;\n }\n}\n"],"mappings":";;;;;;AACA,IAAAA,aAAA,GAAAC,OAAA;AACA,IAAAC,KAAA,GAAAD,OAAA;AACA,IAAAE,SAAA,GAAAF,OAAA;AACA,IAAAG,oBAAA,GAAAH,OAAA;AAGO,MAAMI,4BAA4B,CAAC;EAItCC,WAAWA,CAACC,OAAmB,EAAEC,WAAmC,EAAE;IAClE,IAAI,CAACD,OAAO,GAAGA,OAAO;IACtB,IAAI,CAACC,WAAW,GAAGA,WAAW;EAClC;EACA,MAAMC,OAAOA,CACTC,KAAe,EACfC,YAAsB,EAC2B;IACjD,MAAMC,aAAa,GAAG,MAAM,IAAAC,uCAAyB,EAAC,IAAI,CAACN,OAAO,EAAEG,KAAK,EAAEC,YAAY,CAAC;IACxF,MAAMG,KAAK,GAAG,MAAM,IAAI,CAACC,6BAA6B,CAACL,KAAK,EAAEE,aAAa,CAAC;IAC5E,MAAMI,YAAY,GAAG,MAAM,IAAAC,qCAAuB,EAAC,IAAI,CAACV,OAAO,EAAEG,KAAK,EAAEI,KAAK,CAAC;IAE9E,OAAO;MACHA,KAAK;MACLE;IACJ,CAAC;EACL;EAEA,MAAcD,6BAA6BA,CAACL,KAAe,EAAEE,aAAuB,EAAE;IAClF,MAAM,IAAAM,kDAA6B,EAAC;MAChCX,OAAO,EAAE,IAAI,CAACA,OAAO;MACrBG,KAAK;MACLS,IAAI,EAAEP,aAAa,CAACQ,MAAM;MAC1BN,KAAK,EAAEF,aAAa;MACpBS,cAAc,EAAE,CAAC,UAAU;IAC/B,CAAC,CAAC;IAEF,MAAMC,eAAe,GAAG,IAAIC,IAAI,CAAC,CAAC,CAACC,WAAW,CAAC,CAAC;IAChD,MAAMC,eAAe,GAAG,IAAI,CAACjB,WAAW,CAAC,CAAC;IAE1C,MAAMM,KAAe,GAAG;MACpB,GAAGF,aAAa;MAChBc,UAAU,EAAE,KAAK;MAEjB;AACZ;AACA;MACYC,QAAQ,EAAE;QACNC,QAAQ,EAAEhB,aAAa,CAACiB;MAC5B,CAAC;MACDA,mBAAmB,EAAE,IAAI;MAEzB;AACZ;AACA;MACYC,UAAU,EAAE,IAAAC,aAAO,EAACT,eAAe,EAAE,IAAI,CAAC;MAC1CU,UAAU,EAAE,IAAAxB,qBAAW,EAACiB,eAAe,EAAE,IAAI,CAAC;MAE9C;AACZ;AACA;MACYQ,kBAAkB,EAAE,IAAAF,aAAO,EAACT,eAAe,EAAE,IAAI,CAAC;MAClDY,kBAAkB,EAAE,IAAA1B,qBAAW,EAACiB,eAAe,EAAE,IAAI;IACzD,CAAC;IAED,OAAOX,KAAK;EAChB;AACJ;AAACqB,OAAA,CAAA9B,4BAAA,GAAAA,4BAAA","ignoreList":[]}
1
+ {"version":3,"names":["_entryStorage","require","_date","_identity","TransformEntryRestoreFromBin","constructor","context","getIdentity","execute","model","initialEntry","originalEntry","entryFromStorageTransform","entry","createRestoreFromBinEntryData","storageEntry","entryToStorageTransform","currentDateTime","Date","toISOString","currentIdentity","wbyDeleted","location","folderId","binOriginalFolderId","restoredOn","getDate","restoredBy","revisionRestoredOn","revisionRestoredBy","exports"],"sources":["TransformEntryRestoreFromBin.ts"],"sourcesContent":["import { SecurityIdentity } from \"@webiny/api-security/types\";\nimport { entryFromStorageTransform, entryToStorageTransform } from \"~/utils/entryStorage\";\nimport { getDate } from \"~/utils/date\";\nimport { getIdentity } from \"~/utils/identity\";\nimport { CmsContext, CmsEntry, CmsEntryStorageOperationsMoveToBinParams, CmsModel } from \"~/types\";\n\nexport class TransformEntryRestoreFromBin {\n private context: CmsContext;\n private getIdentity: () => SecurityIdentity;\n\n constructor(context: CmsContext, getIdentity: () => SecurityIdentity) {\n this.context = context;\n this.getIdentity = getIdentity;\n }\n async execute(\n model: CmsModel,\n initialEntry: CmsEntry\n ): Promise<CmsEntryStorageOperationsMoveToBinParams> {\n const originalEntry = await entryFromStorageTransform(this.context, model, initialEntry);\n const entry = await this.createRestoreFromBinEntryData(model, originalEntry);\n const storageEntry = await entryToStorageTransform(this.context, model, entry);\n\n return {\n entry,\n storageEntry\n };\n }\n\n private async createRestoreFromBinEntryData(model: CmsModel, originalEntry: CmsEntry) {\n const currentDateTime = new Date().toISOString();\n const currentIdentity = this.getIdentity();\n\n const entry: CmsEntry = {\n ...originalEntry,\n wbyDeleted: false,\n\n /**\n * Entry location fields. 👇\n */\n location: {\n folderId: originalEntry.binOriginalFolderId\n },\n binOriginalFolderId: null,\n\n /**\n * Entry-level meta fields. 👇\n */\n restoredOn: getDate(currentDateTime, null),\n restoredBy: getIdentity(currentIdentity, null),\n\n /**\n * Revision-level meta fields. 👇\n */\n revisionRestoredOn: getDate(currentDateTime, null),\n revisionRestoredBy: getIdentity(currentIdentity, null)\n };\n\n return entry;\n }\n}\n"],"mappings":";;;;;;AACA,IAAAA,aAAA,GAAAC,OAAA;AACA,IAAAC,KAAA,GAAAD,OAAA;AACA,IAAAE,SAAA,GAAAF,OAAA;AAGO,MAAMG,4BAA4B,CAAC;EAItCC,WAAWA,CAACC,OAAmB,EAAEC,WAAmC,EAAE;IAClE,IAAI,CAACD,OAAO,GAAGA,OAAO;IACtB,IAAI,CAACC,WAAW,GAAGA,WAAW;EAClC;EACA,MAAMC,OAAOA,CACTC,KAAe,EACfC,YAAsB,EAC2B;IACjD,MAAMC,aAAa,GAAG,MAAM,IAAAC,uCAAyB,EAAC,IAAI,CAACN,OAAO,EAAEG,KAAK,EAAEC,YAAY,CAAC;IACxF,MAAMG,KAAK,GAAG,MAAM,IAAI,CAACC,6BAA6B,CAACL,KAAK,EAAEE,aAAa,CAAC;IAC5E,MAAMI,YAAY,GAAG,MAAM,IAAAC,qCAAuB,EAAC,IAAI,CAACV,OAAO,EAAEG,KAAK,EAAEI,KAAK,CAAC;IAE9E,OAAO;MACHA,KAAK;MACLE;IACJ,CAAC;EACL;EAEA,MAAcD,6BAA6BA,CAACL,KAAe,EAAEE,aAAuB,EAAE;IAClF,MAAMM,eAAe,GAAG,IAAIC,IAAI,CAAC,CAAC,CAACC,WAAW,CAAC,CAAC;IAChD,MAAMC,eAAe,GAAG,IAAI,CAACb,WAAW,CAAC,CAAC;IAE1C,MAAMM,KAAe,GAAG;MACpB,GAAGF,aAAa;MAChBU,UAAU,EAAE,KAAK;MAEjB;AACZ;AACA;MACYC,QAAQ,EAAE;QACNC,QAAQ,EAAEZ,aAAa,CAACa;MAC5B,CAAC;MACDA,mBAAmB,EAAE,IAAI;MAEzB;AACZ;AACA;MACYC,UAAU,EAAE,IAAAC,aAAO,EAACT,eAAe,EAAE,IAAI,CAAC;MAC1CU,UAAU,EAAE,IAAApB,qBAAW,EAACa,eAAe,EAAE,IAAI,CAAC;MAE9C;AACZ;AACA;MACYQ,kBAAkB,EAAE,IAAAF,aAAO,EAACT,eAAe,EAAE,IAAI,CAAC;MAClDY,kBAAkB,EAAE,IAAAtB,qBAAW,EAACa,eAAe,EAAE,IAAI;IACzD,CAAC;IAED,OAAOP,KAAK;EAChB;AACJ;AAACiB,OAAA,CAAA1B,4BAAA,GAAAA,4BAAA","ignoreList":[]}
@@ -7,6 +7,7 @@ Object.defineProperty(exports, "__esModule", {
7
7
  exports.assignModelBeforeDelete = void 0;
8
8
  var _error = _interopRequireDefault(require("@webiny/error"));
9
9
  var _CmsModelPlugin = require("../../plugins/CmsModelPlugin");
10
+ var _constants = require("../../constants");
10
11
  const assignModelBeforeDelete = params => {
11
12
  const {
12
13
  onModelBeforeDelete,
@@ -22,6 +23,36 @@ const assignModelBeforeDelete = params => {
22
23
  modelId: model.modelId
23
24
  });
24
25
  }
26
+ const tags = Array.isArray(model.tags) ? model.tags : [];
27
+ /**
28
+ * If the model is a singleton, we need to delete all entries.
29
+ * There will be either 0 or 1 entries in latest or deleted, but let's put high limit, just in case...
30
+ */
31
+ if (tags.includes(_constants.CMS_MODEL_SINGLETON_TAG)) {
32
+ const [latestEntries] = await context.cms.listLatestEntries(model, {
33
+ limit: 10000
34
+ });
35
+ if (latestEntries.length > 0) {
36
+ for (const item of latestEntries) {
37
+ await context.cms.deleteEntry(model, item.id, {
38
+ permanently: true
39
+ });
40
+ }
41
+ return;
42
+ }
43
+ const [deletedEntries] = await context.cms.listDeletedEntries(model, {
44
+ limit: 10000
45
+ });
46
+ if (deletedEntries.length === 0) {
47
+ return;
48
+ }
49
+ for (const item of deletedEntries) {
50
+ await context.cms.deleteEntry(model, item.id, {
51
+ permanently: true
52
+ });
53
+ }
54
+ return;
55
+ }
25
56
  try {
26
57
  const [latestEntries] = await context.cms.listLatestEntries(model, {
27
58
  limit: 1
@@ -1 +1 @@
1
- {"version":3,"names":["_error","_interopRequireDefault","require","_CmsModelPlugin","assignModelBeforeDelete","params","onModelBeforeDelete","context","subscribe","model","modelPlugin","plugins","byType","CmsModelPlugin","type","find","item","contentModel","modelId","WebinyError","latestEntries","cms","listLatestEntries","limit","length","deletedEntries","listDeletedEntries","ex","from","message","code","data","exports"],"sources":["beforeDelete.ts"],"sourcesContent":["import { Topic } from \"@webiny/pubsub/types\";\nimport { CmsContext, OnModelBeforeDeleteTopicParams } from \"~/types\";\nimport WebinyError from \"@webiny/error\";\nimport { CmsModelPlugin } from \"~/plugins/CmsModelPlugin\";\n\ninterface AssignBeforeModelDeleteParams {\n onModelBeforeDelete: Topic<OnModelBeforeDeleteTopicParams>;\n context: CmsContext;\n}\nexport const assignModelBeforeDelete = (params: AssignBeforeModelDeleteParams) => {\n const { onModelBeforeDelete, context } = params;\n\n onModelBeforeDelete.subscribe(async params => {\n const { model } = params;\n\n const modelPlugin = context.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 deleted.\",\n \"CONTENT_MODEL_DELETE_ERROR\",\n {\n modelId: model.modelId\n }\n );\n }\n\n try {\n const [latestEntries] = await context.cms.listLatestEntries(model, { limit: 1 });\n\n if (latestEntries.length > 0) {\n throw new WebinyError(\n `Cannot delete content model \"${model.modelId}\" because there are existing entries.`,\n \"CONTENT_MODEL_BEFORE_DELETE_HOOK_FAILED\"\n );\n }\n\n const [deletedEntries] = await context.cms.listDeletedEntries(model, { limit: 1 });\n\n if (deletedEntries.length > 0) {\n throw new WebinyError(\n `Cannot delete content model \"${model.modelId}\" because there are existing entries in the trash.`,\n \"CONTENT_MODEL_BEFORE_DELETE_HOOK_FAILED\"\n );\n }\n } catch (ex) {\n throw WebinyError.from(ex, {\n message: \"Could not retrieve a list of content entries from the model.\",\n code: \"ENTRIES_ERROR\",\n data: {\n model\n }\n });\n }\n });\n};\n"],"mappings":";;;;;;;AAEA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,eAAA,GAAAD,OAAA;AAMO,MAAME,uBAAuB,GAAIC,MAAqC,IAAK;EAC9E,MAAM;IAAEC,mBAAmB;IAAEC;EAAQ,CAAC,GAAGF,MAAM;EAE/CC,mBAAmB,CAACE,SAAS,CAAC,MAAMH,MAAM,IAAI;IAC1C,MAAM;MAAEI;IAAM,CAAC,GAAGJ,MAAM;IAExB,MAAMK,WAAW,GAAGH,OAAO,CAACI,OAAO,CAC9BC,MAAM,CAAiBC,8BAAc,CAACC,IAAI,CAAC,CAC3CC,IAAI,CAACC,IAAI,IAAIA,IAAI,CAACC,YAAY,CAACC,OAAO,KAAKT,KAAK,CAACS,OAAO,CAAC;IAE9D,IAAIR,WAAW,EAAE;MACb,MAAM,IAAIS,cAAW,CACjB,uDAAuD,EACvD,4BAA4B,EAC5B;QACID,OAAO,EAAET,KAAK,CAACS;MACnB,CACJ,CAAC;IACL;IAEA,IAAI;MACA,MAAM,CAACE,aAAa,CAAC,GAAG,MAAMb,OAAO,CAACc,GAAG,CAACC,iBAAiB,CAACb,KAAK,EAAE;QAAEc,KAAK,EAAE;MAAE,CAAC,CAAC;MAEhF,IAAIH,aAAa,CAACI,MAAM,GAAG,CAAC,EAAE;QAC1B,MAAM,IAAIL,cAAW,CAChB,gCAA+BV,KAAK,CAACS,OAAQ,uCAAsC,EACpF,yCACJ,CAAC;MACL;MAEA,MAAM,CAACO,cAAc,CAAC,GAAG,MAAMlB,OAAO,CAACc,GAAG,CAACK,kBAAkB,CAACjB,KAAK,EAAE;QAAEc,KAAK,EAAE;MAAE,CAAC,CAAC;MAElF,IAAIE,cAAc,CAACD,MAAM,GAAG,CAAC,EAAE;QAC3B,MAAM,IAAIL,cAAW,CAChB,gCAA+BV,KAAK,CAACS,OAAQ,oDAAmD,EACjG,yCACJ,CAAC;MACL;IACJ,CAAC,CAAC,OAAOS,EAAE,EAAE;MACT,MAAMR,cAAW,CAACS,IAAI,CAACD,EAAE,EAAE;QACvBE,OAAO,EAAE,8DAA8D;QACvEC,IAAI,EAAE,eAAe;QACrBC,IAAI,EAAE;UACFtB;QACJ;MACJ,CAAC,CAAC;IACN;EACJ,CAAC,CAAC;AACN,CAAC;AAACuB,OAAA,CAAA5B,uBAAA,GAAAA,uBAAA","ignoreList":[]}
1
+ {"version":3,"names":["_error","_interopRequireDefault","require","_CmsModelPlugin","_constants","assignModelBeforeDelete","params","onModelBeforeDelete","context","subscribe","model","modelPlugin","plugins","byType","CmsModelPlugin","type","find","item","contentModel","modelId","WebinyError","tags","Array","isArray","includes","CMS_MODEL_SINGLETON_TAG","latestEntries","cms","listLatestEntries","limit","length","deleteEntry","id","permanently","deletedEntries","listDeletedEntries","ex","from","message","code","data","exports"],"sources":["beforeDelete.ts"],"sourcesContent":["import { Topic } from \"@webiny/pubsub/types\";\nimport { CmsContext, OnModelBeforeDeleteTopicParams } from \"~/types\";\nimport WebinyError from \"@webiny/error\";\nimport { CmsModelPlugin } from \"~/plugins/CmsModelPlugin\";\nimport { CMS_MODEL_SINGLETON_TAG } from \"~/constants\";\n\ninterface AssignBeforeModelDeleteParams {\n onModelBeforeDelete: Topic<OnModelBeforeDeleteTopicParams>;\n context: CmsContext;\n}\nexport const assignModelBeforeDelete = (params: AssignBeforeModelDeleteParams) => {\n const { onModelBeforeDelete, context } = params;\n\n onModelBeforeDelete.subscribe(async params => {\n const { model } = params;\n\n const modelPlugin = context.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 deleted.\",\n \"CONTENT_MODEL_DELETE_ERROR\",\n {\n modelId: model.modelId\n }\n );\n }\n\n const tags = Array.isArray(model.tags) ? model.tags : [];\n /**\n * If the model is a singleton, we need to delete all entries.\n * There will be either 0 or 1 entries in latest or deleted, but let's put high limit, just in case...\n */\n if (tags.includes(CMS_MODEL_SINGLETON_TAG)) {\n const [latestEntries] = await context.cms.listLatestEntries(model, {\n limit: 10000\n });\n\n if (latestEntries.length > 0) {\n for (const item of latestEntries) {\n await context.cms.deleteEntry(model, item.id, {\n permanently: true\n });\n }\n return;\n }\n\n const [deletedEntries] = await context.cms.listDeletedEntries(model, {\n limit: 10000\n });\n\n if (deletedEntries.length === 0) {\n return;\n }\n\n for (const item of deletedEntries) {\n await context.cms.deleteEntry(model, item.id, {\n permanently: true\n });\n }\n\n return;\n }\n\n try {\n const [latestEntries] = await context.cms.listLatestEntries(model, { limit: 1 });\n\n if (latestEntries.length > 0) {\n throw new WebinyError(\n `Cannot delete content model \"${model.modelId}\" because there are existing entries.`,\n \"CONTENT_MODEL_BEFORE_DELETE_HOOK_FAILED\"\n );\n }\n\n const [deletedEntries] = await context.cms.listDeletedEntries(model, { limit: 1 });\n\n if (deletedEntries.length > 0) {\n throw new WebinyError(\n `Cannot delete content model \"${model.modelId}\" because there are existing entries in the trash.`,\n \"CONTENT_MODEL_BEFORE_DELETE_HOOK_FAILED\"\n );\n }\n } catch (ex) {\n throw WebinyError.from(ex, {\n message: \"Could not retrieve a list of content entries from the model.\",\n code: \"ENTRIES_ERROR\",\n data: {\n model\n }\n });\n }\n });\n};\n"],"mappings":"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","ignoreList":[]}