@ruiapp/rapid-core 0.11.5 → 0.11.7

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 (204) hide show
  1. package/CHANGELOG.md +11 -11
  2. package/dist/core/pluginManager.d.ts +2 -0
  3. package/dist/core/server.d.ts +3 -0
  4. package/dist/dataAccess/entityManager.d.ts +3 -3
  5. package/dist/index.js +118 -41
  6. package/dist/server.d.ts +1 -0
  7. package/dist/types.d.ts +2 -0
  8. package/package.json +1 -1
  9. package/rollup.config.js +16 -16
  10. package/src/bootstrapApplicationConfig.ts +904 -904
  11. package/src/core/ExpressionInterpreter.ts +45 -45
  12. package/src/core/actionHandler.ts +24 -24
  13. package/src/core/actionHandlers/ifActionHandler.ts +27 -27
  14. package/src/core/eventManager.ts +20 -20
  15. package/src/core/facility.ts +7 -7
  16. package/src/core/http/formDataParser.ts +87 -87
  17. package/src/core/http-types.ts +4 -4
  18. package/src/core/pluginManager.ts +202 -193
  19. package/src/core/providers/runtimeProvider.ts +5 -5
  20. package/src/core/request.ts +96 -96
  21. package/src/core/response.ts +84 -84
  22. package/src/core/routeContext.ts +127 -127
  23. package/src/core/routes/healthz.ts +20 -20
  24. package/src/core/routes/index.ts +3 -3
  25. package/src/core/routesBuilder.ts +129 -122
  26. package/src/core/server.ts +161 -158
  27. package/src/dataAccess/columnTypeMapper.ts +22 -22
  28. package/src/dataAccess/dataAccessTypes.ts +165 -165
  29. package/src/dataAccess/dataAccessor.ts +135 -135
  30. package/src/dataAccess/entityManager.ts +2031 -1986
  31. package/src/dataAccess/entityMapper.ts +111 -111
  32. package/src/dataAccess/entityValidator.ts +33 -33
  33. package/src/dataAccess/propertyMapper.ts +28 -28
  34. package/src/deno-std/assert/assert.ts +9 -9
  35. package/src/deno-std/assert/assertion_error.ts +7 -7
  36. package/src/deno-std/datetime/to_imf.ts +32 -32
  37. package/src/deno-std/encoding/base64.ts +141 -141
  38. package/src/deno-std/http/cookie.ts +372 -372
  39. package/src/facilities/cache/CacheFacilityTypes.ts +29 -29
  40. package/src/facilities/cache/CacheFactory.ts +31 -31
  41. package/src/facilities/cache/MemoryCache.ts +58 -58
  42. package/src/facilities/cache/MemoryCacheProvider.ts +15 -15
  43. package/src/facilities/log/LogFacility.ts +35 -35
  44. package/src/helpers/dbTransactionHelper.ts +42 -42
  45. package/src/helpers/entityHelper.ts +89 -89
  46. package/src/helpers/filterHelper.ts +148 -148
  47. package/src/helpers/inputHelper.ts +11 -11
  48. package/src/helpers/licenseHelper.ts +29 -29
  49. package/src/helpers/metaHelper.ts +111 -111
  50. package/src/helpers/runCollectionEntityActionHandler.ts +58 -58
  51. package/src/index.ts +85 -85
  52. package/src/plugins/auth/AuthPlugin.ts +107 -107
  53. package/src/plugins/auth/AuthPluginTypes.ts +11 -11
  54. package/src/plugins/auth/actionHandlers/changePassword.ts +61 -61
  55. package/src/plugins/auth/actionHandlers/createSession.ts +68 -68
  56. package/src/plugins/auth/actionHandlers/deleteSession.ts +18 -18
  57. package/src/plugins/auth/actionHandlers/getMyProfile.ts +28 -28
  58. package/src/plugins/auth/actionHandlers/index.ts +8 -8
  59. package/src/plugins/auth/actionHandlers/resetPassword.ts +45 -45
  60. package/src/plugins/auth/models/AccessToken.ts +56 -56
  61. package/src/plugins/auth/models/index.ts +3 -3
  62. package/src/plugins/auth/routes/changePassword.ts +15 -15
  63. package/src/plugins/auth/routes/getMyProfile.ts +15 -15
  64. package/src/plugins/auth/routes/index.ts +7 -7
  65. package/src/plugins/auth/routes/resetPassword.ts +15 -15
  66. package/src/plugins/auth/routes/signin.ts +15 -15
  67. package/src/plugins/auth/routes/signout.ts +15 -15
  68. package/src/plugins/auth/services/AuthService.ts +66 -66
  69. package/src/plugins/cronJob/CronJobPlugin.ts +104 -104
  70. package/src/plugins/cronJob/CronJobPluginTypes.ts +44 -44
  71. package/src/plugins/cronJob/actionHandlers/index.ts +4 -4
  72. package/src/plugins/cronJob/actionHandlers/runCronJob.ts +32 -32
  73. package/src/plugins/cronJob/entityWatchers/cronJobEntityWatchers.ts +24 -24
  74. package/src/plugins/cronJob/entityWatchers/index.ts +4 -4
  75. package/src/plugins/cronJob/models/CronJob.ts +129 -129
  76. package/src/plugins/cronJob/models/index.ts +3 -3
  77. package/src/plugins/cronJob/routes/index.ts +3 -3
  78. package/src/plugins/cronJob/routes/runCronJob.ts +15 -15
  79. package/src/plugins/cronJob/services/CronJobService.ts +255 -255
  80. package/src/plugins/dataManage/DataManagePlugin.ts +165 -165
  81. package/src/plugins/dataManage/actionHandlers/addEntityRelations.ts +15 -15
  82. package/src/plugins/dataManage/actionHandlers/countCollectionEntities.ts +17 -17
  83. package/src/plugins/dataManage/actionHandlers/createCollectionEntitiesBatch.ts +81 -81
  84. package/src/plugins/dataManage/actionHandlers/createCollectionEntity.ts +20 -20
  85. package/src/plugins/dataManage/actionHandlers/deleteCollectionEntities.ts +47 -45
  86. package/src/plugins/dataManage/actionHandlers/deleteCollectionEntityById.ts +20 -20
  87. package/src/plugins/dataManage/actionHandlers/findCollectionEntities.ts +27 -27
  88. package/src/plugins/dataManage/actionHandlers/findCollectionEntityById.ts +30 -30
  89. package/src/plugins/dataManage/actionHandlers/queryDatabase.ts +22 -22
  90. package/src/plugins/dataManage/actionHandlers/removeEntityRelations.ts +15 -15
  91. package/src/plugins/dataManage/actionHandlers/saveEntity.ts +46 -46
  92. package/src/plugins/dataManage/actionHandlers/updateCollectionEntityById.ts +38 -38
  93. package/src/plugins/entityAccessControl/EntityAccessControlPlugin.ts +146 -146
  94. package/src/plugins/fileManage/FileManagePlugin.ts +52 -52
  95. package/src/plugins/fileManage/actionHandlers/downloadDocument.ts +65 -65
  96. package/src/plugins/fileManage/actionHandlers/downloadFile.ts +44 -44
  97. package/src/plugins/fileManage/actionHandlers/uploadFile.ts +33 -33
  98. package/src/plugins/fileManage/routes/downloadDocument.ts +15 -15
  99. package/src/plugins/fileManage/routes/downloadFile.ts +15 -15
  100. package/src/plugins/fileManage/routes/index.ts +5 -5
  101. package/src/plugins/fileManage/routes/uploadFile.ts +15 -15
  102. package/src/plugins/license/LicensePlugin.ts +79 -79
  103. package/src/plugins/license/LicensePluginTypes.ts +95 -95
  104. package/src/plugins/license/LicenseService.ts +141 -141
  105. package/src/plugins/license/actionHandlers/getLicense.ts +18 -18
  106. package/src/plugins/license/actionHandlers/index.ts +5 -5
  107. package/src/plugins/license/actionHandlers/updateLicense.ts +24 -24
  108. package/src/plugins/license/helpers/certHelper.ts +21 -21
  109. package/src/plugins/license/helpers/cryptoHelper.ts +47 -47
  110. package/src/plugins/license/models/index.ts +1 -1
  111. package/src/plugins/license/routes/getLicense.ts +15 -15
  112. package/src/plugins/license/routes/index.ts +4 -4
  113. package/src/plugins/license/routes/updateLicense.ts +15 -15
  114. package/src/plugins/mail/MailPlugin.ts +74 -74
  115. package/src/plugins/mail/MailPluginTypes.ts +27 -27
  116. package/src/plugins/mail/MailService.ts +38 -38
  117. package/src/plugins/mail/actionHandlers/index.ts +3 -3
  118. package/src/plugins/mail/models/index.ts +1 -1
  119. package/src/plugins/mail/routes/index.ts +1 -1
  120. package/src/plugins/metaManage/MetaManagePlugin.ts +198 -198
  121. package/src/plugins/metaManage/actionHandlers/getMetaModelDetail.ts +10 -10
  122. package/src/plugins/metaManage/actionHandlers/listMetaModels.ts +10 -10
  123. package/src/plugins/metaManage/actionHandlers/listMetaRoutes.ts +10 -10
  124. package/src/plugins/metaManage/services/MetaService.ts +376 -376
  125. package/src/plugins/notification/NotificationPlugin.ts +68 -68
  126. package/src/plugins/notification/NotificationPluginTypes.ts +13 -13
  127. package/src/plugins/notification/NotificationService.ts +25 -25
  128. package/src/plugins/notification/actionHandlers/index.ts +3 -3
  129. package/src/plugins/notification/models/Notification.ts +60 -60
  130. package/src/plugins/notification/models/index.ts +3 -3
  131. package/src/plugins/notification/routes/index.ts +1 -1
  132. package/src/plugins/routeManage/RouteManagePlugin.ts +64 -64
  133. package/src/plugins/routeManage/actionHandlers/httpProxy.ts +13 -13
  134. package/src/plugins/routeManage/actionHandlers/mock.ts +28 -28
  135. package/src/plugins/sequence/SequencePlugin.ts +146 -146
  136. package/src/plugins/sequence/SequencePluginTypes.ts +69 -69
  137. package/src/plugins/sequence/SequenceService.ts +92 -92
  138. package/src/plugins/sequence/actionHandlers/generateSn.ts +32 -32
  139. package/src/plugins/sequence/actionHandlers/index.ts +4 -4
  140. package/src/plugins/sequence/models/SequenceAutoIncrementRecord.ts +49 -49
  141. package/src/plugins/sequence/models/SequenceRule.ts +42 -42
  142. package/src/plugins/sequence/models/index.ts +4 -4
  143. package/src/plugins/sequence/routes/generateSn.ts +15 -15
  144. package/src/plugins/sequence/routes/index.ts +3 -3
  145. package/src/plugins/sequence/segment-utility.ts +11 -11
  146. package/src/plugins/sequence/segments/autoIncrement.ts +90 -90
  147. package/src/plugins/sequence/segments/dayOfMonth.ts +19 -19
  148. package/src/plugins/sequence/segments/index.ts +9 -9
  149. package/src/plugins/sequence/segments/literal.ts +16 -16
  150. package/src/plugins/sequence/segments/month.ts +19 -19
  151. package/src/plugins/sequence/segments/parameter.ts +20 -20
  152. package/src/plugins/sequence/segments/year.ts +19 -19
  153. package/src/plugins/serverOperation/ServerOperationPlugin.ts +93 -93
  154. package/src/plugins/serverOperation/ServerOperationPluginTypes.ts +25 -25
  155. package/src/plugins/serverOperation/actionHandlers/index.ts +4 -4
  156. package/src/plugins/serverOperation/actionHandlers/runServerOperation.ts +20 -20
  157. package/src/plugins/setting/SettingPlugin.ts +68 -68
  158. package/src/plugins/setting/SettingPluginTypes.ts +37 -37
  159. package/src/plugins/setting/SettingService.ts +222 -222
  160. package/src/plugins/setting/actionHandlers/getSystemSettingValues.ts +30 -30
  161. package/src/plugins/setting/actionHandlers/getUserSettingValues.ts +38 -38
  162. package/src/plugins/setting/actionHandlers/index.ts +6 -6
  163. package/src/plugins/setting/actionHandlers/setSystemSettingValues.ts +30 -30
  164. package/src/plugins/setting/models/SystemSettingGroupSetting.ts +57 -57
  165. package/src/plugins/setting/models/SystemSettingItem.ts +48 -48
  166. package/src/plugins/setting/models/SystemSettingItemSetting.ts +73 -73
  167. package/src/plugins/setting/models/UserSettingGroupSetting.ts +57 -57
  168. package/src/plugins/setting/models/UserSettingItem.ts +55 -55
  169. package/src/plugins/setting/models/UserSettingItemSetting.ts +73 -73
  170. package/src/plugins/setting/models/index.ts +8 -8
  171. package/src/plugins/setting/routes/getSystemSettingValues.ts +15 -15
  172. package/src/plugins/setting/routes/getUserSettingValues.ts +15 -15
  173. package/src/plugins/setting/routes/index.ts +5 -5
  174. package/src/plugins/setting/routes/setSystemSettingValues.ts +15 -15
  175. package/src/plugins/stateMachine/StateMachinePlugin.ts +196 -196
  176. package/src/plugins/stateMachine/StateMachinePluginTypes.ts +48 -48
  177. package/src/plugins/stateMachine/actionHandlers/index.ts +4 -4
  178. package/src/plugins/stateMachine/actionHandlers/sendStateMachineEvent.ts +54 -54
  179. package/src/plugins/stateMachine/models/StateMachine.ts +42 -42
  180. package/src/plugins/stateMachine/models/index.ts +3 -3
  181. package/src/plugins/stateMachine/routes/index.ts +3 -3
  182. package/src/plugins/stateMachine/routes/sendStateMachineEvent.ts +15 -15
  183. package/src/plugins/stateMachine/stateMachineHelper.ts +36 -36
  184. package/src/plugins/webhooks/WebhooksPlugin.ts +148 -148
  185. package/src/plugins/webhooks/pluginConfig.ts +75 -75
  186. package/src/polyfill.ts +5 -5
  187. package/src/proxy/mod.ts +38 -38
  188. package/src/proxy/types.ts +21 -21
  189. package/src/queryBuilder/index.ts +1 -1
  190. package/src/queryBuilder/queryBuilder.ts +755 -755
  191. package/src/server.ts +567 -556
  192. package/src/types/cron-job-types.ts +71 -71
  193. package/src/types.ts +884 -882
  194. package/src/utilities/accessControlUtility.ts +33 -33
  195. package/src/utilities/entityUtility.ts +18 -18
  196. package/src/utilities/errorUtility.ts +15 -15
  197. package/src/utilities/fsUtility.ts +137 -137
  198. package/src/utilities/httpUtility.ts +19 -19
  199. package/src/utilities/jwtUtility.ts +26 -26
  200. package/src/utilities/passwordUtility.ts +26 -26
  201. package/src/utilities/pathUtility.ts +14 -14
  202. package/src/utilities/timeUtility.ts +17 -17
  203. package/src/utilities/typeUtility.ts +15 -15
  204. package/tsconfig.json +19 -19
@@ -1,73 +1,73 @@
1
- import { RpdDataModel } from "~/types";
2
-
3
- export default {
4
- maintainedBy: "settingPlugin",
5
- namespace: "svc",
6
- name: "user_setting_item_setting",
7
- singularCode: "user_setting_item_setting",
8
- pluralCode: "user_setting_item_settings",
9
- schema: "public",
10
- tableName: "user_setting_item_settings",
11
- properties: [
12
- {
13
- name: "id",
14
- code: "id",
15
- columnName: "id",
16
- type: "integer",
17
- required: true,
18
- autoIncrement: true,
19
- },
20
- {
21
- name: "group",
22
- code: "group",
23
- type: "relation",
24
- relation: "one",
25
- targetSingularCode: "user_setting_group_setting",
26
- targetIdColumnName: "group_id",
27
- required: true,
28
- },
29
- {
30
- name: "orderNum",
31
- code: "orderNum",
32
- columnName: "order_num",
33
- type: "integer",
34
- required: true,
35
- defaultValue: "0",
36
- },
37
- {
38
- name: "type",
39
- code: "type",
40
- columnName: "type",
41
- type: "text",
42
- required: true,
43
- },
44
- {
45
- name: "code",
46
- code: "code",
47
- columnName: "code",
48
- type: "text",
49
- required: true,
50
- },
51
- {
52
- name: "name",
53
- code: "name",
54
- columnName: "name",
55
- type: "text",
56
- required: false,
57
- },
58
- {
59
- name: "description",
60
- code: "description",
61
- columnName: "description",
62
- type: "text",
63
- required: false,
64
- },
65
- {
66
- name: "config",
67
- code: "config",
68
- columnName: "config",
69
- type: "json",
70
- required: false,
71
- },
72
- ],
73
- } as RpdDataModel;
1
+ import { RpdDataModel } from "~/types";
2
+
3
+ export default {
4
+ maintainedBy: "settingPlugin",
5
+ namespace: "svc",
6
+ name: "user_setting_item_setting",
7
+ singularCode: "user_setting_item_setting",
8
+ pluralCode: "user_setting_item_settings",
9
+ schema: "public",
10
+ tableName: "user_setting_item_settings",
11
+ properties: [
12
+ {
13
+ name: "id",
14
+ code: "id",
15
+ columnName: "id",
16
+ type: "integer",
17
+ required: true,
18
+ autoIncrement: true,
19
+ },
20
+ {
21
+ name: "group",
22
+ code: "group",
23
+ type: "relation",
24
+ relation: "one",
25
+ targetSingularCode: "user_setting_group_setting",
26
+ targetIdColumnName: "group_id",
27
+ required: true,
28
+ },
29
+ {
30
+ name: "orderNum",
31
+ code: "orderNum",
32
+ columnName: "order_num",
33
+ type: "integer",
34
+ required: true,
35
+ defaultValue: "0",
36
+ },
37
+ {
38
+ name: "type",
39
+ code: "type",
40
+ columnName: "type",
41
+ type: "text",
42
+ required: true,
43
+ },
44
+ {
45
+ name: "code",
46
+ code: "code",
47
+ columnName: "code",
48
+ type: "text",
49
+ required: true,
50
+ },
51
+ {
52
+ name: "name",
53
+ code: "name",
54
+ columnName: "name",
55
+ type: "text",
56
+ required: false,
57
+ },
58
+ {
59
+ name: "description",
60
+ code: "description",
61
+ columnName: "description",
62
+ type: "text",
63
+ required: false,
64
+ },
65
+ {
66
+ name: "config",
67
+ code: "config",
68
+ columnName: "config",
69
+ type: "json",
70
+ required: false,
71
+ },
72
+ ],
73
+ } as RpdDataModel;
@@ -1,8 +1,8 @@
1
- import SystemSettingGroupSetting from "./SystemSettingGroupSetting";
2
- import SystemSettingItem from "./SystemSettingItem";
3
- import SystemSettingItemSetting from "./SystemSettingItemSetting";
4
- import UserSettingGroupSetting from "./UserSettingGroupSetting";
5
- import UserSettingItem from "./UserSettingItem";
6
- import UserSettingItemSetting from "./UserSettingItemSetting";
7
-
8
- export default [SystemSettingGroupSetting, SystemSettingItem, SystemSettingItemSetting, UserSettingGroupSetting, UserSettingItem, UserSettingItemSetting];
1
+ import SystemSettingGroupSetting from "./SystemSettingGroupSetting";
2
+ import SystemSettingItem from "./SystemSettingItem";
3
+ import SystemSettingItemSetting from "./SystemSettingItemSetting";
4
+ import UserSettingGroupSetting from "./UserSettingGroupSetting";
5
+ import UserSettingItem from "./UserSettingItem";
6
+ import UserSettingItemSetting from "./UserSettingItemSetting";
7
+
8
+ export default [SystemSettingGroupSetting, SystemSettingItem, SystemSettingItemSetting, UserSettingGroupSetting, UserSettingItem, UserSettingItemSetting];
@@ -1,15 +1,15 @@
1
- import { RpdRoute } from "~/types";
2
-
3
- export default {
4
- namespace: "svc",
5
- name: "svc.getSystemSettingValues",
6
- code: "svc.getSystemSettingValues",
7
- type: "RESTful",
8
- method: "GET",
9
- endpoint: "/svc/systemSettingValues",
10
- actions: [
11
- {
12
- code: "getSystemSettingValues",
13
- },
14
- ],
15
- } satisfies RpdRoute;
1
+ import { RpdRoute } from "~/types";
2
+
3
+ export default {
4
+ namespace: "svc",
5
+ name: "svc.getSystemSettingValues",
6
+ code: "svc.getSystemSettingValues",
7
+ type: "RESTful",
8
+ method: "GET",
9
+ endpoint: "/svc/systemSettingValues",
10
+ actions: [
11
+ {
12
+ code: "getSystemSettingValues",
13
+ },
14
+ ],
15
+ } satisfies RpdRoute;
@@ -1,15 +1,15 @@
1
- import { RpdRoute } from "~/types";
2
-
3
- export default {
4
- namespace: "svc",
5
- name: "svc.getUserSettingValues",
6
- code: "svc.getUserSettingValues",
7
- type: "RESTful",
8
- method: "GET",
9
- endpoint: "/svc/userSettingValues",
10
- actions: [
11
- {
12
- code: "getUserSettingValues",
13
- },
14
- ],
15
- } satisfies RpdRoute;
1
+ import { RpdRoute } from "~/types";
2
+
3
+ export default {
4
+ namespace: "svc",
5
+ name: "svc.getUserSettingValues",
6
+ code: "svc.getUserSettingValues",
7
+ type: "RESTful",
8
+ method: "GET",
9
+ endpoint: "/svc/userSettingValues",
10
+ actions: [
11
+ {
12
+ code: "getUserSettingValues",
13
+ },
14
+ ],
15
+ } satisfies RpdRoute;
@@ -1,5 +1,5 @@
1
- import getUserSettingValues from "./getUserSettingValues";
2
- import getSystemSettingValues from "./getSystemSettingValues";
3
- import setSystemSettingValues from "./setSystemSettingValues";
4
-
5
- export default [getUserSettingValues, getSystemSettingValues, setSystemSettingValues];
1
+ import getUserSettingValues from "./getUserSettingValues";
2
+ import getSystemSettingValues from "./getSystemSettingValues";
3
+ import setSystemSettingValues from "./setSystemSettingValues";
4
+
5
+ export default [getUserSettingValues, getSystemSettingValues, setSystemSettingValues];
@@ -1,15 +1,15 @@
1
- import { RpdRoute } from "~/types";
2
-
3
- export default {
4
- namespace: "svc",
5
- name: "svc.setSystemSettingValues",
6
- code: "svc.setSystemSettingValues",
7
- type: "RESTful",
8
- method: "PATCH",
9
- endpoint: "/svc/systemSettingValues",
10
- actions: [
11
- {
12
- code: "setSystemSettingValues",
13
- },
14
- ],
15
- } satisfies RpdRoute;
1
+ import { RpdRoute } from "~/types";
2
+
3
+ export default {
4
+ namespace: "svc",
5
+ name: "svc.setSystemSettingValues",
6
+ code: "svc.setSystemSettingValues",
7
+ type: "RESTful",
8
+ method: "PATCH",
9
+ endpoint: "/svc/systemSettingValues",
10
+ actions: [
11
+ {
12
+ code: "setSystemSettingValues",
13
+ },
14
+ ],
15
+ } satisfies RpdRoute;
@@ -1,196 +1,196 @@
1
- /**
2
- * State machine plugin
3
- */
4
-
5
- import { CreateEntityOptions, RpdApplicationConfig, RpdDataModel, RpdDataModelProperty, UpdateEntityByIdOptions } from "~/types";
6
- import {
7
- IRpdServer,
8
- RapidPlugin,
9
- RpdConfigurationItemOptions,
10
- RpdServerPluginConfigurableTargetOptions,
11
- RpdServerPluginExtendingAbilities,
12
- } from "~/core/server";
13
-
14
- import pluginActionHandlers from "./actionHandlers";
15
- import pluginModels from "./models";
16
- import pluginRoutes from "./routes";
17
- import { filter, find, first, get, isEqual } from "lodash";
18
- import { PropertyStateMachineConfig } from "./StateMachinePluginTypes";
19
- import { isNullOrUndefined } from "~/utilities/typeUtility";
20
- import { getStateMachineNextSnapshot } from "./stateMachineHelper";
21
- import { getEntityPropertiesIncludingBase } from "~/helpers/metaHelper";
22
-
23
- class StateMachinePlugin implements RapidPlugin {
24
- get code(): string {
25
- return "stateMachinePlugin";
26
- }
27
-
28
- get description(): string {
29
- return null;
30
- }
31
-
32
- get extendingAbilities(): RpdServerPluginExtendingAbilities[] {
33
- return [];
34
- }
35
-
36
- get configurableTargets(): RpdServerPluginConfigurableTargetOptions[] {
37
- return [];
38
- }
39
-
40
- get configurations(): RpdConfigurationItemOptions[] {
41
- return [];
42
- }
43
-
44
- async registerActionHandlers(server: IRpdServer): Promise<any> {
45
- for (const actionHandler of pluginActionHandlers) {
46
- server.registerActionHandler(this, actionHandler);
47
- }
48
- }
49
-
50
- async configureModels(server: IRpdServer, applicationConfig: RpdApplicationConfig): Promise<any> {
51
- server.appendApplicationConfig({ models: pluginModels });
52
- }
53
-
54
- async configureRoutes(server: IRpdServer, applicationConfig: RpdApplicationConfig): Promise<any> {
55
- server.appendApplicationConfig({ routes: pluginRoutes });
56
- }
57
-
58
- async onApplicationLoaded(server: IRpdServer, applicationConfig: RpdApplicationConfig) {
59
- const models = server.getApplicationConfig().models;
60
- for (const model of models) {
61
- for (const property of getEntityPropertiesIncludingBase(server, model)) {
62
- const propertyStateMachineConfig: PropertyStateMachineConfig = property.config?.stateMachine;
63
- if (propertyStateMachineConfig) {
64
- const stateMachineCode = getStateMachineCode(model, property);
65
- const stateMachineConfig = propertyStateMachineConfig.config;
66
-
67
- const stateMachineDataAccessor = server.getDataAccessor({
68
- singularCode: "state_machine",
69
- });
70
- const stateMachine = await stateMachineDataAccessor.findOne(
71
- {
72
- filters: [
73
- {
74
- operator: "eq",
75
- field: "code",
76
- value: stateMachineCode,
77
- },
78
- ],
79
- },
80
- null,
81
- );
82
-
83
- if (stateMachine) {
84
- if (!isEqual(stateMachine.config, stateMachineConfig)) {
85
- await stateMachineDataAccessor.updateById(
86
- stateMachine.id,
87
- {
88
- config: stateMachineConfig,
89
- },
90
- null,
91
- );
92
- }
93
- } else {
94
- await stateMachineDataAccessor.create(
95
- {
96
- code: stateMachineCode,
97
- config: stateMachineConfig,
98
- },
99
- null,
100
- );
101
- }
102
- }
103
- }
104
- }
105
- }
106
-
107
- /**
108
- * 创建实体前的处理。
109
- * 当属性启用了状态机管理,如创建实体时没有指定该属性的状态值,则应将该属性设置为 stateMachine.config.initial 。
110
- * @param server
111
- * @param model
112
- * @param options
113
- */
114
- async beforeCreateEntity(server: IRpdServer, model: RpdDataModel, options: CreateEntityOptions) {
115
- for (const property of getEntityPropertiesIncludingBase(server, model)) {
116
- const isStateMachineEnabled = get(property.config, "stateMachine.enabled", false);
117
- if (isStateMachineEnabled && isNullOrUndefined(options.entity[property.code])) {
118
- const initialState = get(property.config, "stateMachine.config.initial", null);
119
- if (initialState) {
120
- options.entity[property.code] = initialState;
121
- }
122
- }
123
- }
124
- }
125
-
126
- /**
127
- * 更新实体前的处理。
128
- * 1. 对所有启用了状态机管理,且 transferControl 为 true 的属性,应禁止直接更新这些属性
129
- * 2. 当更新实体时指定了operation,则查找启用了状态机管理的属性。
130
- * 如果一个模型中存在多个属性启用了状态机管理,则以 options.stateProperty 中指定的为准。
131
- * 对于该状态属性应用 options.operation,使其转换到下一状态。
132
- * @param server
133
- * @param model
134
- * @param options
135
- */
136
- async beforeUpdateEntity(server: IRpdServer, model: RpdDataModel, options: UpdateEntityByIdOptions, currentEntity: any) {
137
- const entity = options.entityToSave;
138
-
139
- const stateMachineEnabledProperties: RpdDataModelProperty[] = [];
140
- for (const property of getEntityPropertiesIncludingBase(server, model)) {
141
- const isStateMachineEnabled = get(property.config, "stateMachine.enabled", false);
142
-
143
- if (isStateMachineEnabled) {
144
- stateMachineEnabledProperties.push(property);
145
-
146
- const isTransferControlEnabled = get(property.config, "stateMachine.transferControl", false);
147
- if (isTransferControlEnabled && !isNullOrUndefined(entity[property.code])) {
148
- throw new Error(`You're not allowed to change '${property.code}' property directly when transfer control is enabled, do an operation instead.`);
149
- }
150
- }
151
- }
152
-
153
- if (!options.operation) {
154
- return;
155
- }
156
-
157
- let statePropertiesToUpdate: RpdDataModelProperty[];
158
- const statePropertyCodes = options.stateProperties;
159
- if (statePropertyCodes && statePropertyCodes.length) {
160
- statePropertiesToUpdate = filter(stateMachineEnabledProperties, (property) => statePropertyCodes.includes(property.code));
161
- } else {
162
- statePropertiesToUpdate = stateMachineEnabledProperties;
163
- }
164
-
165
- if (!statePropertiesToUpdate.length) {
166
- throw new Error(`State machine property not found.`);
167
- }
168
-
169
- for (const statePropertyToUpdate of statePropertiesToUpdate) {
170
- const machineConfig = get(statePropertyToUpdate.config, "stateMachine.config", null);
171
- if (!machineConfig) {
172
- throw new Error(`State machine of property '${statePropertyToUpdate.code}' not configured.`);
173
- }
174
- machineConfig.id = getStateMachineCode(model, statePropertyToUpdate);
175
-
176
- const nextSnapshot = await getStateMachineNextSnapshot({
177
- machineConfig,
178
- context: {},
179
- currentState: currentEntity[statePropertyToUpdate.code],
180
- event: options.operation,
181
- });
182
-
183
- entity[statePropertyToUpdate.code] = nextSnapshot.value;
184
- }
185
- }
186
- }
187
-
188
- function getStateMachineCode(model: RpdDataModel, property: RpdDataModelProperty) {
189
- if (property.isBaseProperty) {
190
- return `propertyStateMachine.${model.namespace}.${model.base}.${property.code}`;
191
- } else {
192
- return `propertyStateMachine.${model.namespace}.${model.singularCode}.${property.code}`;
193
- }
194
- }
195
-
196
- export default StateMachinePlugin;
1
+ /**
2
+ * State machine plugin
3
+ */
4
+
5
+ import { CreateEntityOptions, RpdApplicationConfig, RpdDataModel, RpdDataModelProperty, UpdateEntityByIdOptions } from "~/types";
6
+ import {
7
+ IRpdServer,
8
+ RapidPlugin,
9
+ RpdConfigurationItemOptions,
10
+ RpdServerPluginConfigurableTargetOptions,
11
+ RpdServerPluginExtendingAbilities,
12
+ } from "~/core/server";
13
+
14
+ import pluginActionHandlers from "./actionHandlers";
15
+ import pluginModels from "./models";
16
+ import pluginRoutes from "./routes";
17
+ import { filter, find, first, get, isEqual } from "lodash";
18
+ import { PropertyStateMachineConfig } from "./StateMachinePluginTypes";
19
+ import { isNullOrUndefined } from "~/utilities/typeUtility";
20
+ import { getStateMachineNextSnapshot } from "./stateMachineHelper";
21
+ import { getEntityPropertiesIncludingBase } from "~/helpers/metaHelper";
22
+
23
+ class StateMachinePlugin implements RapidPlugin {
24
+ get code(): string {
25
+ return "stateMachinePlugin";
26
+ }
27
+
28
+ get description(): string {
29
+ return null;
30
+ }
31
+
32
+ get extendingAbilities(): RpdServerPluginExtendingAbilities[] {
33
+ return [];
34
+ }
35
+
36
+ get configurableTargets(): RpdServerPluginConfigurableTargetOptions[] {
37
+ return [];
38
+ }
39
+
40
+ get configurations(): RpdConfigurationItemOptions[] {
41
+ return [];
42
+ }
43
+
44
+ async registerActionHandlers(server: IRpdServer): Promise<any> {
45
+ for (const actionHandler of pluginActionHandlers) {
46
+ server.registerActionHandler(this, actionHandler);
47
+ }
48
+ }
49
+
50
+ async configureModels(server: IRpdServer, applicationConfig: RpdApplicationConfig): Promise<any> {
51
+ server.appendApplicationConfig({ models: pluginModels });
52
+ }
53
+
54
+ async configureRoutes(server: IRpdServer, applicationConfig: RpdApplicationConfig): Promise<any> {
55
+ server.appendApplicationConfig({ routes: pluginRoutes });
56
+ }
57
+
58
+ async onApplicationLoaded(server: IRpdServer, applicationConfig: RpdApplicationConfig) {
59
+ const models = server.getApplicationConfig().models;
60
+ for (const model of models) {
61
+ for (const property of getEntityPropertiesIncludingBase(server, model)) {
62
+ const propertyStateMachineConfig: PropertyStateMachineConfig = property.config?.stateMachine;
63
+ if (propertyStateMachineConfig) {
64
+ const stateMachineCode = getStateMachineCode(model, property);
65
+ const stateMachineConfig = propertyStateMachineConfig.config;
66
+
67
+ const stateMachineDataAccessor = server.getDataAccessor({
68
+ singularCode: "state_machine",
69
+ });
70
+ const stateMachine = await stateMachineDataAccessor.findOne(
71
+ {
72
+ filters: [
73
+ {
74
+ operator: "eq",
75
+ field: "code",
76
+ value: stateMachineCode,
77
+ },
78
+ ],
79
+ },
80
+ null,
81
+ );
82
+
83
+ if (stateMachine) {
84
+ if (!isEqual(stateMachine.config, stateMachineConfig)) {
85
+ await stateMachineDataAccessor.updateById(
86
+ stateMachine.id,
87
+ {
88
+ config: stateMachineConfig,
89
+ },
90
+ null,
91
+ );
92
+ }
93
+ } else {
94
+ await stateMachineDataAccessor.create(
95
+ {
96
+ code: stateMachineCode,
97
+ config: stateMachineConfig,
98
+ },
99
+ null,
100
+ );
101
+ }
102
+ }
103
+ }
104
+ }
105
+ }
106
+
107
+ /**
108
+ * 创建实体前的处理。
109
+ * 当属性启用了状态机管理,如创建实体时没有指定该属性的状态值,则应将该属性设置为 stateMachine.config.initial 。
110
+ * @param server
111
+ * @param model
112
+ * @param options
113
+ */
114
+ async beforeCreateEntity(server: IRpdServer, model: RpdDataModel, options: CreateEntityOptions) {
115
+ for (const property of getEntityPropertiesIncludingBase(server, model)) {
116
+ const isStateMachineEnabled = get(property.config, "stateMachine.enabled", false);
117
+ if (isStateMachineEnabled && isNullOrUndefined(options.entity[property.code])) {
118
+ const initialState = get(property.config, "stateMachine.config.initial", null);
119
+ if (initialState) {
120
+ options.entity[property.code] = initialState;
121
+ }
122
+ }
123
+ }
124
+ }
125
+
126
+ /**
127
+ * 更新实体前的处理。
128
+ * 1. 对所有启用了状态机管理,且 transferControl 为 true 的属性,应禁止直接更新这些属性
129
+ * 2. 当更新实体时指定了operation,则查找启用了状态机管理的属性。
130
+ * 如果一个模型中存在多个属性启用了状态机管理,则以 options.stateProperty 中指定的为准。
131
+ * 对于该状态属性应用 options.operation,使其转换到下一状态。
132
+ * @param server
133
+ * @param model
134
+ * @param options
135
+ */
136
+ async beforeUpdateEntity(server: IRpdServer, model: RpdDataModel, options: UpdateEntityByIdOptions, currentEntity: any) {
137
+ const entity = options.entityToSave;
138
+
139
+ const stateMachineEnabledProperties: RpdDataModelProperty[] = [];
140
+ for (const property of getEntityPropertiesIncludingBase(server, model)) {
141
+ const isStateMachineEnabled = get(property.config, "stateMachine.enabled", false);
142
+
143
+ if (isStateMachineEnabled) {
144
+ stateMachineEnabledProperties.push(property);
145
+
146
+ const isTransferControlEnabled = get(property.config, "stateMachine.transferControl", false);
147
+ if (isTransferControlEnabled && !isNullOrUndefined(entity[property.code])) {
148
+ throw new Error(`You're not allowed to change '${property.code}' property directly when transfer control is enabled, do an operation instead.`);
149
+ }
150
+ }
151
+ }
152
+
153
+ if (!options.operation) {
154
+ return;
155
+ }
156
+
157
+ let statePropertiesToUpdate: RpdDataModelProperty[];
158
+ const statePropertyCodes = options.stateProperties;
159
+ if (statePropertyCodes && statePropertyCodes.length) {
160
+ statePropertiesToUpdate = filter(stateMachineEnabledProperties, (property) => statePropertyCodes.includes(property.code));
161
+ } else {
162
+ statePropertiesToUpdate = stateMachineEnabledProperties;
163
+ }
164
+
165
+ if (!statePropertiesToUpdate.length) {
166
+ throw new Error(`State machine property not found.`);
167
+ }
168
+
169
+ for (const statePropertyToUpdate of statePropertiesToUpdate) {
170
+ const machineConfig = get(statePropertyToUpdate.config, "stateMachine.config", null);
171
+ if (!machineConfig) {
172
+ throw new Error(`State machine of property '${statePropertyToUpdate.code}' not configured.`);
173
+ }
174
+ machineConfig.id = getStateMachineCode(model, statePropertyToUpdate);
175
+
176
+ const nextSnapshot = await getStateMachineNextSnapshot({
177
+ machineConfig,
178
+ context: {},
179
+ currentState: currentEntity[statePropertyToUpdate.code],
180
+ event: options.operation,
181
+ });
182
+
183
+ entity[statePropertyToUpdate.code] = nextSnapshot.value;
184
+ }
185
+ }
186
+ }
187
+
188
+ function getStateMachineCode(model: RpdDataModel, property: RpdDataModelProperty) {
189
+ if (property.isBaseProperty) {
190
+ return `propertyStateMachine.${model.namespace}.${model.base}.${property.code}`;
191
+ } else {
192
+ return `propertyStateMachine.${model.namespace}.${model.singularCode}.${property.code}`;
193
+ }
194
+ }
195
+
196
+ export default StateMachinePlugin;