@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,146 +1,146 @@
1
- /**
2
- * Sequence plugin
3
- */
4
-
5
- import { CreateEntityOptions, RpdApplicationConfig, RpdDataModel, RpdDataModelProperty } 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 { PropertySequenceConfig } from "./SequencePluginTypes";
18
- import { isEqual } from "lodash";
19
- import SequenceService from "./SequenceService";
20
- import { isNullOrUndefined } from "~/utilities/typeUtility";
21
- import { getEntityPropertiesIncludingBase } from "~/helpers/metaHelper";
22
-
23
- class SequencePlugin implements RapidPlugin {
24
- #sequenceService!: SequenceService;
25
-
26
- get sequenceService() {
27
- return this.#sequenceService;
28
- }
29
-
30
- get code(): string {
31
- return "sequencePlugin";
32
- }
33
-
34
- get description(): string {
35
- return null;
36
- }
37
-
38
- get extendingAbilities(): RpdServerPluginExtendingAbilities[] {
39
- return [];
40
- }
41
-
42
- get configurableTargets(): RpdServerPluginConfigurableTargetOptions[] {
43
- return [];
44
- }
45
-
46
- get configurations(): RpdConfigurationItemOptions[] {
47
- return [];
48
- }
49
-
50
- async registerActionHandlers(server: IRpdServer): Promise<any> {
51
- for (const actionHandler of pluginActionHandlers) {
52
- server.registerActionHandler(this, actionHandler);
53
- }
54
- }
55
-
56
- async configureModels(server: IRpdServer, applicationConfig: RpdApplicationConfig): Promise<any> {
57
- server.appendApplicationConfig({ models: pluginModels });
58
- }
59
-
60
- async configureServices(server: IRpdServer, applicationConfig: RpdApplicationConfig): Promise<any> {
61
- this.#sequenceService = new SequenceService(server);
62
- server.registerService("sequenceService", this.#sequenceService);
63
- }
64
-
65
- async configureRoutes(server: IRpdServer, applicationConfig: RpdApplicationConfig): Promise<any> {
66
- server.appendApplicationConfig({ routes: pluginRoutes });
67
- }
68
-
69
- async onApplicationLoaded(server: IRpdServer, applicationConfig: RpdApplicationConfig) {
70
- const models = server.getApplicationConfig().models;
71
- for (const model of models) {
72
- for (const property of getEntityPropertiesIncludingBase(server, model)) {
73
- const propertySequenceConfig: PropertySequenceConfig = property.config?.sequence;
74
- if (propertySequenceConfig) {
75
- const ruleCode = getSequenceRuleCode(model, property);
76
- const ruleConfig = propertySequenceConfig.config;
77
-
78
- const sequenceRuleDataAccessor = server.getDataAccessor({
79
- singularCode: "sequence_rule",
80
- });
81
- const sequenceRule = await sequenceRuleDataAccessor.findOne(
82
- {
83
- filters: [
84
- {
85
- operator: "eq",
86
- field: {
87
- name: "code",
88
- },
89
- value: ruleCode,
90
- },
91
- ],
92
- },
93
- null,
94
- );
95
-
96
- if (sequenceRule) {
97
- if (isEqual(sequenceRule.config, ruleConfig)) {
98
- await sequenceRuleDataAccessor.updateById(
99
- sequenceRule.id,
100
- {
101
- config: ruleConfig,
102
- },
103
- null,
104
- );
105
- }
106
- } else {
107
- await sequenceRuleDataAccessor.create(
108
- {
109
- code: ruleCode,
110
- config: ruleConfig,
111
- },
112
- null,
113
- );
114
- }
115
- }
116
- }
117
- }
118
- }
119
-
120
- async beforeCreateEntity(server: IRpdServer, model: RpdDataModel, options: CreateEntityOptions) {
121
- const { routeContext, entity } = options;
122
- for (const property of getEntityPropertiesIncludingBase(server, model)) {
123
- const sequenceConfig: PropertySequenceConfig = property.config?.sequence;
124
- const propertyValue = entity[property.code];
125
- if (sequenceConfig && sequenceConfig.enabled && isNullOrUndefined(propertyValue)) {
126
- const ruleCode = getSequenceRuleCode(model, property);
127
- const numbers = await this.#sequenceService.generateSn(routeContext, server, {
128
- ruleCode,
129
- amount: 1,
130
- parameters: entity,
131
- });
132
- entity[property.code] = numbers[0];
133
- }
134
- }
135
- }
136
- }
137
-
138
- function getSequenceRuleCode(model: RpdDataModel, property: RpdDataModelProperty) {
139
- if (property.isBaseProperty) {
140
- return `propertyAutoGenerate.${model.namespace}.${model.base}.${property.code}`;
141
- } else {
142
- return `propertyAutoGenerate.${model.namespace}.${model.singularCode}.${property.code}`;
143
- }
144
- }
145
-
146
- export default SequencePlugin;
1
+ /**
2
+ * Sequence plugin
3
+ */
4
+
5
+ import { CreateEntityOptions, RpdApplicationConfig, RpdDataModel, RpdDataModelProperty } 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 { PropertySequenceConfig } from "./SequencePluginTypes";
18
+ import { isEqual } from "lodash";
19
+ import SequenceService from "./SequenceService";
20
+ import { isNullOrUndefined } from "~/utilities/typeUtility";
21
+ import { getEntityPropertiesIncludingBase } from "~/helpers/metaHelper";
22
+
23
+ class SequencePlugin implements RapidPlugin {
24
+ #sequenceService!: SequenceService;
25
+
26
+ get sequenceService() {
27
+ return this.#sequenceService;
28
+ }
29
+
30
+ get code(): string {
31
+ return "sequencePlugin";
32
+ }
33
+
34
+ get description(): string {
35
+ return null;
36
+ }
37
+
38
+ get extendingAbilities(): RpdServerPluginExtendingAbilities[] {
39
+ return [];
40
+ }
41
+
42
+ get configurableTargets(): RpdServerPluginConfigurableTargetOptions[] {
43
+ return [];
44
+ }
45
+
46
+ get configurations(): RpdConfigurationItemOptions[] {
47
+ return [];
48
+ }
49
+
50
+ async registerActionHandlers(server: IRpdServer): Promise<any> {
51
+ for (const actionHandler of pluginActionHandlers) {
52
+ server.registerActionHandler(this, actionHandler);
53
+ }
54
+ }
55
+
56
+ async configureModels(server: IRpdServer, applicationConfig: RpdApplicationConfig): Promise<any> {
57
+ server.appendApplicationConfig({ models: pluginModels });
58
+ }
59
+
60
+ async configureServices(server: IRpdServer, applicationConfig: RpdApplicationConfig): Promise<any> {
61
+ this.#sequenceService = new SequenceService(server);
62
+ server.registerService("sequenceService", this.#sequenceService);
63
+ }
64
+
65
+ async configureRoutes(server: IRpdServer, applicationConfig: RpdApplicationConfig): Promise<any> {
66
+ server.appendApplicationConfig({ routes: pluginRoutes });
67
+ }
68
+
69
+ async onApplicationLoaded(server: IRpdServer, applicationConfig: RpdApplicationConfig) {
70
+ const models = server.getApplicationConfig().models;
71
+ for (const model of models) {
72
+ for (const property of getEntityPropertiesIncludingBase(server, model)) {
73
+ const propertySequenceConfig: PropertySequenceConfig = property.config?.sequence;
74
+ if (propertySequenceConfig) {
75
+ const ruleCode = getSequenceRuleCode(model, property);
76
+ const ruleConfig = propertySequenceConfig.config;
77
+
78
+ const sequenceRuleDataAccessor = server.getDataAccessor({
79
+ singularCode: "sequence_rule",
80
+ });
81
+ const sequenceRule = await sequenceRuleDataAccessor.findOne(
82
+ {
83
+ filters: [
84
+ {
85
+ operator: "eq",
86
+ field: {
87
+ name: "code",
88
+ },
89
+ value: ruleCode,
90
+ },
91
+ ],
92
+ },
93
+ null,
94
+ );
95
+
96
+ if (sequenceRule) {
97
+ if (isEqual(sequenceRule.config, ruleConfig)) {
98
+ await sequenceRuleDataAccessor.updateById(
99
+ sequenceRule.id,
100
+ {
101
+ config: ruleConfig,
102
+ },
103
+ null,
104
+ );
105
+ }
106
+ } else {
107
+ await sequenceRuleDataAccessor.create(
108
+ {
109
+ code: ruleCode,
110
+ config: ruleConfig,
111
+ },
112
+ null,
113
+ );
114
+ }
115
+ }
116
+ }
117
+ }
118
+ }
119
+
120
+ async beforeCreateEntity(server: IRpdServer, model: RpdDataModel, options: CreateEntityOptions) {
121
+ const { routeContext, entity } = options;
122
+ for (const property of getEntityPropertiesIncludingBase(server, model)) {
123
+ const sequenceConfig: PropertySequenceConfig = property.config?.sequence;
124
+ const propertyValue = entity[property.code];
125
+ if (sequenceConfig && sequenceConfig.enabled && isNullOrUndefined(propertyValue)) {
126
+ const ruleCode = getSequenceRuleCode(model, property);
127
+ const numbers = await this.#sequenceService.generateSn(routeContext, server, {
128
+ ruleCode,
129
+ amount: 1,
130
+ parameters: entity,
131
+ });
132
+ entity[property.code] = numbers[0];
133
+ }
134
+ }
135
+ }
136
+ }
137
+
138
+ function getSequenceRuleCode(model: RpdDataModel, property: RpdDataModelProperty) {
139
+ if (property.isBaseProperty) {
140
+ return `propertyAutoGenerate.${model.namespace}.${model.base}.${property.code}`;
141
+ } else {
142
+ return `propertyAutoGenerate.${model.namespace}.${model.singularCode}.${property.code}`;
143
+ }
144
+ }
145
+
146
+ export default SequencePlugin;
@@ -1,69 +1,69 @@
1
- export type PropertySequenceConfig = {
2
- enabled: boolean;
3
- config: SequenceRuleConfig;
4
- };
5
-
6
- export type SequenceRuleConfig = {
7
- segments: SequenceSegmentConfig[];
8
- };
9
-
10
- export type SequenceSegmentConfig =
11
- | SequenceLiteralSegmentConfig
12
- | SequenceYearSegmentConfig
13
- | SequenceMonthSegmentConfig
14
- | SequenceDayOfMonthSegmentConfig
15
- | SequenceDayOfWeekSegmentConfig
16
- | SequenceDayOfYearSegmentConfig
17
- | SequenceParameterSegmentConfig
18
- | SequenceAutoIncrementSegmentConfig;
19
-
20
- export type SequenceLiteralSegmentConfig = {
21
- type: "literal";
22
- content: string;
23
- };
24
-
25
- export type SequenceYearSegmentConfig = {
26
- type: "year";
27
- padding?: string;
28
- length?: number;
29
- };
30
-
31
- export type SequenceMonthSegmentConfig = {
32
- type: "month";
33
- padding?: string;
34
- length?: number;
35
- };
36
-
37
- export type SequenceDayOfMonthSegmentConfig = {
38
- type: "dayOfMonth";
39
- padding?: string;
40
- length?: number;
41
- };
42
-
43
- export type SequenceDayOfWeekSegmentConfig = {
44
- type: "dayOfWeek";
45
- padding?: string;
46
- length?: number;
47
- };
48
-
49
- export type SequenceDayOfYearSegmentConfig = {
50
- type: "dayOfYear";
51
- padding?: string;
52
- length?: number;
53
- };
54
-
55
- export type SequenceParameterSegmentConfig = {
56
- type: "parameter";
57
- parameterName: string;
58
- defaultContent?: string;
59
- padding?: string;
60
- length?: number;
61
- };
62
-
63
- export type SequenceAutoIncrementSegmentConfig = {
64
- type: "autoIncrement";
65
- scope?: string;
66
- period?: "forever" | "day" | "month" | "year";
67
- padding?: string;
68
- length?: number;
69
- };
1
+ export type PropertySequenceConfig = {
2
+ enabled: boolean;
3
+ config: SequenceRuleConfig;
4
+ };
5
+
6
+ export type SequenceRuleConfig = {
7
+ segments: SequenceSegmentConfig[];
8
+ };
9
+
10
+ export type SequenceSegmentConfig =
11
+ | SequenceLiteralSegmentConfig
12
+ | SequenceYearSegmentConfig
13
+ | SequenceMonthSegmentConfig
14
+ | SequenceDayOfMonthSegmentConfig
15
+ | SequenceDayOfWeekSegmentConfig
16
+ | SequenceDayOfYearSegmentConfig
17
+ | SequenceParameterSegmentConfig
18
+ | SequenceAutoIncrementSegmentConfig;
19
+
20
+ export type SequenceLiteralSegmentConfig = {
21
+ type: "literal";
22
+ content: string;
23
+ };
24
+
25
+ export type SequenceYearSegmentConfig = {
26
+ type: "year";
27
+ padding?: string;
28
+ length?: number;
29
+ };
30
+
31
+ export type SequenceMonthSegmentConfig = {
32
+ type: "month";
33
+ padding?: string;
34
+ length?: number;
35
+ };
36
+
37
+ export type SequenceDayOfMonthSegmentConfig = {
38
+ type: "dayOfMonth";
39
+ padding?: string;
40
+ length?: number;
41
+ };
42
+
43
+ export type SequenceDayOfWeekSegmentConfig = {
44
+ type: "dayOfWeek";
45
+ padding?: string;
46
+ length?: number;
47
+ };
48
+
49
+ export type SequenceDayOfYearSegmentConfig = {
50
+ type: "dayOfYear";
51
+ padding?: string;
52
+ length?: number;
53
+ };
54
+
55
+ export type SequenceParameterSegmentConfig = {
56
+ type: "parameter";
57
+ parameterName: string;
58
+ defaultContent?: string;
59
+ padding?: string;
60
+ length?: number;
61
+ };
62
+
63
+ export type SequenceAutoIncrementSegmentConfig = {
64
+ type: "autoIncrement";
65
+ scope?: string;
66
+ period?: "forever" | "day" | "month" | "year";
67
+ padding?: string;
68
+ length?: number;
69
+ };
@@ -1,92 +1,92 @@
1
- import { IRpdServer } from "~/core/server";
2
- import segmentResolvers from "./segments";
3
- import { find } from "lodash";
4
- import { SequenceRuleConfig, SequenceSegmentConfig } from "./SequencePluginTypes";
5
- import { RouteContext } from "~/core/routeContext";
6
-
7
- export interface GenerateSequenceNumbersInput {
8
- ruleCode: string;
9
- parameters: Record<string, string>;
10
- amount: number;
11
- }
12
-
13
- export interface GenerateSequenceNumbersOutput {
14
- sequences: string[];
15
- }
16
-
17
- export interface SegmentResolver {
18
- segmentType: string;
19
- resolveSegmentValue(
20
- routeContext: RouteContext,
21
- server: IRpdServer,
22
- ruleCode: string,
23
- config: SequenceSegmentConfig,
24
- input: GenerateSequenceNumbersInput,
25
- ): Promise<string>;
26
- }
27
-
28
- export default class SequenceService {
29
- #server: IRpdServer;
30
-
31
- constructor(server: IRpdServer) {
32
- this.#server = server;
33
- }
34
-
35
- async generateSn(routeContext: RouteContext | null, server: IRpdServer, input: GenerateSequenceNumbersInput): Promise<string[]> {
36
- const sequenceNumbers = [];
37
- const { ruleCode, parameters } = input;
38
- let { amount } = input;
39
-
40
- if (!amount) {
41
- amount = 1;
42
- }
43
-
44
- const sequenceRuleDataAccessor = server.getDataAccessor({
45
- singularCode: "sequence_rule",
46
- });
47
-
48
- const sequenceRule = await sequenceRuleDataAccessor.findOne(
49
- {
50
- filters: [
51
- {
52
- operator: "eq",
53
- field: {
54
- name: "code",
55
- },
56
- value: ruleCode,
57
- },
58
- ],
59
- },
60
- routeContext?.getDbTransactionClient(),
61
- );
62
-
63
- if (!sequenceRule) {
64
- throw new Error(`Failed to generate sequence number. Sequence with code '${sequenceRule.code}' not found.`);
65
- }
66
-
67
- const sequenceConfig: SequenceRuleConfig = sequenceRule.config;
68
- if (!sequenceConfig || !sequenceConfig.segments) {
69
- throw new Error("Failed to generate sequence number. Sequence not configured.");
70
- }
71
-
72
- for (let i = 0; i < amount; i++) {
73
- let sequenceNumber: string = "";
74
-
75
- for (const segmentConfig of sequenceConfig.segments) {
76
- const segmentResolver: SegmentResolver = find(segmentResolvers, (item) => item.segmentType === segmentConfig.type);
77
- if (!segmentResolver) {
78
- // TODO: deal with unknown segment type
79
- server.getLogger().warn(`Unknown segment type "${segmentConfig.type}"`);
80
- continue;
81
- }
82
-
83
- const segment = await segmentResolver.resolveSegmentValue(routeContext, server, ruleCode, segmentConfig, input);
84
- sequenceNumber += segment;
85
- }
86
-
87
- sequenceNumbers.push(sequenceNumber);
88
- }
89
-
90
- return sequenceNumbers;
91
- }
92
- }
1
+ import { IRpdServer } from "~/core/server";
2
+ import segmentResolvers from "./segments";
3
+ import { find } from "lodash";
4
+ import { SequenceRuleConfig, SequenceSegmentConfig } from "./SequencePluginTypes";
5
+ import { RouteContext } from "~/core/routeContext";
6
+
7
+ export interface GenerateSequenceNumbersInput {
8
+ ruleCode: string;
9
+ parameters: Record<string, string>;
10
+ amount: number;
11
+ }
12
+
13
+ export interface GenerateSequenceNumbersOutput {
14
+ sequences: string[];
15
+ }
16
+
17
+ export interface SegmentResolver {
18
+ segmentType: string;
19
+ resolveSegmentValue(
20
+ routeContext: RouteContext,
21
+ server: IRpdServer,
22
+ ruleCode: string,
23
+ config: SequenceSegmentConfig,
24
+ input: GenerateSequenceNumbersInput,
25
+ ): Promise<string>;
26
+ }
27
+
28
+ export default class SequenceService {
29
+ #server: IRpdServer;
30
+
31
+ constructor(server: IRpdServer) {
32
+ this.#server = server;
33
+ }
34
+
35
+ async generateSn(routeContext: RouteContext | null, server: IRpdServer, input: GenerateSequenceNumbersInput): Promise<string[]> {
36
+ const sequenceNumbers = [];
37
+ const { ruleCode, parameters } = input;
38
+ let { amount } = input;
39
+
40
+ if (!amount) {
41
+ amount = 1;
42
+ }
43
+
44
+ const sequenceRuleDataAccessor = server.getDataAccessor({
45
+ singularCode: "sequence_rule",
46
+ });
47
+
48
+ const sequenceRule = await sequenceRuleDataAccessor.findOne(
49
+ {
50
+ filters: [
51
+ {
52
+ operator: "eq",
53
+ field: {
54
+ name: "code",
55
+ },
56
+ value: ruleCode,
57
+ },
58
+ ],
59
+ },
60
+ routeContext?.getDbTransactionClient(),
61
+ );
62
+
63
+ if (!sequenceRule) {
64
+ throw new Error(`Failed to generate sequence number. Sequence with code '${sequenceRule.code}' not found.`);
65
+ }
66
+
67
+ const sequenceConfig: SequenceRuleConfig = sequenceRule.config;
68
+ if (!sequenceConfig || !sequenceConfig.segments) {
69
+ throw new Error("Failed to generate sequence number. Sequence not configured.");
70
+ }
71
+
72
+ for (let i = 0; i < amount; i++) {
73
+ let sequenceNumber: string = "";
74
+
75
+ for (const segmentConfig of sequenceConfig.segments) {
76
+ const segmentResolver: SegmentResolver = find(segmentResolvers, (item) => item.segmentType === segmentConfig.type);
77
+ if (!segmentResolver) {
78
+ // TODO: deal with unknown segment type
79
+ server.getLogger().warn(`Unknown segment type "${segmentConfig.type}"`);
80
+ continue;
81
+ }
82
+
83
+ const segment = await segmentResolver.resolveSegmentValue(routeContext, server, ruleCode, segmentConfig, input);
84
+ sequenceNumber += segment;
85
+ }
86
+
87
+ sequenceNumbers.push(sequenceNumber);
88
+ }
89
+
90
+ return sequenceNumbers;
91
+ }
92
+ }
@@ -1,32 +1,32 @@
1
- import { ActionHandlerContext } from "~/core/actionHandler";
2
- import { RapidPlugin } from "~/core/server";
3
- import SequenceService, { GenerateSequenceNumbersInput, GenerateSequenceNumbersOutput } from "../SequenceService";
4
-
5
- export interface GenerateSequenceNumbersOptions {
6
- ruleCode: string;
7
- }
8
-
9
- export const code = "generateSn";
10
-
11
- export async function handler(plugin: RapidPlugin, ctx: ActionHandlerContext, options: GenerateSequenceNumbersOptions) {
12
- const { server, routerContext: routeContext } = ctx;
13
- const { response } = routeContext;
14
-
15
- const input: GenerateSequenceNumbersInput = ctx.input;
16
-
17
- if (options?.ruleCode) {
18
- input.ruleCode = options.ruleCode;
19
- }
20
-
21
- if (!input.ruleCode) {
22
- throw new Error(`Rule code is required when generating sequence numbers.`);
23
- }
24
-
25
- const sequenceService = server.getService<SequenceService>("sequenceService");
26
-
27
- const sequences = await sequenceService.generateSn(routeContext, server, input);
28
-
29
- ctx.output = {
30
- sequences,
31
- } satisfies GenerateSequenceNumbersOutput;
32
- }
1
+ import { ActionHandlerContext } from "~/core/actionHandler";
2
+ import { RapidPlugin } from "~/core/server";
3
+ import SequenceService, { GenerateSequenceNumbersInput, GenerateSequenceNumbersOutput } from "../SequenceService";
4
+
5
+ export interface GenerateSequenceNumbersOptions {
6
+ ruleCode: string;
7
+ }
8
+
9
+ export const code = "generateSn";
10
+
11
+ export async function handler(plugin: RapidPlugin, ctx: ActionHandlerContext, options: GenerateSequenceNumbersOptions) {
12
+ const { server, routerContext: routeContext } = ctx;
13
+ const { response } = routeContext;
14
+
15
+ const input: GenerateSequenceNumbersInput = ctx.input;
16
+
17
+ if (options?.ruleCode) {
18
+ input.ruleCode = options.ruleCode;
19
+ }
20
+
21
+ if (!input.ruleCode) {
22
+ throw new Error(`Rule code is required when generating sequence numbers.`);
23
+ }
24
+
25
+ const sequenceService = server.getService<SequenceService>("sequenceService");
26
+
27
+ const sequences = await sequenceService.generateSn(routeContext, server, input);
28
+
29
+ ctx.output = {
30
+ sequences,
31
+ } satisfies GenerateSequenceNumbersOutput;
32
+ }