@webiny/api-headless-cms 5.34.8 → 5.35.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (374) hide show
  1. package/context.js +47 -68
  2. package/context.js.map +1 -1
  3. package/crud/contentEntry/afterDelete.js +0 -5
  4. package/crud/contentEntry/afterDelete.js.map +1 -1
  5. package/crud/contentEntry/beforeCreate.js +0 -3
  6. package/crud/contentEntry/beforeCreate.js.map +1 -1
  7. package/crud/contentEntry/beforeUpdate.js +0 -3
  8. package/crud/contentEntry/beforeUpdate.js.map +1 -1
  9. package/crud/contentEntry/entryDataValidation.js +1 -40
  10. package/crud/contentEntry/entryDataValidation.js.map +1 -1
  11. package/crud/contentEntry/markLockedFields.d.ts +1 -1
  12. package/crud/contentEntry/markLockedFields.js +5 -26
  13. package/crud/contentEntry/markLockedFields.js.map +1 -1
  14. package/crud/contentEntry/referenceFieldsMapping.js +39 -66
  15. package/crud/contentEntry/referenceFieldsMapping.js.map +1 -1
  16. package/crud/contentEntry/searchableFields.js +1 -12
  17. package/crud/contentEntry/searchableFields.js.map +1 -1
  18. package/crud/contentEntry.crud.d.ts +5 -2
  19. package/crud/contentEntry.crud.js +859 -941
  20. package/crud/contentEntry.crud.js.map +1 -1
  21. package/crud/contentModel/afterCreate.js +0 -2
  22. package/crud/contentModel/afterCreate.js.map +1 -1
  23. package/crud/contentModel/afterCreateFrom.js +0 -2
  24. package/crud/contentModel/afterCreateFrom.js.map +1 -1
  25. package/crud/contentModel/afterDelete.js +0 -2
  26. package/crud/contentModel/afterDelete.js.map +1 -1
  27. package/crud/contentModel/afterUpdate.js +0 -2
  28. package/crud/contentModel/afterUpdate.js.map +1 -1
  29. package/crud/contentModel/beforeCreate.js +39 -105
  30. package/crud/contentModel/beforeCreate.js.map +1 -1
  31. package/crud/contentModel/beforeDelete.d.ts +1 -1
  32. package/crud/contentModel/beforeDelete.js +1 -15
  33. package/crud/contentModel/beforeDelete.js.map +1 -1
  34. package/crud/contentModel/beforeUpdate.js +31 -8
  35. package/crud/contentModel/beforeUpdate.js.map +1 -1
  36. package/crud/contentModel/compatibility/modelApiName.d.ts +3 -0
  37. package/crud/contentModel/compatibility/modelApiName.js +24 -0
  38. package/crud/contentModel/compatibility/modelApiName.js.map +1 -0
  39. package/crud/contentModel/contentModelManagerFactory.js +0 -7
  40. package/crud/contentModel/contentModelManagerFactory.js.map +1 -1
  41. package/crud/contentModel/createFieldStorageId.js +0 -3
  42. package/crud/contentModel/createFieldStorageId.js.map +1 -1
  43. package/crud/contentModel/defaultFields.d.ts +5 -0
  44. package/crud/contentModel/defaultFields.js +58 -0
  45. package/crud/contentModel/defaultFields.js.map +1 -0
  46. package/crud/contentModel/fields/descriptionField.d.ts +2 -0
  47. package/crud/contentModel/fields/descriptionField.js +42 -0
  48. package/crud/contentModel/fields/descriptionField.js.map +1 -0
  49. package/crud/contentModel/fields/imageField.d.ts +2 -0
  50. package/crud/contentModel/fields/imageField.js +46 -0
  51. package/crud/contentModel/fields/imageField.js.map +1 -0
  52. package/crud/contentModel/fields/titleField.d.ts +2 -0
  53. package/crud/contentModel/fields/titleField.js +58 -0
  54. package/crud/contentModel/fields/titleField.js.map +1 -0
  55. package/crud/contentModel/validate/endingAllowed.d.ts +6 -0
  56. package/crud/contentModel/validate/endingAllowed.js +26 -0
  57. package/crud/contentModel/validate/endingAllowed.js.map +1 -0
  58. package/crud/contentModel/validate/isModelEndingAllowed.d.ts +6 -0
  59. package/crud/contentModel/validate/isModelEndingAllowed.js +24 -0
  60. package/crud/contentModel/validate/isModelEndingAllowed.js.map +1 -0
  61. package/crud/contentModel/validate/modelId.d.ts +11 -0
  62. package/crud/contentModel/validate/modelId.js +36 -0
  63. package/crud/contentModel/validate/modelId.js.map +1 -0
  64. package/crud/contentModel/validate/pluralApiName.d.ts +7 -0
  65. package/crud/contentModel/validate/pluralApiName.js +24 -0
  66. package/crud/contentModel/validate/pluralApiName.js.map +1 -0
  67. package/crud/contentModel/validate/singularApiName.d.ts +7 -0
  68. package/crud/contentModel/validate/singularApiName.js +24 -0
  69. package/crud/contentModel/validate/singularApiName.js.map +1 -0
  70. package/crud/contentModel/validateLayout.js +0 -8
  71. package/crud/contentModel/validateLayout.js.map +1 -1
  72. package/crud/contentModel/validateModel.d.ts +1 -0
  73. package/crud/contentModel/validateModel.js +0 -8
  74. package/crud/contentModel/validateModel.js.map +1 -1
  75. package/crud/contentModel/validateModelFields.d.ts +2 -1
  76. package/crud/contentModel/validateModelFields.js +25 -133
  77. package/crud/contentModel/validateModelFields.js.map +1 -1
  78. package/crud/contentModel/validation.d.ts +551 -0
  79. package/crud/contentModel/validation.js +145 -0
  80. package/crud/contentModel/validation.js.map +1 -0
  81. package/crud/contentModel.crud.js +354 -373
  82. package/crud/contentModel.crud.js.map +1 -1
  83. package/crud/contentModelGroup/beforeCreate.js +0 -12
  84. package/crud/contentModelGroup/beforeCreate.js.map +1 -1
  85. package/crud/contentModelGroup/beforeDelete.js +0 -8
  86. package/crud/contentModelGroup/beforeDelete.js.map +1 -1
  87. package/crud/contentModelGroup/beforeUpdate.js +0 -5
  88. package/crud/contentModelGroup/beforeUpdate.js.map +1 -1
  89. package/crud/contentModelGroup/validation.d.ts +30 -0
  90. package/crud/contentModelGroup/validation.js +34 -0
  91. package/crud/contentModelGroup/validation.js.map +1 -0
  92. package/crud/contentModelGroup.crud.js +177 -221
  93. package/crud/contentModelGroup.crud.js.map +1 -1
  94. package/crud/settings.crud.d.ts +1 -1
  95. package/crud/settings.crud.js +5 -22
  96. package/crud/settings.crud.js.map +1 -1
  97. package/crud/system.crud.js +1 -96
  98. package/crud/system.crud.js.map +1 -1
  99. package/fieldConverters/CmsModelDefaultFieldConverterPlugin.js +0 -13
  100. package/fieldConverters/CmsModelDefaultFieldConverterPlugin.js.map +1 -1
  101. package/fieldConverters/CmsModelDynamicZoneFieldConverterPlugin.js +0 -36
  102. package/fieldConverters/CmsModelDynamicZoneFieldConverterPlugin.js.map +1 -1
  103. package/fieldConverters/CmsModelObjectFieldConverterPlugin.js +0 -53
  104. package/fieldConverters/CmsModelObjectFieldConverterPlugin.js.map +1 -1
  105. package/fieldConverters/index.js +0 -5
  106. package/fieldConverters/index.js.map +1 -1
  107. package/graphql/buildSchemaPlugins.d.ts +2 -2
  108. package/graphql/buildSchemaPlugins.js +4 -9
  109. package/graphql/buildSchemaPlugins.js.map +1 -1
  110. package/graphql/checkEndpointAccess.d.ts +2 -0
  111. package/graphql/checkEndpointAccess.js +18 -0
  112. package/graphql/checkEndpointAccess.js.map +1 -0
  113. package/graphql/createExecutableSchema.d.ts +2 -3
  114. package/graphql/createExecutableSchema.js +2 -6
  115. package/graphql/createExecutableSchema.js.map +1 -1
  116. package/graphql/createRequestBody.d.ts +2 -0
  117. package/graphql/createRequestBody.js +14 -0
  118. package/graphql/createRequestBody.js.map +1 -0
  119. package/graphql/formatErrorPayload.d.ts +1 -0
  120. package/graphql/formatErrorPayload.js +25 -0
  121. package/graphql/formatErrorPayload.js.map +1 -0
  122. package/graphql/generateSchema.js +2 -9
  123. package/graphql/generateSchema.js.map +1 -1
  124. package/graphql/getSchema.d.ts +17 -0
  125. package/graphql/getSchema.js +102 -0
  126. package/graphql/getSchema.js.map +1 -0
  127. package/graphql/graphQLHandlerFactory.js +6 -173
  128. package/graphql/graphQLHandlerFactory.js.map +1 -1
  129. package/graphql/handleRequest.d.ts +11 -0
  130. package/graphql/handleRequest.js +81 -0
  131. package/graphql/handleRequest.js.map +1 -0
  132. package/graphql/index.d.ts +1 -1
  133. package/graphql/index.js +0 -5
  134. package/graphql/index.js.map +1 -1
  135. package/graphql/schema/baseContentSchema.d.ts +2 -2
  136. package/graphql/schema/baseContentSchema.js +5 -19
  137. package/graphql/schema/baseContentSchema.js.map +1 -1
  138. package/graphql/schema/baseSchema.d.ts +1 -1
  139. package/graphql/schema/baseSchema.js +5 -10
  140. package/graphql/schema/baseSchema.js.map +1 -1
  141. package/graphql/schema/contentEntries.d.ts +2 -2
  142. package/graphql/schema/contentEntries.js +98 -100
  143. package/graphql/schema/contentEntries.js.map +1 -1
  144. package/graphql/schema/contentModelGroups.d.ts +2 -2
  145. package/graphql/schema/contentModelGroups.js +12 -29
  146. package/graphql/schema/contentModelGroups.js.map +1 -1
  147. package/graphql/schema/contentModels.d.ts +2 -2
  148. package/graphql/schema/contentModels.js +28 -31
  149. package/graphql/schema/contentModels.js.map +1 -1
  150. package/graphql/schema/createFieldResolvers.js +7 -29
  151. package/graphql/schema/createFieldResolvers.js.map +1 -1
  152. package/graphql/schema/createManageResolvers.d.ts +1 -1
  153. package/graphql/schema/createManageResolvers.js +33 -43
  154. package/graphql/schema/createManageResolvers.js.map +1 -1
  155. package/graphql/schema/createManageSDL.d.ts +1 -0
  156. package/graphql/schema/createManageSDL.js +56 -63
  157. package/graphql/schema/createManageSDL.js.map +1 -1
  158. package/graphql/schema/createPreviewResolvers.js +3 -17
  159. package/graphql/schema/createPreviewResolvers.js.map +1 -1
  160. package/graphql/schema/createReadResolvers.js +4 -18
  161. package/graphql/schema/createReadResolvers.js.map +1 -1
  162. package/graphql/schema/createReadSDL.d.ts +1 -0
  163. package/graphql/schema/createReadSDL.js +24 -32
  164. package/graphql/schema/createReadSDL.js.map +1 -1
  165. package/graphql/schema/resolvers/commonFieldResolvers.d.ts +3 -2
  166. package/graphql/schema/resolvers/commonFieldResolvers.js +2 -3
  167. package/graphql/schema/resolvers/commonFieldResolvers.js.map +1 -1
  168. package/graphql/schema/resolvers/manage/resolveCreate.js +0 -3
  169. package/graphql/schema/resolvers/manage/resolveCreate.js.map +1 -1
  170. package/graphql/schema/resolvers/manage/resolveCreateFrom.js +0 -3
  171. package/graphql/schema/resolvers/manage/resolveCreateFrom.js.map +1 -1
  172. package/graphql/schema/resolvers/manage/resolveDelete.js +0 -6
  173. package/graphql/schema/resolvers/manage/resolveDelete.js.map +1 -1
  174. package/graphql/schema/resolvers/manage/resolveGet.js +0 -16
  175. package/graphql/schema/resolvers/manage/resolveGet.js.map +1 -1
  176. package/graphql/schema/resolvers/manage/resolveGetByIds.js +0 -3
  177. package/graphql/schema/resolvers/manage/resolveGetByIds.js.map +1 -1
  178. package/graphql/schema/resolvers/manage/resolveGetRevisions.js +0 -3
  179. package/graphql/schema/resolvers/manage/resolveGetRevisions.js.map +1 -1
  180. package/graphql/schema/resolvers/manage/resolveList.js +0 -3
  181. package/graphql/schema/resolvers/manage/resolveList.js.map +1 -1
  182. package/graphql/schema/resolvers/manage/resolvePublish.js +0 -3
  183. package/graphql/schema/resolvers/manage/resolvePublish.js.map +1 -1
  184. package/graphql/schema/resolvers/manage/resolveRepublish.js +0 -3
  185. package/graphql/schema/resolvers/manage/resolveRepublish.js.map +1 -1
  186. package/graphql/schema/resolvers/manage/resolveUnpublish.js +0 -3
  187. package/graphql/schema/resolvers/manage/resolveUnpublish.js.map +1 -1
  188. package/graphql/schema/resolvers/manage/resolveUpdate.js +0 -3
  189. package/graphql/schema/resolvers/manage/resolveUpdate.js.map +1 -1
  190. package/graphql/schema/resolvers/preview/resolveGet.js +0 -8
  191. package/graphql/schema/resolvers/preview/resolveGet.js.map +1 -1
  192. package/graphql/schema/resolvers/preview/resolveList.js +0 -3
  193. package/graphql/schema/resolvers/preview/resolveList.js.map +1 -1
  194. package/graphql/schema/resolvers/read/resolveGet.js +0 -8
  195. package/graphql/schema/resolvers/read/resolveGet.js.map +1 -1
  196. package/graphql/schema/resolvers/read/resolveList.js +0 -3
  197. package/graphql/schema/resolvers/read/resolveList.js.map +1 -1
  198. package/graphql/schema/schemaPlugins.d.ts +2 -2
  199. package/graphql/schema/schemaPlugins.js +21 -30
  200. package/graphql/schema/schemaPlugins.js.map +1 -1
  201. package/graphql/system.js +55 -87
  202. package/graphql/system.js.map +1 -1
  203. package/graphqlFields/boolean.js +0 -12
  204. package/graphqlFields/boolean.js.map +1 -1
  205. package/graphqlFields/datetime.js +0 -17
  206. package/graphqlFields/datetime.js.map +1 -1
  207. package/graphqlFields/dynamicZone/dynamicZoneField.d.ts +1 -1
  208. package/graphqlFields/dynamicZone/dynamicZoneField.js +57 -48
  209. package/graphqlFields/dynamicZone/dynamicZoneField.js.map +1 -1
  210. package/graphqlFields/dynamicZone/dynamicZoneStorage.js +2 -18
  211. package/graphqlFields/dynamicZone/dynamicZoneStorage.js.map +1 -1
  212. package/graphqlFields/dynamicZone/index.js +0 -2
  213. package/graphqlFields/dynamicZone/index.js.map +1 -1
  214. package/graphqlFields/file.js +0 -8
  215. package/graphqlFields/file.js.map +1 -1
  216. package/graphqlFields/helpers.js +0 -10
  217. package/graphqlFields/helpers.js.map +1 -1
  218. package/graphqlFields/index.js +0 -12
  219. package/graphqlFields/index.js.map +1 -1
  220. package/graphqlFields/longText.js +0 -10
  221. package/graphqlFields/longText.js.map +1 -1
  222. package/graphqlFields/number.js +0 -12
  223. package/graphqlFields/number.js.map +1 -1
  224. package/graphqlFields/object.js +21 -38
  225. package/graphqlFields/object.js.map +1 -1
  226. package/graphqlFields/ref.js +59 -65
  227. package/graphqlFields/ref.js.map +1 -1
  228. package/graphqlFields/richText.js +0 -9
  229. package/graphqlFields/richText.js.map +1 -1
  230. package/graphqlFields/text.js +0 -11
  231. package/graphqlFields/text.js.map +1 -1
  232. package/index.d.ts +4 -2
  233. package/index.js +26 -22
  234. package/index.js.map +1 -1
  235. package/modelManager/DefaultCmsModelManager.js +0 -16
  236. package/modelManager/DefaultCmsModelManager.js.map +1 -1
  237. package/modelManager/index.js +0 -4
  238. package/modelManager/index.js.map +1 -1
  239. package/package.json +26 -28
  240. package/parameters/context.js +0 -4
  241. package/parameters/context.js.map +1 -1
  242. package/parameters/header.js +0 -11
  243. package/parameters/header.js.map +1 -1
  244. package/parameters/index.js +0 -8
  245. package/parameters/index.js.map +1 -1
  246. package/parameters/manual.js +1 -8
  247. package/parameters/manual.js.map +1 -1
  248. package/parameters/path.js +0 -11
  249. package/parameters/path.js.map +1 -1
  250. package/plugins/CmsGraphQLSchemaPlugin.d.ts +5 -0
  251. package/plugins/CmsGraphQLSchemaPlugin.js +12 -0
  252. package/plugins/CmsGraphQLSchemaPlugin.js.map +1 -0
  253. package/plugins/CmsGraphQLSchemaSorterPlugin.js +0 -10
  254. package/plugins/CmsGraphQLSchemaSorterPlugin.js.map +1 -1
  255. package/plugins/CmsGroupPlugin.js +0 -8
  256. package/plugins/CmsGroupPlugin.js.map +1 -1
  257. package/plugins/CmsModelFieldConverterPlugin.js +0 -5
  258. package/plugins/CmsModelFieldConverterPlugin.js.map +1 -1
  259. package/plugins/CmsModelPlugin.d.ts +21 -3
  260. package/plugins/CmsModelPlugin.js +30 -40
  261. package/plugins/CmsModelPlugin.js.map +1 -1
  262. package/plugins/CmsParametersPlugin.js +0 -7
  263. package/plugins/CmsParametersPlugin.js.map +1 -1
  264. package/plugins/StorageOperationsCmsModelPlugin.d.ts +23 -0
  265. package/plugins/StorageOperationsCmsModelPlugin.js +42 -0
  266. package/plugins/StorageOperationsCmsModelPlugin.js.map +1 -0
  267. package/plugins/StorageTransformPlugin.js +0 -9
  268. package/plugins/StorageTransformPlugin.js.map +1 -1
  269. package/plugins/index.d.ts +2 -0
  270. package/plugins/index.js +22 -12
  271. package/plugins/index.js.map +1 -1
  272. package/storage/default.js +0 -3
  273. package/storage/default.js.map +1 -1
  274. package/storage/object.js +0 -19
  275. package/storage/object.js.map +1 -1
  276. package/types.d.ts +173 -79
  277. package/types.js +23 -73
  278. package/types.js.map +1 -1
  279. package/utils/access.js +11 -25
  280. package/utils/access.js.map +1 -1
  281. package/utils/converters/Converter.js +0 -13
  282. package/utils/converters/Converter.js.map +1 -1
  283. package/utils/converters/ConverterCollection.js +9 -33
  284. package/utils/converters/ConverterCollection.js.map +1 -1
  285. package/utils/converters/valueKeyStorageConverter.d.ts +1 -5
  286. package/utils/converters/valueKeyStorageConverter.js +21 -44
  287. package/utils/converters/valueKeyStorageConverter.js.map +1 -1
  288. package/utils/createTypeFromFields.d.ts +1 -0
  289. package/utils/createTypeFromFields.js +11 -20
  290. package/utils/createTypeFromFields.js.map +1 -1
  291. package/utils/createTypeName.d.ts +0 -2
  292. package/utils/createTypeName.js +2 -19
  293. package/utils/createTypeName.js.map +1 -1
  294. package/utils/entryStorage.js +10 -26
  295. package/utils/entryStorage.js.map +1 -1
  296. package/utils/filterAsync.js +0 -5
  297. package/utils/filterAsync.js.map +1 -1
  298. package/utils/getBaseFieldType.js +0 -2
  299. package/utils/getBaseFieldType.js.map +1 -1
  300. package/utils/getEntryDescription.d.ts +2 -0
  301. package/utils/getEntryDescription.js +17 -0
  302. package/utils/getEntryDescription.js.map +1 -0
  303. package/utils/getEntryImage.d.ts +2 -0
  304. package/utils/getEntryImage.js +17 -0
  305. package/utils/getEntryImage.js.map +1 -0
  306. package/utils/getEntryTitle.js +0 -9
  307. package/utils/getEntryTitle.js.map +1 -1
  308. package/utils/getSchemaFromFieldPlugins.d.ts +4 -7
  309. package/utils/getSchemaFromFieldPlugins.js +23 -19
  310. package/utils/getSchemaFromFieldPlugins.js.map +1 -1
  311. package/utils/incrementEntryIdVersion.d.ts +5 -0
  312. package/utils/incrementEntryIdVersion.js +29 -0
  313. package/utils/incrementEntryIdVersion.js.map +1 -0
  314. package/utils/ownership.d.ts +3 -3
  315. package/utils/ownership.js +0 -8
  316. package/utils/ownership.js.map +1 -1
  317. package/utils/permissions.js +8 -23
  318. package/utils/permissions.js.map +1 -1
  319. package/utils/renderFields.d.ts +2 -1
  320. package/utils/renderFields.js +8 -10
  321. package/utils/renderFields.js.map +1 -1
  322. package/utils/renderGetFilterFields.js +0 -13
  323. package/utils/renderGetFilterFields.js.map +1 -1
  324. package/utils/renderInputFields.d.ts +2 -1
  325. package/utils/renderInputFields.js +4 -9
  326. package/utils/renderInputFields.js.map +1 -1
  327. package/utils/renderListFilterFields.js +1 -10
  328. package/utils/renderListFilterFields.js.map +1 -1
  329. package/utils/renderSortEnum.js +0 -9
  330. package/utils/renderSortEnum.js.map +1 -1
  331. package/utils/toSlug.js +0 -4
  332. package/utils/toSlug.js.map +1 -1
  333. package/validators/dateGte.js +0 -7
  334. package/validators/dateGte.js.map +1 -1
  335. package/validators/dateLte.js +0 -7
  336. package/validators/dateLte.js.map +1 -1
  337. package/validators/dynamicZone.js +0 -4
  338. package/validators/dynamicZone.js.map +1 -1
  339. package/validators/gte.js +0 -8
  340. package/validators/gte.js.map +1 -1
  341. package/validators/in.js +0 -8
  342. package/validators/in.js.map +1 -1
  343. package/validators/index.js +0 -16
  344. package/validators/index.js.map +1 -1
  345. package/validators/lte.js +0 -8
  346. package/validators/lte.js.map +1 -1
  347. package/validators/maxLength.js +0 -8
  348. package/validators/maxLength.js.map +1 -1
  349. package/validators/minLength.js +0 -8
  350. package/validators/minLength.js.map +1 -1
  351. package/validators/pattern.js +0 -9
  352. package/validators/pattern.js.map +1 -1
  353. package/validators/patternPlugins/email.js +0 -2
  354. package/validators/patternPlugins/email.js.map +1 -1
  355. package/validators/patternPlugins/index.js +0 -8
  356. package/validators/patternPlugins/index.js.map +1 -1
  357. package/validators/patternPlugins/lowerCase.js +0 -2
  358. package/validators/patternPlugins/lowerCase.js.map +1 -1
  359. package/validators/patternPlugins/lowerCaseSpace.js +0 -2
  360. package/validators/patternPlugins/lowerCaseSpace.js.map +1 -1
  361. package/validators/patternPlugins/upperCase.js +0 -2
  362. package/validators/patternPlugins/upperCase.js.map +1 -1
  363. package/validators/patternPlugins/upperCaseSpace.js +0 -2
  364. package/validators/patternPlugins/upperCaseSpace.js.map +1 -1
  365. package/validators/patternPlugins/url.js +0 -2
  366. package/validators/patternPlugins/url.js.map +1 -1
  367. package/validators/required.js +0 -5
  368. package/validators/required.js.map +1 -1
  369. package/validators/timeGte.js +0 -8
  370. package/validators/timeGte.js.map +1 -1
  371. package/validators/timeLte.js +0 -8
  372. package/validators/timeLte.js.map +1 -1
  373. package/validators/unique.js +0 -7
  374. package/validators/unique.js.map +1 -1
@@ -1,52 +1,34 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
-
5
4
  Object.defineProperty(exports, "__esModule", {
6
5
  value: true
7
6
  });
8
7
  exports.createModelsCrud = void 0;
9
-
8
+ var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
10
9
  var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
11
-
12
10
  var _dataloader = _interopRequireDefault(require("dataloader"));
13
-
11
+ var _error = _interopRequireDefault(require("@webiny/error"));
14
12
  var _handlerGraphql = require("@webiny/handler-graphql");
15
-
16
13
  var _contentModelManagerFactory = require("./contentModel/contentModelManagerFactory");
17
-
18
- var _models = require("./contentModel/models");
19
-
20
- var _createFieldModels = require("./contentModel/createFieldModels");
21
-
22
- var _error = _interopRequireDefault(require("@webiny/error"));
23
-
24
14
  var _pubsub = require("@webiny/pubsub");
25
-
26
15
  var _beforeCreate = require("./contentModel/beforeCreate");
27
-
28
16
  var _beforeUpdate = require("./contentModel/beforeUpdate");
29
-
30
17
  var _beforeDelete = require("./contentModel/beforeDelete");
31
-
32
18
  var _afterCreate = require("./contentModel/afterCreate");
33
-
34
19
  var _afterUpdate = require("./contentModel/afterUpdate");
35
-
36
20
  var _afterDelete = require("./contentModel/afterDelete");
37
-
38
21
  var _afterCreateFrom = require("./contentModel/afterCreateFrom");
39
-
40
22
  var _CmsModelPlugin = require("../plugins/CmsModelPlugin");
41
-
42
23
  var _permissions = require("../utils/permissions");
43
-
44
24
  var _filterAsync = require("../utils/filterAsync");
45
-
46
25
  var _ownership = require("../utils/ownership");
47
-
48
26
  var _access = require("../utils/access");
49
-
27
+ var _validation = require("./contentModel/validation");
28
+ var _utils = require("@webiny/utils");
29
+ var _defaultFields = require("./contentModel/defaultFields");
30
+ var _modelApiName = require("./contentModel/compatibility/modelApiName");
31
+ const _excluded = ["defaultFields"];
50
32
  /**
51
33
  * Given a model, return an array of tags ensuring the `type` tag is set.
52
34
  */
@@ -54,14 +36,11 @@ const ensureTypeTag = model => {
54
36
  // Let's make sure we have a `type` tag assigned.
55
37
  // If `type` tag is not set, set it to a default one (`model`).
56
38
  const tags = model.tags || [];
57
-
58
39
  if (!tags.some(tag => tag.startsWith("type:"))) {
59
40
  tags.push("type:model");
60
41
  }
61
-
62
42
  return tags;
63
43
  };
64
-
65
44
  const createModelsCrud = params => {
66
45
  const {
67
46
  getTenant,
@@ -82,32 +61,33 @@ const createModelsCrud = params => {
82
61
  return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, model), {}, {
83
62
  tags: ensureTypeTag(model),
84
63
  tenant: model.tenant || getTenant().id,
85
- locale: model.locale || getLocale().code
64
+ locale: model.locale || getLocale().code,
65
+ /**
66
+ * TODO: remove in v5.36.0
67
+ * This is for backward compatibility while migrations are not yet executed.
68
+ */
69
+ singularApiName: (0, _modelApiName.ensureSingularApiName)(model),
70
+ pluralApiName: (0, _modelApiName.ensurePluralApiName)(model)
86
71
  });
87
72
  })];
88
73
  })
89
74
  };
90
-
91
75
  const clearModelsCache = () => {
92
76
  for (const loader of Object.values(loaders)) {
93
77
  loader.clearAll();
94
78
  }
95
79
  };
96
-
97
80
  const managers = new Map();
98
-
99
81
  const updateManager = async (context, model) => {
100
82
  const manager = await (0, _contentModelManagerFactory.contentModelManagerFactory)(context, model);
101
83
  managers.set(model.modelId, manager);
102
84
  return manager;
103
85
  };
104
-
105
86
  const checkModelPermissions = check => {
106
87
  return (0, _permissions.checkPermissions)(context, "cms.contentModel", {
107
88
  rwd: check
108
89
  });
109
90
  };
110
-
111
91
  const getModelsAsPlugins = () => {
112
92
  const tenant = getTenant().id;
113
93
  const locale = getLocale().code;
@@ -115,19 +95,16 @@ const createModelsCrud = params => {
115
95
  /**
116
96
  * We need to filter out models that are not for this tenant or locale.
117
97
  * If it does not have tenant or locale define, it is for every locale and tenant
118
- */
119
- .filter(plugin => {
98
+ */.filter(plugin => {
120
99
  const {
121
100
  tenant: modelTenant,
122
101
  locale: modelLocale
123
102
  } = plugin.contentModel;
124
-
125
103
  if (modelTenant && modelTenant !== tenant) {
126
104
  return false;
127
105
  } else if (modelLocale && modelLocale !== locale) {
128
106
  return false;
129
107
  }
130
-
131
108
  return true;
132
109
  }).map(plugin => {
133
110
  return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, plugin.contentModel), {}, {
@@ -138,111 +115,95 @@ const createModelsCrud = params => {
138
115
  });
139
116
  });
140
117
  };
141
-
142
118
  const modelsGet = async modelId => {
143
119
  const pluginModel = getModelsAsPlugins().find(model => model.modelId === modelId);
144
-
145
120
  if (pluginModel) {
146
121
  return pluginModel;
147
122
  }
148
-
149
123
  const model = await storageOperations.models.get({
150
124
  tenant: getTenant().id,
151
125
  locale: getLocale().code,
152
126
  modelId
153
127
  });
154
-
155
128
  if (!model) {
156
129
  throw new _handlerGraphql.NotFoundError(`Content model "${modelId}" was not found!`);
157
130
  }
158
-
159
131
  return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, model), {}, {
160
132
  tags: ensureTypeTag(model),
161
133
  tenant: model.tenant || getTenant().id,
162
134
  locale: model.locale || getLocale().code
163
135
  });
164
136
  };
165
-
166
137
  const modelsList = async () => {
167
138
  const databaseModels = await loaders.listModels.load("listModels");
168
139
  const pluginsModels = getModelsAsPlugins();
169
140
  return databaseModels.concat(pluginsModels);
170
141
  };
171
-
172
142
  const listModels = async () => {
173
- const permission = await checkModelPermissions("r");
174
- const models = await modelsList();
175
- return (0, _filterAsync.filterAsync)(models, async model => {
176
- if (!(0, _ownership.validateOwnership)(context, permission, model)) {
177
- return false;
178
- }
179
-
180
- return (0, _access.validateModelAccess)(context, model);
143
+ return context.benchmark.measure("headlessCms.crud.models.listModels", async () => {
144
+ const permission = await checkModelPermissions("r");
145
+ const models = await modelsList();
146
+ return (0, _filterAsync.filterAsync)(models, async model => {
147
+ if (!(0, _ownership.validateOwnership)(context, permission, model)) {
148
+ return false;
149
+ }
150
+ return (0, _access.validateModelAccess)(context, model);
151
+ });
181
152
  });
182
153
  };
183
-
184
154
  const getModel = async modelId => {
185
- const permission = await checkModelPermissions("r");
186
- const model = await modelsGet(modelId);
187
- (0, _ownership.checkOwnership)(context, permission, model);
188
- await (0, _access.checkModelAccess)(context, model);
189
- return model;
155
+ return context.benchmark.measure("headlessCms.crud.models.getModel", async () => {
156
+ const permission = await checkModelPermissions("r");
157
+ const model = await modelsGet(modelId);
158
+ (0, _ownership.checkOwnership)(context, permission, model);
159
+ await (0, _access.checkModelAccess)(context, model);
160
+ return model;
161
+ });
190
162
  };
191
-
192
163
  const getModelManager = async target => {
193
164
  const modelId = typeof target === "string" ? target : target.modelId;
194
-
195
165
  if (managers.has(modelId)) {
196
166
  return managers.get(modelId);
197
167
  }
198
-
199
168
  const models = await modelsList();
200
169
  const model = models.find(m => m.modelId === modelId);
201
-
202
170
  if (!model) {
203
171
  throw new _handlerGraphql.NotFoundError(`There is no content model "${modelId}".`);
204
172
  }
205
-
206
173
  return await updateManager(context, model);
207
174
  };
175
+
208
176
  /**
209
177
  * Create
210
178
  */
211
-
212
-
213
179
  const onModelBeforeCreate = (0, _pubsub.createTopic)("cms.onModelBeforeCreate");
214
180
  const onModelAfterCreate = (0, _pubsub.createTopic)("cms.onModelAfterCreate");
215
181
  const onModelCreateError = (0, _pubsub.createTopic)("cms.onModelCreateError");
216
182
  /**
217
183
  * Create from / clone
218
184
  */
219
-
220
185
  const onModelBeforeCreateFrom = (0, _pubsub.createTopic)("cms.onModelBeforeCreateFrom");
221
186
  const onModelAfterCreateFrom = (0, _pubsub.createTopic)("cms.onModelAfterCreateFrom");
222
187
  const onModelCreateFromError = (0, _pubsub.createTopic)("cms.onModelCreateFromError");
223
188
  /**
224
189
  * Update
225
190
  */
226
-
227
191
  const onModelBeforeUpdate = (0, _pubsub.createTopic)("cms.onModelBeforeUpdate");
228
192
  const onModelAfterUpdate = (0, _pubsub.createTopic)("cms.onModelAfterUpdate");
229
193
  const onModelUpdateError = (0, _pubsub.createTopic)("cms.onModelUpdateError");
230
194
  /**
231
195
  * Delete
232
196
  */
233
-
234
197
  const onModelBeforeDelete = (0, _pubsub.createTopic)("cms.onModelBeforeDelete");
235
198
  const onModelAfterDelete = (0, _pubsub.createTopic)("cms.onModelAfterDelete");
236
199
  const onModelDeleteError = (0, _pubsub.createTopic)("cms.onModelDeleteError");
237
200
  /**
238
201
  * Initialize
239
202
  */
240
-
241
203
  const onModelInitialize = (0, _pubsub.createTopic)("cms.onModelInitialize");
242
204
  /**
243
205
  * We need to assign some default behaviors.
244
206
  */
245
-
246
207
  (0, _beforeCreate.assignModelBeforeCreate)({
247
208
  onModelBeforeCreate,
248
209
  onModelBeforeCreateFrom,
@@ -274,6 +235,311 @@ const createModelsCrud = params => {
274
235
  context,
275
236
  onModelAfterDelete
276
237
  });
238
+
239
+ /**
240
+ * CRUD methods
241
+ */
242
+ const createModel = async input => {
243
+ await checkModelPermissions("w");
244
+ const result = await (0, _validation.createModelCreateValidation)().safeParseAsync(input);
245
+ if (!result.success) {
246
+ throw (0, _utils.createZodError)(result.error);
247
+ }
248
+ /**
249
+ * We need to extract the defaultFields because it is not for the CmsModel object.
250
+ */
251
+ const _removeUndefinedValue = (0, _utils.removeUndefinedValues)(result.data),
252
+ {
253
+ defaultFields
254
+ } = _removeUndefinedValue,
255
+ data = (0, _objectWithoutProperties2.default)(_removeUndefinedValue, _excluded);
256
+ if (defaultFields) {
257
+ (0, _defaultFields.assignModelDefaultFields)(data);
258
+ }
259
+ const group = await context.security.withoutAuthorization(async () => {
260
+ return context.cms.getGroup(data.group);
261
+ });
262
+ if (!group) {
263
+ throw new _handlerGraphql.NotFoundError(`There is no group "${data.group}".`);
264
+ }
265
+ const identity = getIdentity();
266
+ const model = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, data), {}, {
267
+ modelId: data.modelId || "",
268
+ singularApiName: data.singularApiName,
269
+ pluralApiName: data.pluralApiName,
270
+ titleFieldId: "id",
271
+ descriptionFieldId: null,
272
+ imageFieldId: null,
273
+ description: data.description || "",
274
+ locale: getLocale().code,
275
+ tenant: getTenant().id,
276
+ group: {
277
+ id: group.id,
278
+ name: group.name
279
+ },
280
+ createdBy: {
281
+ id: identity.id,
282
+ displayName: identity.displayName,
283
+ type: identity.type
284
+ },
285
+ createdOn: new Date().toISOString(),
286
+ savedOn: new Date().toISOString(),
287
+ lockedFields: [],
288
+ webinyVersion: context.WEBINY_VERSION
289
+ });
290
+ model.tags = ensureTypeTag(model);
291
+ try {
292
+ await onModelBeforeCreate.publish({
293
+ input: data,
294
+ model
295
+ });
296
+ const createdModel = await storageOperations.models.create({
297
+ model
298
+ });
299
+ loaders.listModels.clearAll();
300
+ await updateManager(context, model);
301
+ await onModelAfterCreate.publish({
302
+ input: data,
303
+ model: createdModel
304
+ });
305
+ return createdModel;
306
+ } catch (ex) {
307
+ await onModelCreateError.publish({
308
+ input: data,
309
+ model,
310
+ error: ex
311
+ });
312
+ throw ex;
313
+ }
314
+ };
315
+ const updateModel = async (modelId, input) => {
316
+ await checkModelPermissions("w");
317
+
318
+ // Get a model record; this will also perform ownership validation.
319
+ const original = await getModel(modelId);
320
+ const result = await (0, _validation.createModelUpdateValidation)().safeParseAsync(input);
321
+ if (!result.success) {
322
+ throw (0, _utils.createZodError)(result.error);
323
+ }
324
+ const data = (0, _utils.removeUndefinedValues)(result.data);
325
+ if (Object.keys(data).length === 0) {
326
+ /**
327
+ * We need to return the original if nothing is to be updated.
328
+ */
329
+ return original;
330
+ }
331
+ let group = {
332
+ id: original.group.id,
333
+ name: original.group.name
334
+ };
335
+ const groupId = data.group;
336
+ if (groupId) {
337
+ const groupData = await context.security.withoutAuthorization(async () => {
338
+ return context.cms.getGroup(groupId);
339
+ });
340
+ if (!groupData) {
341
+ throw new _handlerGraphql.NotFoundError(`There is no group "${groupId}".`);
342
+ }
343
+ group = {
344
+ id: groupData.id,
345
+ name: groupData.name
346
+ };
347
+ }
348
+ const model = (0, _objectSpread2.default)((0, _objectSpread2.default)((0, _objectSpread2.default)({}, original), data), {}, {
349
+ titleFieldId: data.titleFieldId === undefined ? original.titleFieldId : data.titleFieldId,
350
+ descriptionFieldId: data.descriptionFieldId === undefined ? original.descriptionFieldId : data.descriptionFieldId,
351
+ imageFieldId: data.imageFieldId === undefined ? original.imageFieldId : data.imageFieldId,
352
+ group,
353
+ description: data.description || original.description,
354
+ tenant: original.tenant || getTenant().id,
355
+ locale: original.locale || getLocale().code,
356
+ webinyVersion: context.WEBINY_VERSION,
357
+ savedOn: new Date().toISOString()
358
+ });
359
+ model.tags = ensureTypeTag(model);
360
+ try {
361
+ await onModelBeforeUpdate.publish({
362
+ input: data,
363
+ original,
364
+ model
365
+ });
366
+ const resultModel = await storageOperations.models.update({
367
+ model
368
+ });
369
+ await updateManager(context, resultModel);
370
+ await onModelAfterUpdate.publish({
371
+ input: data,
372
+ original,
373
+ model: resultModel
374
+ });
375
+ return resultModel;
376
+ } catch (ex) {
377
+ await onModelUpdateError.publish({
378
+ input: data,
379
+ model,
380
+ original,
381
+ error: ex
382
+ });
383
+ throw ex;
384
+ }
385
+ };
386
+ const updateModelDirect = async params => {
387
+ const {
388
+ model: initialModel,
389
+ original
390
+ } = params;
391
+ const model = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, initialModel), {}, {
392
+ tenant: initialModel.tenant || getTenant().id,
393
+ locale: initialModel.locale || getLocale().code,
394
+ webinyVersion: context.WEBINY_VERSION
395
+ });
396
+ try {
397
+ await onModelBeforeUpdate.publish({
398
+ input: {},
399
+ original,
400
+ model
401
+ });
402
+ const resultModel = await storageOperations.models.update({
403
+ model
404
+ });
405
+ await updateManager(context, resultModel);
406
+ loaders.listModels.clearAll();
407
+ await onModelAfterUpdate.publish({
408
+ input: {},
409
+ original,
410
+ model: resultModel
411
+ });
412
+ return resultModel;
413
+ } catch (ex) {
414
+ await onModelUpdateError.publish({
415
+ input: {},
416
+ original,
417
+ model,
418
+ error: ex
419
+ });
420
+ throw ex;
421
+ }
422
+ };
423
+ const createModelFrom = async (modelId, input) => {
424
+ await checkModelPermissions("w");
425
+ /**
426
+ * Get a model record; this will also perform ownership validation.
427
+ */
428
+ const original = await getModel(modelId);
429
+ const result = await (0, _validation.createModelCreateFromValidation)().safeParseAsync((0, _objectSpread2.default)((0, _objectSpread2.default)({}, input), {}, {
430
+ description: input.description || original.description
431
+ }));
432
+ if (!result.success) {
433
+ throw (0, _utils.createZodError)(result.error);
434
+ }
435
+ const data = (0, _utils.removeUndefinedValues)(result.data);
436
+ const locale = await context.i18n.getLocale(data.locale || original.locale);
437
+ if (!locale) {
438
+ throw new _handlerGraphql.NotFoundError(`There is no locale "${data.locale}".`);
439
+ }
440
+ /**
441
+ * Use storage operations directly because we cannot get group from different locale via context methods.
442
+ */
443
+ const group = await context.cms.storageOperations.groups.get({
444
+ id: data.group,
445
+ tenant: original.tenant,
446
+ locale: locale.code
447
+ });
448
+ if (!group) {
449
+ throw new _handlerGraphql.NotFoundError(`There is no group "${data.group}".`);
450
+ }
451
+ const identity = getIdentity();
452
+ const model = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, original), {}, {
453
+ singularApiName: data.singularApiName,
454
+ pluralApiName: data.pluralApiName,
455
+ locale: locale.code,
456
+ group: {
457
+ id: group.id,
458
+ name: group.name
459
+ },
460
+ icon: data.icon,
461
+ name: data.name,
462
+ modelId: data.modelId || "",
463
+ description: data.description || "",
464
+ createdBy: {
465
+ id: identity.id,
466
+ displayName: identity.displayName,
467
+ type: identity.type
468
+ },
469
+ createdOn: new Date().toISOString(),
470
+ savedOn: new Date().toISOString(),
471
+ lockedFields: [],
472
+ webinyVersion: context.WEBINY_VERSION
473
+ });
474
+ try {
475
+ await onModelBeforeCreateFrom.publish({
476
+ input: data,
477
+ model,
478
+ original
479
+ });
480
+ const createdModel = await storageOperations.models.create({
481
+ model
482
+ });
483
+ loaders.listModels.clearAll();
484
+ await updateManager(context, model);
485
+ await onModelAfterCreateFrom.publish({
486
+ input: data,
487
+ original,
488
+ model: createdModel
489
+ });
490
+ return createdModel;
491
+ } catch (ex) {
492
+ await onModelCreateFromError.publish({
493
+ input: data,
494
+ original,
495
+ model,
496
+ error: ex
497
+ });
498
+ throw ex;
499
+ }
500
+ };
501
+ const deleteModel = async modelId => {
502
+ await checkModelPermissions("d");
503
+ const model = await getModel(modelId);
504
+ try {
505
+ await onModelBeforeDelete.publish({
506
+ model
507
+ });
508
+ try {
509
+ await storageOperations.models.delete({
510
+ model
511
+ });
512
+ } catch (ex) {
513
+ throw new _error.default(ex.message || "Could not delete the content model", ex.code || "CONTENT_MODEL_DELETE_ERROR", {
514
+ error: ex,
515
+ modelId: model.modelId
516
+ });
517
+ }
518
+ await onModelAfterDelete.publish({
519
+ model
520
+ });
521
+ managers.delete(model.modelId);
522
+ } catch (ex) {
523
+ await onModelDeleteError.publish({
524
+ model,
525
+ error: ex
526
+ });
527
+ throw ex;
528
+ }
529
+ };
530
+ const initializeModel = async (modelId, data) => {
531
+ /**
532
+ * We require that users have write permissions to initialize models.
533
+ * Maybe introduce another permission for it?
534
+ */
535
+ await checkModelPermissions("w");
536
+ const model = await getModel(modelId);
537
+ await onModelInitialize.publish({
538
+ model,
539
+ data
540
+ });
541
+ return true;
542
+ };
277
543
  return {
278
544
  /**
279
545
  * Deprecated - will be removed in 5.36.0
@@ -286,7 +552,6 @@ const createModelsCrud = params => {
286
552
  onAfterModelUpdate: onModelAfterUpdate,
287
553
  onBeforeModelDelete: onModelBeforeDelete,
288
554
  onAfterModelDelete: onModelAfterDelete,
289
-
290
555
  /**
291
556
  * Released in 5.34.0
292
557
  */
@@ -306,323 +571,40 @@ const createModelsCrud = params => {
306
571
  clearModelsCache,
307
572
  getModel,
308
573
  listModels,
309
-
310
- async createModel(inputData) {
311
- await checkModelPermissions("w");
312
- const createdData = new _models.CreateContentModelModel().populate(inputData);
313
- await createdData.validate();
314
- const input = await createdData.toJSON();
315
- context.security.disableAuthorization();
316
- const group = await context.cms.getGroup(input.group);
317
- context.security.enableAuthorization();
318
-
319
- if (!group) {
320
- throw new _handlerGraphql.NotFoundError(`There is no group "${input.group}".`);
321
- }
322
-
323
- const fields = await (0, _createFieldModels.createFieldModels)(input.fields);
324
- const identity = getIdentity();
325
- const model = {
326
- name: input.name,
327
- description: input.description || "",
328
- modelId: input.modelId || "",
329
- titleFieldId: "id",
330
- locale: getLocale().code,
331
- tenant: getTenant().id,
332
- group: {
333
- id: group.id,
334
- name: group.name
335
- },
336
- createdBy: {
337
- id: identity.id,
338
- displayName: identity.displayName,
339
- type: identity.type
340
- },
341
- createdOn: new Date().toISOString(),
342
- savedOn: new Date().toISOString(),
343
- fields,
344
- lockedFields: [],
345
- layout: input.layout || [],
346
- tags: [...(input.tags || [])],
347
- webinyVersion: context.WEBINY_VERSION
348
- };
349
- model.tags = ensureTypeTag(model);
350
-
351
- try {
352
- await onModelBeforeCreate.publish({
353
- input,
354
- model
355
- });
356
- const createdModel = await storageOperations.models.create({
357
- model
358
- });
359
- loaders.listModels.clearAll();
360
- await updateManager(context, model);
361
- await onModelAfterCreate.publish({
362
- input,
363
- model: createdModel
364
- });
365
- return createdModel;
366
- } catch (ex) {
367
- await onModelCreateError.publish({
368
- input,
369
- model,
370
- error: ex
371
- });
372
- throw ex;
373
- }
574
+ async createModel(input) {
575
+ return context.benchmark.measure("headlessCms.crud.models.createModel", async () => {
576
+ return createModel(input);
577
+ });
374
578
  },
375
-
376
579
  /**
377
580
  * Method does not check for permissions or ownership.
378
581
  * @internal
379
582
  */
380
583
  async updateModelDirect(params) {
381
- const {
382
- model: initialModel,
383
- original
384
- } = params;
385
- const model = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, initialModel), {}, {
386
- tenant: initialModel.tenant || getTenant().id,
387
- locale: initialModel.locale || getLocale().code,
388
- webinyVersion: context.WEBINY_VERSION
584
+ return context.benchmark.measure("headlessCms.crud.models.updateModelDirect", async () => {
585
+ return updateModelDirect(params);
389
586
  });
390
-
391
- try {
392
- await onModelBeforeUpdate.publish({
393
- input: {},
394
- original,
395
- model
396
- });
397
- const resultModel = await storageOperations.models.update({
398
- model
399
- });
400
- await updateManager(context, resultModel);
401
- loaders.listModels.clearAll();
402
- await onModelAfterUpdate.publish({
403
- input: {},
404
- original,
405
- model: resultModel
406
- });
407
- return resultModel;
408
- } catch (ex) {
409
- await onModelUpdateError.publish({
410
- input: {},
411
- original,
412
- model,
413
- error: ex
414
- });
415
- throw ex;
416
- }
417
587
  },
418
-
419
- async createModelFrom(modelId, data) {
420
- await checkModelPermissions("w");
421
- /**
422
- * Get a model record; this will also perform ownership validation.
423
- */
424
-
425
- const original = await getModel(modelId);
426
- const createdData = new _models.CreateContentModelModelFrom().populate({
427
- name: data.name,
428
- modelId: data.modelId,
429
- description: data.description || original.description,
430
- group: data.group,
431
- locale: data.locale
432
- });
433
- await createdData.validate();
434
- const input = await createdData.toJSON();
435
- const locale = await context.i18n.getLocale(input.locale || original.locale);
436
-
437
- if (!locale) {
438
- throw new _handlerGraphql.NotFoundError(`There is no locale "${input.locale}".`);
439
- }
440
- /**
441
- * Use storage operations directly because we cannot get group from different locale via context methods.
442
- */
443
-
444
-
445
- const group = await context.cms.storageOperations.groups.get({
446
- id: input.group,
447
- tenant: original.tenant,
448
- locale: locale.code
449
- });
450
-
451
- if (!group) {
452
- throw new _handlerGraphql.NotFoundError(`There is no group "${input.group}".`);
453
- }
454
-
455
- const identity = getIdentity();
456
- const model = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, original), {}, {
457
- locale: locale.code,
458
- group: {
459
- id: group.id,
460
- name: group.name
461
- },
462
- name: input.name,
463
- modelId: input.modelId || "",
464
- description: input.description || "",
465
- createdBy: {
466
- id: identity.id,
467
- displayName: identity.displayName,
468
- type: identity.type
469
- },
470
- createdOn: new Date().toISOString(),
471
- savedOn: new Date().toISOString(),
472
- lockedFields: [],
473
- webinyVersion: context.WEBINY_VERSION
588
+ async createModelFrom(modelId, userInput) {
589
+ return context.benchmark.measure("headlessCms.crud.models.createModelFrom", async () => {
590
+ return createModelFrom(modelId, userInput);
474
591
  });
475
-
476
- try {
477
- await onModelBeforeCreateFrom.publish({
478
- input,
479
- model,
480
- original
481
- });
482
- const createdModel = await storageOperations.models.create({
483
- model
484
- });
485
- loaders.listModels.clearAll();
486
- await updateManager(context, model);
487
- await onModelAfterCreateFrom.publish({
488
- input,
489
- original,
490
- model: createdModel
491
- });
492
- return createdModel;
493
- } catch (ex) {
494
- await onModelCreateFromError.publish({
495
- input,
496
- original,
497
- model,
498
- error: ex
499
- });
500
- throw ex;
501
- }
502
592
  },
503
-
504
- async updateModel(modelId, inputData) {
505
- await checkModelPermissions("w"); // Get a model record; this will also perform ownership validation.
506
-
507
- const original = await getModel(modelId);
508
- const updatedData = new _models.UpdateContentModelModel().populate(inputData);
509
- await updatedData.validate();
510
- const input = await updatedData.toJSON({
511
- onlyDirty: true
593
+ async updateModel(modelId, input) {
594
+ return context.benchmark.measure("headlessCms.crud.models.updateModel", async () => {
595
+ return updateModel(modelId, input);
512
596
  });
513
-
514
- if (Object.keys(input).length === 0) {
515
- /**
516
- * We need to return the original if nothing is to be updated.
517
- */
518
- return original;
519
- }
520
-
521
- let group = {
522
- id: original.group.id,
523
- name: original.group.name
524
- };
525
-
526
- if (input.group) {
527
- context.security.disableAuthorization();
528
- const groupData = await context.cms.getGroup(input.group);
529
- context.security.enableAuthorization();
530
-
531
- if (!groupData) {
532
- throw new _handlerGraphql.NotFoundError(`There is no group "${input.group}".`);
533
- }
534
-
535
- group = {
536
- id: groupData.id,
537
- name: groupData.name
538
- };
539
- }
540
-
541
- const fields = await (0, _createFieldModels.createFieldModels)(inputData.fields);
542
- const model = (0, _objectSpread2.default)((0, _objectSpread2.default)((0, _objectSpread2.default)({}, original), input), {}, {
543
- group,
544
- tenant: original.tenant || getTenant().id,
545
- locale: original.locale || getLocale().code,
546
- webinyVersion: context.WEBINY_VERSION,
547
- fields,
548
- savedOn: new Date().toISOString()
549
- });
550
- model.tags = ensureTypeTag(model);
551
-
552
- try {
553
- await onModelBeforeUpdate.publish({
554
- input,
555
- original,
556
- model
557
- });
558
- const resultModel = await storageOperations.models.update({
559
- model
560
- });
561
- await updateManager(context, resultModel);
562
- await onModelAfterUpdate.publish({
563
- input,
564
- original,
565
- model: resultModel
566
- });
567
- return resultModel;
568
- } catch (ex) {
569
- await onModelUpdateError.publish({
570
- input,
571
- model,
572
- original,
573
- error: ex
574
- });
575
- throw ex;
576
- }
577
597
  },
578
-
579
598
  async deleteModel(modelId) {
580
- await checkModelPermissions("d");
581
- const model = await getModel(modelId);
582
-
583
- try {
584
- await onModelBeforeDelete.publish({
585
- model
586
- });
587
-
588
- try {
589
- await storageOperations.models.delete({
590
- model
591
- });
592
- } catch (ex) {
593
- throw new _error.default(ex.message || "Could not delete the content model", ex.code || "CONTENT_MODEL_DELETE_ERROR", {
594
- error: ex,
595
- modelId: model.modelId
596
- });
597
- }
598
-
599
- await onModelAfterDelete.publish({
600
- model
601
- });
602
- managers.delete(model.modelId);
603
- } catch (ex) {
604
- await onModelDeleteError.publish({
605
- model,
606
- error: ex
607
- });
608
- throw ex;
609
- }
599
+ return context.benchmark.measure("headlessCms.crud.models.deleteModel", async () => {
600
+ return deleteModel(modelId);
601
+ });
610
602
  },
611
-
612
603
  async initializeModel(modelId, data) {
613
- /**
614
- * We require that users have write permissions to initialize models.
615
- * Maybe introduce another permission for it?
616
- */
617
- await checkModelPermissions("w");
618
- const model = await getModel(modelId);
619
- await onModelInitialize.publish({
620
- model,
621
- data
604
+ return context.benchmark.measure("headlessCms.crud.models.initializeModel", async () => {
605
+ return initializeModel(modelId, data);
622
606
  });
623
- return true;
624
607
  },
625
-
626
608
  getModelManager,
627
609
  getEntryManager: async model => {
628
610
  return getModelManager(model);
@@ -631,5 +613,4 @@ const createModelsCrud = params => {
631
613
  getEntryManagers: () => managers
632
614
  };
633
615
  };
634
-
635
616
  exports.createModelsCrud = createModelsCrud;