@webiny/api-headless-cms 6.1.0 → 6.2.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 (577) hide show
  1. package/context.d.ts +2 -5
  2. package/context.js +16 -7
  3. package/context.js.map +1 -1
  4. package/crud/AccessControl/AccessControl.d.ts +18 -28
  5. package/crud/AccessControl/AccessControl.js.map +1 -1
  6. package/crud/contentEntry/entryDataFactories/createEntryData.js +17 -6
  7. package/crud/contentEntry/entryDataFactories/createEntryData.js.map +1 -1
  8. package/crud/contentEntry/entryDataFactories/createEntryRevisionFromData.js +9 -3
  9. package/crud/contentEntry/entryDataFactories/createEntryRevisionFromData.js.map +1 -1
  10. package/crud/contentEntry/entryDataValidation.d.ts +1 -1
  11. package/crud/contentEntry/entryDataValidation.js +16 -13
  12. package/crud/contentEntry/entryDataValidation.js.map +1 -1
  13. package/crud/contentEntry/searchableFields.d.ts +2 -3
  14. package/crud/contentEntry/searchableFields.js +10 -18
  15. package/crud/contentEntry/searchableFields.js.map +1 -1
  16. package/crud/contentModel.crud.js +2 -1
  17. package/crud/contentModel.crud.js.map +1 -1
  18. package/domain/contentModel/validation/modelFields.js +15 -20
  19. package/domain/contentModel/validation/modelFields.js.map +1 -1
  20. package/exports/api/cms/graphql.d.ts +1 -0
  21. package/exports/api/cms/graphql.js +3 -0
  22. package/exports/api/cms/graphql.js.map +1 -0
  23. package/exports/api/cms/storage.d.ts +3 -0
  24. package/exports/api/cms/storage.js +5 -0
  25. package/exports/api/cms/storage.js.map +1 -0
  26. package/exports/api/cms/validation.d.ts +4 -0
  27. package/exports/api/cms/validation.js +6 -0
  28. package/exports/api/cms/validation.js.map +1 -0
  29. package/features/contentEntry/CreateEntry/CreateEntryUseCase.d.ts +3 -3
  30. package/features/contentEntry/CreateEntry/CreateEntryUseCase.js +3 -3
  31. package/features/contentEntry/CreateEntry/CreateEntryUseCase.js.map +1 -1
  32. package/features/contentEntry/CreateEntry/events.d.ts +2 -2
  33. package/features/contentEntry/CreateEntry/events.js +1 -1
  34. package/features/contentEntry/CreateEntry/events.js.map +1 -1
  35. package/features/contentEntry/CreateEntryRevisionFrom/CreateEntryRevisionFromUseCase.d.ts +3 -3
  36. package/features/contentEntry/CreateEntryRevisionFrom/CreateEntryRevisionFromUseCase.js +3 -3
  37. package/features/contentEntry/CreateEntryRevisionFrom/CreateEntryRevisionFromUseCase.js.map +1 -1
  38. package/features/contentEntry/CreateEntryRevisionFrom/events.d.ts +2 -2
  39. package/features/contentEntry/CreateEntryRevisionFrom/events.js +1 -1
  40. package/features/contentEntry/CreateEntryRevisionFrom/events.js.map +1 -1
  41. package/features/contentEntry/DeleteEntry/DeleteEntryUseCase.d.ts +1 -1
  42. package/features/contentEntry/DeleteEntry/DeleteEntryUseCase.js +1 -1
  43. package/features/contentEntry/DeleteEntry/DeleteEntryUseCase.js.map +1 -1
  44. package/features/contentEntry/DeleteEntry/MoveEntryToBinUseCase.d.ts +2 -2
  45. package/features/contentEntry/DeleteEntry/MoveEntryToBinUseCase.js +2 -2
  46. package/features/contentEntry/DeleteEntry/MoveEntryToBinUseCase.js.map +1 -1
  47. package/features/contentEntry/DeleteEntry/events.d.ts +2 -2
  48. package/features/contentEntry/DeleteEntry/events.js +1 -1
  49. package/features/contentEntry/DeleteEntry/events.js.map +1 -1
  50. package/features/contentEntry/DeleteEntryRevision/DeleteEntryRevisionUseCase.d.ts +1 -1
  51. package/features/contentEntry/DeleteEntryRevision/DeleteEntryRevisionUseCase.js +1 -1
  52. package/features/contentEntry/DeleteEntryRevision/DeleteEntryRevisionUseCase.js.map +1 -1
  53. package/features/contentEntry/DeleteEntryRevision/events.d.ts +2 -2
  54. package/features/contentEntry/DeleteEntryRevision/events.js +1 -1
  55. package/features/contentEntry/DeleteEntryRevision/events.js.map +1 -1
  56. package/features/contentEntry/DeleteMultipleEntries/DeleteMultipleEntriesUseCase.d.ts +1 -1
  57. package/features/contentEntry/DeleteMultipleEntries/DeleteMultipleEntriesUseCase.js +1 -1
  58. package/features/contentEntry/DeleteMultipleEntries/DeleteMultipleEntriesUseCase.js.map +1 -1
  59. package/features/contentEntry/DeleteMultipleEntries/events.d.ts +2 -2
  60. package/features/contentEntry/DeleteMultipleEntries/events.js +1 -1
  61. package/features/contentEntry/DeleteMultipleEntries/events.js.map +1 -1
  62. package/features/contentEntry/GetUniqueFieldValues/GetUniqueFieldValuesUseCase.js +6 -11
  63. package/features/contentEntry/GetUniqueFieldValues/GetUniqueFieldValuesUseCase.js.map +1 -1
  64. package/features/contentEntry/ListEntries/ListEntriesUseCase.d.ts +1 -1
  65. package/features/contentEntry/ListEntries/ListEntriesUseCase.js +1 -1
  66. package/features/contentEntry/ListEntries/ListEntriesUseCase.js.map +1 -1
  67. package/features/contentEntry/MoveEntry/MoveEntryUseCase.d.ts +1 -1
  68. package/features/contentEntry/MoveEntry/MoveEntryUseCase.js +1 -1
  69. package/features/contentEntry/MoveEntry/MoveEntryUseCase.js.map +1 -1
  70. package/features/contentEntry/MoveEntry/events.d.ts +2 -2
  71. package/features/contentEntry/MoveEntry/events.js +1 -1
  72. package/features/contentEntry/MoveEntry/events.js.map +1 -1
  73. package/features/contentEntry/PublishEntry/PublishEntryUseCase.d.ts +2 -2
  74. package/features/contentEntry/PublishEntry/PublishEntryUseCase.js +2 -2
  75. package/features/contentEntry/PublishEntry/PublishEntryUseCase.js.map +1 -1
  76. package/features/contentEntry/PublishEntry/events.d.ts +2 -2
  77. package/features/contentEntry/PublishEntry/events.js +1 -1
  78. package/features/contentEntry/PublishEntry/events.js.map +1 -1
  79. package/features/contentEntry/RepublishEntry/RepublishEntryUseCase.d.ts +2 -2
  80. package/features/contentEntry/RepublishEntry/RepublishEntryUseCase.js +2 -2
  81. package/features/contentEntry/RepublishEntry/RepublishEntryUseCase.js.map +1 -1
  82. package/features/contentEntry/RepublishEntry/events.d.ts +2 -2
  83. package/features/contentEntry/RepublishEntry/events.js +1 -1
  84. package/features/contentEntry/RepublishEntry/events.js.map +1 -1
  85. package/features/contentEntry/RestoreEntryFromBin/RestoreEntryFromBinUseCase.d.ts +2 -2
  86. package/features/contentEntry/RestoreEntryFromBin/RestoreEntryFromBinUseCase.js +2 -2
  87. package/features/contentEntry/RestoreEntryFromBin/RestoreEntryFromBinUseCase.js.map +1 -1
  88. package/features/contentEntry/RestoreEntryFromBin/events.d.ts +2 -2
  89. package/features/contentEntry/RestoreEntryFromBin/events.js +1 -1
  90. package/features/contentEntry/RestoreEntryFromBin/events.js.map +1 -1
  91. package/features/contentEntry/UnpublishEntry/UnpublishEntryUseCase.d.ts +2 -2
  92. package/features/contentEntry/UnpublishEntry/UnpublishEntryUseCase.js +2 -2
  93. package/features/contentEntry/UnpublishEntry/UnpublishEntryUseCase.js.map +1 -1
  94. package/features/contentEntry/UnpublishEntry/events.d.ts +2 -2
  95. package/features/contentEntry/UnpublishEntry/events.js +1 -1
  96. package/features/contentEntry/UnpublishEntry/events.js.map +1 -1
  97. package/features/contentEntry/UpdateEntry/UpdateEntryUseCase.d.ts +3 -3
  98. package/features/contentEntry/UpdateEntry/UpdateEntryUseCase.js +3 -3
  99. package/features/contentEntry/UpdateEntry/UpdateEntryUseCase.js.map +1 -1
  100. package/features/contentEntry/UpdateEntry/events.d.ts +2 -2
  101. package/features/contentEntry/UpdateEntry/events.js +1 -1
  102. package/features/contentEntry/UpdateEntry/events.js.map +1 -1
  103. package/features/contentModel/CreateModel/CreateModelRepository.d.ts +1 -1
  104. package/features/contentModel/CreateModel/CreateModelRepository.js +1 -1
  105. package/features/contentModel/CreateModel/CreateModelRepository.js.map +1 -1
  106. package/features/contentModel/CreateModel/CreateModelUseCase.d.ts +3 -3
  107. package/features/contentModel/CreateModel/CreateModelUseCase.js +3 -3
  108. package/features/contentModel/CreateModel/CreateModelUseCase.js.map +1 -1
  109. package/features/contentModel/CreateModel/events.d.ts +2 -2
  110. package/features/contentModel/CreateModel/events.js +1 -1
  111. package/features/contentModel/CreateModel/events.js.map +1 -1
  112. package/features/contentModel/CreateModelFrom/CreateModelFromRepository.d.ts +1 -1
  113. package/features/contentModel/CreateModelFrom/CreateModelFromRepository.js +1 -1
  114. package/features/contentModel/CreateModelFrom/CreateModelFromRepository.js.map +1 -1
  115. package/features/contentModel/CreateModelFrom/CreateModelFromUseCase.d.ts +3 -3
  116. package/features/contentModel/CreateModelFrom/CreateModelFromUseCase.js +4 -3
  117. package/features/contentModel/CreateModelFrom/CreateModelFromUseCase.js.map +1 -1
  118. package/features/contentModel/CreateModelFrom/events.d.ts +2 -2
  119. package/features/contentModel/CreateModelFrom/events.js +1 -1
  120. package/features/contentModel/CreateModelFrom/events.js.map +1 -1
  121. package/features/contentModel/DeleteModel/DeleteModelUseCase.d.ts +1 -1
  122. package/features/contentModel/DeleteModel/DeleteModelUseCase.js +1 -1
  123. package/features/contentModel/DeleteModel/DeleteModelUseCase.js.map +1 -1
  124. package/features/contentModel/DeleteModel/events.d.ts +2 -2
  125. package/features/contentModel/DeleteModel/events.js +1 -1
  126. package/features/contentModel/DeleteModel/events.js.map +1 -1
  127. package/features/contentModel/ModelToAstConverter/ModelToAstConverter.d.ts +3 -3
  128. package/features/contentModel/ModelToAstConverter/ModelToAstConverter.js +6 -6
  129. package/features/contentModel/ModelToAstConverter/ModelToAstConverter.js.map +1 -1
  130. package/features/contentModel/UpdateModel/UpdateModelUseCase.d.ts +2 -2
  131. package/features/contentModel/UpdateModel/UpdateModelUseCase.js +2 -2
  132. package/features/contentModel/UpdateModel/UpdateModelUseCase.js.map +1 -1
  133. package/features/contentModel/UpdateModel/events.d.ts +2 -2
  134. package/features/contentModel/UpdateModel/events.js +1 -1
  135. package/features/contentModel/UpdateModel/events.js.map +1 -1
  136. package/features/contentModel/shared/ModelsFetcher.d.ts +1 -1
  137. package/features/contentModel/shared/ModelsFetcher.js +1 -1
  138. package/features/contentModel/shared/ModelsFetcher.js.map +1 -1
  139. package/features/contentModelGroup/CreateGroup/CreateGroupRepository.d.ts +1 -1
  140. package/features/contentModelGroup/CreateGroup/CreateGroupRepository.js +1 -1
  141. package/features/contentModelGroup/CreateGroup/CreateGroupRepository.js.map +1 -1
  142. package/features/contentModelGroup/CreateGroup/CreateGroupUseCase.d.ts +3 -3
  143. package/features/contentModelGroup/CreateGroup/CreateGroupUseCase.js +3 -3
  144. package/features/contentModelGroup/CreateGroup/CreateGroupUseCase.js.map +1 -1
  145. package/features/contentModelGroup/CreateGroup/events.d.ts +2 -2
  146. package/features/contentModelGroup/CreateGroup/events.js +1 -1
  147. package/features/contentModelGroup/CreateGroup/events.js.map +1 -1
  148. package/features/contentModelGroup/DeleteGroup/DeleteGroupUseCase.d.ts +1 -1
  149. package/features/contentModelGroup/DeleteGroup/DeleteGroupUseCase.js +1 -1
  150. package/features/contentModelGroup/DeleteGroup/DeleteGroupUseCase.js.map +1 -1
  151. package/features/contentModelGroup/DeleteGroup/events.d.ts +2 -2
  152. package/features/contentModelGroup/DeleteGroup/events.js +1 -1
  153. package/features/contentModelGroup/DeleteGroup/events.js.map +1 -1
  154. package/features/contentModelGroup/GetGroup/GetGroupRepository.d.ts +2 -2
  155. package/features/contentModelGroup/GetGroup/GetGroupRepository.js +2 -2
  156. package/features/contentModelGroup/GetGroup/GetGroupRepository.js.map +1 -1
  157. package/features/contentModelGroup/ListGroups/ListGroupsRepository.d.ts +2 -2
  158. package/features/contentModelGroup/ListGroups/ListGroupsRepository.js +2 -2
  159. package/features/contentModelGroup/ListGroups/ListGroupsRepository.js.map +1 -1
  160. package/features/contentModelGroup/UpdateGroup/UpdateGroupUseCase.d.ts +2 -2
  161. package/features/contentModelGroup/UpdateGroup/UpdateGroupUseCase.js +2 -2
  162. package/features/contentModelGroup/UpdateGroup/UpdateGroupUseCase.js.map +1 -1
  163. package/features/contentModelGroup/UpdateGroup/events.d.ts +2 -2
  164. package/features/contentModelGroup/UpdateGroup/events.js +1 -1
  165. package/features/contentModelGroup/UpdateGroup/events.js.map +1 -1
  166. package/features/contentModelGroup/shared/PluginGroupsProvider.d.ts +2 -2
  167. package/features/contentModelGroup/shared/PluginGroupsProvider.js +2 -2
  168. package/features/contentModelGroup/shared/PluginGroupsProvider.js.map +1 -1
  169. package/features/graphql/feature.d.ts +1 -0
  170. package/features/graphql/feature.js +34 -0
  171. package/features/graphql/feature.js.map +1 -0
  172. package/features/graphql/fields/CmsModelFieldToGraphQLRegistry.d.ts +13 -0
  173. package/features/graphql/fields/CmsModelFieldToGraphQLRegistry.js +27 -0
  174. package/features/graphql/fields/CmsModelFieldToGraphQLRegistry.js.map +1 -0
  175. package/features/graphql/fields/abstractions/CmsModelFieldToGraphQL.d.ts +97 -0
  176. package/features/graphql/fields/abstractions/CmsModelFieldToGraphQL.js +4 -0
  177. package/features/graphql/fields/abstractions/CmsModelFieldToGraphQL.js.map +1 -0
  178. package/features/graphql/fields/abstractions/CmsModelFieldToGraphQLRegistry.d.ts +10 -0
  179. package/features/graphql/fields/abstractions/CmsModelFieldToGraphQLRegistry.js +4 -0
  180. package/features/graphql/fields/abstractions/CmsModelFieldToGraphQLRegistry.js.map +1 -0
  181. package/features/graphql/fields/base/BooleanToGraphQL.d.ts +26 -0
  182. package/features/graphql/fields/base/BooleanToGraphQL.js +68 -0
  183. package/features/graphql/fields/base/BooleanToGraphQL.js.map +1 -0
  184. package/features/graphql/fields/base/DateTimeToGraphQL.d.ts +26 -0
  185. package/features/graphql/fields/base/DateTimeToGraphQL.js +97 -0
  186. package/features/graphql/fields/base/DateTimeToGraphQL.js.map +1 -0
  187. package/features/graphql/fields/base/DynamicZoneToGraphQL.d.ts +30 -0
  188. package/features/graphql/fields/base/DynamicZoneToGraphQL.js +280 -0
  189. package/features/graphql/fields/base/DynamicZoneToGraphQL.js.map +1 -0
  190. package/features/graphql/fields/base/FileToGraphQL.d.ts +22 -0
  191. package/features/graphql/fields/base/FileToGraphQL.js +39 -0
  192. package/features/graphql/fields/base/FileToGraphQL.js.map +1 -0
  193. package/features/graphql/fields/base/JsonToGraphQL.d.ts +24 -0
  194. package/features/graphql/fields/base/JsonToGraphQL.js +52 -0
  195. package/features/graphql/fields/base/JsonToGraphQL.js.map +1 -0
  196. package/features/graphql/fields/base/LongTextToGraphQL.d.ts +24 -0
  197. package/features/graphql/fields/base/LongTextToGraphQL.js +57 -0
  198. package/features/graphql/fields/base/LongTextToGraphQL.js.map +1 -0
  199. package/features/graphql/fields/base/NumberToGraphQL.d.ts +26 -0
  200. package/features/graphql/fields/base/NumberToGraphQL.js +78 -0
  201. package/features/graphql/fields/base/NumberToGraphQL.js.map +1 -0
  202. package/features/graphql/fields/base/ObjectToGraphQL.d.ts +31 -0
  203. package/features/graphql/fields/base/ObjectToGraphQL.js +264 -0
  204. package/features/graphql/fields/base/ObjectToGraphQL.js.map +1 -0
  205. package/features/graphql/fields/base/RefToGraphQL.d.ts +29 -0
  206. package/features/graphql/fields/base/RefToGraphQL.js +261 -0
  207. package/features/graphql/fields/base/RefToGraphQL.js.map +1 -0
  208. package/features/graphql/fields/base/RichTextToGraphQL.d.ts +25 -0
  209. package/features/graphql/fields/base/RichTextToGraphQL.js +58 -0
  210. package/features/graphql/fields/base/RichTextToGraphQL.js.map +1 -0
  211. package/features/graphql/fields/base/SearchableJsonToGraphQL.d.ts +26 -0
  212. package/features/graphql/fields/base/SearchableJsonToGraphQL.js +62 -0
  213. package/features/graphql/fields/base/SearchableJsonToGraphQL.js.map +1 -0
  214. package/features/graphql/fields/base/TextToGraphQL.d.ts +26 -0
  215. package/features/graphql/fields/base/TextToGraphQL.js +74 -0
  216. package/features/graphql/fields/base/TextToGraphQL.js.map +1 -0
  217. package/features/graphql/fields/base/dynamicZone/createTypeDefsForTemplates.d.ts +16 -0
  218. package/features/graphql/fields/base/dynamicZone/createTypeDefsForTemplates.js +37 -0
  219. package/features/graphql/fields/base/dynamicZone/createTypeDefsForTemplates.js.map +1 -0
  220. package/features/graphql/fields/base/dynamicZone/normalizeDynamicZoneInput.d.ts +3 -0
  221. package/features/graphql/fields/base/dynamicZone/normalizeDynamicZoneInput.js +14 -0
  222. package/features/graphql/fields/base/dynamicZone/normalizeDynamicZoneInput.js.map +1 -0
  223. package/{graphqlFields → features/graphql/fields/base}/richText/richTextResolver.d.ts +1 -1
  224. package/{graphqlFields → features/graphql/fields/base}/richText/richTextResolver.js +2 -2
  225. package/features/graphql/fields/base/richText/richTextResolver.js.map +1 -0
  226. package/{graphqlFields/helpers.d.ts → features/graphql/fields/base/utils/createGraphQLInputField.d.ts} +1 -1
  227. package/features/graphql/fields/base/utils/createGraphQLInputField.js +17 -0
  228. package/features/graphql/fields/base/utils/createGraphQLInputField.js.map +1 -0
  229. package/features/graphql/index.d.ts +4 -0
  230. package/features/graphql/index.js +6 -0
  231. package/features/graphql/index.js.map +1 -0
  232. package/features/graphql/sort/abstractions/CmsGraphQLSchemaSorter.d.ts +13 -0
  233. package/features/graphql/sort/abstractions/CmsGraphQLSchemaSorter.js +4 -0
  234. package/features/graphql/sort/abstractions/CmsGraphQLSchemaSorter.js.map +1 -0
  235. package/features/installer/CmsInstaller.d.ts +1 -1
  236. package/features/installer/CmsInstaller.js +1 -1
  237. package/features/installer/CmsInstaller.js.map +1 -1
  238. package/features/shared/abstractions.d.ts +9 -2
  239. package/features/shared/abstractions.js +1 -0
  240. package/features/shared/abstractions.js.map +1 -1
  241. package/features/storage/StorageTransformRegistry.d.ts +13 -0
  242. package/features/storage/StorageTransformRegistry.js +27 -0
  243. package/features/storage/StorageTransformRegistry.js.map +1 -0
  244. package/features/storage/abstractions/StorageTransform.d.ts +26 -0
  245. package/features/storage/abstractions/StorageTransform.js +4 -0
  246. package/features/storage/abstractions/StorageTransform.js.map +1 -0
  247. package/features/storage/abstractions/StorageTransformRegistry.d.ts +10 -0
  248. package/features/storage/abstractions/StorageTransformRegistry.js +4 -0
  249. package/features/storage/abstractions/StorageTransformRegistry.js.map +1 -0
  250. package/features/storage/feature.d.ts +1 -0
  251. package/features/storage/feature.js +24 -0
  252. package/features/storage/feature.js.map +1 -0
  253. package/features/storage/fields/DateStorageTransform.d.ts +10 -0
  254. package/features/storage/fields/DateStorageTransform.js +110 -0
  255. package/features/storage/fields/DateStorageTransform.js.map +1 -0
  256. package/features/storage/fields/DefaultStorageTransform.d.ts +10 -0
  257. package/features/storage/fields/DefaultStorageTransform.js +20 -0
  258. package/features/storage/fields/DefaultStorageTransform.js.map +1 -0
  259. package/features/storage/fields/DynamicZoneStorageTransform.d.ts +10 -0
  260. package/features/storage/fields/DynamicZoneStorageTransform.js +142 -0
  261. package/features/storage/fields/DynamicZoneStorageTransform.js.map +1 -0
  262. package/features/storage/fields/JsonStorageTransform.d.ts +13 -0
  263. package/features/storage/fields/JsonStorageTransform.js +31 -0
  264. package/features/storage/fields/JsonStorageTransform.js.map +1 -0
  265. package/features/storage/fields/LongTextStorageTransform.d.ts +18 -0
  266. package/features/storage/fields/LongTextStorageTransform.js +55 -0
  267. package/features/storage/fields/LongTextStorageTransform.js.map +1 -0
  268. package/features/storage/fields/ObjectStorageTransform.d.ts +10 -0
  269. package/features/storage/fields/ObjectStorageTransform.js +99 -0
  270. package/features/storage/fields/ObjectStorageTransform.js.map +1 -0
  271. package/features/storage/fields/RichTextStorageTransform.d.ts +13 -0
  272. package/features/storage/fields/RichTextStorageTransform.js +39 -0
  273. package/features/storage/fields/RichTextStorageTransform.js.map +1 -0
  274. package/features/storage/index.d.ts +3 -0
  275. package/features/storage/index.js +5 -0
  276. package/features/storage/index.js.map +1 -0
  277. package/features/validation/CmsModelFieldPatternValidatorRegistry.d.ts +12 -0
  278. package/features/validation/CmsModelFieldPatternValidatorRegistry.js +21 -0
  279. package/features/validation/CmsModelFieldPatternValidatorRegistry.js.map +1 -0
  280. package/features/validation/CmsModelFieldValidatorRegistry.d.ts +12 -0
  281. package/features/validation/CmsModelFieldValidatorRegistry.js +23 -0
  282. package/features/validation/CmsModelFieldValidatorRegistry.js.map +1 -0
  283. package/features/validation/abstractions/CmsModelFieldPatternValidator.d.ts +13 -0
  284. package/features/validation/abstractions/CmsModelFieldPatternValidator.js +4 -0
  285. package/features/validation/abstractions/CmsModelFieldPatternValidator.js.map +1 -0
  286. package/features/validation/abstractions/CmsModelFieldPatternValidatorRegistry.d.ts +9 -0
  287. package/features/validation/abstractions/CmsModelFieldPatternValidatorRegistry.js +4 -0
  288. package/features/validation/abstractions/CmsModelFieldPatternValidatorRegistry.js.map +1 -0
  289. package/features/validation/abstractions/CmsModelFieldValidator.d.ts +11 -0
  290. package/features/validation/abstractions/CmsModelFieldValidator.js +4 -0
  291. package/features/validation/abstractions/CmsModelFieldValidator.js.map +1 -0
  292. package/features/validation/abstractions/CmsModelFieldValidatorRegistry.d.ts +9 -0
  293. package/features/validation/abstractions/CmsModelFieldValidatorRegistry.js +4 -0
  294. package/features/validation/abstractions/CmsModelFieldValidatorRegistry.js.map +1 -0
  295. package/features/validation/feature.d.ts +1 -0
  296. package/features/validation/feature.js +48 -0
  297. package/features/validation/feature.js.map +1 -0
  298. package/features/validation/index.d.ts +5 -0
  299. package/features/validation/index.js +7 -0
  300. package/features/validation/index.js.map +1 -0
  301. package/features/validation/validators/DateGteValidator.d.ts +10 -0
  302. package/features/validation/validators/DateGteValidator.js +26 -0
  303. package/features/validation/validators/DateGteValidator.js.map +1 -0
  304. package/features/validation/validators/DateLteValidator.d.ts +10 -0
  305. package/features/validation/validators/DateLteValidator.js +26 -0
  306. package/features/validation/validators/DateLteValidator.js.map +1 -0
  307. package/features/validation/validators/GteValidator.d.ts +10 -0
  308. package/features/validation/validators/GteValidator.js +21 -0
  309. package/features/validation/validators/GteValidator.js.map +1 -0
  310. package/features/validation/validators/InValidator.d.ts +10 -0
  311. package/features/validation/validators/InValidator.js +21 -0
  312. package/features/validation/validators/InValidator.js.map +1 -0
  313. package/features/validation/validators/LteValidator.d.ts +10 -0
  314. package/features/validation/validators/LteValidator.js +21 -0
  315. package/features/validation/validators/LteValidator.js.map +1 -0
  316. package/features/validation/validators/MaxLengthValidator.d.ts +10 -0
  317. package/features/validation/validators/MaxLengthValidator.js +21 -0
  318. package/features/validation/validators/MaxLengthValidator.js.map +1 -0
  319. package/features/validation/validators/MinLengthValidator.d.ts +10 -0
  320. package/features/validation/validators/MinLengthValidator.js +21 -0
  321. package/features/validation/validators/MinLengthValidator.js.map +1 -0
  322. package/features/validation/validators/PatternValidator.d.ts +13 -0
  323. package/features/validation/validators/PatternValidator.js +38 -0
  324. package/features/validation/validators/PatternValidator.js.map +1 -0
  325. package/features/validation/validators/RequiredValidator.d.ts +10 -0
  326. package/features/validation/validators/RequiredValidator.js +16 -0
  327. package/features/validation/validators/RequiredValidator.js.map +1 -0
  328. package/features/validation/validators/TimeGteValidator.d.ts +10 -0
  329. package/features/validation/validators/TimeGteValidator.js +21 -0
  330. package/features/validation/validators/TimeGteValidator.js.map +1 -0
  331. package/features/validation/validators/TimeLteValidator.d.ts +10 -0
  332. package/features/validation/validators/TimeLteValidator.js +21 -0
  333. package/features/validation/validators/TimeLteValidator.js.map +1 -0
  334. package/features/validation/validators/UniqueValidator.d.ts +10 -0
  335. package/features/validation/validators/UniqueValidator.js +47 -0
  336. package/features/validation/validators/UniqueValidator.js.map +1 -0
  337. package/features/validation/validators/patterns/EmailPattern.d.ts +12 -0
  338. package/features/validation/validators/patterns/EmailPattern.js +14 -0
  339. package/features/validation/validators/patterns/EmailPattern.js.map +1 -0
  340. package/features/validation/validators/patterns/LowerCasePattern.d.ts +12 -0
  341. package/features/validation/validators/patterns/LowerCasePattern.js +14 -0
  342. package/features/validation/validators/patterns/LowerCasePattern.js.map +1 -0
  343. package/features/validation/validators/patterns/LowerCaseSpacePattern.d.ts +12 -0
  344. package/features/validation/validators/patterns/LowerCaseSpacePattern.js +14 -0
  345. package/features/validation/validators/patterns/LowerCaseSpacePattern.js.map +1 -0
  346. package/features/validation/validators/patterns/UpperCasePattern.d.ts +12 -0
  347. package/features/validation/validators/patterns/UpperCasePattern.js +14 -0
  348. package/features/validation/validators/patterns/UpperCasePattern.js.map +1 -0
  349. package/features/validation/validators/patterns/UpperCaseSpacePattern.d.ts +12 -0
  350. package/features/validation/validators/patterns/UpperCaseSpacePattern.js +14 -0
  351. package/features/validation/validators/patterns/UpperCaseSpacePattern.js.map +1 -0
  352. package/features/validation/validators/patterns/UrlPattern.d.ts +12 -0
  353. package/features/validation/validators/patterns/UrlPattern.js +14 -0
  354. package/features/validation/validators/patterns/UrlPattern.js.map +1 -0
  355. package/graphql/getSchema/generateCacheKey.js +1 -1
  356. package/graphql/getSchema/generateCacheKey.js.map +1 -1
  357. package/graphql/schema/baseSchema.d.ts +2 -1
  358. package/graphql/schema/baseSchema.js +11 -9
  359. package/graphql/schema/baseSchema.js.map +1 -1
  360. package/graphql/schema/createFieldResolvers.d.ts +3 -2
  361. package/graphql/schema/createFieldResolvers.js +5 -4
  362. package/graphql/schema/createFieldResolvers.js.map +1 -1
  363. package/graphql/schema/createManageResolvers.d.ts +3 -2
  364. package/graphql/schema/createManageResolvers.js +3 -3
  365. package/graphql/schema/createManageResolvers.js.map +1 -1
  366. package/graphql/schema/createManageSDL.d.ts +4 -4
  367. package/graphql/schema/createManageSDL.js +8 -8
  368. package/graphql/schema/createManageSDL.js.map +1 -1
  369. package/graphql/schema/createPreviewResolvers.d.ts +3 -2
  370. package/graphql/schema/createPreviewResolvers.js +4 -4
  371. package/graphql/schema/createPreviewResolvers.js.map +1 -1
  372. package/graphql/schema/createReadResolvers.d.ts +3 -2
  373. package/graphql/schema/createReadResolvers.js +4 -4
  374. package/graphql/schema/createReadResolvers.js.map +1 -1
  375. package/graphql/schema/createReadSDL.d.ts +4 -4
  376. package/graphql/schema/createReadSDL.js +7 -7
  377. package/graphql/schema/createReadSDL.js.map +1 -1
  378. package/graphql/schema/createSingularResolvers.d.ts +3 -2
  379. package/graphql/schema/createSingularResolvers.js +3 -3
  380. package/graphql/schema/createSingularResolvers.js.map +1 -1
  381. package/graphql/schema/createSingularSDL.d.ts +3 -2
  382. package/graphql/schema/createSingularSDL.js +3 -3
  383. package/graphql/schema/createSingularSDL.js.map +1 -1
  384. package/graphql/schema/resolvers/manage/normalizeGraphQlInput.js +6 -7
  385. package/graphql/schema/resolvers/manage/normalizeGraphQlInput.js.map +1 -1
  386. package/graphql/schema/schemaPlugins.js +14 -17
  387. package/graphql/schema/schemaPlugins.js.map +1 -1
  388. package/index.d.ts +1 -4
  389. package/index.js +2 -6
  390. package/index.js.map +1 -1
  391. package/package.json +25 -25
  392. package/plugins/index.d.ts +0 -2
  393. package/plugins/index.js +0 -2
  394. package/plugins/index.js.map +1 -1
  395. package/types/modelField.d.ts +1 -1
  396. package/types/modelField.js.map +1 -1
  397. package/types/plugins.d.ts +1 -305
  398. package/types/plugins.js.map +1 -1
  399. package/types/types.d.ts +4 -44
  400. package/types/types.js +0 -4
  401. package/types/types.js.map +1 -1
  402. package/utils/contentModelAst/CmsModelFieldToAstConverterFromPlugins.d.ts +3 -2
  403. package/utils/contentModelAst/CmsModelFieldToAstConverterFromPlugins.js +3 -3
  404. package/utils/contentModelAst/CmsModelFieldToAstConverterFromPlugins.js.map +1 -1
  405. package/utils/contentModelAst/CmsModelFieldToAstFromPlugin.d.ts +4 -3
  406. package/utils/contentModelAst/CmsModelFieldToAstFromPlugin.js +3 -3
  407. package/utils/contentModelAst/CmsModelFieldToAstFromPlugin.js.map +1 -1
  408. package/utils/converters/ConverterCollection.d.ts +2 -0
  409. package/utils/converters/ConverterCollection.js +3 -2
  410. package/utils/converters/ConverterCollection.js.map +1 -1
  411. package/utils/converters/valueKeyFromStorageConverter.d.ts +2 -0
  412. package/utils/converters/valueKeyFromStorageConverter.js +4 -2
  413. package/utils/converters/valueKeyFromStorageConverter.js.map +1 -1
  414. package/utils/converters/valueKeyStorageConverter.d.ts +2 -3
  415. package/utils/converters/valueKeyStorageConverter.js +7 -3
  416. package/utils/converters/valueKeyStorageConverter.js.map +1 -1
  417. package/utils/converters/valueKeyToStorageConverter.d.ts +2 -0
  418. package/utils/converters/valueKeyToStorageConverter.js +4 -2
  419. package/utils/converters/valueKeyToStorageConverter.js.map +1 -1
  420. package/utils/createTypeFromFields.d.ts +3 -2
  421. package/utils/createTypeFromFields.js +3 -3
  422. package/utils/createTypeFromFields.js.map +1 -1
  423. package/utils/entryStorage.d.ts +8 -15
  424. package/utils/entryStorage.js +31 -59
  425. package/utils/entryStorage.js.map +1 -1
  426. package/utils/getBaseFieldType.js +3 -0
  427. package/utils/getBaseFieldType.js.map +1 -1
  428. package/utils/getSchemaFromFieldPlugins.d.ts +3 -2
  429. package/utils/getSchemaFromFieldPlugins.js +5 -9
  430. package/utils/getSchemaFromFieldPlugins.js.map +1 -1
  431. package/utils/renderFields.d.ts +4 -3
  432. package/utils/renderFields.js +14 -9
  433. package/utils/renderFields.js.map +1 -1
  434. package/utils/renderGetFilterFields.d.ts +3 -2
  435. package/utils/renderGetFilterFields.js +2 -2
  436. package/utils/renderGetFilterFields.js.map +1 -1
  437. package/utils/renderInputFields.d.ts +4 -3
  438. package/utils/renderInputFields.js +5 -11
  439. package/utils/renderInputFields.js.map +1 -1
  440. package/utils/renderListFilterFields.d.ts +3 -2
  441. package/utils/renderListFilterFields.js +5 -3
  442. package/utils/renderListFilterFields.js.map +1 -1
  443. package/utils/renderSortEnum.d.ts +4 -4
  444. package/utils/renderSortEnum.js +11 -11
  445. package/utils/renderSortEnum.js.map +1 -1
  446. package/graphql/schema/createFieldTypePluginRecords.d.ts +0 -3
  447. package/graphql/schema/createFieldTypePluginRecords.js +0 -8
  448. package/graphql/schema/createFieldTypePluginRecords.js.map +0 -1
  449. package/graphqlFields/boolean.d.ts +0 -2
  450. package/graphqlFields/boolean.js +0 -52
  451. package/graphqlFields/boolean.js.map +0 -1
  452. package/graphqlFields/datetime.d.ts +0 -2
  453. package/graphqlFields/datetime.js +0 -71
  454. package/graphqlFields/datetime.js.map +0 -1
  455. package/graphqlFields/dynamicZone/dynamicZoneField.d.ts +0 -2
  456. package/graphqlFields/dynamicZone/dynamicZoneField.js +0 -313
  457. package/graphqlFields/dynamicZone/dynamicZoneField.js.map +0 -1
  458. package/graphqlFields/dynamicZone/index.d.ts +0 -1
  459. package/graphqlFields/dynamicZone/index.js +0 -3
  460. package/graphqlFields/dynamicZone/index.js.map +0 -1
  461. package/graphqlFields/file.d.ts +0 -2
  462. package/graphqlFields/file.js +0 -37
  463. package/graphqlFields/file.js.map +0 -1
  464. package/graphqlFields/helpers.js +0 -20
  465. package/graphqlFields/helpers.js.map +0 -1
  466. package/graphqlFields/index.d.ts +0 -2
  467. package/graphqlFields/index.js +0 -15
  468. package/graphqlFields/index.js.map +0 -1
  469. package/graphqlFields/json.d.ts +0 -2
  470. package/graphqlFields/json.js +0 -42
  471. package/graphqlFields/json.js.map +0 -1
  472. package/graphqlFields/longText.d.ts +0 -2
  473. package/graphqlFields/longText.js +0 -57
  474. package/graphqlFields/longText.js.map +0 -1
  475. package/graphqlFields/number.d.ts +0 -2
  476. package/graphqlFields/number.js +0 -63
  477. package/graphqlFields/number.js.map +0 -1
  478. package/graphqlFields/object.d.ts +0 -2
  479. package/graphqlFields/object.js +0 -245
  480. package/graphqlFields/object.js.map +0 -1
  481. package/graphqlFields/ref.d.ts +0 -2
  482. package/graphqlFields/ref.js +0 -286
  483. package/graphqlFields/ref.js.map +0 -1
  484. package/graphqlFields/richText/richTextResolver.js.map +0 -1
  485. package/graphqlFields/richText.d.ts +0 -2
  486. package/graphqlFields/richText.js +0 -48
  487. package/graphqlFields/richText.js.map +0 -1
  488. package/graphqlFields/searchableJson.d.ts +0 -2
  489. package/graphqlFields/searchableJson.js +0 -53
  490. package/graphqlFields/searchableJson.js.map +0 -1
  491. package/graphqlFields/text.d.ts +0 -2
  492. package/graphqlFields/text.js +0 -59
  493. package/graphqlFields/text.js.map +0 -1
  494. package/plugins/CmsGraphQLSchemaSorterPlugin.d.ts +0 -20
  495. package/plugins/CmsGraphQLSchemaSorterPlugin.js +0 -19
  496. package/plugins/CmsGraphQLSchemaSorterPlugin.js.map +0 -1
  497. package/plugins/StorageTransformPlugin.d.ts +0 -35
  498. package/plugins/StorageTransformPlugin.js +0 -26
  499. package/plugins/StorageTransformPlugin.js.map +0 -1
  500. package/storage/date.d.ts +0 -3
  501. package/storage/date.js +0 -110
  502. package/storage/date.js.map +0 -1
  503. package/storage/default.d.ts +0 -2
  504. package/storage/default.js +0 -19
  505. package/storage/default.js.map +0 -1
  506. package/storage/dynamicZone.d.ts +0 -2
  507. package/storage/dynamicZone.js +0 -149
  508. package/storage/dynamicZone.js.map +0 -1
  509. package/storage/index.d.ts +0 -1
  510. package/storage/index.js +0 -13
  511. package/storage/index.js.map +0 -1
  512. package/storage/json.d.ts +0 -2
  513. package/storage/json.js +0 -49
  514. package/storage/json.js.map +0 -1
  515. package/storage/object.d.ts +0 -2
  516. package/storage/object.js +0 -104
  517. package/storage/object.js.map +0 -1
  518. package/validators/dateGte.d.ts +0 -2
  519. package/validators/dateGte.js +0 -25
  520. package/validators/dateGte.js.map +0 -1
  521. package/validators/dateLte.d.ts +0 -2
  522. package/validators/dateLte.js +0 -25
  523. package/validators/dateLte.js.map +0 -1
  524. package/validators/gte.d.ts +0 -2
  525. package/validators/gte.js +0 -22
  526. package/validators/gte.js.map +0 -1
  527. package/validators/in.d.ts +0 -2
  528. package/validators/in.js +0 -22
  529. package/validators/in.js.map +0 -1
  530. package/validators/index.d.ts +0 -1
  531. package/validators/index.js +0 -16
  532. package/validators/index.js.map +0 -1
  533. package/validators/lte.d.ts +0 -2
  534. package/validators/lte.js +0 -22
  535. package/validators/lte.js.map +0 -1
  536. package/validators/maxLength.d.ts +0 -2
  537. package/validators/maxLength.js +0 -22
  538. package/validators/maxLength.js.map +0 -1
  539. package/validators/minLength.d.ts +0 -2
  540. package/validators/minLength.js +0 -22
  541. package/validators/minLength.js.map +0 -1
  542. package/validators/pattern.d.ts +0 -2
  543. package/validators/pattern.js +0 -36
  544. package/validators/pattern.js.map +0 -1
  545. package/validators/patternPlugins/email.d.ts +0 -2
  546. package/validators/patternPlugins/email.js +0 -13
  547. package/validators/patternPlugins/email.js.map +0 -1
  548. package/validators/patternPlugins/index.d.ts +0 -2
  549. package/validators/patternPlugins/index.js +0 -11
  550. package/validators/patternPlugins/index.js.map +0 -1
  551. package/validators/patternPlugins/lowerCase.d.ts +0 -2
  552. package/validators/patternPlugins/lowerCase.js +0 -13
  553. package/validators/patternPlugins/lowerCase.js.map +0 -1
  554. package/validators/patternPlugins/lowerCaseSpace.d.ts +0 -2
  555. package/validators/patternPlugins/lowerCaseSpace.js +0 -13
  556. package/validators/patternPlugins/lowerCaseSpace.js.map +0 -1
  557. package/validators/patternPlugins/upperCase.d.ts +0 -2
  558. package/validators/patternPlugins/upperCase.js +0 -13
  559. package/validators/patternPlugins/upperCase.js.map +0 -1
  560. package/validators/patternPlugins/upperCaseSpace.d.ts +0 -2
  561. package/validators/patternPlugins/upperCaseSpace.js +0 -13
  562. package/validators/patternPlugins/upperCaseSpace.js.map +0 -1
  563. package/validators/patternPlugins/url.d.ts +0 -2
  564. package/validators/patternPlugins/url.js +0 -13
  565. package/validators/patternPlugins/url.js.map +0 -1
  566. package/validators/required.d.ts +0 -2
  567. package/validators/required.js +0 -17
  568. package/validators/required.js.map +0 -1
  569. package/validators/timeGte.d.ts +0 -2
  570. package/validators/timeGte.js +0 -20
  571. package/validators/timeGte.js.map +0 -1
  572. package/validators/timeLte.d.ts +0 -2
  573. package/validators/timeLte.js +0 -20
  574. package/validators/timeLte.js.map +0 -1
  575. package/validators/unique.d.ts +0 -6
  576. package/validators/unique.js +0 -57
  577. package/validators/unique.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"names":["createAbstraction","DomainEvent","ModelBeforeUpdateEvent","eventType","getHandlerAbstraction","ModelBeforeUpdateEventHandler","ModelAfterUpdateEvent","ModelAfterUpdateEventHandler","ModelUpdateErrorEvent","ModelUpdateErrorEventHandler"],"sources":["events.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/api\";\nimport type { IEventHandler } from \"@webiny/api-core/features/EventPublisher\";\nimport { DomainEvent } from \"@webiny/api-core/features/EventPublisher\";\nimport type { CmsModel, CmsModelUpdateInput } from \"~/types/index.js\";\n\n/**\n * Event payloads\n */\nexport interface ModelBeforeUpdateEventPayload {\n model: CmsModel;\n original: CmsModel;\n input: CmsModelUpdateInput;\n}\n\nexport interface ModelAfterUpdateEventPayload {\n model: CmsModel;\n original: CmsModel;\n}\n\nexport interface ModelUpdateErrorEventPayload {\n input: CmsModelUpdateInput;\n model: CmsModel;\n original: CmsModel;\n error: Error;\n}\n\n/**\n * ModelBeforeUpdateEvent - Published before updating a model\n */\nexport class ModelBeforeUpdateEvent extends DomainEvent<ModelBeforeUpdateEventPayload> {\n eventType = \"Cms/Model/BeforeUpdate\" as const;\n\n getHandlerAbstraction() {\n return ModelBeforeUpdateEventHandler;\n }\n}\n\n/** Hook into model lifecycle before a model is updated. */\nexport const ModelBeforeUpdateEventHandler = createAbstraction<\n IEventHandler<ModelBeforeUpdateEvent>\n>(\"ModelBeforeUpdateEventHandler\");\n\nexport namespace ModelBeforeUpdateEventHandler {\n export type Interface = IEventHandler<ModelBeforeUpdateEvent>;\n export type Event = ModelBeforeUpdateEvent;\n}\n\n/**\n * ModelAfterUpdateEvent - Published after updating a model\n */\nexport class ModelAfterUpdateEvent extends DomainEvent<ModelAfterUpdateEventPayload> {\n eventType = \"Cms/Model/AfterUpdate\" as const;\n\n getHandlerAbstraction() {\n return ModelAfterUpdateEventHandler;\n }\n}\n\n/** Hook into model lifecycle after a model is updated. */\nexport const ModelAfterUpdateEventHandler = createAbstraction<IEventHandler<ModelAfterUpdateEvent>>(\n \"ModelAfterUpdateEventHandler\"\n);\n\nexport namespace ModelAfterUpdateEventHandler {\n export type Interface = IEventHandler<ModelAfterUpdateEvent>;\n export type Event = ModelAfterUpdateEvent;\n}\n\n/**\n * ModelUpdateErrorEvent - Published when update fails\n */\nexport class ModelUpdateErrorEvent extends DomainEvent<ModelUpdateErrorEventPayload> {\n eventType = \"Cms/Model/UpdateError\" as const;\n\n getHandlerAbstraction() {\n return ModelUpdateErrorEventHandler;\n }\n}\n\nexport const ModelUpdateErrorEventHandler = createAbstraction<IEventHandler<ModelUpdateErrorEvent>>(\n \"ModelUpdateErrorEventHandler\"\n);\n\nexport namespace ModelUpdateErrorEventHandler {\n export type Interface = IEventHandler<ModelUpdateErrorEvent>;\n export type Event = ModelUpdateErrorEvent;\n}\n"],"mappings":"AAAA,SAASA,iBAAiB,QAAQ,qBAAqB;AAEvD,SAASC,WAAW,QAAQ,0CAA0C;;AAGtE;AACA;AACA;;AAmBA;AACA;AACA;AACA,OAAO,MAAMC,sBAAsB,SAASD,WAAW,CAAgC;EACnFE,SAAS,GAAG,wBAAwB;EAEpCC,qBAAqBA,CAAA,EAAG;IACpB,OAAOC,6BAA6B;EACxC;AACJ;;AAEA;AACA,OAAO,MAAMA,6BAA6B,GAAGL,iBAAiB,CAE5D,+BAA+B,CAAC;AAOlC;AACA;AACA;AACA,OAAO,MAAMM,qBAAqB,SAASL,WAAW,CAA+B;EACjFE,SAAS,GAAG,uBAAuB;EAEnCC,qBAAqBA,CAAA,EAAG;IACpB,OAAOG,4BAA4B;EACvC;AACJ;;AAEA;AACA,OAAO,MAAMA,4BAA4B,GAAGP,iBAAiB,CACzD,8BACJ,CAAC;AAOD;AACA;AACA;AACA,OAAO,MAAMQ,qBAAqB,SAASP,WAAW,CAA+B;EACjFE,SAAS,GAAG,uBAAuB;EAEnCC,qBAAqBA,CAAA,EAAG;IACpB,OAAOK,4BAA4B;EACvC;AACJ;AAEA,OAAO,MAAMA,4BAA4B,GAAGT,iBAAiB,CACzD,8BACJ,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["createAbstraction","DomainEvent","ModelBeforeUpdateEvent","eventType","getHandlerAbstraction","ModelBeforeUpdateEventHandler","ModelAfterUpdateEvent","ModelAfterUpdateEventHandler","ModelUpdateErrorEvent","ModelUpdateErrorEventHandler"],"sources":["events.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/api\";\nimport type { IEventHandler } from \"@webiny/api-core/features/eventPublisher/index.js\";\nimport { DomainEvent } from \"@webiny/api-core/features/eventPublisher/index.js\";\nimport type { CmsModel, CmsModelUpdateInput } from \"~/types/index.js\";\n\n/**\n * Event payloads\n */\nexport interface ModelBeforeUpdateEventPayload {\n model: CmsModel;\n original: CmsModel;\n input: CmsModelUpdateInput;\n}\n\nexport interface ModelAfterUpdateEventPayload {\n model: CmsModel;\n original: CmsModel;\n}\n\nexport interface ModelUpdateErrorEventPayload {\n input: CmsModelUpdateInput;\n model: CmsModel;\n original: CmsModel;\n error: Error;\n}\n\n/**\n * ModelBeforeUpdateEvent - Published before updating a model\n */\nexport class ModelBeforeUpdateEvent extends DomainEvent<ModelBeforeUpdateEventPayload> {\n eventType = \"Cms/Model/BeforeUpdate\" as const;\n\n getHandlerAbstraction() {\n return ModelBeforeUpdateEventHandler;\n }\n}\n\n/** Hook into model lifecycle before a model is updated. */\nexport const ModelBeforeUpdateEventHandler = createAbstraction<\n IEventHandler<ModelBeforeUpdateEvent>\n>(\"ModelBeforeUpdateEventHandler\");\n\nexport namespace ModelBeforeUpdateEventHandler {\n export type Interface = IEventHandler<ModelBeforeUpdateEvent>;\n export type Event = ModelBeforeUpdateEvent;\n}\n\n/**\n * ModelAfterUpdateEvent - Published after updating a model\n */\nexport class ModelAfterUpdateEvent extends DomainEvent<ModelAfterUpdateEventPayload> {\n eventType = \"Cms/Model/AfterUpdate\" as const;\n\n getHandlerAbstraction() {\n return ModelAfterUpdateEventHandler;\n }\n}\n\n/** Hook into model lifecycle after a model is updated. */\nexport const ModelAfterUpdateEventHandler = createAbstraction<IEventHandler<ModelAfterUpdateEvent>>(\n \"ModelAfterUpdateEventHandler\"\n);\n\nexport namespace ModelAfterUpdateEventHandler {\n export type Interface = IEventHandler<ModelAfterUpdateEvent>;\n export type Event = ModelAfterUpdateEvent;\n}\n\n/**\n * ModelUpdateErrorEvent - Published when update fails\n */\nexport class ModelUpdateErrorEvent extends DomainEvent<ModelUpdateErrorEventPayload> {\n eventType = \"Cms/Model/UpdateError\" as const;\n\n getHandlerAbstraction() {\n return ModelUpdateErrorEventHandler;\n }\n}\n\nexport const ModelUpdateErrorEventHandler = createAbstraction<IEventHandler<ModelUpdateErrorEvent>>(\n \"ModelUpdateErrorEventHandler\"\n);\n\nexport namespace ModelUpdateErrorEventHandler {\n export type Interface = IEventHandler<ModelUpdateErrorEvent>;\n export type Event = ModelUpdateErrorEvent;\n}\n"],"mappings":"AAAA,SAASA,iBAAiB,QAAQ,qBAAqB;AAEvD,SAASC,WAAW,QAAQ,mDAAmD;;AAG/E;AACA;AACA;;AAmBA;AACA;AACA;AACA,OAAO,MAAMC,sBAAsB,SAASD,WAAW,CAAgC;EACnFE,SAAS,GAAG,wBAAwB;EAEpCC,qBAAqBA,CAAA,EAAG;IACpB,OAAOC,6BAA6B;EACxC;AACJ;;AAEA;AACA,OAAO,MAAMA,6BAA6B,GAAGL,iBAAiB,CAE5D,+BAA+B,CAAC;AAOlC;AACA;AACA;AACA,OAAO,MAAMM,qBAAqB,SAASL,WAAW,CAA+B;EACjFE,SAAS,GAAG,uBAAuB;EAEnCC,qBAAqBA,CAAA,EAAG;IACpB,OAAOG,4BAA4B;EACvC;AACJ;;AAEA;AACA,OAAO,MAAMA,4BAA4B,GAAGP,iBAAiB,CACzD,8BACJ,CAAC;AAOD;AACA;AACA;AACA,OAAO,MAAMQ,qBAAqB,SAASP,WAAW,CAA+B;EACjFE,SAAS,GAAG,uBAAuB;EAEnCC,qBAAqBA,CAAA,EAAG;IACpB,OAAOK,4BAA4B;EACvC;AACJ;AAEA,OAAO,MAAMA,4BAA4B,GAAGT,iBAAiB,CACzD,8BACJ,CAAC","ignoreList":[]}
@@ -2,7 +2,7 @@ import { Result } from "@webiny/feature/api";
2
2
  import { ModelCache, ModelsFetcher as FetcherAbstraction } from "../../../features/contentModel/shared/abstractions.js";
3
3
  import { PluginModelsProvider } from "../../../features/contentModel/shared/abstractions.js";
4
4
  import { StorageOperations } from "../../../features/shared/abstractions.js";
5
- import { TenantContext } from "@webiny/api-core/features/TenantContext";
5
+ import { TenantContext } from "@webiny/api-core/features/tenancy/TenantContext/index.js";
6
6
  import type { CmsModel } from "../../../types/index.js";
7
7
  /**
8
8
  * ModelsFetcherImpl - Implementation with multi-level caching.
@@ -2,7 +2,7 @@ import { Result } from "@webiny/feature/api";
2
2
  import { ModelCache, ModelsFetcher as FetcherAbstraction } from "./abstractions.js";
3
3
  import { PluginModelsProvider } from "./abstractions.js";
4
4
  import { StorageOperations } from "../../shared/abstractions.js";
5
- import { TenantContext } from "@webiny/api-core/features/TenantContext";
5
+ import { TenantContext } from "@webiny/api-core/features/tenancy/TenantContext/index.js";
6
6
  import { ModelNotFoundError, ModelPersistenceError } from "../../../domain/contentModel/errors.js";
7
7
  import { createCacheKey } from "../../../utils/index.js";
8
8
  import { ensureTypeTag } from "../../../domain/contentModel/ensureTypeTag.js";
@@ -1 +1 @@
1
- {"version":3,"names":["Result","ModelCache","ModelsFetcher","FetcherAbstraction","PluginModelsProvider","StorageOperations","TenantContext","ModelNotFoundError","ModelPersistenceError","createCacheKey","ensureTypeTag","ModelsFetcherImpl","constructor","modelCache","pluginModelsProvider","storageOperations","tenantContext","fetchAll","tenant","getTenant","cacheKey","id","pluginModels","list","cached","getOrSet","fetchAndMergeModels","ok","error","fail","fetchById","modelId","result","isFail","model","value","find","m","dbCacheKey","databaseModels","models","where","taggedDatabaseModels","map","tags","createImplementation","implementation","dependencies"],"sources":["ModelsFetcher.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport {\n ModelCache,\n ModelsFetcher as FetcherAbstraction\n} from \"~/features/contentModel/shared/abstractions.js\";\nimport { PluginModelsProvider } from \"~/features/contentModel/shared/abstractions.js\";\nimport { StorageOperations } from \"~/features/shared/abstractions.js\";\nimport { TenantContext } from \"@webiny/api-core/features/TenantContext\";\nimport { ModelNotFoundError, ModelPersistenceError } from \"~/domain/contentModel/errors.js\";\nimport { createCacheKey } from \"~/utils/index.js\";\nimport { ensureTypeTag } from \"~/domain/contentModel/ensureTypeTag.js\";\nimport type { CmsModel } from \"~/types/index.js\";\n\n/**\n * ModelsFetcherImpl - Implementation with multi-level caching.\n *\n * Caching strategy:\n * 1. Plugin models are cached per tenant (with access control applied by PluginModelsProvider)\n * 2. Database models are cached per tenant (raw from DB)\n * 3. Filtered database models are cached per tenant + identity (with access control applied)\n * 4. Final merged list is cached per tenant + identity\n */\nclass ModelsFetcherImpl implements FetcherAbstraction.Interface {\n public constructor(\n private modelCache: ModelCache.Interface,\n private pluginModelsProvider: PluginModelsProvider.Interface,\n private storageOperations: StorageOperations.Interface,\n private tenantContext: TenantContext.Interface\n ) {}\n\n async fetchAll(): Promise<Result<CmsModel[], FetcherAbstraction.Error>> {\n try {\n const tenant = this.tenantContext.getTenant();\n\n // Create a cache key based on tenant + identity\n const cacheKey = createCacheKey({\n tenant: tenant.id\n });\n\n // Fetch plugin models (with caching and access control)\n const pluginModels = await this.pluginModelsProvider.list(tenant.id);\n\n // Try to get from cache first\n const cached = await this.modelCache.getOrSet(cacheKey, async () => {\n return this.fetchAndMergeModels(tenant.id);\n });\n\n return Result.ok([...cached, ...pluginModels]);\n } catch (error) {\n return Result.fail(new ModelPersistenceError(error as Error));\n }\n }\n\n async fetchById(modelId: string): Promise<Result<CmsModel, FetcherAbstraction.Error>> {\n const result = await this.fetchAll();\n if (result.isFail()) {\n return Result.fail(new ModelPersistenceError(result.error));\n }\n\n const model = result.value.find(m => m.modelId === modelId);\n if (!model) {\n return Result.fail(new ModelNotFoundError(modelId));\n }\n\n return Result.ok(model);\n }\n\n private async fetchAndMergeModels(tenant: string): Promise<CmsModel[]> {\n // 1. Fetch database models (with caching)\n const dbCacheKey = createCacheKey({ tenant, id: \"storage\" });\n const databaseModels = await this.modelCache.getOrSet(dbCacheKey, async () => {\n return this.storageOperations.models.list({ where: { tenant } });\n });\n\n // 2. Ensure type tags on database models\n const taggedDatabaseModels = databaseModels.map(model => {\n model.tags = ensureTypeTag(model);\n return model;\n });\n\n // 3. Return merged models.\n return taggedDatabaseModels;\n }\n}\n\nexport const ModelsFetcher = FetcherAbstraction.createImplementation({\n implementation: ModelsFetcherImpl,\n dependencies: [ModelCache, PluginModelsProvider, StorageOperations, TenantContext]\n});\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["Result","ModelCache","ModelsFetcher","FetcherAbstraction","PluginModelsProvider","StorageOperations","TenantContext","ModelNotFoundError","ModelPersistenceError","createCacheKey","ensureTypeTag","ModelsFetcherImpl","constructor","modelCache","pluginModelsProvider","storageOperations","tenantContext","fetchAll","tenant","getTenant","cacheKey","id","pluginModels","list","cached","getOrSet","fetchAndMergeModels","ok","error","fail","fetchById","modelId","result","isFail","model","value","find","m","dbCacheKey","databaseModels","models","where","taggedDatabaseModels","map","tags","createImplementation","implementation","dependencies"],"sources":["ModelsFetcher.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport {\n ModelCache,\n ModelsFetcher as FetcherAbstraction\n} from \"~/features/contentModel/shared/abstractions.js\";\nimport { PluginModelsProvider } from \"~/features/contentModel/shared/abstractions.js\";\nimport { StorageOperations } from \"~/features/shared/abstractions.js\";\nimport { TenantContext } from \"@webiny/api-core/features/tenancy/TenantContext/index.js\";\nimport { ModelNotFoundError, ModelPersistenceError } from \"~/domain/contentModel/errors.js\";\nimport { createCacheKey } from \"~/utils/index.js\";\nimport { ensureTypeTag } from \"~/domain/contentModel/ensureTypeTag.js\";\nimport type { CmsModel } from \"~/types/index.js\";\n\n/**\n * ModelsFetcherImpl - Implementation with multi-level caching.\n *\n * Caching strategy:\n * 1. Plugin models are cached per tenant (with access control applied by PluginModelsProvider)\n * 2. Database models are cached per tenant (raw from DB)\n * 3. Filtered database models are cached per tenant + identity (with access control applied)\n * 4. Final merged list is cached per tenant + identity\n */\nclass ModelsFetcherImpl implements FetcherAbstraction.Interface {\n public constructor(\n private modelCache: ModelCache.Interface,\n private pluginModelsProvider: PluginModelsProvider.Interface,\n private storageOperations: StorageOperations.Interface,\n private tenantContext: TenantContext.Interface\n ) {}\n\n async fetchAll(): Promise<Result<CmsModel[], FetcherAbstraction.Error>> {\n try {\n const tenant = this.tenantContext.getTenant();\n\n // Create a cache key based on tenant + identity\n const cacheKey = createCacheKey({\n tenant: tenant.id\n });\n\n // Fetch plugin models (with caching and access control)\n const pluginModels = await this.pluginModelsProvider.list(tenant.id);\n\n // Try to get from cache first\n const cached = await this.modelCache.getOrSet(cacheKey, async () => {\n return this.fetchAndMergeModels(tenant.id);\n });\n\n return Result.ok([...cached, ...pluginModels]);\n } catch (error) {\n return Result.fail(new ModelPersistenceError(error as Error));\n }\n }\n\n async fetchById(modelId: string): Promise<Result<CmsModel, FetcherAbstraction.Error>> {\n const result = await this.fetchAll();\n if (result.isFail()) {\n return Result.fail(new ModelPersistenceError(result.error));\n }\n\n const model = result.value.find(m => m.modelId === modelId);\n if (!model) {\n return Result.fail(new ModelNotFoundError(modelId));\n }\n\n return Result.ok(model);\n }\n\n private async fetchAndMergeModels(tenant: string): Promise<CmsModel[]> {\n // 1. Fetch database models (with caching)\n const dbCacheKey = createCacheKey({ tenant, id: \"storage\" });\n const databaseModels = await this.modelCache.getOrSet(dbCacheKey, async () => {\n return this.storageOperations.models.list({ where: { tenant } });\n });\n\n // 2. Ensure type tags on database models\n const taggedDatabaseModels = databaseModels.map(model => {\n model.tags = ensureTypeTag(model);\n return model;\n });\n\n // 3. Return merged models.\n return taggedDatabaseModels;\n }\n}\n\nexport const ModelsFetcher = FetcherAbstraction.createImplementation({\n implementation: ModelsFetcherImpl,\n dependencies: [ModelCache, PluginModelsProvider, StorageOperations, TenantContext]\n});\n"],"mappings":"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","ignoreList":[]}
@@ -3,7 +3,7 @@ import { CreateGroupRepository as RepositoryAbstraction } from "./abstractions.j
3
3
  import { GroupCache } from "../../../features/contentModelGroup/shared/abstractions.js";
4
4
  import { PluginGroupsProvider } from "../../../features/contentModelGroup/shared/abstractions.js";
5
5
  import { StorageOperations } from "../../../features/shared/abstractions.js";
6
- import { TenantContext } from "@webiny/api-core/features/TenantContext";
6
+ import { TenantContext } from "@webiny/api-core/features/tenancy/TenantContext/index.js";
7
7
  import type { CmsGroup } from "../../../types/index.js";
8
8
  /**
9
9
  * CreateGroupRepository - Validates and persists a new group.
@@ -6,7 +6,7 @@ import { PluginGroupsProvider } from "../shared/abstractions.js";
6
6
  import { GroupSlugTakenError } from "../../../domain/contentModelGroup/errors.js";
7
7
  import { GroupPersistenceError } from "../../../domain/contentModelGroup/errors.js";
8
8
  import { StorageOperations } from "../../shared/abstractions.js";
9
- import { TenantContext } from "@webiny/api-core/features/TenantContext";
9
+ import { TenantContext } from "@webiny/api-core/features/tenancy/TenantContext/index.js";
10
10
  import { toSlug } from "../../../utils/toSlug.js";
11
11
  import { generateAlphaNumericId } from "@webiny/utils";
12
12
  /**
@@ -1 +1 @@
1
- {"version":3,"names":["Result","createImplementation","CreateGroupRepository","RepositoryAbstraction","GroupCache","PluginGroupsProvider","GroupSlugTakenError","GroupPersistenceError","StorageOperations","TenantContext","toSlug","generateAlphaNumericId","CreateGroupRepositoryImpl","constructor","groupCache","pluginGroupsProvider","storageOperations","tenantContext","execute","group","tenant","getTenant","id","existingById","groups","list","where","length","fail","slug","slugTaken","isSlugTaken","pluginGroups","getGroups","pluginGroupConflict","find","pg","create","clear","ok","error","trim","existingBySlug","baseSlug","name","abstraction","implementation","dependencies"],"sources":["CreateGroupRepository.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { createImplementation } from \"@webiny/feature/api\";\nimport { CreateGroupRepository as RepositoryAbstraction } from \"./abstractions.js\";\nimport { GroupCache } from \"~/features/contentModelGroup/shared/abstractions.js\";\nimport { PluginGroupsProvider } from \"~/features/contentModelGroup/shared/abstractions.js\";\nimport { GroupSlugTakenError } from \"~/domain/contentModelGroup/errors.js\";\nimport { GroupPersistenceError } from \"~/domain/contentModelGroup/errors.js\";\nimport { StorageOperations } from \"~/features/shared/abstractions.js\";\nimport { TenantContext } from \"@webiny/api-core/features/TenantContext\";\nimport { toSlug } from \"~/utils/toSlug.js\";\nimport { generateAlphaNumericId } from \"@webiny/utils\";\nimport type { CmsGroup } from \"~/types/index.js\";\n\n/**\n * CreateGroupRepository - Validates and persists a new group.\n *\n * Responsibilities:\n * - Validate ID uniqueness (if provided)\n * - Validate slug uniqueness (or generate unique slug)\n * - Check for plugin group conflicts\n * - Persist to storage\n * - Clear GroupCache after successful create\n */\nclass CreateGroupRepositoryImpl implements RepositoryAbstraction.Interface {\n public constructor(\n private groupCache: GroupCache.Interface,\n private pluginGroupsProvider: PluginGroupsProvider.Interface,\n private storageOperations: StorageOperations.Interface,\n private tenantContext: TenantContext.Interface\n ) {}\n\n async execute(group: CmsGroup): Promise<Result<void, RepositoryAbstraction.Error>> {\n try {\n const tenant = this.tenantContext.getTenant();\n\n // 1. Validate ID uniqueness (if provided)\n if (group.id) {\n const existingById = await this.storageOperations.groups.list({\n where: {\n tenant: tenant.id,\n id: group.id\n }\n });\n\n if (existingById.length > 0) {\n return Result.fail(new GroupSlugTakenError(group.slug));\n }\n }\n\n // 2. Generate or validate slug\n const slugTaken = await this.isSlugTaken(group, tenant.id);\n if (slugTaken) {\n return Result.fail(new GroupSlugTakenError(group.slug));\n }\n\n // 3. Check for plugin group conflicts\n const pluginGroups = await this.pluginGroupsProvider.getGroups();\n const pluginGroupConflict = pluginGroups.find(pg => pg.slug === group.slug);\n if (pluginGroupConflict) {\n return Result.fail(new GroupSlugTakenError(group.slug));\n }\n\n // 4. Persist to storage\n await this.storageOperations.groups.create({ group });\n\n // 5. Clear cache\n this.groupCache.clear();\n\n return Result.ok();\n } catch (error) {\n return Result.fail(new GroupPersistenceError(error as Error));\n }\n }\n\n private async isSlugTaken(group: CmsGroup, tenant: string): Promise<boolean> {\n // If slug is provided and not empty, validate it\n if (group.slug && group.slug.trim()) {\n const existingBySlug = await this.storageOperations.groups.list({\n where: {\n tenant,\n slug: group.slug\n }\n });\n\n return existingBySlug.length > 0;\n }\n\n // Generate slug from name\n const baseSlug = toSlug(group.name);\n const existingBySlug = await this.storageOperations.groups.list({\n where: {\n tenant,\n slug: baseSlug\n }\n });\n\n if (existingBySlug.length === 0) {\n // No conflict, use base slug\n group.slug = baseSlug;\n } else {\n // Conflict, append random suffix\n group.slug = `${baseSlug}-${generateAlphaNumericId(8)}`;\n }\n\n return false;\n }\n}\n\nexport const CreateGroupRepository = createImplementation({\n abstraction: RepositoryAbstraction,\n implementation: CreateGroupRepositoryImpl,\n dependencies: [GroupCache, PluginGroupsProvider, StorageOperations, TenantContext]\n});\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["Result","createImplementation","CreateGroupRepository","RepositoryAbstraction","GroupCache","PluginGroupsProvider","GroupSlugTakenError","GroupPersistenceError","StorageOperations","TenantContext","toSlug","generateAlphaNumericId","CreateGroupRepositoryImpl","constructor","groupCache","pluginGroupsProvider","storageOperations","tenantContext","execute","group","tenant","getTenant","id","existingById","groups","list","where","length","fail","slug","slugTaken","isSlugTaken","pluginGroups","getGroups","pluginGroupConflict","find","pg","create","clear","ok","error","trim","existingBySlug","baseSlug","name","abstraction","implementation","dependencies"],"sources":["CreateGroupRepository.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { createImplementation } from \"@webiny/feature/api\";\nimport { CreateGroupRepository as RepositoryAbstraction } from \"./abstractions.js\";\nimport { GroupCache } from \"~/features/contentModelGroup/shared/abstractions.js\";\nimport { PluginGroupsProvider } from \"~/features/contentModelGroup/shared/abstractions.js\";\nimport { GroupSlugTakenError } from \"~/domain/contentModelGroup/errors.js\";\nimport { GroupPersistenceError } from \"~/domain/contentModelGroup/errors.js\";\nimport { StorageOperations } from \"~/features/shared/abstractions.js\";\nimport { TenantContext } from \"@webiny/api-core/features/tenancy/TenantContext/index.js\";\nimport { toSlug } from \"~/utils/toSlug.js\";\nimport { generateAlphaNumericId } from \"@webiny/utils\";\nimport type { CmsGroup } from \"~/types/index.js\";\n\n/**\n * CreateGroupRepository - Validates and persists a new group.\n *\n * Responsibilities:\n * - Validate ID uniqueness (if provided)\n * - Validate slug uniqueness (or generate unique slug)\n * - Check for plugin group conflicts\n * - Persist to storage\n * - Clear GroupCache after successful create\n */\nclass CreateGroupRepositoryImpl implements RepositoryAbstraction.Interface {\n public constructor(\n private groupCache: GroupCache.Interface,\n private pluginGroupsProvider: PluginGroupsProvider.Interface,\n private storageOperations: StorageOperations.Interface,\n private tenantContext: TenantContext.Interface\n ) {}\n\n async execute(group: CmsGroup): Promise<Result<void, RepositoryAbstraction.Error>> {\n try {\n const tenant = this.tenantContext.getTenant();\n\n // 1. Validate ID uniqueness (if provided)\n if (group.id) {\n const existingById = await this.storageOperations.groups.list({\n where: {\n tenant: tenant.id,\n id: group.id\n }\n });\n\n if (existingById.length > 0) {\n return Result.fail(new GroupSlugTakenError(group.slug));\n }\n }\n\n // 2. Generate or validate slug\n const slugTaken = await this.isSlugTaken(group, tenant.id);\n if (slugTaken) {\n return Result.fail(new GroupSlugTakenError(group.slug));\n }\n\n // 3. Check for plugin group conflicts\n const pluginGroups = await this.pluginGroupsProvider.getGroups();\n const pluginGroupConflict = pluginGroups.find(pg => pg.slug === group.slug);\n if (pluginGroupConflict) {\n return Result.fail(new GroupSlugTakenError(group.slug));\n }\n\n // 4. Persist to storage\n await this.storageOperations.groups.create({ group });\n\n // 5. Clear cache\n this.groupCache.clear();\n\n return Result.ok();\n } catch (error) {\n return Result.fail(new GroupPersistenceError(error as Error));\n }\n }\n\n private async isSlugTaken(group: CmsGroup, tenant: string): Promise<boolean> {\n // If slug is provided and not empty, validate it\n if (group.slug && group.slug.trim()) {\n const existingBySlug = await this.storageOperations.groups.list({\n where: {\n tenant,\n slug: group.slug\n }\n });\n\n return existingBySlug.length > 0;\n }\n\n // Generate slug from name\n const baseSlug = toSlug(group.name);\n const existingBySlug = await this.storageOperations.groups.list({\n where: {\n tenant,\n slug: baseSlug\n }\n });\n\n if (existingBySlug.length === 0) {\n // No conflict, use base slug\n group.slug = baseSlug;\n } else {\n // Conflict, append random suffix\n group.slug = `${baseSlug}-${generateAlphaNumericId(8)}`;\n }\n\n return false;\n }\n}\n\nexport const CreateGroupRepository = createImplementation({\n abstraction: RepositoryAbstraction,\n implementation: CreateGroupRepositoryImpl,\n dependencies: [GroupCache, PluginGroupsProvider, StorageOperations, TenantContext]\n});\n"],"mappings":"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","ignoreList":[]}
@@ -1,10 +1,10 @@
1
1
  import { Result } from "@webiny/feature/api";
2
2
  import { CreateGroupUseCase as UseCaseAbstraction } from "./abstractions.js";
3
3
  import { CreateGroupRepository } from "./abstractions.js";
4
- import { EventPublisher } from "@webiny/api-core/features/EventPublisher";
4
+ import { EventPublisher } from "@webiny/api-core/features/eventPublisher/index.js";
5
5
  import { AccessControl } from "../../../features/shared/abstractions.js";
6
- import { TenantContext } from "@webiny/api-core/features/TenantContext";
7
- import { IdentityContext } from "@webiny/api-core/features/IdentityContext";
6
+ import { TenantContext } from "@webiny/api-core/features/tenancy/TenantContext/index.js";
7
+ import { IdentityContext } from "@webiny/api-core/features/security/IdentityContext/index.js";
8
8
  import { CmsContext } from "../../../features/shared/abstractions.js";
9
9
  import type { CmsGroup } from "../../../types/index.js";
10
10
  import type { CmsGroupCreateInput } from "../../../types/index.js";
@@ -2,13 +2,13 @@ import { Result } from "@webiny/feature/api";
2
2
  import { createImplementation } from "@webiny/feature/api";
3
3
  import { CreateGroupUseCase as UseCaseAbstraction } from "./abstractions.js";
4
4
  import { CreateGroupRepository } from "./abstractions.js";
5
- import { EventPublisher } from "@webiny/api-core/features/EventPublisher";
5
+ import { EventPublisher } from "@webiny/api-core/features/eventPublisher/index.js";
6
6
  import { GroupBeforeCreateEventEvent } from "./events.js";
7
7
  import { GroupAfterCreateEvent } from "./events.js";
8
8
  import { GroupCreateErrorEvent } from "./events.js";
9
9
  import { AccessControl } from "../../shared/abstractions.js";
10
- import { TenantContext } from "@webiny/api-core/features/TenantContext";
11
- import { IdentityContext } from "@webiny/api-core/features/IdentityContext";
10
+ import { TenantContext } from "@webiny/api-core/features/tenancy/TenantContext/index.js";
11
+ import { IdentityContext } from "@webiny/api-core/features/security/IdentityContext/index.js";
12
12
  import { CmsContext } from "../../shared/abstractions.js";
13
13
  import { GroupNotAuthorizedError, GroupValidationError } from "../../../domain/contentModelGroup/errors.js";
14
14
  import { createZodError } from "@webiny/utils";
@@ -1 +1 @@
1
- {"version":3,"names":["Result","createImplementation","CreateGroupUseCase","UseCaseAbstraction","CreateGroupRepository","EventPublisher","GroupBeforeCreateEventEvent","GroupAfterCreateEvent","GroupCreateErrorEvent","AccessControl","TenantContext","IdentityContext","CmsContext","GroupNotAuthorizedError","GroupValidationError","createZodError","mdbid","createGroupCreateValidation","CreateGroupUseCaseImpl","constructor","eventPublisher","repository","accessControl","tenantContext","identityContext","cmsContext","execute","input","canAccess","canAccessGroup","rwd","fail","validationResult","safeParseAsync","success","zodError","error","message","data","invalidFields","identity","getIdentity","tenant","getTenant","id","group","createdOn","Date","toISOString","savedOn","createdBy","displayName","type","publish","result","isFail","ok","abstraction","implementation","dependencies"],"sources":["CreateGroupUseCase.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { createImplementation } from \"@webiny/feature/api\";\nimport { CreateGroupUseCase as UseCaseAbstraction } from \"./abstractions.js\";\nimport { CreateGroupRepository } from \"./abstractions.js\";\nimport { EventPublisher } from \"@webiny/api-core/features/EventPublisher\";\nimport { GroupBeforeCreateEventEvent } from \"./events.js\";\nimport { GroupAfterCreateEvent } from \"./events.js\";\nimport { GroupCreateErrorEvent } from \"./events.js\";\nimport { AccessControl } from \"~/features/shared/abstractions.js\";\nimport { TenantContext } from \"@webiny/api-core/features/TenantContext\";\nimport { IdentityContext } from \"@webiny/api-core/features/IdentityContext\";\nimport { CmsContext } from \"~/features/shared/abstractions.js\";\nimport {\n GroupNotAuthorizedError,\n GroupValidationError\n} from \"~/domain/contentModelGroup/errors.js\";\nimport { createZodError } from \"@webiny/utils\";\nimport { mdbid } from \"@webiny/utils\";\nimport { createGroupCreateValidation } from \"~/domain/contentModelGroup/validation.js\";\nimport type { CmsGroup } from \"~/types/index.js\";\nimport type { CmsGroupCreateInput } from \"~/types/index.js\";\n\n/**\n * CreateGroupUseCase - Orchestrates group creation.\n *\n * Responsibilities:\n * - Validate input (Zod)\n * - Create domain group object\n * - Access control checks\n * - Publish before event\n * - Delegate to repository\n * - Publish after event or error event\n */\nclass CreateGroupUseCaseImpl implements UseCaseAbstraction.Interface {\n public constructor(\n private eventPublisher: EventPublisher.Interface,\n private repository: CreateGroupRepository.Interface,\n private accessControl: AccessControl.Interface,\n private tenantContext: TenantContext.Interface,\n private identityContext: IdentityContext.Interface,\n private cmsContext: CmsContext.Interface\n ) {}\n\n async execute(input: CmsGroupCreateInput): Promise<Result<CmsGroup, UseCaseAbstraction.Error>> {\n // Initial access control check\n const canAccess = await this.accessControl.canAccessGroup({ rwd: \"w\" });\n if (!canAccess) {\n return Result.fail(new GroupNotAuthorizedError());\n }\n\n // Validate input\n const validationResult = await createGroupCreateValidation().safeParseAsync(input);\n if (!validationResult.success) {\n const zodError = createZodError(validationResult.error);\n return Result.fail(\n new GroupValidationError(zodError.message, zodError.data!.invalidFields)\n );\n }\n const data = validationResult.data;\n\n // Create domain group object\n const identity = this.identityContext.getIdentity();\n const tenant = this.tenantContext.getTenant();\n\n const id = data.id || mdbid();\n const group: CmsGroup = {\n ...data,\n id,\n tenant: tenant.id,\n createdOn: new Date().toISOString(),\n savedOn: new Date().toISOString(),\n createdBy: {\n id: identity.id,\n displayName: identity.displayName,\n type: identity.type\n }\n };\n\n // Access control check on created group\n const canAccessGroup = await this.accessControl.canAccessGroup({ group, rwd: \"w\" });\n if (!canAccessGroup) {\n return Result.fail(new GroupNotAuthorizedError());\n }\n\n try {\n // Publish before event\n await this.eventPublisher.publish(new GroupBeforeCreateEventEvent({ group }));\n\n // Persist via repository\n const result = await this.repository.execute(group);\n if (result.isFail()) {\n // Publish error event\n await this.eventPublisher.publish(\n new GroupCreateErrorEvent({\n input,\n group,\n error: result.error\n })\n );\n return Result.fail(result.error);\n }\n\n // Publish after event\n await this.eventPublisher.publish(new GroupAfterCreateEvent({ group }));\n\n return Result.ok(group);\n } catch (error) {\n // Publish error event for unexpected errors\n await this.eventPublisher.publish(\n new GroupCreateErrorEvent({\n input,\n group,\n error: error as Error\n })\n );\n return Result.fail(error as UseCaseAbstraction.Error);\n }\n }\n}\n\nexport const CreateGroupUseCase = createImplementation({\n abstraction: UseCaseAbstraction,\n implementation: CreateGroupUseCaseImpl,\n dependencies: [\n EventPublisher,\n CreateGroupRepository,\n AccessControl,\n TenantContext,\n IdentityContext,\n CmsContext\n ]\n});\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["Result","createImplementation","CreateGroupUseCase","UseCaseAbstraction","CreateGroupRepository","EventPublisher","GroupBeforeCreateEventEvent","GroupAfterCreateEvent","GroupCreateErrorEvent","AccessControl","TenantContext","IdentityContext","CmsContext","GroupNotAuthorizedError","GroupValidationError","createZodError","mdbid","createGroupCreateValidation","CreateGroupUseCaseImpl","constructor","eventPublisher","repository","accessControl","tenantContext","identityContext","cmsContext","execute","input","canAccess","canAccessGroup","rwd","fail","validationResult","safeParseAsync","success","zodError","error","message","data","invalidFields","identity","getIdentity","tenant","getTenant","id","group","createdOn","Date","toISOString","savedOn","createdBy","displayName","type","publish","result","isFail","ok","abstraction","implementation","dependencies"],"sources":["CreateGroupUseCase.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { createImplementation } from \"@webiny/feature/api\";\nimport { CreateGroupUseCase as UseCaseAbstraction } from \"./abstractions.js\";\nimport { CreateGroupRepository } from \"./abstractions.js\";\nimport { EventPublisher } from \"@webiny/api-core/features/eventPublisher/index.js\";\nimport { GroupBeforeCreateEventEvent } from \"./events.js\";\nimport { GroupAfterCreateEvent } from \"./events.js\";\nimport { GroupCreateErrorEvent } from \"./events.js\";\nimport { AccessControl } from \"~/features/shared/abstractions.js\";\nimport { TenantContext } from \"@webiny/api-core/features/tenancy/TenantContext/index.js\";\nimport { IdentityContext } from \"@webiny/api-core/features/security/IdentityContext/index.js\";\nimport { CmsContext } from \"~/features/shared/abstractions.js\";\nimport {\n GroupNotAuthorizedError,\n GroupValidationError\n} from \"~/domain/contentModelGroup/errors.js\";\nimport { createZodError } from \"@webiny/utils\";\nimport { mdbid } from \"@webiny/utils\";\nimport { createGroupCreateValidation } from \"~/domain/contentModelGroup/validation.js\";\nimport type { CmsGroup } from \"~/types/index.js\";\nimport type { CmsGroupCreateInput } from \"~/types/index.js\";\n\n/**\n * CreateGroupUseCase - Orchestrates group creation.\n *\n * Responsibilities:\n * - Validate input (Zod)\n * - Create domain group object\n * - Access control checks\n * - Publish before event\n * - Delegate to repository\n * - Publish after event or error event\n */\nclass CreateGroupUseCaseImpl implements UseCaseAbstraction.Interface {\n public constructor(\n private eventPublisher: EventPublisher.Interface,\n private repository: CreateGroupRepository.Interface,\n private accessControl: AccessControl.Interface,\n private tenantContext: TenantContext.Interface,\n private identityContext: IdentityContext.Interface,\n private cmsContext: CmsContext.Interface\n ) {}\n\n async execute(input: CmsGroupCreateInput): Promise<Result<CmsGroup, UseCaseAbstraction.Error>> {\n // Initial access control check\n const canAccess = await this.accessControl.canAccessGroup({ rwd: \"w\" });\n if (!canAccess) {\n return Result.fail(new GroupNotAuthorizedError());\n }\n\n // Validate input\n const validationResult = await createGroupCreateValidation().safeParseAsync(input);\n if (!validationResult.success) {\n const zodError = createZodError(validationResult.error);\n return Result.fail(\n new GroupValidationError(zodError.message, zodError.data!.invalidFields)\n );\n }\n const data = validationResult.data;\n\n // Create domain group object\n const identity = this.identityContext.getIdentity();\n const tenant = this.tenantContext.getTenant();\n\n const id = data.id || mdbid();\n const group: CmsGroup = {\n ...data,\n id,\n tenant: tenant.id,\n createdOn: new Date().toISOString(),\n savedOn: new Date().toISOString(),\n createdBy: {\n id: identity.id,\n displayName: identity.displayName,\n type: identity.type\n }\n };\n\n // Access control check on created group\n const canAccessGroup = await this.accessControl.canAccessGroup({ group, rwd: \"w\" });\n if (!canAccessGroup) {\n return Result.fail(new GroupNotAuthorizedError());\n }\n\n try {\n // Publish before event\n await this.eventPublisher.publish(new GroupBeforeCreateEventEvent({ group }));\n\n // Persist via repository\n const result = await this.repository.execute(group);\n if (result.isFail()) {\n // Publish error event\n await this.eventPublisher.publish(\n new GroupCreateErrorEvent({\n input,\n group,\n error: result.error\n })\n );\n return Result.fail(result.error);\n }\n\n // Publish after event\n await this.eventPublisher.publish(new GroupAfterCreateEvent({ group }));\n\n return Result.ok(group);\n } catch (error) {\n // Publish error event for unexpected errors\n await this.eventPublisher.publish(\n new GroupCreateErrorEvent({\n input,\n group,\n error: error as Error\n })\n );\n return Result.fail(error as UseCaseAbstraction.Error);\n }\n }\n}\n\nexport const CreateGroupUseCase = createImplementation({\n abstraction: UseCaseAbstraction,\n implementation: CreateGroupUseCaseImpl,\n dependencies: [\n EventPublisher,\n CreateGroupRepository,\n AccessControl,\n TenantContext,\n IdentityContext,\n CmsContext\n ]\n});\n"],"mappings":"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","ignoreList":[]}
@@ -1,5 +1,5 @@
1
- import type { IEventHandler } from "@webiny/api-core/features/EventPublisher";
2
- import { DomainEvent } from "@webiny/api-core/features/EventPublisher";
1
+ import type { IEventHandler } from "@webiny/api-core/features/eventPublisher/index.js";
2
+ import { DomainEvent } from "@webiny/api-core/features/eventPublisher/index.js";
3
3
  import type { CmsGroup, CmsGroupCreateInput } from "../../../types/index.js";
4
4
  /**
5
5
  * Event payloads
@@ -1,5 +1,5 @@
1
1
  import { createAbstraction } from "@webiny/feature/api";
2
- import { DomainEvent } from "@webiny/api-core/features/EventPublisher";
2
+ import { DomainEvent } from "@webiny/api-core/features/eventPublisher/index.js";
3
3
 
4
4
  /**
5
5
  * Event payloads
@@ -1 +1 @@
1
- {"version":3,"names":["createAbstraction","DomainEvent","GroupBeforeCreateEventEvent","eventType","getHandlerAbstraction","GroupBeforeCreateEventHandler","GroupAfterCreateEvent","GroupAfterCreateEventHandler","GroupCreateErrorEvent","GroupCreateErrorEventHandler"],"sources":["events.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/api\";\nimport type { IEventHandler } from \"@webiny/api-core/features/EventPublisher\";\nimport { DomainEvent } from \"@webiny/api-core/features/EventPublisher\";\nimport type { CmsGroup, CmsGroupCreateInput } from \"~/types/index.js\";\n\n/**\n * Event payloads\n */\nexport interface GroupBeforeCreateEventPayload {\n group: CmsGroup;\n}\n\nexport interface GroupAfterCreateEventPayload {\n group: CmsGroup;\n}\n\nexport interface GroupCreateErrorEventPayload {\n input: CmsGroupCreateInput;\n group: CmsGroup;\n error: Error;\n}\n\n/**\n * GroupBeforeCreateEvent - Published before creating a group\n */\nexport class GroupBeforeCreateEventEvent extends DomainEvent<GroupBeforeCreateEventPayload> {\n eventType = \"Cms/Group/BeforeCreate\" as const;\n\n getHandlerAbstraction() {\n return GroupBeforeCreateEventHandler;\n }\n}\n\n/** Hook into group lifecycle before a group is created. */\nexport const GroupBeforeCreateEventHandler = createAbstraction<\n IEventHandler<GroupBeforeCreateEventEvent>\n>(\"GroupBeforeCreateEventHandler\");\n\nexport namespace GroupBeforeCreateEventHandler {\n export type Interface = IEventHandler<GroupBeforeCreateEventEvent>;\n export type Event = GroupBeforeCreateEventEvent;\n}\n\n/**\n * GroupAfterCreateEvent - Published after creating a group\n */\nexport class GroupAfterCreateEvent extends DomainEvent<GroupAfterCreateEventPayload> {\n eventType = \"Cms/Group/AfterCreate\" as const;\n\n getHandlerAbstraction() {\n return GroupAfterCreateEventHandler;\n }\n}\n\n/** Hook into group lifecycle after a group is created. */\nexport const GroupAfterCreateEventHandler = createAbstraction<IEventHandler<GroupAfterCreateEvent>>(\n \"GroupAfterCreateEventHandler\"\n);\n\nexport namespace GroupAfterCreateEventHandler {\n export type Interface = IEventHandler<GroupAfterCreateEvent>;\n export type Event = GroupAfterCreateEvent;\n}\n\n/**\n * GroupCreateErrorEvent - Published when create fails\n */\nexport class GroupCreateErrorEvent extends DomainEvent<GroupCreateErrorEventPayload> {\n eventType = \"Cms/Group/CreateError\" as const;\n\n getHandlerAbstraction() {\n return GroupCreateErrorEventHandler;\n }\n}\n\nexport const GroupCreateErrorEventHandler = createAbstraction<IEventHandler<GroupCreateErrorEvent>>(\n \"GroupCreateErrorEventHandler\"\n);\n\nexport namespace GroupCreateErrorEventHandler {\n export type Interface = IEventHandler<GroupCreateErrorEvent>;\n export type Event = GroupCreateErrorEvent;\n}\n"],"mappings":"AAAA,SAASA,iBAAiB,QAAQ,qBAAqB;AAEvD,SAASC,WAAW,QAAQ,0CAA0C;;AAGtE;AACA;AACA;;AAeA;AACA;AACA;AACA,OAAO,MAAMC,2BAA2B,SAASD,WAAW,CAAgC;EACxFE,SAAS,GAAG,wBAAwB;EAEpCC,qBAAqBA,CAAA,EAAG;IACpB,OAAOC,6BAA6B;EACxC;AACJ;;AAEA;AACA,OAAO,MAAMA,6BAA6B,GAAGL,iBAAiB,CAE5D,+BAA+B,CAAC;AAOlC;AACA;AACA;AACA,OAAO,MAAMM,qBAAqB,SAASL,WAAW,CAA+B;EACjFE,SAAS,GAAG,uBAAuB;EAEnCC,qBAAqBA,CAAA,EAAG;IACpB,OAAOG,4BAA4B;EACvC;AACJ;;AAEA;AACA,OAAO,MAAMA,4BAA4B,GAAGP,iBAAiB,CACzD,8BACJ,CAAC;AAOD;AACA;AACA;AACA,OAAO,MAAMQ,qBAAqB,SAASP,WAAW,CAA+B;EACjFE,SAAS,GAAG,uBAAuB;EAEnCC,qBAAqBA,CAAA,EAAG;IACpB,OAAOK,4BAA4B;EACvC;AACJ;AAEA,OAAO,MAAMA,4BAA4B,GAAGT,iBAAiB,CACzD,8BACJ,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["createAbstraction","DomainEvent","GroupBeforeCreateEventEvent","eventType","getHandlerAbstraction","GroupBeforeCreateEventHandler","GroupAfterCreateEvent","GroupAfterCreateEventHandler","GroupCreateErrorEvent","GroupCreateErrorEventHandler"],"sources":["events.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/api\";\nimport type { IEventHandler } from \"@webiny/api-core/features/eventPublisher/index.js\";\nimport { DomainEvent } from \"@webiny/api-core/features/eventPublisher/index.js\";\nimport type { CmsGroup, CmsGroupCreateInput } from \"~/types/index.js\";\n\n/**\n * Event payloads\n */\nexport interface GroupBeforeCreateEventPayload {\n group: CmsGroup;\n}\n\nexport interface GroupAfterCreateEventPayload {\n group: CmsGroup;\n}\n\nexport interface GroupCreateErrorEventPayload {\n input: CmsGroupCreateInput;\n group: CmsGroup;\n error: Error;\n}\n\n/**\n * GroupBeforeCreateEvent - Published before creating a group\n */\nexport class GroupBeforeCreateEventEvent extends DomainEvent<GroupBeforeCreateEventPayload> {\n eventType = \"Cms/Group/BeforeCreate\" as const;\n\n getHandlerAbstraction() {\n return GroupBeforeCreateEventHandler;\n }\n}\n\n/** Hook into group lifecycle before a group is created. */\nexport const GroupBeforeCreateEventHandler = createAbstraction<\n IEventHandler<GroupBeforeCreateEventEvent>\n>(\"GroupBeforeCreateEventHandler\");\n\nexport namespace GroupBeforeCreateEventHandler {\n export type Interface = IEventHandler<GroupBeforeCreateEventEvent>;\n export type Event = GroupBeforeCreateEventEvent;\n}\n\n/**\n * GroupAfterCreateEvent - Published after creating a group\n */\nexport class GroupAfterCreateEvent extends DomainEvent<GroupAfterCreateEventPayload> {\n eventType = \"Cms/Group/AfterCreate\" as const;\n\n getHandlerAbstraction() {\n return GroupAfterCreateEventHandler;\n }\n}\n\n/** Hook into group lifecycle after a group is created. */\nexport const GroupAfterCreateEventHandler = createAbstraction<IEventHandler<GroupAfterCreateEvent>>(\n \"GroupAfterCreateEventHandler\"\n);\n\nexport namespace GroupAfterCreateEventHandler {\n export type Interface = IEventHandler<GroupAfterCreateEvent>;\n export type Event = GroupAfterCreateEvent;\n}\n\n/**\n * GroupCreateErrorEvent - Published when create fails\n */\nexport class GroupCreateErrorEvent extends DomainEvent<GroupCreateErrorEventPayload> {\n eventType = \"Cms/Group/CreateError\" as const;\n\n getHandlerAbstraction() {\n return GroupCreateErrorEventHandler;\n }\n}\n\nexport const GroupCreateErrorEventHandler = createAbstraction<IEventHandler<GroupCreateErrorEvent>>(\n \"GroupCreateErrorEventHandler\"\n);\n\nexport namespace GroupCreateErrorEventHandler {\n export type Interface = IEventHandler<GroupCreateErrorEvent>;\n export type Event = GroupCreateErrorEvent;\n}\n"],"mappings":"AAAA,SAASA,iBAAiB,QAAQ,qBAAqB;AAEvD,SAASC,WAAW,QAAQ,mDAAmD;;AAG/E;AACA;AACA;;AAeA;AACA;AACA;AACA,OAAO,MAAMC,2BAA2B,SAASD,WAAW,CAAgC;EACxFE,SAAS,GAAG,wBAAwB;EAEpCC,qBAAqBA,CAAA,EAAG;IACpB,OAAOC,6BAA6B;EACxC;AACJ;;AAEA;AACA,OAAO,MAAMA,6BAA6B,GAAGL,iBAAiB,CAE5D,+BAA+B,CAAC;AAOlC;AACA;AACA;AACA,OAAO,MAAMM,qBAAqB,SAASL,WAAW,CAA+B;EACjFE,SAAS,GAAG,uBAAuB;EAEnCC,qBAAqBA,CAAA,EAAG;IACpB,OAAOG,4BAA4B;EACvC;AACJ;;AAEA;AACA,OAAO,MAAMA,4BAA4B,GAAGP,iBAAiB,CACzD,8BACJ,CAAC;AAOD;AACA;AACA;AACA,OAAO,MAAMQ,qBAAqB,SAASP,WAAW,CAA+B;EACjFE,SAAS,GAAG,uBAAuB;EAEnCC,qBAAqBA,CAAA,EAAG;IACpB,OAAOK,4BAA4B;EACvC;AACJ;AAEA,OAAO,MAAMA,4BAA4B,GAAGT,iBAAiB,CACzD,8BACJ,CAAC","ignoreList":[]}
@@ -2,7 +2,7 @@ import { Result } from "@webiny/feature/api";
2
2
  import { DeleteGroupUseCase as UseCaseAbstraction } from "./abstractions.js";
3
3
  import { DeleteGroupRepository } from "./abstractions.js";
4
4
  import { GetGroupUseCase } from "../../../features/contentModelGroup/GetGroup/abstractions.js";
5
- import { EventPublisher } from "@webiny/api-core/features/EventPublisher";
5
+ import { EventPublisher } from "@webiny/api-core/features/eventPublisher/index.js";
6
6
  import { AccessControl } from "../../../features/shared/abstractions.js";
7
7
  /**
8
8
  * DeleteGroupUseCase - Orchestrates group deletion.
@@ -3,7 +3,7 @@ import { createImplementation } from "@webiny/feature/api";
3
3
  import { DeleteGroupUseCase as UseCaseAbstraction } from "./abstractions.js";
4
4
  import { DeleteGroupRepository } from "./abstractions.js";
5
5
  import { GetGroupUseCase } from "../GetGroup/abstractions.js";
6
- import { EventPublisher } from "@webiny/api-core/features/EventPublisher";
6
+ import { EventPublisher } from "@webiny/api-core/features/eventPublisher/index.js";
7
7
  import { GroupBeforeDeleteEvent } from "./events.js";
8
8
  import { GroupAfterDeleteEvent } from "./events.js";
9
9
  import { GroupDeleteErrorEvent } from "./events.js";
@@ -1 +1 @@
1
- {"version":3,"names":["Result","createImplementation","DeleteGroupUseCase","UseCaseAbstraction","DeleteGroupRepository","GetGroupUseCase","EventPublisher","GroupBeforeDeleteEvent","GroupAfterDeleteEvent","GroupDeleteErrorEvent","AccessControl","GroupNotAuthorizedError","DeleteGroupUseCaseImpl","constructor","eventPublisher","repository","getGroupUseCase","accessControl","execute","groupId","canAccess","canAccessGroup","rwd","fail","getResult","isFail","error","group","value","publish","result","ok","abstraction","implementation","dependencies"],"sources":["DeleteGroupUseCase.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { createImplementation } from \"@webiny/feature/api\";\nimport { DeleteGroupUseCase as UseCaseAbstraction } from \"./abstractions.js\";\nimport { DeleteGroupRepository } from \"./abstractions.js\";\nimport { GetGroupUseCase } from \"~/features/contentModelGroup/GetGroup/abstractions.js\";\nimport { EventPublisher } from \"@webiny/api-core/features/EventPublisher\";\nimport { GroupBeforeDeleteEvent } from \"./events.js\";\nimport { GroupAfterDeleteEvent } from \"./events.js\";\nimport { GroupDeleteErrorEvent } from \"./events.js\";\nimport { AccessControl } from \"~/features/shared/abstractions.js\";\nimport { GroupNotAuthorizedError } from \"~/domain/contentModelGroup/errors.js\";\n\n/**\n * DeleteGroupUseCase - Orchestrates group deletion.\n *\n * Responsibilities:\n * - Fetch original group\n * - Access control checks\n * - Publish before event\n * - Delegate to repository\n * - Publish after event or error event\n */\nclass DeleteGroupUseCaseImpl implements UseCaseAbstraction.Interface {\n public constructor(\n private eventPublisher: EventPublisher.Interface,\n private repository: DeleteGroupRepository.Interface,\n private getGroupUseCase: GetGroupUseCase.Interface,\n private accessControl: AccessControl.Interface\n ) {}\n\n async execute(groupId: string): Promise<Result<void, UseCaseAbstraction.Error>> {\n // Initial access control check\n const canAccess = await this.accessControl.canAccessGroup({ rwd: \"d\" });\n if (!canAccess) {\n return Result.fail(new GroupNotAuthorizedError());\n }\n\n // Fetch original group\n const getResult = await this.getGroupUseCase.execute(groupId);\n if (getResult.isFail()) {\n return Result.fail(getResult.error);\n }\n const group = getResult.value;\n\n // Access control check on group\n const canAccessGroup = await this.accessControl.canAccessGroup({ group });\n if (!canAccessGroup) {\n return Result.fail(new GroupNotAuthorizedError());\n }\n\n try {\n // Publish before event\n await this.eventPublisher.publish(\n new GroupBeforeDeleteEvent({\n group\n })\n );\n\n // Persist via repository\n const result = await this.repository.execute(group);\n if (result.isFail()) {\n // Publish error event\n await this.eventPublisher.publish(\n new GroupDeleteErrorEvent({\n group,\n error: result.error\n })\n );\n return Result.fail(result.error);\n }\n\n // Publish after event\n await this.eventPublisher.publish(\n new GroupAfterDeleteEvent({\n group\n })\n );\n\n return Result.ok();\n } catch (error) {\n // Publish error event for unexpected errors\n await this.eventPublisher.publish(\n new GroupDeleteErrorEvent({\n group,\n error: error as Error\n })\n );\n return Result.fail(error as UseCaseAbstraction.Error);\n }\n }\n}\n\nexport const DeleteGroupUseCase = createImplementation({\n abstraction: UseCaseAbstraction,\n implementation: DeleteGroupUseCaseImpl,\n dependencies: [EventPublisher, DeleteGroupRepository, GetGroupUseCase, AccessControl]\n});\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["Result","createImplementation","DeleteGroupUseCase","UseCaseAbstraction","DeleteGroupRepository","GetGroupUseCase","EventPublisher","GroupBeforeDeleteEvent","GroupAfterDeleteEvent","GroupDeleteErrorEvent","AccessControl","GroupNotAuthorizedError","DeleteGroupUseCaseImpl","constructor","eventPublisher","repository","getGroupUseCase","accessControl","execute","groupId","canAccess","canAccessGroup","rwd","fail","getResult","isFail","error","group","value","publish","result","ok","abstraction","implementation","dependencies"],"sources":["DeleteGroupUseCase.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { createImplementation } from \"@webiny/feature/api\";\nimport { DeleteGroupUseCase as UseCaseAbstraction } from \"./abstractions.js\";\nimport { DeleteGroupRepository } from \"./abstractions.js\";\nimport { GetGroupUseCase } from \"~/features/contentModelGroup/GetGroup/abstractions.js\";\nimport { EventPublisher } from \"@webiny/api-core/features/eventPublisher/index.js\";\nimport { GroupBeforeDeleteEvent } from \"./events.js\";\nimport { GroupAfterDeleteEvent } from \"./events.js\";\nimport { GroupDeleteErrorEvent } from \"./events.js\";\nimport { AccessControl } from \"~/features/shared/abstractions.js\";\nimport { GroupNotAuthorizedError } from \"~/domain/contentModelGroup/errors.js\";\n\n/**\n * DeleteGroupUseCase - Orchestrates group deletion.\n *\n * Responsibilities:\n * - Fetch original group\n * - Access control checks\n * - Publish before event\n * - Delegate to repository\n * - Publish after event or error event\n */\nclass DeleteGroupUseCaseImpl implements UseCaseAbstraction.Interface {\n public constructor(\n private eventPublisher: EventPublisher.Interface,\n private repository: DeleteGroupRepository.Interface,\n private getGroupUseCase: GetGroupUseCase.Interface,\n private accessControl: AccessControl.Interface\n ) {}\n\n async execute(groupId: string): Promise<Result<void, UseCaseAbstraction.Error>> {\n // Initial access control check\n const canAccess = await this.accessControl.canAccessGroup({ rwd: \"d\" });\n if (!canAccess) {\n return Result.fail(new GroupNotAuthorizedError());\n }\n\n // Fetch original group\n const getResult = await this.getGroupUseCase.execute(groupId);\n if (getResult.isFail()) {\n return Result.fail(getResult.error);\n }\n const group = getResult.value;\n\n // Access control check on group\n const canAccessGroup = await this.accessControl.canAccessGroup({ group });\n if (!canAccessGroup) {\n return Result.fail(new GroupNotAuthorizedError());\n }\n\n try {\n // Publish before event\n await this.eventPublisher.publish(\n new GroupBeforeDeleteEvent({\n group\n })\n );\n\n // Persist via repository\n const result = await this.repository.execute(group);\n if (result.isFail()) {\n // Publish error event\n await this.eventPublisher.publish(\n new GroupDeleteErrorEvent({\n group,\n error: result.error\n })\n );\n return Result.fail(result.error);\n }\n\n // Publish after event\n await this.eventPublisher.publish(\n new GroupAfterDeleteEvent({\n group\n })\n );\n\n return Result.ok();\n } catch (error) {\n // Publish error event for unexpected errors\n await this.eventPublisher.publish(\n new GroupDeleteErrorEvent({\n group,\n error: error as Error\n })\n );\n return Result.fail(error as UseCaseAbstraction.Error);\n }\n }\n}\n\nexport const DeleteGroupUseCase = createImplementation({\n abstraction: UseCaseAbstraction,\n implementation: DeleteGroupUseCaseImpl,\n dependencies: [EventPublisher, DeleteGroupRepository, GetGroupUseCase, AccessControl]\n});\n"],"mappings":"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","ignoreList":[]}
@@ -1,5 +1,5 @@
1
- import { DomainEvent } from "@webiny/api-core/features/EventPublisher";
2
- import type { IEventHandler } from "@webiny/api-core/features/EventPublisher";
1
+ import { DomainEvent } from "@webiny/api-core/features/eventPublisher/index.js";
2
+ import type { IEventHandler } from "@webiny/api-core/features/eventPublisher/index.js";
3
3
  import type { CmsGroup } from "../../../types/index.js";
4
4
  /**
5
5
  * Event payloads
@@ -1,5 +1,5 @@
1
1
  import { createAbstraction } from "@webiny/feature/api";
2
- import { DomainEvent } from "@webiny/api-core/features/EventPublisher";
2
+ import { DomainEvent } from "@webiny/api-core/features/eventPublisher/index.js";
3
3
 
4
4
  /**
5
5
  * Event payloads
@@ -1 +1 @@
1
- {"version":3,"names":["createAbstraction","DomainEvent","GroupBeforeDeleteEvent","eventType","getHandlerAbstraction","GroupBeforeDeleteEventHandler","GroupAfterDeleteEvent","GroupAfterDeleteEventHandler","GroupDeleteErrorEvent","GroupDeleteErrorEventHandler"],"sources":["events.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/api\";\nimport { DomainEvent } from \"@webiny/api-core/features/EventPublisher\";\nimport type { IEventHandler } from \"@webiny/api-core/features/EventPublisher\";\nimport type { CmsGroup } from \"~/types/index.js\";\n\n/**\n * Event payloads\n */\nexport interface GroupBeforeDeleteEventPayload {\n group: CmsGroup;\n}\n\nexport interface GroupAfterDeleteEventPayload {\n group: CmsGroup;\n}\n\nexport interface GroupDeleteErrorEventPayload {\n group: CmsGroup;\n error: Error;\n}\n\n/**\n * GroupBeforeDeleteEvent - Published before deleting a group\n */\nexport class GroupBeforeDeleteEvent extends DomainEvent<GroupBeforeDeleteEventPayload> {\n eventType = \"Cms/Group/BeforeDelete\" as const;\n\n getHandlerAbstraction() {\n return GroupBeforeDeleteEventHandler;\n }\n}\n\n/** Hook into group lifecycle before a group is deleted. */\nexport const GroupBeforeDeleteEventHandler = createAbstraction<\n IEventHandler<GroupBeforeDeleteEvent>\n>(\"GroupBeforeDeleteEventHandler\");\n\nexport namespace GroupBeforeDeleteEventHandler {\n export type Interface = IEventHandler<GroupBeforeDeleteEvent>;\n export type Event = GroupBeforeDeleteEvent;\n}\n\n/**\n * GroupAfterDeleteEvent - Published after deleting a group\n */\nexport class GroupAfterDeleteEvent extends DomainEvent<GroupAfterDeleteEventPayload> {\n eventType = \"Cms/Group/AfterDelete\" as const;\n\n getHandlerAbstraction() {\n return GroupAfterDeleteEventHandler;\n }\n}\n\n/** Hook into group lifecycle after a group is deleted. */\nexport const GroupAfterDeleteEventHandler = createAbstraction<IEventHandler<GroupAfterDeleteEvent>>(\n \"GroupAfterDeleteEventHandler\"\n);\n\nexport namespace GroupAfterDeleteEventHandler {\n export type Interface = IEventHandler<GroupAfterDeleteEvent>;\n export type Event = GroupAfterDeleteEvent;\n}\n\n/**\n * GroupDeleteErrorEvent - Published when delete fails\n */\nexport class GroupDeleteErrorEvent extends DomainEvent<GroupDeleteErrorEventPayload> {\n eventType = \"Cms/Group/DeleteError\" as const;\n\n getHandlerAbstraction() {\n return GroupDeleteErrorEventHandler;\n }\n}\n\nexport const GroupDeleteErrorEventHandler = createAbstraction<IEventHandler<GroupDeleteErrorEvent>>(\n \"GroupDeleteErrorEventHandler\"\n);\n\nexport namespace GroupDeleteErrorEventHandler {\n export type Interface = IEventHandler<GroupDeleteErrorEvent>;\n export type Event = GroupDeleteErrorEvent;\n}\n"],"mappings":"AAAA,SAASA,iBAAiB,QAAQ,qBAAqB;AACvD,SAASC,WAAW,QAAQ,0CAA0C;;AAItE;AACA;AACA;;AAcA;AACA;AACA;AACA,OAAO,MAAMC,sBAAsB,SAASD,WAAW,CAAgC;EACnFE,SAAS,GAAG,wBAAwB;EAEpCC,qBAAqBA,CAAA,EAAG;IACpB,OAAOC,6BAA6B;EACxC;AACJ;;AAEA;AACA,OAAO,MAAMA,6BAA6B,GAAGL,iBAAiB,CAE5D,+BAA+B,CAAC;AAOlC;AACA;AACA;AACA,OAAO,MAAMM,qBAAqB,SAASL,WAAW,CAA+B;EACjFE,SAAS,GAAG,uBAAuB;EAEnCC,qBAAqBA,CAAA,EAAG;IACpB,OAAOG,4BAA4B;EACvC;AACJ;;AAEA;AACA,OAAO,MAAMA,4BAA4B,GAAGP,iBAAiB,CACzD,8BACJ,CAAC;AAOD;AACA;AACA;AACA,OAAO,MAAMQ,qBAAqB,SAASP,WAAW,CAA+B;EACjFE,SAAS,GAAG,uBAAuB;EAEnCC,qBAAqBA,CAAA,EAAG;IACpB,OAAOK,4BAA4B;EACvC;AACJ;AAEA,OAAO,MAAMA,4BAA4B,GAAGT,iBAAiB,CACzD,8BACJ,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["createAbstraction","DomainEvent","GroupBeforeDeleteEvent","eventType","getHandlerAbstraction","GroupBeforeDeleteEventHandler","GroupAfterDeleteEvent","GroupAfterDeleteEventHandler","GroupDeleteErrorEvent","GroupDeleteErrorEventHandler"],"sources":["events.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/api\";\nimport { DomainEvent } from \"@webiny/api-core/features/eventPublisher/index.js\";\nimport type { IEventHandler } from \"@webiny/api-core/features/eventPublisher/index.js\";\nimport type { CmsGroup } from \"~/types/index.js\";\n\n/**\n * Event payloads\n */\nexport interface GroupBeforeDeleteEventPayload {\n group: CmsGroup;\n}\n\nexport interface GroupAfterDeleteEventPayload {\n group: CmsGroup;\n}\n\nexport interface GroupDeleteErrorEventPayload {\n group: CmsGroup;\n error: Error;\n}\n\n/**\n * GroupBeforeDeleteEvent - Published before deleting a group\n */\nexport class GroupBeforeDeleteEvent extends DomainEvent<GroupBeforeDeleteEventPayload> {\n eventType = \"Cms/Group/BeforeDelete\" as const;\n\n getHandlerAbstraction() {\n return GroupBeforeDeleteEventHandler;\n }\n}\n\n/** Hook into group lifecycle before a group is deleted. */\nexport const GroupBeforeDeleteEventHandler = createAbstraction<\n IEventHandler<GroupBeforeDeleteEvent>\n>(\"GroupBeforeDeleteEventHandler\");\n\nexport namespace GroupBeforeDeleteEventHandler {\n export type Interface = IEventHandler<GroupBeforeDeleteEvent>;\n export type Event = GroupBeforeDeleteEvent;\n}\n\n/**\n * GroupAfterDeleteEvent - Published after deleting a group\n */\nexport class GroupAfterDeleteEvent extends DomainEvent<GroupAfterDeleteEventPayload> {\n eventType = \"Cms/Group/AfterDelete\" as const;\n\n getHandlerAbstraction() {\n return GroupAfterDeleteEventHandler;\n }\n}\n\n/** Hook into group lifecycle after a group is deleted. */\nexport const GroupAfterDeleteEventHandler = createAbstraction<IEventHandler<GroupAfterDeleteEvent>>(\n \"GroupAfterDeleteEventHandler\"\n);\n\nexport namespace GroupAfterDeleteEventHandler {\n export type Interface = IEventHandler<GroupAfterDeleteEvent>;\n export type Event = GroupAfterDeleteEvent;\n}\n\n/**\n * GroupDeleteErrorEvent - Published when delete fails\n */\nexport class GroupDeleteErrorEvent extends DomainEvent<GroupDeleteErrorEventPayload> {\n eventType = \"Cms/Group/DeleteError\" as const;\n\n getHandlerAbstraction() {\n return GroupDeleteErrorEventHandler;\n }\n}\n\nexport const GroupDeleteErrorEventHandler = createAbstraction<IEventHandler<GroupDeleteErrorEvent>>(\n \"GroupDeleteErrorEventHandler\"\n);\n\nexport namespace GroupDeleteErrorEventHandler {\n export type Interface = IEventHandler<GroupDeleteErrorEvent>;\n export type Event = GroupDeleteErrorEvent;\n}\n"],"mappings":"AAAA,SAASA,iBAAiB,QAAQ,qBAAqB;AACvD,SAASC,WAAW,QAAQ,mDAAmD;;AAI/E;AACA;AACA;;AAcA;AACA;AACA;AACA,OAAO,MAAMC,sBAAsB,SAASD,WAAW,CAAgC;EACnFE,SAAS,GAAG,wBAAwB;EAEpCC,qBAAqBA,CAAA,EAAG;IACpB,OAAOC,6BAA6B;EACxC;AACJ;;AAEA;AACA,OAAO,MAAMA,6BAA6B,GAAGL,iBAAiB,CAE5D,+BAA+B,CAAC;AAOlC;AACA;AACA;AACA,OAAO,MAAMM,qBAAqB,SAASL,WAAW,CAA+B;EACjFE,SAAS,GAAG,uBAAuB;EAEnCC,qBAAqBA,CAAA,EAAG;IACpB,OAAOG,4BAA4B;EACvC;AACJ;;AAEA;AACA,OAAO,MAAMA,4BAA4B,GAAGP,iBAAiB,CACzD,8BACJ,CAAC;AAOD;AACA;AACA;AACA,OAAO,MAAMQ,qBAAqB,SAASP,WAAW,CAA+B;EACjFE,SAAS,GAAG,uBAAuB;EAEnCC,qBAAqBA,CAAA,EAAG;IACpB,OAAOK,4BAA4B;EACvC;AACJ;AAEA,OAAO,MAAMA,4BAA4B,GAAGT,iBAAiB,CACzD,8BACJ,CAAC","ignoreList":[]}
@@ -1,5 +1,5 @@
1
- import { TenantContext } from "@webiny/api-core/features/TenantContext";
2
- import { IdentityContext } from "@webiny/api-core/features/IdentityContext";
1
+ import { TenantContext } from "@webiny/api-core/features/tenancy/TenantContext/index.js";
2
+ import { IdentityContext } from "@webiny/api-core/features/security/IdentityContext/index.js";
3
3
  import { Result } from "@webiny/feature/api";
4
4
  import { GetGroupRepository as RepositoryAbstraction } from "./abstractions.js";
5
5
  import { GroupCache } from "../../../features/contentModelGroup/shared/abstractions.js";
@@ -1,5 +1,5 @@
1
- import { TenantContext } from "@webiny/api-core/features/TenantContext";
2
- import { IdentityContext } from "@webiny/api-core/features/IdentityContext";
1
+ import { TenantContext } from "@webiny/api-core/features/tenancy/TenantContext/index.js";
2
+ import { IdentityContext } from "@webiny/api-core/features/security/IdentityContext/index.js";
3
3
  import { Result } from "@webiny/feature/api";
4
4
  import { createImplementation } from "@webiny/feature/api";
5
5
  import { GetGroupRepository as RepositoryAbstraction } from "./abstractions.js";
@@ -1 +1 @@
1
- {"version":3,"names":["TenantContext","IdentityContext","Result","createImplementation","GetGroupRepository","RepositoryAbstraction","GroupCache","PluginGroupsProvider","GroupNotFoundError","GroupPersistenceError","StorageOperations","AccessControl","CmsContext","filterAsync","createCacheKey","GetGroupRepositoryImpl","constructor","groupCache","pluginGroupsProvider","storageOperations","accessControl","tenantContext","identityContext","cmsContext","execute","groupId","tenant","getTenant","groups","fetchAllGroups","id","group","find","g","fail","ok","error","pluginGroups","getGroups","dbCacheKey","databaseGroups","getOrSet","list","where","filteredCacheKey","get","identity","security","isAuthorizationEnabled","getIdentity","undefined","filteredDatabaseGroups","canAccessGroup","abstraction","implementation","dependencies"],"sources":["GetGroupRepository.ts"],"sourcesContent":["import { TenantContext } from \"@webiny/api-core/features/TenantContext\";\nimport { IdentityContext } from \"@webiny/api-core/features/IdentityContext\";\nimport { Result } from \"@webiny/feature/api\";\nimport { createImplementation } from \"@webiny/feature/api\";\nimport { GetGroupRepository as RepositoryAbstraction } from \"./abstractions.js\";\nimport { GroupCache } from \"~/features/contentModelGroup/shared/abstractions.js\";\nimport { PluginGroupsProvider } from \"~/features/contentModelGroup/shared/abstractions.js\";\nimport { GroupNotFoundError } from \"~/domain/contentModelGroup/errors.js\";\nimport { GroupPersistenceError } from \"~/domain/contentModelGroup/errors.js\";\nimport { StorageOperations } from \"~/features/shared/abstractions.js\";\nimport { AccessControl } from \"~/features/shared/abstractions.js\";\nimport { CmsContext } from \"~/features/shared/abstractions.js\";\nimport { filterAsync } from \"~/utils/filterAsync.js\";\nimport { createCacheKey } from \"~/utils/index.js\";\nimport type { CmsGroup } from \"~/types/index.js\";\n\n/**\n * GetGroupRepository - Fetches a single group by ID.\n *\n * Responsibilities:\n * - Create cache keys based on tenant + identity\n * - Provide data loader functions to GroupCache\n * - Fetch from plugin groups + database groups\n * - Apply access control filtering\n * - Return the group or NotFoundError\n */\nclass GetGroupRepositoryImpl implements RepositoryAbstraction.Interface {\n public constructor(\n private groupCache: GroupCache.Interface,\n private pluginGroupsProvider: PluginGroupsProvider.Interface,\n private storageOperations: StorageOperations.Interface,\n private accessControl: AccessControl.Interface,\n private tenantContext: TenantContext.Interface,\n private identityContext: IdentityContext.Interface,\n private cmsContext: CmsContext.Interface\n ) {}\n\n async execute(groupId: string): Promise<Result<CmsGroup, RepositoryAbstraction.Error>> {\n try {\n const tenant = this.tenantContext.getTenant();\n\n // Fetch all groups (plugin + database) with access control filtering\n const groups = await this.fetchAllGroups(tenant.id);\n\n const group = groups.find(g => g.id === groupId);\n\n if (!group) {\n return Result.fail(new GroupNotFoundError(groupId));\n }\n\n return Result.ok(group);\n } catch (error) {\n return Result.fail(new GroupPersistenceError(error as Error));\n }\n }\n\n private async fetchAllGroups(tenant: string): Promise<CmsGroup[]> {\n // 1. Fetch plugin groups (with caching and access control)\n const pluginGroups = await this.pluginGroupsProvider.getGroups();\n\n // 2. Fetch database groups (with caching)\n const dbCacheKey = createCacheKey({ tenant });\n const databaseGroups = await this.groupCache.getOrSet(dbCacheKey, async () => {\n return await this.storageOperations.groups.list({\n where: { tenant }\n });\n });\n\n // 3. Apply access control to database groups (with caching)\n const filteredCacheKey = createCacheKey({\n dbCacheKey: dbCacheKey.get(),\n identity: this.cmsContext.security.isAuthorizationEnabled()\n ? this.identityContext.getIdentity()?.id\n : undefined\n });\n\n const filteredDatabaseGroups = await this.groupCache.getOrSet(\n filteredCacheKey,\n async () => {\n return filterAsync(databaseGroups, async (group?: CmsGroup) => {\n if (!group) {\n return false;\n }\n return this.accessControl.canAccessGroup({ group });\n });\n }\n );\n\n // 4. Merge plugin + database groups\n return [...pluginGroups, ...filteredDatabaseGroups];\n }\n}\n\nexport const GetGroupRepository = createImplementation({\n abstraction: RepositoryAbstraction,\n implementation: GetGroupRepositoryImpl,\n dependencies: [\n GroupCache,\n PluginGroupsProvider,\n StorageOperations,\n AccessControl,\n TenantContext,\n IdentityContext,\n CmsContext\n ]\n});\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["TenantContext","IdentityContext","Result","createImplementation","GetGroupRepository","RepositoryAbstraction","GroupCache","PluginGroupsProvider","GroupNotFoundError","GroupPersistenceError","StorageOperations","AccessControl","CmsContext","filterAsync","createCacheKey","GetGroupRepositoryImpl","constructor","groupCache","pluginGroupsProvider","storageOperations","accessControl","tenantContext","identityContext","cmsContext","execute","groupId","tenant","getTenant","groups","fetchAllGroups","id","group","find","g","fail","ok","error","pluginGroups","getGroups","dbCacheKey","databaseGroups","getOrSet","list","where","filteredCacheKey","get","identity","security","isAuthorizationEnabled","getIdentity","undefined","filteredDatabaseGroups","canAccessGroup","abstraction","implementation","dependencies"],"sources":["GetGroupRepository.ts"],"sourcesContent":["import { TenantContext } from \"@webiny/api-core/features/tenancy/TenantContext/index.js\";\nimport { IdentityContext } from \"@webiny/api-core/features/security/IdentityContext/index.js\";\nimport { Result } from \"@webiny/feature/api\";\nimport { createImplementation } from \"@webiny/feature/api\";\nimport { GetGroupRepository as RepositoryAbstraction } from \"./abstractions.js\";\nimport { GroupCache } from \"~/features/contentModelGroup/shared/abstractions.js\";\nimport { PluginGroupsProvider } from \"~/features/contentModelGroup/shared/abstractions.js\";\nimport { GroupNotFoundError } from \"~/domain/contentModelGroup/errors.js\";\nimport { GroupPersistenceError } from \"~/domain/contentModelGroup/errors.js\";\nimport { StorageOperations } from \"~/features/shared/abstractions.js\";\nimport { AccessControl } from \"~/features/shared/abstractions.js\";\nimport { CmsContext } from \"~/features/shared/abstractions.js\";\nimport { filterAsync } from \"~/utils/filterAsync.js\";\nimport { createCacheKey } from \"~/utils/index.js\";\nimport type { CmsGroup } from \"~/types/index.js\";\n\n/**\n * GetGroupRepository - Fetches a single group by ID.\n *\n * Responsibilities:\n * - Create cache keys based on tenant + identity\n * - Provide data loader functions to GroupCache\n * - Fetch from plugin groups + database groups\n * - Apply access control filtering\n * - Return the group or NotFoundError\n */\nclass GetGroupRepositoryImpl implements RepositoryAbstraction.Interface {\n public constructor(\n private groupCache: GroupCache.Interface,\n private pluginGroupsProvider: PluginGroupsProvider.Interface,\n private storageOperations: StorageOperations.Interface,\n private accessControl: AccessControl.Interface,\n private tenantContext: TenantContext.Interface,\n private identityContext: IdentityContext.Interface,\n private cmsContext: CmsContext.Interface\n ) {}\n\n async execute(groupId: string): Promise<Result<CmsGroup, RepositoryAbstraction.Error>> {\n try {\n const tenant = this.tenantContext.getTenant();\n\n // Fetch all groups (plugin + database) with access control filtering\n const groups = await this.fetchAllGroups(tenant.id);\n\n const group = groups.find(g => g.id === groupId);\n\n if (!group) {\n return Result.fail(new GroupNotFoundError(groupId));\n }\n\n return Result.ok(group);\n } catch (error) {\n return Result.fail(new GroupPersistenceError(error as Error));\n }\n }\n\n private async fetchAllGroups(tenant: string): Promise<CmsGroup[]> {\n // 1. Fetch plugin groups (with caching and access control)\n const pluginGroups = await this.pluginGroupsProvider.getGroups();\n\n // 2. Fetch database groups (with caching)\n const dbCacheKey = createCacheKey({ tenant });\n const databaseGroups = await this.groupCache.getOrSet(dbCacheKey, async () => {\n return await this.storageOperations.groups.list({\n where: { tenant }\n });\n });\n\n // 3. Apply access control to database groups (with caching)\n const filteredCacheKey = createCacheKey({\n dbCacheKey: dbCacheKey.get(),\n identity: this.cmsContext.security.isAuthorizationEnabled()\n ? this.identityContext.getIdentity()?.id\n : undefined\n });\n\n const filteredDatabaseGroups = await this.groupCache.getOrSet(\n filteredCacheKey,\n async () => {\n return filterAsync(databaseGroups, async (group?: CmsGroup) => {\n if (!group) {\n return false;\n }\n return this.accessControl.canAccessGroup({ group });\n });\n }\n );\n\n // 4. Merge plugin + database groups\n return [...pluginGroups, ...filteredDatabaseGroups];\n }\n}\n\nexport const GetGroupRepository = createImplementation({\n abstraction: RepositoryAbstraction,\n implementation: GetGroupRepositoryImpl,\n dependencies: [\n GroupCache,\n PluginGroupsProvider,\n StorageOperations,\n AccessControl,\n TenantContext,\n IdentityContext,\n CmsContext\n ]\n});\n"],"mappings":"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","ignoreList":[]}
@@ -4,8 +4,8 @@ import { GroupCache } from "../../../features/contentModelGroup/shared/abstracti
4
4
  import { PluginGroupsProvider } from "../../../features/contentModelGroup/shared/abstractions.js";
5
5
  import { StorageOperations } from "../../../features/shared/abstractions.js";
6
6
  import { AccessControl } from "../../../features/shared/abstractions.js";
7
- import { TenantContext } from "@webiny/api-core/features/TenantContext";
8
- import { IdentityContext } from "@webiny/api-core/features/IdentityContext";
7
+ import { TenantContext } from "@webiny/api-core/features/tenancy/TenantContext/index.js";
8
+ import { IdentityContext } from "@webiny/api-core/features/security/IdentityContext/index.js";
9
9
  import { CmsContext } from "../../../features/shared/abstractions.js";
10
10
  import type { CmsGroup } from "../../../types/index.js";
11
11
  /**
@@ -6,8 +6,8 @@ import { PluginGroupsProvider } from "../shared/abstractions.js";
6
6
  import { GroupPersistenceError } from "../../../domain/contentModelGroup/errors.js";
7
7
  import { StorageOperations } from "../../shared/abstractions.js";
8
8
  import { AccessControl } from "../../shared/abstractions.js";
9
- import { TenantContext } from "@webiny/api-core/features/TenantContext";
10
- import { IdentityContext } from "@webiny/api-core/features/IdentityContext";
9
+ import { TenantContext } from "@webiny/api-core/features/tenancy/TenantContext/index.js";
10
+ import { IdentityContext } from "@webiny/api-core/features/security/IdentityContext/index.js";
11
11
  import { CmsContext } from "../../shared/abstractions.js";
12
12
  import { filterAsync } from "../../../utils/filterAsync.js";
13
13
  import { createCacheKey } from "../../../utils/index.js";
@@ -1 +1 @@
1
- {"version":3,"names":["Result","createImplementation","ListGroupsRepository","RepositoryAbstraction","GroupCache","PluginGroupsProvider","GroupPersistenceError","StorageOperations","AccessControl","TenantContext","IdentityContext","CmsContext","filterAsync","createCacheKey","ListGroupsRepositoryImpl","constructor","groupCache","pluginGroupsProvider","storageOperations","accessControl","tenantContext","identityContext","cmsContext","execute","tenant","getTenant","groups","fetchAllGroups","id","ok","error","fail","pluginGroups","getGroups","dbCacheKey","databaseGroups","getOrSet","list","where","filteredCacheKey","get","identity","security","isAuthorizationEnabled","getIdentity","undefined","filteredDatabaseGroups","group","canAccessGroup","abstraction","implementation","dependencies"],"sources":["ListGroupsRepository.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { createImplementation } from \"@webiny/feature/api\";\nimport { ListGroupsRepository as RepositoryAbstraction } from \"./abstractions.js\";\nimport { GroupCache } from \"~/features/contentModelGroup/shared/abstractions.js\";\nimport { PluginGroupsProvider } from \"~/features/contentModelGroup/shared/abstractions.js\";\nimport { GroupPersistenceError } from \"~/domain/contentModelGroup/errors.js\";\nimport { StorageOperations } from \"~/features/shared/abstractions.js\";\nimport { AccessControl } from \"~/features/shared/abstractions.js\";\nimport { TenantContext } from \"@webiny/api-core/features/TenantContext\";\nimport { IdentityContext } from \"@webiny/api-core/features/IdentityContext\";\nimport { CmsContext } from \"~/features/shared/abstractions.js\";\nimport { filterAsync } from \"~/utils/filterAsync.js\";\nimport { createCacheKey } from \"~/utils/index.js\";\nimport type { CmsGroup } from \"~/types/index.js\";\n\n/**\n * ListGroupsRepository - Fetches all groups (plugin + database).\n *\n * Responsibilities:\n * - Create cache keys based on tenant + identity\n * - Provide data loader functions to GroupCache\n * - Fetch from plugin groups + database groups\n * - Apply access control filtering\n * - Return all accessible groups\n */\nclass ListGroupsRepositoryImpl implements RepositoryAbstraction.Interface {\n public constructor(\n private groupCache: GroupCache.Interface,\n private pluginGroupsProvider: PluginGroupsProvider.Interface,\n private storageOperations: StorageOperations.Interface,\n private accessControl: AccessControl.Interface,\n private tenantContext: TenantContext.Interface,\n private identityContext: IdentityContext.Interface,\n private cmsContext: CmsContext.Interface\n ) {}\n\n async execute(): Promise<Result<CmsGroup[], RepositoryAbstraction.Error>> {\n try {\n const tenant = this.tenantContext.getTenant();\n\n // Fetch all groups (plugin + database) with access control filtering\n const groups = await this.fetchAllGroups(tenant.id);\n\n return Result.ok(groups);\n } catch (error) {\n return Result.fail(new GroupPersistenceError(error as Error));\n }\n }\n\n private async fetchAllGroups(tenant: string): Promise<CmsGroup[]> {\n // 1. Fetch plugin groups (with caching and access control)\n const pluginGroups = await this.pluginGroupsProvider.getGroups();\n\n // 2. Fetch database groups (with caching)\n const dbCacheKey = createCacheKey({ tenant });\n const databaseGroups = await this.groupCache.getOrSet(dbCacheKey, async () => {\n return await this.storageOperations.groups.list({\n where: { tenant }\n });\n });\n\n // 3. Apply access control to database groups (with caching)\n const filteredCacheKey = createCacheKey({\n dbCacheKey: dbCacheKey.get(),\n identity: this.cmsContext.security.isAuthorizationEnabled()\n ? this.identityContext.getIdentity()?.id\n : undefined\n });\n\n const filteredDatabaseGroups = await this.groupCache.getOrSet(\n filteredCacheKey,\n async () => {\n return filterAsync(databaseGroups, async (group?: CmsGroup) => {\n if (!group) {\n return false;\n }\n return this.accessControl.canAccessGroup({ group });\n });\n }\n );\n\n // 4. Merge groups\n return [...filteredDatabaseGroups, ...pluginGroups];\n }\n}\n\nexport const ListGroupsRepository = createImplementation({\n abstraction: RepositoryAbstraction,\n implementation: ListGroupsRepositoryImpl,\n dependencies: [\n GroupCache,\n PluginGroupsProvider,\n StorageOperations,\n AccessControl,\n TenantContext,\n IdentityContext,\n CmsContext\n ]\n});\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["Result","createImplementation","ListGroupsRepository","RepositoryAbstraction","GroupCache","PluginGroupsProvider","GroupPersistenceError","StorageOperations","AccessControl","TenantContext","IdentityContext","CmsContext","filterAsync","createCacheKey","ListGroupsRepositoryImpl","constructor","groupCache","pluginGroupsProvider","storageOperations","accessControl","tenantContext","identityContext","cmsContext","execute","tenant","getTenant","groups","fetchAllGroups","id","ok","error","fail","pluginGroups","getGroups","dbCacheKey","databaseGroups","getOrSet","list","where","filteredCacheKey","get","identity","security","isAuthorizationEnabled","getIdentity","undefined","filteredDatabaseGroups","group","canAccessGroup","abstraction","implementation","dependencies"],"sources":["ListGroupsRepository.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { createImplementation } from \"@webiny/feature/api\";\nimport { ListGroupsRepository as RepositoryAbstraction } from \"./abstractions.js\";\nimport { GroupCache } from \"~/features/contentModelGroup/shared/abstractions.js\";\nimport { PluginGroupsProvider } from \"~/features/contentModelGroup/shared/abstractions.js\";\nimport { GroupPersistenceError } from \"~/domain/contentModelGroup/errors.js\";\nimport { StorageOperations } from \"~/features/shared/abstractions.js\";\nimport { AccessControl } from \"~/features/shared/abstractions.js\";\nimport { TenantContext } from \"@webiny/api-core/features/tenancy/TenantContext/index.js\";\nimport { IdentityContext } from \"@webiny/api-core/features/security/IdentityContext/index.js\";\nimport { CmsContext } from \"~/features/shared/abstractions.js\";\nimport { filterAsync } from \"~/utils/filterAsync.js\";\nimport { createCacheKey } from \"~/utils/index.js\";\nimport type { CmsGroup } from \"~/types/index.js\";\n\n/**\n * ListGroupsRepository - Fetches all groups (plugin + database).\n *\n * Responsibilities:\n * - Create cache keys based on tenant + identity\n * - Provide data loader functions to GroupCache\n * - Fetch from plugin groups + database groups\n * - Apply access control filtering\n * - Return all accessible groups\n */\nclass ListGroupsRepositoryImpl implements RepositoryAbstraction.Interface {\n public constructor(\n private groupCache: GroupCache.Interface,\n private pluginGroupsProvider: PluginGroupsProvider.Interface,\n private storageOperations: StorageOperations.Interface,\n private accessControl: AccessControl.Interface,\n private tenantContext: TenantContext.Interface,\n private identityContext: IdentityContext.Interface,\n private cmsContext: CmsContext.Interface\n ) {}\n\n async execute(): Promise<Result<CmsGroup[], RepositoryAbstraction.Error>> {\n try {\n const tenant = this.tenantContext.getTenant();\n\n // Fetch all groups (plugin + database) with access control filtering\n const groups = await this.fetchAllGroups(tenant.id);\n\n return Result.ok(groups);\n } catch (error) {\n return Result.fail(new GroupPersistenceError(error as Error));\n }\n }\n\n private async fetchAllGroups(tenant: string): Promise<CmsGroup[]> {\n // 1. Fetch plugin groups (with caching and access control)\n const pluginGroups = await this.pluginGroupsProvider.getGroups();\n\n // 2. Fetch database groups (with caching)\n const dbCacheKey = createCacheKey({ tenant });\n const databaseGroups = await this.groupCache.getOrSet(dbCacheKey, async () => {\n return await this.storageOperations.groups.list({\n where: { tenant }\n });\n });\n\n // 3. Apply access control to database groups (with caching)\n const filteredCacheKey = createCacheKey({\n dbCacheKey: dbCacheKey.get(),\n identity: this.cmsContext.security.isAuthorizationEnabled()\n ? this.identityContext.getIdentity()?.id\n : undefined\n });\n\n const filteredDatabaseGroups = await this.groupCache.getOrSet(\n filteredCacheKey,\n async () => {\n return filterAsync(databaseGroups, async (group?: CmsGroup) => {\n if (!group) {\n return false;\n }\n return this.accessControl.canAccessGroup({ group });\n });\n }\n );\n\n // 4. Merge groups\n return [...filteredDatabaseGroups, ...pluginGroups];\n }\n}\n\nexport const ListGroupsRepository = createImplementation({\n abstraction: RepositoryAbstraction,\n implementation: ListGroupsRepositoryImpl,\n dependencies: [\n GroupCache,\n PluginGroupsProvider,\n StorageOperations,\n AccessControl,\n TenantContext,\n IdentityContext,\n CmsContext\n ]\n});\n"],"mappings":"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","ignoreList":[]}
@@ -2,9 +2,9 @@ import { Result } from "@webiny/feature/api";
2
2
  import { UpdateGroupUseCase as UseCaseAbstraction } from "./abstractions.js";
3
3
  import { UpdateGroupRepository } from "./abstractions.js";
4
4
  import { GetGroupUseCase } from "../../../features/contentModelGroup/GetGroup/abstractions.js";
5
- import { EventPublisher } from "@webiny/api-core/features/EventPublisher";
5
+ import { EventPublisher } from "@webiny/api-core/features/eventPublisher/index.js";
6
6
  import { AccessControl } from "../../../features/shared/abstractions.js";
7
- import { TenantContext } from "@webiny/api-core/features/TenantContext";
7
+ import { TenantContext } from "@webiny/api-core/features/tenancy/TenantContext/index.js";
8
8
  import type { CmsGroup } from "../../../types/index.js";
9
9
  import type { CmsGroupUpdateInput } from "../../../types/index.js";
10
10
  /**
@@ -3,12 +3,12 @@ import { createImplementation } from "@webiny/feature/api";
3
3
  import { UpdateGroupUseCase as UseCaseAbstraction } from "./abstractions.js";
4
4
  import { UpdateGroupRepository } from "./abstractions.js";
5
5
  import { GetGroupUseCase } from "../GetGroup/abstractions.js";
6
- import { EventPublisher } from "@webiny/api-core/features/EventPublisher";
6
+ import { EventPublisher } from "@webiny/api-core/features/eventPublisher/index.js";
7
7
  import { GroupBeforeUpdateEvent } from "./events.js";
8
8
  import { GroupAfterUpdateEvent } from "./events.js";
9
9
  import { GroupUpdateErrorEvent } from "./events.js";
10
10
  import { AccessControl } from "../../shared/abstractions.js";
11
- import { TenantContext } from "@webiny/api-core/features/TenantContext";
11
+ import { TenantContext } from "@webiny/api-core/features/tenancy/TenantContext/index.js";
12
12
  import { GroupNotAuthorizedError, GroupValidationError } from "../../../domain/contentModelGroup/errors.js";
13
13
  import { createZodError } from "@webiny/utils";
14
14
  import { createGroupUpdateValidation } from "../../../domain/contentModelGroup/validation.js";
@@ -1 +1 @@
1
- {"version":3,"names":["Result","createImplementation","UpdateGroupUseCase","UseCaseAbstraction","UpdateGroupRepository","GetGroupUseCase","EventPublisher","GroupBeforeUpdateEvent","GroupAfterUpdateEvent","GroupUpdateErrorEvent","AccessControl","TenantContext","GroupNotAuthorizedError","GroupValidationError","createZodError","createGroupUpdateValidation","UpdateGroupUseCaseImpl","constructor","eventPublisher","repository","getGroupUseCase","accessControl","tenantContext","execute","groupId","input","canAccess","canAccessGroup","rwd","fail","getResult","isFail","error","original","value","group","validationResult","safeParseAsync","success","zodError","message","data","invalidFields","Object","keys","length","ok","tenant","getTenant","id","savedOn","Date","toISOString","publish","result","abstraction","implementation","dependencies"],"sources":["UpdateGroupUseCase.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { createImplementation } from \"@webiny/feature/api\";\nimport { UpdateGroupUseCase as UseCaseAbstraction } from \"./abstractions.js\";\nimport { UpdateGroupRepository } from \"./abstractions.js\";\nimport { GetGroupUseCase } from \"~/features/contentModelGroup/GetGroup/abstractions.js\";\nimport { EventPublisher } from \"@webiny/api-core/features/EventPublisher\";\nimport { GroupBeforeUpdateEvent } from \"./events.js\";\nimport { GroupAfterUpdateEvent } from \"./events.js\";\nimport { GroupUpdateErrorEvent } from \"./events.js\";\nimport { AccessControl } from \"~/features/shared/abstractions.js\";\nimport { TenantContext } from \"@webiny/api-core/features/TenantContext\";\nimport {\n GroupNotAuthorizedError,\n GroupValidationError\n} from \"~/domain/contentModelGroup/errors.js\";\nimport { createZodError } from \"@webiny/utils\";\nimport { createGroupUpdateValidation } from \"~/domain/contentModelGroup/validation.js\";\nimport type { CmsGroup } from \"~/types/index.js\";\nimport type { CmsGroupUpdateInput } from \"~/types/index.js\";\n\n/**\n * UpdateGroupUseCase - Orchestrates group updates.\n *\n * Responsibilities:\n * - Fetch original group\n * - Access control checks\n * - Validate input (Zod)\n * - Skip if no changes\n * - Merge changes\n * - Publish before event\n * - Delegate to repository\n * - Publish after event or error event\n */\nclass UpdateGroupUseCaseImpl implements UseCaseAbstraction.Interface {\n public constructor(\n private eventPublisher: EventPublisher.Interface,\n private repository: UpdateGroupRepository.Interface,\n private getGroupUseCase: GetGroupUseCase.Interface,\n private accessControl: AccessControl.Interface,\n private tenantContext: TenantContext.Interface\n ) {}\n\n async execute(\n groupId: string,\n input: CmsGroupUpdateInput\n ): Promise<Result<CmsGroup, UseCaseAbstraction.Error>> {\n // Initial access control check\n const canAccess = await this.accessControl.canAccessGroup({ rwd: \"w\" });\n if (!canAccess) {\n return Result.fail(new GroupNotAuthorizedError());\n }\n\n // Fetch original group\n const getResult = await this.getGroupUseCase.execute(groupId);\n if (getResult.isFail()) {\n return Result.fail(getResult.error);\n }\n const original = getResult.value;\n\n // Access control check on original group\n const canAccessGroup = await this.accessControl.canAccessGroup({ group: original });\n if (!canAccessGroup) {\n return Result.fail(new GroupNotAuthorizedError());\n }\n\n // Validate input\n const validationResult = await createGroupUpdateValidation().safeParseAsync(input);\n if (!validationResult.success) {\n const zodError = createZodError(validationResult.error);\n return Result.fail(\n new GroupValidationError(zodError.message, zodError.data!.invalidFields)\n );\n }\n const data = validationResult.data;\n\n // Skip if no changes\n if (Object.keys(data).length === 0) {\n return Result.ok(original);\n }\n\n // Merge changes\n const tenant = this.tenantContext.getTenant();\n const group: CmsGroup = {\n ...original,\n ...data,\n tenant: tenant.id,\n savedOn: new Date().toISOString()\n };\n\n try {\n // Publish before event\n await this.eventPublisher.publish(\n new GroupBeforeUpdateEvent({\n original,\n group\n })\n );\n\n // Persist via repository\n const result = await this.repository.execute(group);\n if (result.isFail()) {\n // Publish error event\n await this.eventPublisher.publish(\n new GroupUpdateErrorEvent({\n input,\n original,\n group,\n error: result.error\n })\n );\n return Result.fail(result.error);\n }\n\n // Publish after event\n await this.eventPublisher.publish(\n new GroupAfterUpdateEvent({\n original,\n group\n })\n );\n\n return Result.ok(group);\n } catch (error) {\n // Publish error event for unexpected errors\n await this.eventPublisher.publish(\n new GroupUpdateErrorEvent({\n input,\n original,\n group,\n error: error as Error\n })\n );\n return Result.fail(error as UseCaseAbstraction.Error);\n }\n }\n}\n\nexport const UpdateGroupUseCase = createImplementation({\n abstraction: UseCaseAbstraction,\n implementation: UpdateGroupUseCaseImpl,\n dependencies: [\n EventPublisher,\n UpdateGroupRepository,\n GetGroupUseCase,\n AccessControl,\n TenantContext\n ]\n});\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["Result","createImplementation","UpdateGroupUseCase","UseCaseAbstraction","UpdateGroupRepository","GetGroupUseCase","EventPublisher","GroupBeforeUpdateEvent","GroupAfterUpdateEvent","GroupUpdateErrorEvent","AccessControl","TenantContext","GroupNotAuthorizedError","GroupValidationError","createZodError","createGroupUpdateValidation","UpdateGroupUseCaseImpl","constructor","eventPublisher","repository","getGroupUseCase","accessControl","tenantContext","execute","groupId","input","canAccess","canAccessGroup","rwd","fail","getResult","isFail","error","original","value","group","validationResult","safeParseAsync","success","zodError","message","data","invalidFields","Object","keys","length","ok","tenant","getTenant","id","savedOn","Date","toISOString","publish","result","abstraction","implementation","dependencies"],"sources":["UpdateGroupUseCase.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { createImplementation } from \"@webiny/feature/api\";\nimport { UpdateGroupUseCase as UseCaseAbstraction } from \"./abstractions.js\";\nimport { UpdateGroupRepository } from \"./abstractions.js\";\nimport { GetGroupUseCase } from \"~/features/contentModelGroup/GetGroup/abstractions.js\";\nimport { EventPublisher } from \"@webiny/api-core/features/eventPublisher/index.js\";\nimport { GroupBeforeUpdateEvent } from \"./events.js\";\nimport { GroupAfterUpdateEvent } from \"./events.js\";\nimport { GroupUpdateErrorEvent } from \"./events.js\";\nimport { AccessControl } from \"~/features/shared/abstractions.js\";\nimport { TenantContext } from \"@webiny/api-core/features/tenancy/TenantContext/index.js\";\nimport {\n GroupNotAuthorizedError,\n GroupValidationError\n} from \"~/domain/contentModelGroup/errors.js\";\nimport { createZodError } from \"@webiny/utils\";\nimport { createGroupUpdateValidation } from \"~/domain/contentModelGroup/validation.js\";\nimport type { CmsGroup } from \"~/types/index.js\";\nimport type { CmsGroupUpdateInput } from \"~/types/index.js\";\n\n/**\n * UpdateGroupUseCase - Orchestrates group updates.\n *\n * Responsibilities:\n * - Fetch original group\n * - Access control checks\n * - Validate input (Zod)\n * - Skip if no changes\n * - Merge changes\n * - Publish before event\n * - Delegate to repository\n * - Publish after event or error event\n */\nclass UpdateGroupUseCaseImpl implements UseCaseAbstraction.Interface {\n public constructor(\n private eventPublisher: EventPublisher.Interface,\n private repository: UpdateGroupRepository.Interface,\n private getGroupUseCase: GetGroupUseCase.Interface,\n private accessControl: AccessControl.Interface,\n private tenantContext: TenantContext.Interface\n ) {}\n\n async execute(\n groupId: string,\n input: CmsGroupUpdateInput\n ): Promise<Result<CmsGroup, UseCaseAbstraction.Error>> {\n // Initial access control check\n const canAccess = await this.accessControl.canAccessGroup({ rwd: \"w\" });\n if (!canAccess) {\n return Result.fail(new GroupNotAuthorizedError());\n }\n\n // Fetch original group\n const getResult = await this.getGroupUseCase.execute(groupId);\n if (getResult.isFail()) {\n return Result.fail(getResult.error);\n }\n const original = getResult.value;\n\n // Access control check on original group\n const canAccessGroup = await this.accessControl.canAccessGroup({ group: original });\n if (!canAccessGroup) {\n return Result.fail(new GroupNotAuthorizedError());\n }\n\n // Validate input\n const validationResult = await createGroupUpdateValidation().safeParseAsync(input);\n if (!validationResult.success) {\n const zodError = createZodError(validationResult.error);\n return Result.fail(\n new GroupValidationError(zodError.message, zodError.data!.invalidFields)\n );\n }\n const data = validationResult.data;\n\n // Skip if no changes\n if (Object.keys(data).length === 0) {\n return Result.ok(original);\n }\n\n // Merge changes\n const tenant = this.tenantContext.getTenant();\n const group: CmsGroup = {\n ...original,\n ...data,\n tenant: tenant.id,\n savedOn: new Date().toISOString()\n };\n\n try {\n // Publish before event\n await this.eventPublisher.publish(\n new GroupBeforeUpdateEvent({\n original,\n group\n })\n );\n\n // Persist via repository\n const result = await this.repository.execute(group);\n if (result.isFail()) {\n // Publish error event\n await this.eventPublisher.publish(\n new GroupUpdateErrorEvent({\n input,\n original,\n group,\n error: result.error\n })\n );\n return Result.fail(result.error);\n }\n\n // Publish after event\n await this.eventPublisher.publish(\n new GroupAfterUpdateEvent({\n original,\n group\n })\n );\n\n return Result.ok(group);\n } catch (error) {\n // Publish error event for unexpected errors\n await this.eventPublisher.publish(\n new GroupUpdateErrorEvent({\n input,\n original,\n group,\n error: error as Error\n })\n );\n return Result.fail(error as UseCaseAbstraction.Error);\n }\n }\n}\n\nexport const UpdateGroupUseCase = createImplementation({\n abstraction: UseCaseAbstraction,\n implementation: UpdateGroupUseCaseImpl,\n dependencies: [\n EventPublisher,\n UpdateGroupRepository,\n GetGroupUseCase,\n AccessControl,\n TenantContext\n ]\n});\n"],"mappings":"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","ignoreList":[]}