@ruiapp/rapid-core 0.1.48 → 0.1.50
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/index.d.ts +0 -2
- package/dist/index.js +97 -86
- package/dist/server.d.ts +3 -1
- package/dist/types.d.ts +15 -1
- package/package.json +1 -1
- package/src/dataAccess/entityMapper.ts +4 -0
- package/src/index.ts +0 -3
- package/src/server.ts +93 -1
- package/src/types.ts +21 -1
- package/dist/plugins/entityWatch/EntityWatchPlugin.d.ts +0 -15
- package/dist/plugins/entityWatch/EntityWatchPluginTypes.d.ts +0 -16
- package/src/plugins/entityWatch/EntityWatchPlugin.ts +0 -96
- package/src/plugins/entityWatch/EntityWatchPluginTypes.ts +0 -21
package/dist/index.d.ts
CHANGED
|
@@ -21,6 +21,4 @@ export { default as CronJobPlugin } from "./plugins/cronJob/CronJobPlugin";
|
|
|
21
21
|
export * from "./plugins/cronJob/CronJobPluginTypes";
|
|
22
22
|
export { default as StateMachinePlugin } from "./plugins/stateMachine/StateMachinePlugin";
|
|
23
23
|
export * from "./plugins/stateMachine/StateMachinePluginTypes";
|
|
24
|
-
export { default as EntityWatchPlugin } from "./plugins/entityWatch/EntityWatchPlugin";
|
|
25
|
-
export * from "./plugins/entityWatch/EntityWatchPluginTypes";
|
|
26
24
|
export { default as EntityAccessControlPlugin } from "./plugins/entityAccessControl/EntityAccessControlPlugin";
|
package/dist/index.js
CHANGED
|
@@ -1858,6 +1858,9 @@ function mapDbRowToEntity(server, model, row, keepNonPropertyFields) {
|
|
|
1858
1858
|
propertyName = columnName;
|
|
1859
1859
|
}
|
|
1860
1860
|
}
|
|
1861
|
+
if (property?.config?.dataManage?.hidden) {
|
|
1862
|
+
return;
|
|
1863
|
+
}
|
|
1861
1864
|
if (isRelationProp) {
|
|
1862
1865
|
if (row[propertyName]) {
|
|
1863
1866
|
if (!result[propertyName]) {
|
|
@@ -2856,6 +2859,16 @@ class RapidServer {
|
|
|
2856
2859
|
#actionHandlersMapByCode;
|
|
2857
2860
|
#databaseAccessor;
|
|
2858
2861
|
#cachedDataAccessors;
|
|
2862
|
+
#entityBeforeCreateEventEmitters;
|
|
2863
|
+
#entityCreateEventEmitters;
|
|
2864
|
+
#entityBeforeUpdateEventEmitters;
|
|
2865
|
+
#entityUpdateEventEmitters;
|
|
2866
|
+
#entityBeforeDeleteEventEmitters;
|
|
2867
|
+
#entityDeleteEventEmitters;
|
|
2868
|
+
#entityAddRelationsEventEmitters;
|
|
2869
|
+
#entityRemoveRelationsEventEmitters;
|
|
2870
|
+
#entityWatchers;
|
|
2871
|
+
#appEntityWatchers;
|
|
2859
2872
|
#cachedEntityManager;
|
|
2860
2873
|
#services;
|
|
2861
2874
|
queryBuilder;
|
|
@@ -2879,6 +2892,24 @@ class RapidServer {
|
|
|
2879
2892
|
this.#databaseAccessor = options.databaseAccessor;
|
|
2880
2893
|
this.#cachedDataAccessors = new Map();
|
|
2881
2894
|
this.#cachedEntityManager = new Map();
|
|
2895
|
+
this.#entityBeforeCreateEventEmitters = new EventManager();
|
|
2896
|
+
this.#entityCreateEventEmitters = new EventManager();
|
|
2897
|
+
this.#entityBeforeUpdateEventEmitters = new EventManager();
|
|
2898
|
+
this.#entityUpdateEventEmitters = new EventManager();
|
|
2899
|
+
this.#entityBeforeDeleteEventEmitters = new EventManager();
|
|
2900
|
+
this.#entityDeleteEventEmitters = new EventManager();
|
|
2901
|
+
this.#entityAddRelationsEventEmitters = new EventManager();
|
|
2902
|
+
this.#entityRemoveRelationsEventEmitters = new EventManager();
|
|
2903
|
+
this.registerEventHandler("entity.beforeCreate", this.#handleEntityEvent.bind(this, "entity.beforeCreate"));
|
|
2904
|
+
this.registerEventHandler("entity.create", this.#handleEntityEvent.bind(this, "entity.create"));
|
|
2905
|
+
this.registerEventHandler("entity.beforeUpdate", this.#handleEntityEvent.bind(this, "entity.beforeUpdate"));
|
|
2906
|
+
this.registerEventHandler("entity.update", this.#handleEntityEvent.bind(this, "entity.update"));
|
|
2907
|
+
this.registerEventHandler("entity.beforeDelete", this.#handleEntityEvent.bind(this, "entity.beforeDelete"));
|
|
2908
|
+
this.registerEventHandler("entity.delete", this.#handleEntityEvent.bind(this, "entity.delete"));
|
|
2909
|
+
this.registerEventHandler("entity.addRelations", this.#handleEntityEvent.bind(this, "entity.addRelations"));
|
|
2910
|
+
this.registerEventHandler("entity.removeRelations", this.#handleEntityEvent.bind(this, "entity.removeRelations"));
|
|
2911
|
+
this.#entityWatchers = [];
|
|
2912
|
+
this.#appEntityWatchers = options.entityWatchers || [];
|
|
2882
2913
|
this.#services = new Map();
|
|
2883
2914
|
this.queryBuilder = new QueryBuilder({
|
|
2884
2915
|
dbDefaultSchema: options.databaseConfig.dbDefaultSchema,
|
|
@@ -2993,6 +3024,9 @@ class RapidServer {
|
|
|
2993
3024
|
this.#eventManager.on(eventName, listener);
|
|
2994
3025
|
return this;
|
|
2995
3026
|
}
|
|
3027
|
+
registerEntityWatcher(entityWatcher) {
|
|
3028
|
+
this.#entityWatchers.push(entityWatcher);
|
|
3029
|
+
}
|
|
2996
3030
|
async emitEvent(eventName, payload, sender) {
|
|
2997
3031
|
this.#logger.debug(`Emitting '${eventName}' event.`, { eventName, payload });
|
|
2998
3032
|
await this.#eventManager.emit(eventName, sender, payload);
|
|
@@ -3021,6 +3055,33 @@ class RapidServer {
|
|
|
3021
3055
|
await pluginManager.registerEventHandlers();
|
|
3022
3056
|
await pluginManager.registerMessageHandlers();
|
|
3023
3057
|
await pluginManager.registerTaskProcessors();
|
|
3058
|
+
this.#entityWatchers = this.#entityWatchers.concat(this.#appEntityWatchers);
|
|
3059
|
+
for (const entityWatcher of this.#entityWatchers) {
|
|
3060
|
+
if (entityWatcher.eventName === "entity.beforeCreate") {
|
|
3061
|
+
this.#entityBeforeCreateEventEmitters.on(entityWatcher.modelSingularCode, entityWatcher.handler);
|
|
3062
|
+
}
|
|
3063
|
+
else if (entityWatcher.eventName === "entity.create") {
|
|
3064
|
+
this.#entityCreateEventEmitters.on(entityWatcher.modelSingularCode, entityWatcher.handler);
|
|
3065
|
+
}
|
|
3066
|
+
else if (entityWatcher.eventName === "entity.beforeUpdate") {
|
|
3067
|
+
this.#entityBeforeUpdateEventEmitters.on(entityWatcher.modelSingularCode, entityWatcher.handler);
|
|
3068
|
+
}
|
|
3069
|
+
else if (entityWatcher.eventName === "entity.update") {
|
|
3070
|
+
this.#entityUpdateEventEmitters.on(entityWatcher.modelSingularCode, entityWatcher.handler);
|
|
3071
|
+
}
|
|
3072
|
+
else if (entityWatcher.eventName === "entity.beforeDelete") {
|
|
3073
|
+
this.#entityBeforeDeleteEventEmitters.on(entityWatcher.modelSingularCode, entityWatcher.handler);
|
|
3074
|
+
}
|
|
3075
|
+
else if (entityWatcher.eventName === "entity.delete") {
|
|
3076
|
+
this.#entityDeleteEventEmitters.on(entityWatcher.modelSingularCode, entityWatcher.handler);
|
|
3077
|
+
}
|
|
3078
|
+
else if (entityWatcher.eventName === "entity.addRelations") {
|
|
3079
|
+
this.#entityAddRelationsEventEmitters.on(entityWatcher.modelSingularCode, entityWatcher.handler);
|
|
3080
|
+
}
|
|
3081
|
+
else if (entityWatcher.eventName === "entity.removeRelations") {
|
|
3082
|
+
this.#entityRemoveRelationsEventEmitters.on(entityWatcher.modelSingularCode, entityWatcher.handler);
|
|
3083
|
+
}
|
|
3084
|
+
}
|
|
3024
3085
|
await this.configureApplication();
|
|
3025
3086
|
this.#logger.info(`Rapid server ready.`);
|
|
3026
3087
|
await pluginManager.onApplicationReady(this.#applicationConfig);
|
|
@@ -3100,6 +3161,42 @@ class RapidServer {
|
|
|
3100
3161
|
async beforeUpdateEntity(model, options, currentEntity) {
|
|
3101
3162
|
await this.#pluginManager.beforeUpdateEntity(model, options, currentEntity);
|
|
3102
3163
|
}
|
|
3164
|
+
#handleEntityEvent(eventName, sender, payload) {
|
|
3165
|
+
const { modelSingularCode, baseModelSingularCode } = payload;
|
|
3166
|
+
const entityWatchHandlerContext = {
|
|
3167
|
+
server: this,
|
|
3168
|
+
payload,
|
|
3169
|
+
};
|
|
3170
|
+
let emitter;
|
|
3171
|
+
if (eventName === "entity.beforeCreate") {
|
|
3172
|
+
emitter = this.#entityBeforeCreateEventEmitters;
|
|
3173
|
+
}
|
|
3174
|
+
else if (eventName === "entity.create") {
|
|
3175
|
+
emitter = this.#entityCreateEventEmitters;
|
|
3176
|
+
}
|
|
3177
|
+
else if (eventName === "entity.beforeUpdate") {
|
|
3178
|
+
emitter = this.#entityBeforeUpdateEventEmitters;
|
|
3179
|
+
}
|
|
3180
|
+
else if (eventName === "entity.update") {
|
|
3181
|
+
emitter = this.#entityUpdateEventEmitters;
|
|
3182
|
+
}
|
|
3183
|
+
else if (eventName === "entity.beforeDelete") {
|
|
3184
|
+
emitter = this.#entityBeforeDeleteEventEmitters;
|
|
3185
|
+
}
|
|
3186
|
+
else if (eventName === "entity.delete") {
|
|
3187
|
+
emitter = this.#entityDeleteEventEmitters;
|
|
3188
|
+
}
|
|
3189
|
+
else if (eventName === "entity.addRelations") {
|
|
3190
|
+
emitter = this.#entityAddRelationsEventEmitters;
|
|
3191
|
+
}
|
|
3192
|
+
else if (eventName === "entity.removeRelations") {
|
|
3193
|
+
emitter = this.#entityRemoveRelationsEventEmitters;
|
|
3194
|
+
}
|
|
3195
|
+
emitter.emit(modelSingularCode, entityWatchHandlerContext);
|
|
3196
|
+
if (baseModelSingularCode) {
|
|
3197
|
+
emitter.emit(baseModelSingularCode, entityWatchHandlerContext);
|
|
3198
|
+
}
|
|
3199
|
+
}
|
|
3103
3200
|
}
|
|
3104
3201
|
|
|
3105
3202
|
// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license.
|
|
@@ -5669,91 +5766,6 @@ function getStateMachineCode(model, property) {
|
|
|
5669
5766
|
}
|
|
5670
5767
|
}
|
|
5671
5768
|
|
|
5672
|
-
class EntityWatchPlugin {
|
|
5673
|
-
#createEventEmitters;
|
|
5674
|
-
#updateEventEmitters;
|
|
5675
|
-
#deleteEventEmitters;
|
|
5676
|
-
#addRelationsEventEmitters;
|
|
5677
|
-
#removeRelationsEventEmitters;
|
|
5678
|
-
constructor(options) {
|
|
5679
|
-
const { watchers } = options;
|
|
5680
|
-
this.#createEventEmitters = new EventManager();
|
|
5681
|
-
this.#updateEventEmitters = new EventManager();
|
|
5682
|
-
this.#deleteEventEmitters = new EventManager();
|
|
5683
|
-
this.#addRelationsEventEmitters = new EventManager();
|
|
5684
|
-
this.#removeRelationsEventEmitters = new EventManager();
|
|
5685
|
-
for (const watcher of watchers) {
|
|
5686
|
-
if (watcher.eventName === "entity.create") {
|
|
5687
|
-
this.#createEventEmitters.on(watcher.modelSingularCode, watcher.handler);
|
|
5688
|
-
}
|
|
5689
|
-
else if (watcher.eventName === "entity.update") {
|
|
5690
|
-
this.#updateEventEmitters.on(watcher.modelSingularCode, watcher.handler);
|
|
5691
|
-
}
|
|
5692
|
-
else if (watcher.eventName === "entity.delete") {
|
|
5693
|
-
this.#deleteEventEmitters.on(watcher.modelSingularCode, watcher.handler);
|
|
5694
|
-
}
|
|
5695
|
-
else if (watcher.eventName === "entity.addRelations") {
|
|
5696
|
-
this.#addRelationsEventEmitters.on(watcher.modelSingularCode, watcher.handler);
|
|
5697
|
-
}
|
|
5698
|
-
else if (watcher.eventName === "entity.removeRelations") {
|
|
5699
|
-
this.#removeRelationsEventEmitters.on(watcher.modelSingularCode, watcher.handler);
|
|
5700
|
-
}
|
|
5701
|
-
}
|
|
5702
|
-
}
|
|
5703
|
-
get code() {
|
|
5704
|
-
return "entityWatch";
|
|
5705
|
-
}
|
|
5706
|
-
get description() {
|
|
5707
|
-
return "";
|
|
5708
|
-
}
|
|
5709
|
-
get extendingAbilities() {
|
|
5710
|
-
return [];
|
|
5711
|
-
}
|
|
5712
|
-
get configurableTargets() {
|
|
5713
|
-
return [];
|
|
5714
|
-
}
|
|
5715
|
-
get configurations() {
|
|
5716
|
-
return [];
|
|
5717
|
-
}
|
|
5718
|
-
async registerEventHandlers(server) {
|
|
5719
|
-
server.registerEventHandler("entity.create", this.handleEntityEvent.bind(this, server, "entity.create"));
|
|
5720
|
-
server.registerEventHandler("entity.update", this.handleEntityEvent.bind(this, server, "entity.update"));
|
|
5721
|
-
server.registerEventHandler("entity.delete", this.handleEntityEvent.bind(this, server, "entity.delete"));
|
|
5722
|
-
server.registerEventHandler("entity.addRelations", this.handleEntityEvent.bind(this, server, "entity.addRelations"));
|
|
5723
|
-
server.registerEventHandler("entity.removeRelations", this.handleEntityEvent.bind(this, server, "entity.removeRelations"));
|
|
5724
|
-
}
|
|
5725
|
-
handleEntityEvent(server, eventName, sender, payload) {
|
|
5726
|
-
if (sender === this) {
|
|
5727
|
-
return;
|
|
5728
|
-
}
|
|
5729
|
-
const { modelSingularCode, baseModelSingularCode } = payload;
|
|
5730
|
-
const entityWatchHandlerContext = {
|
|
5731
|
-
server,
|
|
5732
|
-
payload,
|
|
5733
|
-
};
|
|
5734
|
-
let emitter;
|
|
5735
|
-
if (eventName === "entity.create") {
|
|
5736
|
-
emitter = this.#createEventEmitters;
|
|
5737
|
-
}
|
|
5738
|
-
else if (eventName === "entity.update") {
|
|
5739
|
-
emitter = this.#updateEventEmitters;
|
|
5740
|
-
}
|
|
5741
|
-
else if (eventName === "entity.delete") {
|
|
5742
|
-
emitter = this.#deleteEventEmitters;
|
|
5743
|
-
}
|
|
5744
|
-
else if (eventName === "entity.addRelations") {
|
|
5745
|
-
emitter = this.#addRelationsEventEmitters;
|
|
5746
|
-
}
|
|
5747
|
-
else if (eventName === "entity.removeRelations") {
|
|
5748
|
-
emitter = this.#removeRelationsEventEmitters;
|
|
5749
|
-
}
|
|
5750
|
-
emitter.emit(modelSingularCode, entityWatchHandlerContext);
|
|
5751
|
-
if (baseModelSingularCode) {
|
|
5752
|
-
emitter.emit(baseModelSingularCode, entityWatchHandlerContext);
|
|
5753
|
-
}
|
|
5754
|
-
}
|
|
5755
|
-
}
|
|
5756
|
-
|
|
5757
5769
|
function isAccessAllowed(policy, allowedActions) {
|
|
5758
5770
|
let isAnyCheckPassed = true;
|
|
5759
5771
|
let isAllCheckPassed = true;
|
|
@@ -5864,7 +5876,6 @@ exports.AuthPlugin = AuthPlugin;
|
|
|
5864
5876
|
exports.CronJobPlugin = CronJobPlugin;
|
|
5865
5877
|
exports.DataManagePlugin = DataManager;
|
|
5866
5878
|
exports.EntityAccessControlPlugin = EntityAccessControlPlugin;
|
|
5867
|
-
exports.EntityWatchPlugin = EntityWatchPlugin;
|
|
5868
5879
|
exports.FileManagePlugin = FileManager;
|
|
5869
5880
|
exports.GlobalRequest = GlobalRequest;
|
|
5870
5881
|
exports.MetaManagePlugin = MetaManager;
|
package/dist/server.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { GetDataAccessorOptions, GetModelOptions, IDatabaseAccessor, IDatabaseConfig, IQueryBuilder, IRpdDataAccessor, RpdApplicationConfig, RpdDataModel, RpdServerEventTypes, RapidServerConfig, RpdDataModelProperty, CreateEntityOptions, UpdateEntityByIdOptions } from "./types";
|
|
1
|
+
import { GetDataAccessorOptions, GetModelOptions, IDatabaseAccessor, IDatabaseConfig, IQueryBuilder, IRpdDataAccessor, RpdApplicationConfig, RpdDataModel, RpdServerEventTypes, RapidServerConfig, RpdDataModelProperty, CreateEntityOptions, UpdateEntityByIdOptions, EntityWatcherType } from "./types";
|
|
2
2
|
import { ActionHandler, ActionHandlerContext, IPluginActionHandler } from "./core/actionHandler";
|
|
3
3
|
import { IRpdServer, RapidPlugin } from "./core/server";
|
|
4
4
|
import { Next } from "./core/routeContext";
|
|
@@ -13,6 +13,7 @@ export interface InitServerOptions {
|
|
|
13
13
|
applicationConfig?: RpdApplicationConfig;
|
|
14
14
|
facilityFactories?: FacilityFactory[];
|
|
15
15
|
plugins?: RapidPlugin[];
|
|
16
|
+
entityWatchers?: EntityWatcherType[];
|
|
16
17
|
}
|
|
17
18
|
export declare class RapidServer implements IRpdServer {
|
|
18
19
|
#private;
|
|
@@ -31,6 +32,7 @@ export declare class RapidServer implements IRpdServer {
|
|
|
31
32
|
getModel(options: GetModelOptions): RpdDataModel | undefined;
|
|
32
33
|
getEntityManager<TEntity = any>(singularCode: string): EntityManager<TEntity>;
|
|
33
34
|
registerEventHandler<K extends keyof RpdServerEventTypes>(eventName: K, listener: (...args: RpdServerEventTypes[K]) => void): this;
|
|
35
|
+
registerEntityWatcher(entityWatcher: EntityWatcherType): void;
|
|
34
36
|
emitEvent<K extends keyof RpdServerEventTypes>(eventName: K, payload: RpdServerEventTypes[K][1], sender?: RapidPlugin): Promise<void>;
|
|
35
37
|
registerService(name: string, service: any): void;
|
|
36
38
|
getService<TService>(name: string): TService;
|
package/dist/types.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { RapidPlugin } from "./core/server";
|
|
1
|
+
import { IRpdServer, RapidPlugin } from "./core/server";
|
|
2
2
|
import { CountRowOptions, FindRowOptions } from "./dataAccess/dataAccessTypes";
|
|
3
3
|
export type RapidServerConfig = {
|
|
4
4
|
baseUrl?: string;
|
|
@@ -405,3 +405,17 @@ export interface RemoveEntityRelationsOptions {
|
|
|
405
405
|
[k: string]: any;
|
|
406
406
|
}[];
|
|
407
407
|
}
|
|
408
|
+
export type EntityWatcherType = EntityWatcher<"entity.create"> | EntityWatcher<"entity.update"> | EntityWatcher<"entity.delete"> | EntityWatcher<"entity.addRelations"> | EntityWatcher<"entity.removeRelations"> | EntityWatcher<any>;
|
|
409
|
+
export interface EntityWatcher<TEventName extends keyof RpdServerEventTypes = any> {
|
|
410
|
+
eventName: TEventName;
|
|
411
|
+
modelSingularCode: string;
|
|
412
|
+
handler: EntityWatchHandler<TEventName>;
|
|
413
|
+
}
|
|
414
|
+
export type EntityWatchHandler<TEventName extends keyof RpdServerEventTypes> = (ctx: EntityWatchHandlerContext<TEventName>) => Promise<void>;
|
|
415
|
+
export type EntityWatchHandlerContext<TEventName extends keyof RpdServerEventTypes> = {
|
|
416
|
+
server: IRpdServer;
|
|
417
|
+
payload: RpdServerEventTypes[TEventName][1];
|
|
418
|
+
};
|
|
419
|
+
export interface EntityWatchPluginInitOptions {
|
|
420
|
+
watchers: EntityWatcherType[];
|
|
421
|
+
}
|
package/package.json
CHANGED
package/src/index.ts
CHANGED
|
@@ -38,7 +38,4 @@ export * from "./plugins/cronJob/CronJobPluginTypes";
|
|
|
38
38
|
export { default as StateMachinePlugin } from "./plugins/stateMachine/StateMachinePlugin";
|
|
39
39
|
export * from "./plugins/stateMachine/StateMachinePluginTypes";
|
|
40
40
|
|
|
41
|
-
export { default as EntityWatchPlugin } from "./plugins/entityWatch/EntityWatchPlugin";
|
|
42
|
-
export * from "./plugins/entityWatch/EntityWatchPluginTypes";
|
|
43
|
-
|
|
44
41
|
export { default as EntityAccessControlPlugin } from "./plugins/entityAccessControl/EntityAccessControlPlugin";
|
package/src/server.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import DataAccessor from "./dataAccess/dataAccessor";
|
|
2
|
-
import { GetDataAccessorOptions, GetModelOptions, IDatabaseAccessor, IDatabaseConfig, IQueryBuilder, IRpdDataAccessor, RpdApplicationConfig, RpdDataModel, RpdServerEventTypes, RapidServerConfig, RpdDataModelProperty, CreateEntityOptions, UpdateEntityByIdOptions } from "./types";
|
|
2
|
+
import { GetDataAccessorOptions, GetModelOptions, IDatabaseAccessor, IDatabaseConfig, IQueryBuilder, IRpdDataAccessor, RpdApplicationConfig, RpdDataModel, RpdServerEventTypes, RapidServerConfig, RpdDataModelProperty, CreateEntityOptions, UpdateEntityByIdOptions, EntityWatchHandlerContext, EntityWatcherType, RpdEntityCreateEventPayload } from "./types";
|
|
3
3
|
|
|
4
4
|
import QueryBuilder from "./queryBuilder/queryBuilder";
|
|
5
5
|
import PluginManager from "./core/pluginManager";
|
|
@@ -23,6 +23,7 @@ export interface InitServerOptions {
|
|
|
23
23
|
applicationConfig?: RpdApplicationConfig;
|
|
24
24
|
facilityFactories?: FacilityFactory[];
|
|
25
25
|
plugins?: RapidPlugin[];
|
|
26
|
+
entityWatchers?: EntityWatcherType[];
|
|
26
27
|
}
|
|
27
28
|
|
|
28
29
|
export class RapidServer implements IRpdServer {
|
|
@@ -37,6 +38,18 @@ export class RapidServer implements IRpdServer {
|
|
|
37
38
|
#actionHandlersMapByCode: Map<string, ActionHandler>;
|
|
38
39
|
#databaseAccessor: IDatabaseAccessor;
|
|
39
40
|
#cachedDataAccessors: Map<string, DataAccessor>;
|
|
41
|
+
|
|
42
|
+
#entityBeforeCreateEventEmitters: EventManager<Record<string, [EntityWatchHandlerContext<any>]>>;
|
|
43
|
+
#entityCreateEventEmitters: EventManager<Record<string, [EntityWatchHandlerContext<any>]>>;
|
|
44
|
+
#entityBeforeUpdateEventEmitters: EventManager<Record<string, [EntityWatchHandlerContext<any>]>>;
|
|
45
|
+
#entityUpdateEventEmitters: EventManager<Record<string, [EntityWatchHandlerContext<any>]>>;
|
|
46
|
+
#entityBeforeDeleteEventEmitters: EventManager<Record<string, [EntityWatchHandlerContext<any>]>>;
|
|
47
|
+
#entityDeleteEventEmitters: EventManager<Record<string, [EntityWatchHandlerContext<any>]>>;
|
|
48
|
+
#entityAddRelationsEventEmitters: EventManager<Record<string, [EntityWatchHandlerContext<any>]>>;
|
|
49
|
+
#entityRemoveRelationsEventEmitters: EventManager<Record<string, [EntityWatchHandlerContext<any>]>>;
|
|
50
|
+
#entityWatchers: EntityWatcherType[];
|
|
51
|
+
#appEntityWatchers: EntityWatcherType[];
|
|
52
|
+
|
|
40
53
|
#cachedEntityManager: Map<string, EntityManager>;
|
|
41
54
|
#services: Map<string, any>;
|
|
42
55
|
queryBuilder: IQueryBuilder;
|
|
@@ -44,6 +57,7 @@ export class RapidServer implements IRpdServer {
|
|
|
44
57
|
databaseConfig: IDatabaseConfig;
|
|
45
58
|
#buildedRoutes: (ctx: any, next: any) => any;
|
|
46
59
|
|
|
60
|
+
|
|
47
61
|
constructor(options: InitServerOptions) {
|
|
48
62
|
this.#logger = options.logger;
|
|
49
63
|
|
|
@@ -65,6 +79,27 @@ export class RapidServer implements IRpdServer {
|
|
|
65
79
|
this.#cachedDataAccessors = new Map();
|
|
66
80
|
this.#cachedEntityManager = new Map();
|
|
67
81
|
|
|
82
|
+
this.#entityBeforeCreateEventEmitters = new EventManager();
|
|
83
|
+
this.#entityCreateEventEmitters = new EventManager();
|
|
84
|
+
this.#entityBeforeUpdateEventEmitters = new EventManager();
|
|
85
|
+
this.#entityUpdateEventEmitters = new EventManager();
|
|
86
|
+
this.#entityBeforeDeleteEventEmitters = new EventManager();
|
|
87
|
+
this.#entityDeleteEventEmitters = new EventManager();
|
|
88
|
+
this.#entityAddRelationsEventEmitters = new EventManager();
|
|
89
|
+
this.#entityRemoveRelationsEventEmitters = new EventManager();
|
|
90
|
+
|
|
91
|
+
this.registerEventHandler("entity.beforeCreate", this.#handleEntityEvent.bind(this, "entity.beforeCreate"));
|
|
92
|
+
this.registerEventHandler("entity.create", this.#handleEntityEvent.bind(this, "entity.create"));
|
|
93
|
+
this.registerEventHandler("entity.beforeUpdate", this.#handleEntityEvent.bind(this, "entity.beforeUpdate"));
|
|
94
|
+
this.registerEventHandler("entity.update", this.#handleEntityEvent.bind(this, "entity.update"));
|
|
95
|
+
this.registerEventHandler("entity.beforeDelete", this.#handleEntityEvent.bind(this, "entity.beforeDelete"));
|
|
96
|
+
this.registerEventHandler("entity.delete", this.#handleEntityEvent.bind(this, "entity.delete"));
|
|
97
|
+
this.registerEventHandler("entity.addRelations", this.#handleEntityEvent.bind(this, "entity.addRelations"));
|
|
98
|
+
this.registerEventHandler("entity.removeRelations", this.#handleEntityEvent.bind(this, "entity.removeRelations"));
|
|
99
|
+
|
|
100
|
+
this.#entityWatchers = [];
|
|
101
|
+
this.#appEntityWatchers = options.entityWatchers || [];
|
|
102
|
+
|
|
68
103
|
this.#services = new Map();
|
|
69
104
|
|
|
70
105
|
this.queryBuilder = new QueryBuilder({
|
|
@@ -196,6 +231,10 @@ export class RapidServer implements IRpdServer {
|
|
|
196
231
|
return this;
|
|
197
232
|
}
|
|
198
233
|
|
|
234
|
+
registerEntityWatcher(entityWatcher: EntityWatcherType) {
|
|
235
|
+
this.#entityWatchers.push(entityWatcher);
|
|
236
|
+
}
|
|
237
|
+
|
|
199
238
|
async emitEvent<K extends keyof RpdServerEventTypes>(eventName: K, payload: RpdServerEventTypes[K][1], sender?: RapidPlugin) {
|
|
200
239
|
this.#logger.debug(`Emitting '${eventName}' event.`, { eventName, payload });
|
|
201
240
|
await this.#eventManager.emit<K>(eventName, sender, payload as any);
|
|
@@ -231,6 +270,27 @@ export class RapidServer implements IRpdServer {
|
|
|
231
270
|
await pluginManager.registerMessageHandlers();
|
|
232
271
|
await pluginManager.registerTaskProcessors();
|
|
233
272
|
|
|
273
|
+
this.#entityWatchers = this.#entityWatchers.concat(this.#appEntityWatchers);
|
|
274
|
+
for (const entityWatcher of this.#entityWatchers) {
|
|
275
|
+
if (entityWatcher.eventName === "entity.beforeCreate") {
|
|
276
|
+
this.#entityBeforeCreateEventEmitters.on(entityWatcher.modelSingularCode, entityWatcher.handler);
|
|
277
|
+
} else if (entityWatcher.eventName === "entity.create") {
|
|
278
|
+
this.#entityCreateEventEmitters.on(entityWatcher.modelSingularCode, entityWatcher.handler);
|
|
279
|
+
} else if (entityWatcher.eventName === "entity.beforeUpdate") {
|
|
280
|
+
this.#entityBeforeUpdateEventEmitters.on(entityWatcher.modelSingularCode, entityWatcher.handler);
|
|
281
|
+
} else if (entityWatcher.eventName === "entity.update") {
|
|
282
|
+
this.#entityUpdateEventEmitters.on(entityWatcher.modelSingularCode, entityWatcher.handler);
|
|
283
|
+
} else if (entityWatcher.eventName === "entity.beforeDelete") {
|
|
284
|
+
this.#entityBeforeDeleteEventEmitters.on(entityWatcher.modelSingularCode, entityWatcher.handler);
|
|
285
|
+
} else if (entityWatcher.eventName === "entity.delete") {
|
|
286
|
+
this.#entityDeleteEventEmitters.on(entityWatcher.modelSingularCode, entityWatcher.handler);
|
|
287
|
+
} else if (entityWatcher.eventName === "entity.addRelations") {
|
|
288
|
+
this.#entityAddRelationsEventEmitters.on(entityWatcher.modelSingularCode, entityWatcher.handler);
|
|
289
|
+
} else if (entityWatcher.eventName === "entity.removeRelations") {
|
|
290
|
+
this.#entityRemoveRelationsEventEmitters.on(entityWatcher.modelSingularCode, entityWatcher.handler);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
|
|
234
294
|
await this.configureApplication();
|
|
235
295
|
|
|
236
296
|
this.#logger.info(`Rapid server ready.`);
|
|
@@ -327,4 +387,36 @@ export class RapidServer implements IRpdServer {
|
|
|
327
387
|
async beforeUpdateEntity(model: RpdDataModel, options: UpdateEntityByIdOptions, currentEntity: any) {
|
|
328
388
|
await this.#pluginManager.beforeUpdateEntity(model, options, currentEntity);
|
|
329
389
|
}
|
|
390
|
+
|
|
391
|
+
#handleEntityEvent(eventName: keyof RpdServerEventTypes, sender: RapidPlugin, payload: RpdEntityCreateEventPayload) {
|
|
392
|
+
const { modelSingularCode, baseModelSingularCode } = payload;
|
|
393
|
+
const entityWatchHandlerContext: EntityWatchHandlerContext<typeof eventName> = {
|
|
394
|
+
server: this,
|
|
395
|
+
payload,
|
|
396
|
+
};
|
|
397
|
+
|
|
398
|
+
let emitter: EventManager<Record<string, [EntityWatchHandlerContext<any>]>>;
|
|
399
|
+
if (eventName === "entity.beforeCreate") {
|
|
400
|
+
emitter = this.#entityBeforeCreateEventEmitters;
|
|
401
|
+
} else if (eventName === "entity.create") {
|
|
402
|
+
emitter = this.#entityCreateEventEmitters;
|
|
403
|
+
} else if (eventName === "entity.beforeUpdate") {
|
|
404
|
+
emitter = this.#entityBeforeUpdateEventEmitters;
|
|
405
|
+
} else if (eventName === "entity.update") {
|
|
406
|
+
emitter = this.#entityUpdateEventEmitters;
|
|
407
|
+
} else if (eventName === "entity.beforeDelete") {
|
|
408
|
+
emitter = this.#entityBeforeDeleteEventEmitters;
|
|
409
|
+
} else if (eventName === "entity.delete") {
|
|
410
|
+
emitter = this.#entityDeleteEventEmitters;
|
|
411
|
+
} else if (eventName === "entity.addRelations") {
|
|
412
|
+
emitter = this.#entityAddRelationsEventEmitters;
|
|
413
|
+
} else if (eventName === "entity.removeRelations") {
|
|
414
|
+
emitter = this.#entityRemoveRelationsEventEmitters;
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
emitter.emit(modelSingularCode, entityWatchHandlerContext);
|
|
418
|
+
if (baseModelSingularCode) {
|
|
419
|
+
emitter.emit(baseModelSingularCode, entityWatchHandlerContext);
|
|
420
|
+
}
|
|
421
|
+
}
|
|
330
422
|
}
|
package/src/types.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { RapidPlugin } from "./core/server";
|
|
1
|
+
import { IRpdServer, RapidPlugin } from "./core/server";
|
|
2
2
|
import { CountRowOptions, FindRowOptions } from "./dataAccess/dataAccessTypes";
|
|
3
3
|
|
|
4
4
|
export type RapidServerConfig = {
|
|
@@ -467,3 +467,23 @@ export interface RemoveEntityRelationsOptions {
|
|
|
467
467
|
property: string;
|
|
468
468
|
relations: { id?: number; [k: string]: any }[];
|
|
469
469
|
}
|
|
470
|
+
|
|
471
|
+
|
|
472
|
+
export type EntityWatcherType = EntityWatcher<"entity.create"> | EntityWatcher<"entity.update"> | EntityWatcher<"entity.delete"> | EntityWatcher<"entity.addRelations"> | EntityWatcher<"entity.removeRelations"> | EntityWatcher<any>;
|
|
473
|
+
|
|
474
|
+
export interface EntityWatcher<TEventName extends keyof RpdServerEventTypes = any> {
|
|
475
|
+
eventName: TEventName;
|
|
476
|
+
modelSingularCode: string;
|
|
477
|
+
handler: EntityWatchHandler<TEventName>;
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
export type EntityWatchHandler<TEventName extends keyof RpdServerEventTypes> = (ctx: EntityWatchHandlerContext<TEventName>) => Promise<void>;
|
|
481
|
+
|
|
482
|
+
export type EntityWatchHandlerContext<TEventName extends keyof RpdServerEventTypes> = {
|
|
483
|
+
server: IRpdServer;
|
|
484
|
+
payload: RpdServerEventTypes[TEventName][1];
|
|
485
|
+
};
|
|
486
|
+
|
|
487
|
+
export interface EntityWatchPluginInitOptions {
|
|
488
|
+
watchers: EntityWatcherType[];
|
|
489
|
+
}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import type { RpdEntityCreateEventPayload, RpdServerEventTypes } from "../../types";
|
|
2
|
-
import { IRpdServer, RapidPlugin, RpdConfigurationItemOptions, RpdServerPluginConfigurableTargetOptions, RpdServerPluginExtendingAbilities } from "../../core/server";
|
|
3
|
-
import { EntityWatchPluginInitOptions } from "./EntityWatchPluginTypes";
|
|
4
|
-
declare class EntityWatchPlugin implements RapidPlugin {
|
|
5
|
-
#private;
|
|
6
|
-
constructor(options: EntityWatchPluginInitOptions);
|
|
7
|
-
get code(): string;
|
|
8
|
-
get description(): string;
|
|
9
|
-
get extendingAbilities(): RpdServerPluginExtendingAbilities[];
|
|
10
|
-
get configurableTargets(): RpdServerPluginConfigurableTargetOptions[];
|
|
11
|
-
get configurations(): RpdConfigurationItemOptions[];
|
|
12
|
-
registerEventHandlers(server: IRpdServer): Promise<any>;
|
|
13
|
-
handleEntityEvent(server: IRpdServer, eventName: keyof RpdServerEventTypes, sender: RapidPlugin, payload: RpdEntityCreateEventPayload): void;
|
|
14
|
-
}
|
|
15
|
-
export default EntityWatchPlugin;
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { IRpdServer } from "../../core/server";
|
|
2
|
-
import { RpdServerEventTypes } from "../../types";
|
|
3
|
-
export type EntityWatcherType = EntityWatcher<"entity.create"> | EntityWatcher<"entity.update"> | EntityWatcher<"entity.delete"> | EntityWatcher<"entity.addRelations"> | EntityWatcher<"entity.removeRelations"> | EntityWatcher<any>;
|
|
4
|
-
export interface EntityWatcher<TEventName extends keyof RpdServerEventTypes = any> {
|
|
5
|
-
eventName: TEventName;
|
|
6
|
-
modelSingularCode: string;
|
|
7
|
-
handler: EntityWatchHandler<TEventName>;
|
|
8
|
-
}
|
|
9
|
-
export type EntityWatchHandler<TEventName extends keyof RpdServerEventTypes> = (ctx: EntityWatchHandlerContext<TEventName>) => Promise<void>;
|
|
10
|
-
export type EntityWatchHandlerContext<TEventName extends keyof RpdServerEventTypes> = {
|
|
11
|
-
server: IRpdServer;
|
|
12
|
-
payload: RpdServerEventTypes[TEventName][1];
|
|
13
|
-
};
|
|
14
|
-
export interface EntityWatchPluginInitOptions {
|
|
15
|
-
watchers: EntityWatcherType[];
|
|
16
|
-
}
|
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
import type { RpdEntityCreateEventPayload, RpdServerEventTypes } from "~/types";
|
|
2
|
-
import { IRpdServer, RapidPlugin, RpdConfigurationItemOptions, RpdServerPluginConfigurableTargetOptions, RpdServerPluginExtendingAbilities } from "~/core/server";
|
|
3
|
-
import { EntityWatchHandlerContext, EntityWatchPluginInitOptions } from "./EntityWatchPluginTypes";
|
|
4
|
-
import EventManager from "~/core/eventManager";
|
|
5
|
-
|
|
6
|
-
class EntityWatchPlugin implements RapidPlugin {
|
|
7
|
-
#createEventEmitters: EventManager<Record<string, [EntityWatchHandlerContext<any>]>>;
|
|
8
|
-
#updateEventEmitters: EventManager<Record<string, [EntityWatchHandlerContext<any>]>>;
|
|
9
|
-
#deleteEventEmitters: EventManager<Record<string, [EntityWatchHandlerContext<any>]>>;
|
|
10
|
-
#addRelationsEventEmitters: EventManager<Record<string, [EntityWatchHandlerContext<any>]>>;
|
|
11
|
-
#removeRelationsEventEmitters: EventManager<Record<string, [EntityWatchHandlerContext<any>]>>;
|
|
12
|
-
|
|
13
|
-
constructor(options: EntityWatchPluginInitOptions) {
|
|
14
|
-
const { watchers } = options;
|
|
15
|
-
|
|
16
|
-
this.#createEventEmitters = new EventManager();
|
|
17
|
-
this.#updateEventEmitters = new EventManager();
|
|
18
|
-
this.#deleteEventEmitters = new EventManager();
|
|
19
|
-
this.#addRelationsEventEmitters = new EventManager();
|
|
20
|
-
this.#removeRelationsEventEmitters = new EventManager();
|
|
21
|
-
|
|
22
|
-
for (const watcher of watchers) {
|
|
23
|
-
if (watcher.eventName === "entity.create") {
|
|
24
|
-
this.#createEventEmitters.on(watcher.modelSingularCode, watcher.handler);
|
|
25
|
-
} else if (watcher.eventName === "entity.update") {
|
|
26
|
-
this.#updateEventEmitters.on(watcher.modelSingularCode, watcher.handler);
|
|
27
|
-
} else if (watcher.eventName === "entity.delete") {
|
|
28
|
-
this.#deleteEventEmitters.on(watcher.modelSingularCode, watcher.handler);
|
|
29
|
-
} else if (watcher.eventName === "entity.addRelations") {
|
|
30
|
-
this.#addRelationsEventEmitters.on(watcher.modelSingularCode, watcher.handler);
|
|
31
|
-
} else if (watcher.eventName === "entity.removeRelations") {
|
|
32
|
-
this.#removeRelationsEventEmitters.on(watcher.modelSingularCode, watcher.handler);
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
get code(): string {
|
|
38
|
-
return "entityWatch";
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
get description(): string {
|
|
42
|
-
return "";
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
get extendingAbilities(): RpdServerPluginExtendingAbilities[] {
|
|
46
|
-
return [];
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
get configurableTargets(): RpdServerPluginConfigurableTargetOptions[] {
|
|
50
|
-
return [];
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
get configurations(): RpdConfigurationItemOptions[] {
|
|
54
|
-
return [];
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
async registerEventHandlers(server: IRpdServer): Promise<any> {
|
|
58
|
-
server.registerEventHandler("entity.create", this.handleEntityEvent.bind(this, server, "entity.create"));
|
|
59
|
-
server.registerEventHandler("entity.update", this.handleEntityEvent.bind(this, server, "entity.update"));
|
|
60
|
-
server.registerEventHandler("entity.delete", this.handleEntityEvent.bind(this, server, "entity.delete"));
|
|
61
|
-
server.registerEventHandler("entity.addRelations", this.handleEntityEvent.bind(this, server, "entity.addRelations"));
|
|
62
|
-
server.registerEventHandler("entity.removeRelations", this.handleEntityEvent.bind(this, server, "entity.removeRelations"));
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
handleEntityEvent(server: IRpdServer, eventName: keyof RpdServerEventTypes, sender: RapidPlugin, payload: RpdEntityCreateEventPayload) {
|
|
66
|
-
if (sender === this) {
|
|
67
|
-
return;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
const { modelSingularCode, baseModelSingularCode } = payload;
|
|
71
|
-
const entityWatchHandlerContext: EntityWatchHandlerContext<typeof eventName> = {
|
|
72
|
-
server,
|
|
73
|
-
payload,
|
|
74
|
-
};
|
|
75
|
-
|
|
76
|
-
let emitter: EventManager<Record<string, [EntityWatchHandlerContext<any>]>>;
|
|
77
|
-
if (eventName === "entity.create") {
|
|
78
|
-
emitter = this.#createEventEmitters;
|
|
79
|
-
} else if (eventName === "entity.update") {
|
|
80
|
-
emitter = this.#updateEventEmitters;
|
|
81
|
-
} else if (eventName === "entity.delete") {
|
|
82
|
-
emitter = this.#deleteEventEmitters;
|
|
83
|
-
} else if (eventName === "entity.addRelations") {
|
|
84
|
-
emitter = this.#addRelationsEventEmitters;
|
|
85
|
-
} else if (eventName === "entity.removeRelations") {
|
|
86
|
-
emitter = this.#removeRelationsEventEmitters;
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
emitter.emit(modelSingularCode, entityWatchHandlerContext);
|
|
90
|
-
if (baseModelSingularCode) {
|
|
91
|
-
emitter.emit(baseModelSingularCode, entityWatchHandlerContext);
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
export default EntityWatchPlugin;
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { IRpdServer } from "~/core/server";
|
|
2
|
-
import { RpdServerEventTypes } from "~/types";
|
|
3
|
-
|
|
4
|
-
export type EntityWatcherType = EntityWatcher<"entity.create"> | EntityWatcher<"entity.update"> | EntityWatcher<"entity.delete"> | EntityWatcher<"entity.addRelations"> | EntityWatcher<"entity.removeRelations"> | EntityWatcher<any>;
|
|
5
|
-
|
|
6
|
-
export interface EntityWatcher<TEventName extends keyof RpdServerEventTypes = any> {
|
|
7
|
-
eventName: TEventName;
|
|
8
|
-
modelSingularCode: string;
|
|
9
|
-
handler: EntityWatchHandler<TEventName>;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
export type EntityWatchHandler<TEventName extends keyof RpdServerEventTypes> = (ctx: EntityWatchHandlerContext<TEventName>) => Promise<void>;
|
|
13
|
-
|
|
14
|
-
export type EntityWatchHandlerContext<TEventName extends keyof RpdServerEventTypes> = {
|
|
15
|
-
server: IRpdServer;
|
|
16
|
-
payload: RpdServerEventTypes[TEventName][1];
|
|
17
|
-
};
|
|
18
|
-
|
|
19
|
-
export interface EntityWatchPluginInitOptions {
|
|
20
|
-
watchers: EntityWatcherType[];
|
|
21
|
-
}
|