@ruiapp/rapid-core 0.1.63 → 0.1.66
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.
- package/dist/helpers/entityHelpers.d.ts +3 -1
- package/dist/{dataAccess → helpers}/metaHelper.d.ts +3 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +879 -154
- package/dist/plugins/setting/SettingPlugin.d.ts +21 -0
- package/dist/plugins/setting/SettingPluginTypes.d.ts +33 -0
- package/dist/plugins/setting/SettingService.d.ts +22 -0
- package/dist/plugins/setting/actionHandlers/getSystemSettingValues.d.ts +7 -0
- package/dist/plugins/setting/actionHandlers/getUserSettingValues.d.ts +7 -0
- package/dist/plugins/setting/actionHandlers/index.d.ts +4 -0
- package/dist/plugins/setting/models/SystemSettingGroupSetting.d.ts +3 -0
- package/dist/plugins/setting/models/SystemSettingItem.d.ts +3 -0
- package/dist/plugins/setting/models/SystemSettingItemSetting.d.ts +3 -0
- package/dist/plugins/setting/models/UserSettingGroupSetting.d.ts +3 -0
- package/dist/plugins/setting/models/UserSettingItem.d.ts +3 -0
- package/dist/plugins/setting/models/UserSettingItemSetting.d.ts +3 -0
- package/dist/plugins/setting/models/index.d.ts +2 -0
- package/dist/plugins/setting/routes/getSystemSettingValues.d.ts +12 -0
- package/dist/plugins/setting/routes/getUserSettingValues.d.ts +12 -0
- package/dist/plugins/setting/routes/index.d.ts +12 -0
- package/dist/types.d.ts +4 -0
- package/package.json +1 -1
- package/rollup.config.js +16 -16
- package/src/bootstrapApplicationConfig.ts +552 -545
- package/src/core/actionHandler.ts +22 -22
- package/src/core/eventManager.ts +20 -20
- package/src/core/facility.ts +7 -7
- package/src/core/http/formDataParser.ts +89 -89
- package/src/core/http-types.ts +4 -4
- package/src/core/pluginManager.ts +175 -175
- package/src/core/providers/runtimeProvider.ts +5 -5
- package/src/core/request.ts +86 -86
- package/src/core/response.ts +76 -76
- package/src/core/routeContext.ts +43 -43
- package/src/core/routesBuilder.ts +88 -88
- package/src/core/server.ts +16 -1
- package/src/dataAccess/dataAccessTypes.ts +109 -109
- package/src/dataAccess/dataAccessor.ts +137 -137
- package/src/dataAccess/entityManager.ts +1298 -1292
- package/src/dataAccess/entityMapper.ts +4 -5
- package/src/dataAccess/propertyMapper.ts +27 -27
- package/src/deno-std/assert/assert.ts +9 -9
- package/src/deno-std/assert/assertion_error.ts +7 -7
- package/src/deno-std/datetime/to_imf.ts +32 -32
- package/src/deno-std/encoding/base64.ts +141 -141
- package/src/deno-std/http/cookie.ts +8 -1
- package/src/facilities/log/LogFacility.ts +35 -35
- package/src/helpers/entityHelpers.ts +76 -21
- package/src/{dataAccess → helpers}/filterHelper.ts +3 -1
- package/src/helpers/inputHelper.ts +11 -11
- package/src/{dataAccess → helpers}/metaHelper.ts +15 -6
- package/src/helpers/runCollectionEntityActionHandler.ts +6 -1
- package/src/index.ts +44 -41
- package/src/plugins/auth/AuthPlugin.ts +7 -1
- package/src/plugins/auth/actionHandlers/changePassword.ts +54 -54
- package/src/plugins/auth/actionHandlers/createSession.ts +63 -63
- package/src/plugins/auth/actionHandlers/deleteSession.ts +18 -18
- package/src/plugins/auth/actionHandlers/getMyProfile.ts +35 -35
- package/src/plugins/auth/actionHandlers/index.ts +8 -8
- package/src/plugins/auth/actionHandlers/resetPassword.ts +38 -38
- package/src/plugins/auth/models/AccessToken.ts +56 -56
- package/src/plugins/auth/models/index.ts +3 -3
- package/src/plugins/auth/routes/changePassword.ts +15 -15
- package/src/plugins/auth/routes/getMyProfile.ts +15 -15
- package/src/plugins/auth/routes/index.ts +7 -7
- package/src/plugins/auth/routes/resetPassword.ts +15 -15
- package/src/plugins/auth/routes/signin.ts +15 -15
- package/src/plugins/auth/routes/signout.ts +15 -15
- package/src/plugins/cronJob/CronJobPlugin.ts +7 -1
- package/src/plugins/cronJob/CronJobPluginTypes.ts +49 -49
- package/src/plugins/cronJob/actionHandlers/index.ts +4 -4
- package/src/plugins/cronJob/actionHandlers/runCronJob.ts +29 -29
- package/src/plugins/cronJob/routes/index.ts +3 -3
- package/src/plugins/cronJob/routes/runCronJob.ts +15 -15
- package/src/plugins/dataManage/DataManagePlugin.ts +7 -1
- package/src/plugins/dataManage/actionHandlers/addEntityRelations.ts +20 -20
- package/src/plugins/dataManage/actionHandlers/countCollectionEntities.ts +15 -15
- package/src/plugins/dataManage/actionHandlers/createCollectionEntitiesBatch.ts +42 -42
- package/src/plugins/dataManage/actionHandlers/createCollectionEntity.ts +24 -24
- package/src/plugins/dataManage/actionHandlers/deleteCollectionEntityById.ts +7 -4
- package/src/plugins/dataManage/actionHandlers/findCollectionEntities.ts +26 -26
- package/src/plugins/dataManage/actionHandlers/findCollectionEntityById.ts +21 -21
- package/src/plugins/dataManage/actionHandlers/queryDatabase.ts +22 -22
- package/src/plugins/dataManage/actionHandlers/removeEntityRelations.ts +20 -20
- package/src/plugins/dataManage/actionHandlers/updateCollectionEntityById.ts +35 -35
- package/src/plugins/entityAccessControl/EntityAccessControlPlugin.ts +146 -146
- package/src/plugins/fileManage/FileManagePlugin.ts +7 -1
- package/src/plugins/fileManage/actionHandlers/downloadDocument.ts +36 -36
- package/src/plugins/fileManage/actionHandlers/downloadFile.ts +28 -28
- package/src/plugins/fileManage/actionHandlers/uploadFile.ts +33 -33
- package/src/plugins/fileManage/routes/downloadDocument.ts +15 -15
- package/src/plugins/fileManage/routes/downloadFile.ts +15 -15
- package/src/plugins/fileManage/routes/index.ts +5 -5
- package/src/plugins/fileManage/routes/uploadFile.ts +15 -15
- package/src/plugins/metaManage/MetaManagePlugin.ts +37 -9
- package/src/plugins/metaManage/actionHandlers/getMetaModelDetail.ts +10 -10
- package/src/plugins/metaManage/actionHandlers/listMetaModels.ts +9 -9
- package/src/plugins/metaManage/actionHandlers/listMetaRoutes.ts +9 -9
- package/src/plugins/routeManage/RouteManagePlugin.ts +7 -1
- package/src/plugins/routeManage/actionHandlers/httpProxy.ts +13 -13
- package/src/plugins/sequence/SequencePlugin.ts +8 -2
- package/src/plugins/sequence/SequencePluginTypes.ts +9 -1
- package/src/plugins/sequence/SequenceService.ts +81 -81
- package/src/plugins/sequence/actionHandlers/generateSn.ts +32 -32
- package/src/plugins/sequence/actionHandlers/index.ts +4 -4
- package/src/plugins/sequence/models/SequenceAutoIncrementRecord.ts +49 -49
- package/src/plugins/sequence/models/SequenceRule.ts +42 -42
- package/src/plugins/sequence/models/index.ts +4 -4
- package/src/plugins/sequence/routes/generateSn.ts +15 -15
- package/src/plugins/sequence/routes/index.ts +3 -3
- package/src/plugins/sequence/segment-utility.ts +11 -11
- package/src/plugins/sequence/segments/autoIncrement.ts +6 -1
- package/src/plugins/sequence/segments/dayOfMonth.ts +6 -1
- package/src/plugins/sequence/segments/index.ts +9 -9
- package/src/plugins/sequence/segments/literal.ts +6 -1
- package/src/plugins/sequence/segments/month.ts +6 -1
- package/src/plugins/sequence/segments/parameter.ts +6 -1
- package/src/plugins/sequence/segments/year.ts +6 -1
- package/src/plugins/serverOperation/ServerOperationPlugin.ts +91 -91
- package/src/plugins/serverOperation/ServerOperationPluginTypes.ts +15 -15
- package/src/plugins/serverOperation/actionHandlers/index.ts +4 -4
- package/src/plugins/serverOperation/actionHandlers/runServerOperation.ts +15 -15
- package/src/plugins/setting/SettingPlugin.ts +68 -0
- package/src/plugins/setting/SettingPluginTypes.ts +37 -0
- package/src/plugins/setting/SettingService.ts +206 -0
- package/src/plugins/setting/actionHandlers/getSystemSettingValues.ts +30 -0
- package/src/plugins/setting/actionHandlers/getUserSettingValues.ts +38 -0
- package/src/plugins/setting/actionHandlers/index.ts +5 -0
- package/src/plugins/setting/models/SystemSettingGroupSetting.ts +56 -0
- package/src/plugins/setting/models/SystemSettingItem.ts +42 -0
- package/src/plugins/setting/models/SystemSettingItemSetting.ts +72 -0
- package/src/plugins/setting/models/UserSettingGroupSetting.ts +56 -0
- package/src/plugins/setting/models/UserSettingItem.ts +49 -0
- package/src/plugins/setting/models/UserSettingItemSetting.ts +72 -0
- package/src/plugins/setting/models/index.ts +8 -0
- package/src/plugins/setting/routes/getSystemSettingValues.ts +15 -0
- package/src/plugins/setting/routes/getUserSettingValues.ts +15 -0
- package/src/plugins/setting/routes/index.ts +4 -0
- package/src/plugins/stateMachine/StateMachinePlugin.ts +8 -2
- package/src/plugins/stateMachine/StateMachinePluginTypes.ts +9 -1
- package/src/plugins/stateMachine/actionHandlers/index.ts +4 -4
- package/src/plugins/stateMachine/actionHandlers/sendStateMachineEvent.ts +51 -51
- package/src/plugins/stateMachine/models/StateMachine.ts +42 -42
- package/src/plugins/stateMachine/models/index.ts +3 -3
- package/src/plugins/stateMachine/routes/index.ts +3 -3
- package/src/plugins/stateMachine/routes/sendStateMachineEvent.ts +15 -15
- package/src/plugins/stateMachine/stateMachineHelper.ts +36 -36
- package/src/plugins/webhooks/WebhooksPlugin.ts +13 -2
- package/src/plugins/webhooks/pluginConfig.ts +74 -74
- package/src/polyfill.ts +5 -5
- package/src/proxy/mod.ts +38 -38
- package/src/proxy/types.ts +21 -21
- package/src/queryBuilder/index.ts +1 -1
- package/src/queryBuilder/queryBuilder.ts +473 -473
- package/src/server.ts +23 -3
- package/src/types.ts +593 -589
- package/src/utilities/accessControlUtility.ts +33 -33
- package/src/utilities/errorUtility.ts +4 -6
- package/src/utilities/fsUtility.ts +61 -61
- package/src/utilities/httpUtility.ts +19 -19
- package/src/utilities/jwtUtility.ts +26 -26
- package/src/utilities/typeUtility.ts +11 -11
- package/tsconfig.json +19 -19
- package/dist/utilities/rapidUtility.d.ts +0 -2
- package/src/utilities/rapidUtility.ts +0 -5
- /package/dist/{dataAccess → helpers}/filterHelper.d.ts +0 -0
|
@@ -2,15 +2,30 @@
|
|
|
2
2
|
* Meta manager plugin
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
-
import {
|
|
6
|
-
|
|
5
|
+
import {
|
|
6
|
+
IQueryBuilder,
|
|
7
|
+
QuoteTableOptions,
|
|
8
|
+
RpdApplicationConfig,
|
|
9
|
+
RpdDataModel,
|
|
10
|
+
RpdDataModelProperty,
|
|
11
|
+
RpdDataPropertyTypes,
|
|
12
|
+
RpdEntityCreateEventPayload,
|
|
13
|
+
RpdEntityDeleteEventPayload,
|
|
14
|
+
RpdEntityUpdateEventPayload,
|
|
15
|
+
} from "~/types";
|
|
16
|
+
import {
|
|
17
|
+
IRpdServer,
|
|
18
|
+
RapidPlugin,
|
|
19
|
+
RpdConfigurationItemOptions,
|
|
20
|
+
RpdServerPluginConfigurableTargetOptions,
|
|
21
|
+
RpdServerPluginExtendingAbilities,
|
|
22
|
+
} from "~/core/server";
|
|
7
23
|
|
|
8
24
|
import * as listMetaModels from "./actionHandlers/listMetaModels";
|
|
9
25
|
import * as listMetaRoutes from "./actionHandlers/listMetaRoutes";
|
|
10
26
|
import * as getMetaModelDetail from "./actionHandlers/getMetaModelDetail";
|
|
11
|
-
import { isRelationProperty } from "~/utilities/rapidUtility";
|
|
12
27
|
import { find } from "lodash";
|
|
13
|
-
import { getEntityPropertiesIncludingBase } from "~/
|
|
28
|
+
import { getEntityPropertiesIncludingBase, isRelationProperty } from "~/helpers/metaHelper";
|
|
14
29
|
|
|
15
30
|
class MetaManager implements RapidPlugin {
|
|
16
31
|
get code(): string {
|
|
@@ -90,7 +105,10 @@ async function handleEntityUpdateEvent(server: IRpdServer, sender: RapidPlugin,
|
|
|
90
105
|
const modelChanges: Partial<RpdDataModel> = payload.changes;
|
|
91
106
|
if (modelChanges.tableName) {
|
|
92
107
|
const modelBefore: RpdDataModel = payload.before;
|
|
93
|
-
await server.queryDatabaseObject(
|
|
108
|
+
await server.queryDatabaseObject(
|
|
109
|
+
`ALTER TABLE ${queryBuilder.quoteTable(modelBefore)} RENAME TO ${queryBuilder.quoteTable(modelChanges as QuoteTableOptions)}`,
|
|
110
|
+
[],
|
|
111
|
+
);
|
|
94
112
|
}
|
|
95
113
|
}
|
|
96
114
|
}
|
|
@@ -220,7 +238,10 @@ async function syncDatabaseSchema(server: IRpdServer, applicationConfig: RpdAppl
|
|
|
220
238
|
}
|
|
221
239
|
} else if (property.relation === "many") {
|
|
222
240
|
if (property.linkTableName) {
|
|
223
|
-
const tableInDb = find(tablesInDb, {
|
|
241
|
+
const tableInDb = find(tablesInDb, {
|
|
242
|
+
table_schema: property.linkSchema || server.databaseConfig.dbDefaultSchema,
|
|
243
|
+
table_name: property.linkTableName,
|
|
244
|
+
});
|
|
224
245
|
if (!tableInDb) {
|
|
225
246
|
columnDDL = generateLinkTableDDL(queryBuilder, {
|
|
226
247
|
linkSchema: property.linkSchema,
|
|
@@ -289,13 +310,17 @@ async function syncDatabaseSchema(server: IRpdServer, applicationConfig: RpdAppl
|
|
|
289
310
|
} else {
|
|
290
311
|
const expectedColumnType = pgPropertyTypeColumnMap[property.type];
|
|
291
312
|
if (columnInDb.udt_name !== expectedColumnType) {
|
|
292
|
-
const sqlAlterColumnType = `alter table ${queryBuilder.quoteTable(model)} alter column ${queryBuilder.quoteObject(
|
|
313
|
+
const sqlAlterColumnType = `alter table ${queryBuilder.quoteTable(model)} alter column ${queryBuilder.quoteObject(
|
|
314
|
+
columnName,
|
|
315
|
+
)} type ${expectedColumnType}`;
|
|
293
316
|
await server.tryQueryDatabaseObject(sqlAlterColumnType);
|
|
294
317
|
}
|
|
295
318
|
|
|
296
319
|
if (property.defaultValue) {
|
|
297
320
|
if (!columnInDb.column_default) {
|
|
298
|
-
const sqlSetColumnDefault = `alter table ${queryBuilder.quoteTable(model)} alter column ${queryBuilder.quoteObject(columnName)} set default ${
|
|
321
|
+
const sqlSetColumnDefault = `alter table ${queryBuilder.quoteTable(model)} alter column ${queryBuilder.quoteObject(columnName)} set default ${
|
|
322
|
+
property.defaultValue
|
|
323
|
+
}`;
|
|
299
324
|
await server.tryQueryDatabaseObject(sqlSetColumnDefault);
|
|
300
325
|
}
|
|
301
326
|
} else {
|
|
@@ -335,7 +360,10 @@ async function syncDatabaseSchema(server: IRpdServer, applicationConfig: RpdAppl
|
|
|
335
360
|
constraint_name: expectedContraintName,
|
|
336
361
|
});
|
|
337
362
|
if (!constraintInDb) {
|
|
338
|
-
await server.queryDatabaseObject(
|
|
363
|
+
await server.queryDatabaseObject(
|
|
364
|
+
`ALTER TABLE ${queryBuilder.quoteTable(model)} ADD CONSTRAINT ${queryBuilder.quoteObject(expectedContraintName)} PRIMARY KEY (id);`,
|
|
365
|
+
[],
|
|
366
|
+
);
|
|
339
367
|
}
|
|
340
368
|
}
|
|
341
369
|
}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { ActionHandlerContext } from "~/core/actionHandler";
|
|
2
|
-
import { RapidPlugin } from "~/core/server";
|
|
3
|
-
|
|
4
|
-
export const code = "getMetaModelDetail";
|
|
5
|
-
|
|
6
|
-
export async function handler(plugin: RapidPlugin, ctx: ActionHandlerContext, options: any) {
|
|
7
|
-
const { server, input } = ctx;
|
|
8
|
-
const model = server.getModel(input);
|
|
9
|
-
ctx.output = model;
|
|
10
|
-
}
|
|
1
|
+
import { ActionHandlerContext } from "~/core/actionHandler";
|
|
2
|
+
import { RapidPlugin } from "~/core/server";
|
|
3
|
+
|
|
4
|
+
export const code = "getMetaModelDetail";
|
|
5
|
+
|
|
6
|
+
export async function handler(plugin: RapidPlugin, ctx: ActionHandlerContext, options: any) {
|
|
7
|
+
const { server, input } = ctx;
|
|
8
|
+
const model = server.getModel(input);
|
|
9
|
+
ctx.output = model;
|
|
10
|
+
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { ActionHandlerContext } from "~/core/actionHandler";
|
|
2
|
-
import { RapidPlugin } from "~/core/server";
|
|
3
|
-
|
|
4
|
-
export const code = "listMetaModels";
|
|
5
|
-
|
|
6
|
-
export async function handler(plugin: RapidPlugin, ctx: ActionHandlerContext, options: any) {
|
|
7
|
-
const { applicationConfig } = ctx;
|
|
8
|
-
ctx.output = { list: applicationConfig.models };
|
|
9
|
-
}
|
|
1
|
+
import { ActionHandlerContext } from "~/core/actionHandler";
|
|
2
|
+
import { RapidPlugin } from "~/core/server";
|
|
3
|
+
|
|
4
|
+
export const code = "listMetaModels";
|
|
5
|
+
|
|
6
|
+
export async function handler(plugin: RapidPlugin, ctx: ActionHandlerContext, options: any) {
|
|
7
|
+
const { applicationConfig } = ctx;
|
|
8
|
+
ctx.output = { list: applicationConfig.models };
|
|
9
|
+
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { ActionHandlerContext } from "~/core/actionHandler";
|
|
2
|
-
import { RapidPlugin } from "~/core/server";
|
|
3
|
-
|
|
4
|
-
export const code = "listMetaRoutes";
|
|
5
|
-
|
|
6
|
-
export async function handler(plugin: RapidPlugin, ctx: ActionHandlerContext, options: any) {
|
|
7
|
-
const { applicationConfig } = ctx;
|
|
8
|
-
ctx.output = { list: applicationConfig.routes };
|
|
9
|
-
}
|
|
1
|
+
import { ActionHandlerContext } from "~/core/actionHandler";
|
|
2
|
+
import { RapidPlugin } from "~/core/server";
|
|
3
|
+
|
|
4
|
+
export const code = "listMetaRoutes";
|
|
5
|
+
|
|
6
|
+
export async function handler(plugin: RapidPlugin, ctx: ActionHandlerContext, options: any) {
|
|
7
|
+
const { applicationConfig } = ctx;
|
|
8
|
+
ctx.output = { list: applicationConfig.routes };
|
|
9
|
+
}
|
|
@@ -3,7 +3,13 @@
|
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
5
|
import { RpdApplicationConfig } from "~/types";
|
|
6
|
-
import {
|
|
6
|
+
import {
|
|
7
|
+
RpdServerPluginExtendingAbilities,
|
|
8
|
+
RpdServerPluginConfigurableTargetOptions,
|
|
9
|
+
RpdConfigurationItemOptions,
|
|
10
|
+
IRpdServer,
|
|
11
|
+
RapidPlugin,
|
|
12
|
+
} from "~/core/server";
|
|
7
13
|
import * as httpProxy from "./actionHandlers/httpProxy";
|
|
8
14
|
|
|
9
15
|
class RouteManager implements RapidPlugin {
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import { RunProxyHandlerOptions } from "~/types";
|
|
2
|
-
import { doProxy } from "~/proxy/mod";
|
|
3
|
-
import { ActionHandlerContext } from "~/core/actionHandler";
|
|
4
|
-
import { RapidPlugin } from "~/core/server";
|
|
5
|
-
|
|
6
|
-
export const code = "httpProxy";
|
|
7
|
-
|
|
8
|
-
export async function handler(plugin: RapidPlugin, ctx: ActionHandlerContext, options: RunProxyHandlerOptions) {
|
|
9
|
-
const { logger } = ctx;
|
|
10
|
-
logger.debug(`Running ${code} handler...`);
|
|
11
|
-
|
|
12
|
-
await doProxy(ctx.routerContext, options);
|
|
13
|
-
}
|
|
1
|
+
import { RunProxyHandlerOptions } from "~/types";
|
|
2
|
+
import { doProxy } from "~/proxy/mod";
|
|
3
|
+
import { ActionHandlerContext } from "~/core/actionHandler";
|
|
4
|
+
import { RapidPlugin } from "~/core/server";
|
|
5
|
+
|
|
6
|
+
export const code = "httpProxy";
|
|
7
|
+
|
|
8
|
+
export async function handler(plugin: RapidPlugin, ctx: ActionHandlerContext, options: RunProxyHandlerOptions) {
|
|
9
|
+
const { logger } = ctx;
|
|
10
|
+
logger.debug(`Running ${code} handler...`);
|
|
11
|
+
|
|
12
|
+
await doProxy(ctx.routerContext, options);
|
|
13
|
+
}
|
|
@@ -3,7 +3,13 @@
|
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
5
|
import { CreateEntityOptions, RpdApplicationConfig, RpdDataModel, RpdDataModelProperty } from "~/types";
|
|
6
|
-
import {
|
|
6
|
+
import {
|
|
7
|
+
IRpdServer,
|
|
8
|
+
RapidPlugin,
|
|
9
|
+
RpdConfigurationItemOptions,
|
|
10
|
+
RpdServerPluginConfigurableTargetOptions,
|
|
11
|
+
RpdServerPluginExtendingAbilities,
|
|
12
|
+
} from "~/core/server";
|
|
7
13
|
|
|
8
14
|
import pluginActionHandlers from "./actionHandlers";
|
|
9
15
|
import pluginModels from "./models";
|
|
@@ -12,7 +18,7 @@ import { PropertySequenceConfig } from "./SequencePluginTypes";
|
|
|
12
18
|
import { isEqual } from "lodash";
|
|
13
19
|
import SequenceService from "./SequenceService";
|
|
14
20
|
import { isNullOrUndefined } from "~/utilities/typeUtility";
|
|
15
|
-
import { getEntityPropertiesIncludingBase } from "~/
|
|
21
|
+
import { getEntityPropertiesIncludingBase } from "~/helpers/metaHelper";
|
|
16
22
|
|
|
17
23
|
class SequencePlugin implements RapidPlugin {
|
|
18
24
|
#sequenceService!: SequenceService;
|
|
@@ -7,7 +7,15 @@ export type SequenceRuleConfig = {
|
|
|
7
7
|
segments: SequenceSegmentConfig[];
|
|
8
8
|
};
|
|
9
9
|
|
|
10
|
-
export type SequenceSegmentConfig =
|
|
10
|
+
export type SequenceSegmentConfig =
|
|
11
|
+
| SequenceLiteralSegmentConfig
|
|
12
|
+
| SequenceYearSegmentConfig
|
|
13
|
+
| SequenceMonthSegmentConfig
|
|
14
|
+
| SequenceDayOfMonthSegmentConfig
|
|
15
|
+
| SequenceDayOfWeekSegmentConfig
|
|
16
|
+
| SequenceDayOfYearSegmentConfig
|
|
17
|
+
| SequenceParameterSegmentConfig
|
|
18
|
+
| SequenceAutoIncrementSegmentConfig;
|
|
11
19
|
|
|
12
20
|
export type SequenceLiteralSegmentConfig = {
|
|
13
21
|
type: "literal";
|
|
@@ -1,81 +1,81 @@
|
|
|
1
|
-
import { IRpdServer } from "~/core/server";
|
|
2
|
-
import segmentResolvers from "./segments";
|
|
3
|
-
import { find } from "lodash";
|
|
4
|
-
import { SequenceRuleConfig, SequenceSegmentConfig } from "./SequencePluginTypes";
|
|
5
|
-
|
|
6
|
-
export interface GenerateSequenceNumbersInput {
|
|
7
|
-
ruleCode: string;
|
|
8
|
-
parameters: Record<string, string>;
|
|
9
|
-
amount: number;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
export interface GenerateSequenceNumbersOutput {
|
|
13
|
-
sequences: string[];
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export interface SegmentResolver {
|
|
17
|
-
segmentType: string;
|
|
18
|
-
resolveSegmentValue(server: IRpdServer, ruleCode: string, config: SequenceSegmentConfig, input: GenerateSequenceNumbersInput): Promise<string>;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
export default class SequenceService {
|
|
22
|
-
#server: IRpdServer;
|
|
23
|
-
|
|
24
|
-
constructor(server: IRpdServer) {
|
|
25
|
-
this.#server = server;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
async generateSn(server: IRpdServer, input: GenerateSequenceNumbersInput): Promise<string[]> {
|
|
29
|
-
const sequenceNumbers = [];
|
|
30
|
-
const { ruleCode, parameters } = input;
|
|
31
|
-
let { amount } = input;
|
|
32
|
-
|
|
33
|
-
if (!amount) {
|
|
34
|
-
amount = 1;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
const sequenceRuleDataAccessor = server.getDataAccessor({
|
|
38
|
-
singularCode: "sequence_rule",
|
|
39
|
-
});
|
|
40
|
-
|
|
41
|
-
const sequenceRule = await sequenceRuleDataAccessor.findOne({
|
|
42
|
-
filters: [
|
|
43
|
-
{
|
|
44
|
-
operator: "eq",
|
|
45
|
-
field: {
|
|
46
|
-
name: "code",
|
|
47
|
-
},
|
|
48
|
-
value: ruleCode,
|
|
49
|
-
},
|
|
50
|
-
],
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
if (!sequenceRule) {
|
|
54
|
-
throw new Error(`Failed to generate sequence number. Sequence with code '${sequenceRule.code}' not found.`);
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
const sequenceConfig: SequenceRuleConfig = sequenceRule.config;
|
|
58
|
-
if (!sequenceConfig || !sequenceConfig.segments) {
|
|
59
|
-
throw new Error("Failed to generate sequence number. Sequence not configured.");
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
for (let i = 0; i < amount; i++) {
|
|
63
|
-
let sequenceNumber: string = "";
|
|
64
|
-
|
|
65
|
-
for (const segmentConfig of sequenceConfig.segments) {
|
|
66
|
-
const segmentResolver: SegmentResolver = find(segmentResolvers, (item) => item.segmentType === segmentConfig.type);
|
|
67
|
-
if (!segmentResolver) {
|
|
68
|
-
// TODO: deal with unkown segment type
|
|
69
|
-
continue;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
const segment = await segmentResolver.resolveSegmentValue(server, ruleCode, segmentConfig, input);
|
|
73
|
-
sequenceNumber += segment;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
sequenceNumbers.push(sequenceNumber);
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
return sequenceNumbers;
|
|
80
|
-
}
|
|
81
|
-
}
|
|
1
|
+
import { IRpdServer } from "~/core/server";
|
|
2
|
+
import segmentResolvers from "./segments";
|
|
3
|
+
import { find } from "lodash";
|
|
4
|
+
import { SequenceRuleConfig, SequenceSegmentConfig } from "./SequencePluginTypes";
|
|
5
|
+
|
|
6
|
+
export interface GenerateSequenceNumbersInput {
|
|
7
|
+
ruleCode: string;
|
|
8
|
+
parameters: Record<string, string>;
|
|
9
|
+
amount: number;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export interface GenerateSequenceNumbersOutput {
|
|
13
|
+
sequences: string[];
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export interface SegmentResolver {
|
|
17
|
+
segmentType: string;
|
|
18
|
+
resolveSegmentValue(server: IRpdServer, ruleCode: string, config: SequenceSegmentConfig, input: GenerateSequenceNumbersInput): Promise<string>;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export default class SequenceService {
|
|
22
|
+
#server: IRpdServer;
|
|
23
|
+
|
|
24
|
+
constructor(server: IRpdServer) {
|
|
25
|
+
this.#server = server;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
async generateSn(server: IRpdServer, input: GenerateSequenceNumbersInput): Promise<string[]> {
|
|
29
|
+
const sequenceNumbers = [];
|
|
30
|
+
const { ruleCode, parameters } = input;
|
|
31
|
+
let { amount } = input;
|
|
32
|
+
|
|
33
|
+
if (!amount) {
|
|
34
|
+
amount = 1;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const sequenceRuleDataAccessor = server.getDataAccessor({
|
|
38
|
+
singularCode: "sequence_rule",
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
const sequenceRule = await sequenceRuleDataAccessor.findOne({
|
|
42
|
+
filters: [
|
|
43
|
+
{
|
|
44
|
+
operator: "eq",
|
|
45
|
+
field: {
|
|
46
|
+
name: "code",
|
|
47
|
+
},
|
|
48
|
+
value: ruleCode,
|
|
49
|
+
},
|
|
50
|
+
],
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
if (!sequenceRule) {
|
|
54
|
+
throw new Error(`Failed to generate sequence number. Sequence with code '${sequenceRule.code}' not found.`);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const sequenceConfig: SequenceRuleConfig = sequenceRule.config;
|
|
58
|
+
if (!sequenceConfig || !sequenceConfig.segments) {
|
|
59
|
+
throw new Error("Failed to generate sequence number. Sequence not configured.");
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
for (let i = 0; i < amount; i++) {
|
|
63
|
+
let sequenceNumber: string = "";
|
|
64
|
+
|
|
65
|
+
for (const segmentConfig of sequenceConfig.segments) {
|
|
66
|
+
const segmentResolver: SegmentResolver = find(segmentResolvers, (item) => item.segmentType === segmentConfig.type);
|
|
67
|
+
if (!segmentResolver) {
|
|
68
|
+
// TODO: deal with unkown segment type
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
const segment = await segmentResolver.resolveSegmentValue(server, ruleCode, segmentConfig, input);
|
|
73
|
+
sequenceNumber += segment;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
sequenceNumbers.push(sequenceNumber);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
return sequenceNumbers;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
@@ -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 } = ctx;
|
|
13
|
-
const { response } = routerContext;
|
|
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(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 } = ctx;
|
|
13
|
+
const { response } = routerContext;
|
|
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(server, input);
|
|
28
|
+
|
|
29
|
+
ctx.output = {
|
|
30
|
+
sequences,
|
|
31
|
+
} satisfies GenerateSequenceNumbersOutput;
|
|
32
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { IPluginActionHandler } from "~/core/actionHandler";
|
|
2
|
-
import * as generateSn from "./generateSn";
|
|
3
|
-
|
|
4
|
-
export default [generateSn] satisfies IPluginActionHandler[];
|
|
1
|
+
import { IPluginActionHandler } from "~/core/actionHandler";
|
|
2
|
+
import * as generateSn from "./generateSn";
|
|
3
|
+
|
|
4
|
+
export default [generateSn] satisfies IPluginActionHandler[];
|
|
@@ -1,49 +1,49 @@
|
|
|
1
|
-
import { RpdDataModel } from "~/types";
|
|
2
|
-
|
|
3
|
-
export default {
|
|
4
|
-
maintainedBy: "sequencePlugin",
|
|
5
|
-
namespace: "svc",
|
|
6
|
-
name: "sequence_auto_increment_record",
|
|
7
|
-
singularCode: "sequence_auto_increment_record",
|
|
8
|
-
pluralCode: "sequence_auto_increment_records",
|
|
9
|
-
schema: "public",
|
|
10
|
-
tableName: "sequence_auto_increment_records",
|
|
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: "ruleCode",
|
|
22
|
-
code: "ruleCode",
|
|
23
|
-
columnName: "rule_code",
|
|
24
|
-
type: "text",
|
|
25
|
-
required: true,
|
|
26
|
-
},
|
|
27
|
-
{
|
|
28
|
-
name: "scope",
|
|
29
|
-
code: "scope",
|
|
30
|
-
columnName: "scope",
|
|
31
|
-
type: "text",
|
|
32
|
-
required: false,
|
|
33
|
-
},
|
|
34
|
-
{
|
|
35
|
-
name: "currentValue",
|
|
36
|
-
code: "currentValue",
|
|
37
|
-
columnName: "current_value",
|
|
38
|
-
type: "integer",
|
|
39
|
-
required: true,
|
|
40
|
-
},
|
|
41
|
-
{
|
|
42
|
-
name: "updatedAt",
|
|
43
|
-
code: "updatedAt",
|
|
44
|
-
columnName: "updated_at",
|
|
45
|
-
type: "datetime",
|
|
46
|
-
required: true,
|
|
47
|
-
},
|
|
48
|
-
],
|
|
49
|
-
} as RpdDataModel;
|
|
1
|
+
import { RpdDataModel } from "~/types";
|
|
2
|
+
|
|
3
|
+
export default {
|
|
4
|
+
maintainedBy: "sequencePlugin",
|
|
5
|
+
namespace: "svc",
|
|
6
|
+
name: "sequence_auto_increment_record",
|
|
7
|
+
singularCode: "sequence_auto_increment_record",
|
|
8
|
+
pluralCode: "sequence_auto_increment_records",
|
|
9
|
+
schema: "public",
|
|
10
|
+
tableName: "sequence_auto_increment_records",
|
|
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: "ruleCode",
|
|
22
|
+
code: "ruleCode",
|
|
23
|
+
columnName: "rule_code",
|
|
24
|
+
type: "text",
|
|
25
|
+
required: true,
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
name: "scope",
|
|
29
|
+
code: "scope",
|
|
30
|
+
columnName: "scope",
|
|
31
|
+
type: "text",
|
|
32
|
+
required: false,
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
name: "currentValue",
|
|
36
|
+
code: "currentValue",
|
|
37
|
+
columnName: "current_value",
|
|
38
|
+
type: "integer",
|
|
39
|
+
required: true,
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
name: "updatedAt",
|
|
43
|
+
code: "updatedAt",
|
|
44
|
+
columnName: "updated_at",
|
|
45
|
+
type: "datetime",
|
|
46
|
+
required: true,
|
|
47
|
+
},
|
|
48
|
+
],
|
|
49
|
+
} as RpdDataModel;
|
|
@@ -1,42 +1,42 @@
|
|
|
1
|
-
import { RpdDataModel } from "~/types";
|
|
2
|
-
|
|
3
|
-
export default {
|
|
4
|
-
maintainedBy: "sequencePlugin",
|
|
5
|
-
namespace: "svc",
|
|
6
|
-
name: "sequence_rule",
|
|
7
|
-
singularCode: "sequence_rule",
|
|
8
|
-
pluralCode: "sequence_rules",
|
|
9
|
-
schema: "public",
|
|
10
|
-
tableName: "sequence_rules",
|
|
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: "code",
|
|
22
|
-
code: "code",
|
|
23
|
-
columnName: "code",
|
|
24
|
-
type: "text",
|
|
25
|
-
required: true,
|
|
26
|
-
},
|
|
27
|
-
{
|
|
28
|
-
name: "description",
|
|
29
|
-
code: "description",
|
|
30
|
-
columnName: "description",
|
|
31
|
-
type: "text",
|
|
32
|
-
required: false,
|
|
33
|
-
},
|
|
34
|
-
{
|
|
35
|
-
name: "config",
|
|
36
|
-
code: "config",
|
|
37
|
-
columnName: "config",
|
|
38
|
-
type: "json",
|
|
39
|
-
required: false,
|
|
40
|
-
},
|
|
41
|
-
],
|
|
42
|
-
} as RpdDataModel;
|
|
1
|
+
import { RpdDataModel } from "~/types";
|
|
2
|
+
|
|
3
|
+
export default {
|
|
4
|
+
maintainedBy: "sequencePlugin",
|
|
5
|
+
namespace: "svc",
|
|
6
|
+
name: "sequence_rule",
|
|
7
|
+
singularCode: "sequence_rule",
|
|
8
|
+
pluralCode: "sequence_rules",
|
|
9
|
+
schema: "public",
|
|
10
|
+
tableName: "sequence_rules",
|
|
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: "code",
|
|
22
|
+
code: "code",
|
|
23
|
+
columnName: "code",
|
|
24
|
+
type: "text",
|
|
25
|
+
required: true,
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
name: "description",
|
|
29
|
+
code: "description",
|
|
30
|
+
columnName: "description",
|
|
31
|
+
type: "text",
|
|
32
|
+
required: false,
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
name: "config",
|
|
36
|
+
code: "config",
|
|
37
|
+
columnName: "config",
|
|
38
|
+
type: "json",
|
|
39
|
+
required: false,
|
|
40
|
+
},
|
|
41
|
+
],
|
|
42
|
+
} as RpdDataModel;
|