@ruiapp/rapid-core 0.5.11 → 0.5.13

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 (185) hide show
  1. package/CHANGELOG.md +7 -7
  2. package/dist/facilities/cache/CacheFacilityTypes.d.ts +4 -2
  3. package/dist/facilities/cache/MemoryCache.d.ts +3 -1
  4. package/dist/index.d.ts +4 -0
  5. package/dist/index.js +131 -72
  6. package/dist/utilities/entityUtility.d.ts +1 -0
  7. package/dist/utilities/passwordUtility.d.ts +14 -0
  8. package/package.json +2 -2
  9. package/rollup.config.js +16 -16
  10. package/src/bootstrapApplicationConfig.ts +638 -638
  11. package/src/core/actionHandler.ts +22 -22
  12. package/src/core/eventManager.ts +20 -20
  13. package/src/core/facility.ts +7 -7
  14. package/src/core/http/formDataParser.ts +89 -89
  15. package/src/core/http-types.ts +4 -4
  16. package/src/core/pluginManager.ts +175 -175
  17. package/src/core/providers/runtimeProvider.ts +5 -5
  18. package/src/core/request.ts +95 -95
  19. package/src/core/response.ts +79 -79
  20. package/src/core/routeContext.ts +100 -100
  21. package/src/core/routesBuilder.ts +88 -88
  22. package/src/core/server.ts +145 -145
  23. package/src/dataAccess/columnTypeMapper.ts +22 -22
  24. package/src/dataAccess/dataAccessTypes.ts +163 -163
  25. package/src/dataAccess/dataAccessor.ts +135 -135
  26. package/src/dataAccess/entityManager.ts +1910 -1910
  27. package/src/dataAccess/entityMapper.ts +100 -100
  28. package/src/dataAccess/propertyMapper.ts +28 -28
  29. package/src/deno-std/assert/assert.ts +9 -9
  30. package/src/deno-std/assert/assertion_error.ts +7 -7
  31. package/src/deno-std/datetime/to_imf.ts +32 -32
  32. package/src/deno-std/encoding/base64.ts +141 -141
  33. package/src/deno-std/http/cookie.ts +372 -372
  34. package/src/facilities/cache/CacheFacilityTypes.ts +29 -27
  35. package/src/facilities/cache/CacheFactory.ts +31 -31
  36. package/src/facilities/cache/MemoryCache.ts +58 -42
  37. package/src/facilities/cache/MemoryCacheProvider.ts +15 -15
  38. package/src/facilities/log/LogFacility.ts +35 -35
  39. package/src/helpers/entityHelpers.ts +76 -76
  40. package/src/helpers/filterHelper.ts +148 -148
  41. package/src/helpers/inputHelper.ts +11 -11
  42. package/src/helpers/metaHelper.ts +104 -104
  43. package/src/helpers/runCollectionEntityActionHandler.ts +57 -57
  44. package/src/index.ts +67 -63
  45. package/src/plugins/auth/AuthPlugin.ts +93 -93
  46. package/src/plugins/auth/actionHandlers/changePassword.ts +60 -61
  47. package/src/plugins/auth/actionHandlers/createSession.ts +68 -68
  48. package/src/plugins/auth/actionHandlers/deleteSession.ts +18 -18
  49. package/src/plugins/auth/actionHandlers/getMyProfile.ts +35 -35
  50. package/src/plugins/auth/actionHandlers/index.ts +8 -8
  51. package/src/plugins/auth/actionHandlers/resetPassword.ts +44 -45
  52. package/src/plugins/auth/models/AccessToken.ts +56 -56
  53. package/src/plugins/auth/models/index.ts +3 -3
  54. package/src/plugins/auth/routes/changePassword.ts +15 -15
  55. package/src/plugins/auth/routes/getMyProfile.ts +15 -15
  56. package/src/plugins/auth/routes/index.ts +7 -7
  57. package/src/plugins/auth/routes/resetPassword.ts +15 -15
  58. package/src/plugins/auth/routes/signin.ts +15 -15
  59. package/src/plugins/auth/routes/signout.ts +15 -15
  60. package/src/plugins/auth/services/AuthService.ts +39 -39
  61. package/src/plugins/cronJob/CronJobPlugin.ts +112 -112
  62. package/src/plugins/cronJob/CronJobPluginTypes.ts +49 -49
  63. package/src/plugins/cronJob/actionHandlers/index.ts +4 -4
  64. package/src/plugins/cronJob/actionHandlers/runCronJob.ts +29 -29
  65. package/src/plugins/cronJob/routes/index.ts +3 -3
  66. package/src/plugins/cronJob/routes/runCronJob.ts +15 -15
  67. package/src/plugins/dataManage/DataManagePlugin.ts +163 -163
  68. package/src/plugins/dataManage/actionHandlers/addEntityRelations.ts +15 -15
  69. package/src/plugins/dataManage/actionHandlers/countCollectionEntities.ts +17 -17
  70. package/src/plugins/dataManage/actionHandlers/createCollectionEntitiesBatch.ts +81 -81
  71. package/src/plugins/dataManage/actionHandlers/createCollectionEntity.ts +20 -20
  72. package/src/plugins/dataManage/actionHandlers/deleteCollectionEntities.ts +45 -45
  73. package/src/plugins/dataManage/actionHandlers/deleteCollectionEntityById.ts +20 -20
  74. package/src/plugins/dataManage/actionHandlers/findCollectionEntities.ts +27 -27
  75. package/src/plugins/dataManage/actionHandlers/findCollectionEntityById.ts +30 -30
  76. package/src/plugins/dataManage/actionHandlers/queryDatabase.ts +22 -22
  77. package/src/plugins/dataManage/actionHandlers/removeEntityRelations.ts +15 -15
  78. package/src/plugins/dataManage/actionHandlers/updateCollectionEntityById.ts +38 -38
  79. package/src/plugins/entityAccessControl/EntityAccessControlPlugin.ts +146 -146
  80. package/src/plugins/fileManage/FileManagePlugin.ts +52 -52
  81. package/src/plugins/fileManage/actionHandlers/downloadDocument.ts +65 -65
  82. package/src/plugins/fileManage/actionHandlers/downloadFile.ts +44 -44
  83. package/src/plugins/fileManage/actionHandlers/uploadFile.ts +33 -33
  84. package/src/plugins/fileManage/routes/downloadDocument.ts +15 -15
  85. package/src/plugins/fileManage/routes/downloadFile.ts +15 -15
  86. package/src/plugins/fileManage/routes/index.ts +5 -5
  87. package/src/plugins/fileManage/routes/uploadFile.ts +15 -15
  88. package/src/plugins/license/LicensePlugin.ts +79 -79
  89. package/src/plugins/license/LicensePluginTypes.ts +95 -95
  90. package/src/plugins/license/LicenseService.ts +118 -118
  91. package/src/plugins/license/actionHandlers/getLicense.ts +18 -18
  92. package/src/plugins/license/actionHandlers/index.ts +4 -4
  93. package/src/plugins/license/helpers/certHelper.ts +21 -21
  94. package/src/plugins/license/helpers/cryptoHelper.ts +47 -47
  95. package/src/plugins/license/models/index.ts +1 -1
  96. package/src/plugins/license/routes/getLicense.ts +15 -15
  97. package/src/plugins/license/routes/index.ts +3 -3
  98. package/src/plugins/mail/MailPlugin.ts +74 -74
  99. package/src/plugins/mail/MailPluginTypes.ts +27 -27
  100. package/src/plugins/mail/MailService.ts +38 -38
  101. package/src/plugins/mail/actionHandlers/index.ts +3 -3
  102. package/src/plugins/mail/models/index.ts +1 -1
  103. package/src/plugins/mail/routes/index.ts +1 -1
  104. package/src/plugins/metaManage/MetaManagePlugin.ts +530 -530
  105. package/src/plugins/metaManage/actionHandlers/getMetaModelDetail.ts +10 -10
  106. package/src/plugins/metaManage/actionHandlers/listMetaModels.ts +9 -9
  107. package/src/plugins/metaManage/actionHandlers/listMetaRoutes.ts +9 -9
  108. package/src/plugins/notification/NotificationPlugin.ts +68 -68
  109. package/src/plugins/notification/NotificationPluginTypes.ts +13 -13
  110. package/src/plugins/notification/NotificationService.ts +25 -25
  111. package/src/plugins/notification/actionHandlers/index.ts +3 -3
  112. package/src/plugins/notification/models/Notification.ts +60 -60
  113. package/src/plugins/notification/models/index.ts +3 -3
  114. package/src/plugins/notification/routes/index.ts +1 -1
  115. package/src/plugins/routeManage/RouteManagePlugin.ts +62 -62
  116. package/src/plugins/routeManage/actionHandlers/httpProxy.ts +13 -13
  117. package/src/plugins/sequence/SequencePlugin.ts +146 -146
  118. package/src/plugins/sequence/SequencePluginTypes.ts +69 -69
  119. package/src/plugins/sequence/SequenceService.ts +92 -92
  120. package/src/plugins/sequence/actionHandlers/generateSn.ts +32 -32
  121. package/src/plugins/sequence/actionHandlers/index.ts +4 -4
  122. package/src/plugins/sequence/models/SequenceAutoIncrementRecord.ts +49 -49
  123. package/src/plugins/sequence/models/SequenceRule.ts +42 -42
  124. package/src/plugins/sequence/models/index.ts +4 -4
  125. package/src/plugins/sequence/routes/generateSn.ts +15 -15
  126. package/src/plugins/sequence/routes/index.ts +3 -3
  127. package/src/plugins/sequence/segment-utility.ts +11 -11
  128. package/src/plugins/sequence/segments/autoIncrement.ts +90 -90
  129. package/src/plugins/sequence/segments/dayOfMonth.ts +19 -19
  130. package/src/plugins/sequence/segments/index.ts +9 -9
  131. package/src/plugins/sequence/segments/literal.ts +16 -16
  132. package/src/plugins/sequence/segments/month.ts +19 -19
  133. package/src/plugins/sequence/segments/parameter.ts +20 -20
  134. package/src/plugins/sequence/segments/year.ts +19 -19
  135. package/src/plugins/serverOperation/ServerOperationPlugin.ts +91 -91
  136. package/src/plugins/serverOperation/ServerOperationPluginTypes.ts +15 -15
  137. package/src/plugins/serverOperation/actionHandlers/index.ts +4 -4
  138. package/src/plugins/serverOperation/actionHandlers/runServerOperation.ts +15 -15
  139. package/src/plugins/setting/SettingPlugin.ts +68 -68
  140. package/src/plugins/setting/SettingPluginTypes.ts +37 -37
  141. package/src/plugins/setting/SettingService.ts +213 -213
  142. package/src/plugins/setting/actionHandlers/getSystemSettingValues.ts +30 -30
  143. package/src/plugins/setting/actionHandlers/getUserSettingValues.ts +38 -38
  144. package/src/plugins/setting/actionHandlers/index.ts +6 -6
  145. package/src/plugins/setting/actionHandlers/setSystemSettingValues.ts +30 -30
  146. package/src/plugins/setting/models/SystemSettingGroupSetting.ts +57 -57
  147. package/src/plugins/setting/models/SystemSettingItem.ts +48 -48
  148. package/src/plugins/setting/models/SystemSettingItemSetting.ts +73 -73
  149. package/src/plugins/setting/models/UserSettingGroupSetting.ts +57 -57
  150. package/src/plugins/setting/models/UserSettingItem.ts +55 -55
  151. package/src/plugins/setting/models/UserSettingItemSetting.ts +73 -73
  152. package/src/plugins/setting/models/index.ts +8 -8
  153. package/src/plugins/setting/routes/getSystemSettingValues.ts +15 -15
  154. package/src/plugins/setting/routes/getUserSettingValues.ts +15 -15
  155. package/src/plugins/setting/routes/index.ts +5 -5
  156. package/src/plugins/setting/routes/setSystemSettingValues.ts +15 -15
  157. package/src/plugins/stateMachine/StateMachinePlugin.ts +196 -196
  158. package/src/plugins/stateMachine/StateMachinePluginTypes.ts +48 -48
  159. package/src/plugins/stateMachine/actionHandlers/index.ts +4 -4
  160. package/src/plugins/stateMachine/actionHandlers/sendStateMachineEvent.ts +54 -54
  161. package/src/plugins/stateMachine/models/StateMachine.ts +42 -42
  162. package/src/plugins/stateMachine/models/index.ts +3 -3
  163. package/src/plugins/stateMachine/routes/index.ts +3 -3
  164. package/src/plugins/stateMachine/routes/sendStateMachineEvent.ts +15 -15
  165. package/src/plugins/stateMachine/stateMachineHelper.ts +36 -36
  166. package/src/plugins/webhooks/WebhooksPlugin.ts +148 -148
  167. package/src/plugins/webhooks/pluginConfig.ts +75 -75
  168. package/src/polyfill.ts +5 -5
  169. package/src/proxy/mod.ts +38 -38
  170. package/src/proxy/types.ts +21 -21
  171. package/src/queryBuilder/index.ts +1 -1
  172. package/src/queryBuilder/queryBuilder.ts +668 -668
  173. package/src/server.ts +480 -480
  174. package/src/types.ts +722 -722
  175. package/src/utilities/accessControlUtility.ts +33 -33
  176. package/src/utilities/entityUtility.ts +18 -0
  177. package/src/utilities/errorUtility.ts +15 -15
  178. package/src/utilities/fsUtility.ts +61 -61
  179. package/src/utilities/httpUtility.ts +19 -19
  180. package/src/utilities/jwtUtility.ts +26 -26
  181. package/src/utilities/passwordUtility.ts +26 -0
  182. package/src/utilities/pathUtility.ts +14 -14
  183. package/src/utilities/timeUtility.ts +9 -9
  184. package/src/utilities/typeUtility.ts +15 -15
  185. 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;