@ruiapp/rapid-core 0.1.49 → 0.1.51
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/core/server.d.ts +3 -2
- package/dist/index.d.ts +0 -2
- package/dist/index.js +94 -87
- package/dist/server.d.ts +4 -2
- package/dist/types.d.ts +15 -1
- package/package.json +1 -1
- package/src/core/server.ts +3 -2
- package/src/index.ts +0 -3
- package/src/server.ts +94 -3
- 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/core/server.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { CreateEntityOptions, GetDataAccessorOptions, GetModelOptions, IDatabaseConfig, IQueryBuilder, IRpdDataAccessor, RapidServerConfig, RpdApplicationConfig, RpdDataModel, RpdDataModelProperty, RpdServerEventTypes, UpdateEntityByIdOptions } from "../types";
|
|
1
|
+
import { CreateEntityOptions, EntityWatcherType, GetDataAccessorOptions, GetModelOptions, IDatabaseConfig, IQueryBuilder, IRpdDataAccessor, RapidServerConfig, RpdApplicationConfig, RpdDataModel, RpdDataModelProperty, RpdServerEventTypes, UpdateEntityByIdOptions } from "../types";
|
|
2
2
|
import { IPluginActionHandler, ActionHandler, ActionHandlerContext } from "./actionHandler";
|
|
3
3
|
import { Next, RouteContext } from "./routeContext";
|
|
4
4
|
import EntityManager from "../dataAccess/entityManager";
|
|
@@ -24,7 +24,8 @@ export interface IRpdServer {
|
|
|
24
24
|
appendApplicationConfig(config: Partial<RpdApplicationConfig>): any;
|
|
25
25
|
appendModelProperties(modelSingularCode: string, properties: RpdDataModelProperty[]): any;
|
|
26
26
|
getModel(options: GetModelOptions): RpdDataModel | undefined;
|
|
27
|
-
registerEventHandler<K extends keyof RpdServerEventTypes>(eventName: K, listener: (...args: RpdServerEventTypes[K]) => void):
|
|
27
|
+
registerEventHandler<K extends keyof RpdServerEventTypes>(eventName: K, listener: (...args: RpdServerEventTypes[K]) => void): any;
|
|
28
|
+
registerEntityWatcher(entityWatcher: EntityWatcherType): any;
|
|
28
29
|
emitEvent<K extends keyof RpdServerEventTypes>(eventName: K, payload: RpdServerEventTypes[K][1], sender?: RapidPlugin): void;
|
|
29
30
|
handleRequest(request: Request, next: Next): Promise<Response>;
|
|
30
31
|
beforeRunRouteActions(handlerContext: ActionHandlerContext): Promise<void>;
|
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
|
@@ -2859,6 +2859,16 @@ class RapidServer {
|
|
|
2859
2859
|
#actionHandlersMapByCode;
|
|
2860
2860
|
#databaseAccessor;
|
|
2861
2861
|
#cachedDataAccessors;
|
|
2862
|
+
#entityBeforeCreateEventEmitters;
|
|
2863
|
+
#entityCreateEventEmitters;
|
|
2864
|
+
#entityBeforeUpdateEventEmitters;
|
|
2865
|
+
#entityUpdateEventEmitters;
|
|
2866
|
+
#entityBeforeDeleteEventEmitters;
|
|
2867
|
+
#entityDeleteEventEmitters;
|
|
2868
|
+
#entityAddRelationsEventEmitters;
|
|
2869
|
+
#entityRemoveRelationsEventEmitters;
|
|
2870
|
+
#entityWatchers;
|
|
2871
|
+
#appEntityWatchers;
|
|
2862
2872
|
#cachedEntityManager;
|
|
2863
2873
|
#services;
|
|
2864
2874
|
queryBuilder;
|
|
@@ -2882,6 +2892,24 @@ class RapidServer {
|
|
|
2882
2892
|
this.#databaseAccessor = options.databaseAccessor;
|
|
2883
2893
|
this.#cachedDataAccessors = new Map();
|
|
2884
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 || [];
|
|
2885
2913
|
this.#services = new Map();
|
|
2886
2914
|
this.queryBuilder = new QueryBuilder({
|
|
2887
2915
|
dbDefaultSchema: options.databaseConfig.dbDefaultSchema,
|
|
@@ -2994,7 +3022,9 @@ class RapidServer {
|
|
|
2994
3022
|
}
|
|
2995
3023
|
registerEventHandler(eventName, listener) {
|
|
2996
3024
|
this.#eventManager.on(eventName, listener);
|
|
2997
|
-
|
|
3025
|
+
}
|
|
3026
|
+
registerEntityWatcher(entityWatcher) {
|
|
3027
|
+
this.#entityWatchers.push(entityWatcher);
|
|
2998
3028
|
}
|
|
2999
3029
|
async emitEvent(eventName, payload, sender) {
|
|
3000
3030
|
this.#logger.debug(`Emitting '${eventName}' event.`, { eventName, payload });
|
|
@@ -3024,6 +3054,33 @@ class RapidServer {
|
|
|
3024
3054
|
await pluginManager.registerEventHandlers();
|
|
3025
3055
|
await pluginManager.registerMessageHandlers();
|
|
3026
3056
|
await pluginManager.registerTaskProcessors();
|
|
3057
|
+
this.#entityWatchers = this.#entityWatchers.concat(this.#appEntityWatchers);
|
|
3058
|
+
for (const entityWatcher of this.#entityWatchers) {
|
|
3059
|
+
if (entityWatcher.eventName === "entity.beforeCreate") {
|
|
3060
|
+
this.#entityBeforeCreateEventEmitters.on(entityWatcher.modelSingularCode, entityWatcher.handler);
|
|
3061
|
+
}
|
|
3062
|
+
else if (entityWatcher.eventName === "entity.create") {
|
|
3063
|
+
this.#entityCreateEventEmitters.on(entityWatcher.modelSingularCode, entityWatcher.handler);
|
|
3064
|
+
}
|
|
3065
|
+
else if (entityWatcher.eventName === "entity.beforeUpdate") {
|
|
3066
|
+
this.#entityBeforeUpdateEventEmitters.on(entityWatcher.modelSingularCode, entityWatcher.handler);
|
|
3067
|
+
}
|
|
3068
|
+
else if (entityWatcher.eventName === "entity.update") {
|
|
3069
|
+
this.#entityUpdateEventEmitters.on(entityWatcher.modelSingularCode, entityWatcher.handler);
|
|
3070
|
+
}
|
|
3071
|
+
else if (entityWatcher.eventName === "entity.beforeDelete") {
|
|
3072
|
+
this.#entityBeforeDeleteEventEmitters.on(entityWatcher.modelSingularCode, entityWatcher.handler);
|
|
3073
|
+
}
|
|
3074
|
+
else if (entityWatcher.eventName === "entity.delete") {
|
|
3075
|
+
this.#entityDeleteEventEmitters.on(entityWatcher.modelSingularCode, entityWatcher.handler);
|
|
3076
|
+
}
|
|
3077
|
+
else if (entityWatcher.eventName === "entity.addRelations") {
|
|
3078
|
+
this.#entityAddRelationsEventEmitters.on(entityWatcher.modelSingularCode, entityWatcher.handler);
|
|
3079
|
+
}
|
|
3080
|
+
else if (entityWatcher.eventName === "entity.removeRelations") {
|
|
3081
|
+
this.#entityRemoveRelationsEventEmitters.on(entityWatcher.modelSingularCode, entityWatcher.handler);
|
|
3082
|
+
}
|
|
3083
|
+
}
|
|
3027
3084
|
await this.configureApplication();
|
|
3028
3085
|
this.#logger.info(`Rapid server ready.`);
|
|
3029
3086
|
await pluginManager.onApplicationReady(this.#applicationConfig);
|
|
@@ -3103,6 +3160,42 @@ class RapidServer {
|
|
|
3103
3160
|
async beforeUpdateEntity(model, options, currentEntity) {
|
|
3104
3161
|
await this.#pluginManager.beforeUpdateEntity(model, options, currentEntity);
|
|
3105
3162
|
}
|
|
3163
|
+
#handleEntityEvent(eventName, sender, payload) {
|
|
3164
|
+
const { modelSingularCode, baseModelSingularCode } = payload;
|
|
3165
|
+
const entityWatchHandlerContext = {
|
|
3166
|
+
server: this,
|
|
3167
|
+
payload,
|
|
3168
|
+
};
|
|
3169
|
+
let emitter;
|
|
3170
|
+
if (eventName === "entity.beforeCreate") {
|
|
3171
|
+
emitter = this.#entityBeforeCreateEventEmitters;
|
|
3172
|
+
}
|
|
3173
|
+
else if (eventName === "entity.create") {
|
|
3174
|
+
emitter = this.#entityCreateEventEmitters;
|
|
3175
|
+
}
|
|
3176
|
+
else if (eventName === "entity.beforeUpdate") {
|
|
3177
|
+
emitter = this.#entityBeforeUpdateEventEmitters;
|
|
3178
|
+
}
|
|
3179
|
+
else if (eventName === "entity.update") {
|
|
3180
|
+
emitter = this.#entityUpdateEventEmitters;
|
|
3181
|
+
}
|
|
3182
|
+
else if (eventName === "entity.beforeDelete") {
|
|
3183
|
+
emitter = this.#entityBeforeDeleteEventEmitters;
|
|
3184
|
+
}
|
|
3185
|
+
else if (eventName === "entity.delete") {
|
|
3186
|
+
emitter = this.#entityDeleteEventEmitters;
|
|
3187
|
+
}
|
|
3188
|
+
else if (eventName === "entity.addRelations") {
|
|
3189
|
+
emitter = this.#entityAddRelationsEventEmitters;
|
|
3190
|
+
}
|
|
3191
|
+
else if (eventName === "entity.removeRelations") {
|
|
3192
|
+
emitter = this.#entityRemoveRelationsEventEmitters;
|
|
3193
|
+
}
|
|
3194
|
+
emitter.emit(modelSingularCode, entityWatchHandlerContext);
|
|
3195
|
+
if (baseModelSingularCode) {
|
|
3196
|
+
emitter.emit(baseModelSingularCode, entityWatchHandlerContext);
|
|
3197
|
+
}
|
|
3198
|
+
}
|
|
3106
3199
|
}
|
|
3107
3200
|
|
|
3108
3201
|
// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license.
|
|
@@ -5672,91 +5765,6 @@ function getStateMachineCode(model, property) {
|
|
|
5672
5765
|
}
|
|
5673
5766
|
}
|
|
5674
5767
|
|
|
5675
|
-
class EntityWatchPlugin {
|
|
5676
|
-
#createEventEmitters;
|
|
5677
|
-
#updateEventEmitters;
|
|
5678
|
-
#deleteEventEmitters;
|
|
5679
|
-
#addRelationsEventEmitters;
|
|
5680
|
-
#removeRelationsEventEmitters;
|
|
5681
|
-
constructor(options) {
|
|
5682
|
-
const { watchers } = options;
|
|
5683
|
-
this.#createEventEmitters = new EventManager();
|
|
5684
|
-
this.#updateEventEmitters = new EventManager();
|
|
5685
|
-
this.#deleteEventEmitters = new EventManager();
|
|
5686
|
-
this.#addRelationsEventEmitters = new EventManager();
|
|
5687
|
-
this.#removeRelationsEventEmitters = new EventManager();
|
|
5688
|
-
for (const watcher of watchers) {
|
|
5689
|
-
if (watcher.eventName === "entity.create") {
|
|
5690
|
-
this.#createEventEmitters.on(watcher.modelSingularCode, watcher.handler);
|
|
5691
|
-
}
|
|
5692
|
-
else if (watcher.eventName === "entity.update") {
|
|
5693
|
-
this.#updateEventEmitters.on(watcher.modelSingularCode, watcher.handler);
|
|
5694
|
-
}
|
|
5695
|
-
else if (watcher.eventName === "entity.delete") {
|
|
5696
|
-
this.#deleteEventEmitters.on(watcher.modelSingularCode, watcher.handler);
|
|
5697
|
-
}
|
|
5698
|
-
else if (watcher.eventName === "entity.addRelations") {
|
|
5699
|
-
this.#addRelationsEventEmitters.on(watcher.modelSingularCode, watcher.handler);
|
|
5700
|
-
}
|
|
5701
|
-
else if (watcher.eventName === "entity.removeRelations") {
|
|
5702
|
-
this.#removeRelationsEventEmitters.on(watcher.modelSingularCode, watcher.handler);
|
|
5703
|
-
}
|
|
5704
|
-
}
|
|
5705
|
-
}
|
|
5706
|
-
get code() {
|
|
5707
|
-
return "entityWatch";
|
|
5708
|
-
}
|
|
5709
|
-
get description() {
|
|
5710
|
-
return "";
|
|
5711
|
-
}
|
|
5712
|
-
get extendingAbilities() {
|
|
5713
|
-
return [];
|
|
5714
|
-
}
|
|
5715
|
-
get configurableTargets() {
|
|
5716
|
-
return [];
|
|
5717
|
-
}
|
|
5718
|
-
get configurations() {
|
|
5719
|
-
return [];
|
|
5720
|
-
}
|
|
5721
|
-
async registerEventHandlers(server) {
|
|
5722
|
-
server.registerEventHandler("entity.create", this.handleEntityEvent.bind(this, server, "entity.create"));
|
|
5723
|
-
server.registerEventHandler("entity.update", this.handleEntityEvent.bind(this, server, "entity.update"));
|
|
5724
|
-
server.registerEventHandler("entity.delete", this.handleEntityEvent.bind(this, server, "entity.delete"));
|
|
5725
|
-
server.registerEventHandler("entity.addRelations", this.handleEntityEvent.bind(this, server, "entity.addRelations"));
|
|
5726
|
-
server.registerEventHandler("entity.removeRelations", this.handleEntityEvent.bind(this, server, "entity.removeRelations"));
|
|
5727
|
-
}
|
|
5728
|
-
handleEntityEvent(server, eventName, sender, payload) {
|
|
5729
|
-
if (sender === this) {
|
|
5730
|
-
return;
|
|
5731
|
-
}
|
|
5732
|
-
const { modelSingularCode, baseModelSingularCode } = payload;
|
|
5733
|
-
const entityWatchHandlerContext = {
|
|
5734
|
-
server,
|
|
5735
|
-
payload,
|
|
5736
|
-
};
|
|
5737
|
-
let emitter;
|
|
5738
|
-
if (eventName === "entity.create") {
|
|
5739
|
-
emitter = this.#createEventEmitters;
|
|
5740
|
-
}
|
|
5741
|
-
else if (eventName === "entity.update") {
|
|
5742
|
-
emitter = this.#updateEventEmitters;
|
|
5743
|
-
}
|
|
5744
|
-
else if (eventName === "entity.delete") {
|
|
5745
|
-
emitter = this.#deleteEventEmitters;
|
|
5746
|
-
}
|
|
5747
|
-
else if (eventName === "entity.addRelations") {
|
|
5748
|
-
emitter = this.#addRelationsEventEmitters;
|
|
5749
|
-
}
|
|
5750
|
-
else if (eventName === "entity.removeRelations") {
|
|
5751
|
-
emitter = this.#removeRelationsEventEmitters;
|
|
5752
|
-
}
|
|
5753
|
-
emitter.emit(modelSingularCode, entityWatchHandlerContext);
|
|
5754
|
-
if (baseModelSingularCode) {
|
|
5755
|
-
emitter.emit(baseModelSingularCode, entityWatchHandlerContext);
|
|
5756
|
-
}
|
|
5757
|
-
}
|
|
5758
|
-
}
|
|
5759
|
-
|
|
5760
5768
|
function isAccessAllowed(policy, allowedActions) {
|
|
5761
5769
|
let isAnyCheckPassed = true;
|
|
5762
5770
|
let isAllCheckPassed = true;
|
|
@@ -5867,7 +5875,6 @@ exports.AuthPlugin = AuthPlugin;
|
|
|
5867
5875
|
exports.CronJobPlugin = CronJobPlugin;
|
|
5868
5876
|
exports.DataManagePlugin = DataManager;
|
|
5869
5877
|
exports.EntityAccessControlPlugin = EntityAccessControlPlugin;
|
|
5870
|
-
exports.EntityWatchPlugin = EntityWatchPlugin;
|
|
5871
5878
|
exports.FileManagePlugin = FileManager;
|
|
5872
5879
|
exports.GlobalRequest = GlobalRequest;
|
|
5873
5880
|
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;
|
|
@@ -30,7 +31,8 @@ export declare class RapidServer implements IRpdServer {
|
|
|
30
31
|
getDataAccessor<T = any>(options: GetDataAccessorOptions): IRpdDataAccessor<T>;
|
|
31
32
|
getModel(options: GetModelOptions): RpdDataModel | undefined;
|
|
32
33
|
getEntityManager<TEntity = any>(singularCode: string): EntityManager<TEntity>;
|
|
33
|
-
registerEventHandler<K extends keyof RpdServerEventTypes>(eventName: K, listener: (...args: RpdServerEventTypes[K]) => void):
|
|
34
|
+
registerEventHandler<K extends keyof RpdServerEventTypes>(eventName: K, listener: (...args: RpdServerEventTypes[K]) => void): void;
|
|
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/core/server.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { CreateEntityOptions, GetDataAccessorOptions, GetModelOptions, IDatabaseConfig, IQueryBuilder, IRpdDataAccessor, RapidServerConfig, RpdApplicationConfig, RpdDataModel, RpdDataModelProperty, RpdServerEventTypes, UpdateEntityByIdOptions } from "~/types";
|
|
1
|
+
import { CreateEntityOptions, EntityWatcherType, GetDataAccessorOptions, GetModelOptions, IDatabaseConfig, IQueryBuilder, IRpdDataAccessor, RapidServerConfig, RpdApplicationConfig, RpdDataModel, RpdDataModelProperty, RpdServerEventTypes, UpdateEntityByIdOptions } from "~/types";
|
|
2
2
|
import { IPluginActionHandler, ActionHandler, ActionHandlerContext } from "./actionHandler";
|
|
3
3
|
import { Next, RouteContext } from "./routeContext";
|
|
4
4
|
import EntityManager from "~/dataAccess/entityManager";
|
|
@@ -28,7 +28,8 @@ export interface IRpdServer {
|
|
|
28
28
|
appendApplicationConfig(config: Partial<RpdApplicationConfig>);
|
|
29
29
|
appendModelProperties(modelSingularCode: string, properties: RpdDataModelProperty[]);
|
|
30
30
|
getModel(options: GetModelOptions): RpdDataModel | undefined;
|
|
31
|
-
registerEventHandler<K extends keyof RpdServerEventTypes>(eventName: K, listener: (...args: RpdServerEventTypes[K]) => void)
|
|
31
|
+
registerEventHandler<K extends keyof RpdServerEventTypes>(eventName: K, listener: (...args: RpdServerEventTypes[K]) => void);
|
|
32
|
+
registerEntityWatcher(entityWatcher: EntityWatcherType);
|
|
32
33
|
emitEvent<K extends keyof RpdServerEventTypes>(eventName: K, payload: RpdServerEventTypes[K][1], sender?: RapidPlugin): void;
|
|
33
34
|
handleRequest(request: Request, next: Next): Promise<Response>;
|
|
34
35
|
beforeRunRouteActions(handlerContext: ActionHandlerContext): Promise<void>;
|
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({
|
|
@@ -191,9 +226,12 @@ export class RapidServer implements IRpdServer {
|
|
|
191
226
|
return entityManager;
|
|
192
227
|
}
|
|
193
228
|
|
|
194
|
-
registerEventHandler<K extends keyof RpdServerEventTypes>(eventName: K, listener: (...args: RpdServerEventTypes[K]) => void)
|
|
229
|
+
registerEventHandler<K extends keyof RpdServerEventTypes>(eventName: K, listener: (...args: RpdServerEventTypes[K]) => void) {
|
|
195
230
|
this.#eventManager.on(eventName, listener);
|
|
196
|
-
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
registerEntityWatcher(entityWatcher: EntityWatcherType) {
|
|
234
|
+
this.#entityWatchers.push(entityWatcher);
|
|
197
235
|
}
|
|
198
236
|
|
|
199
237
|
async emitEvent<K extends keyof RpdServerEventTypes>(eventName: K, payload: RpdServerEventTypes[K][1], sender?: RapidPlugin) {
|
|
@@ -231,6 +269,27 @@ export class RapidServer implements IRpdServer {
|
|
|
231
269
|
await pluginManager.registerMessageHandlers();
|
|
232
270
|
await pluginManager.registerTaskProcessors();
|
|
233
271
|
|
|
272
|
+
this.#entityWatchers = this.#entityWatchers.concat(this.#appEntityWatchers);
|
|
273
|
+
for (const entityWatcher of this.#entityWatchers) {
|
|
274
|
+
if (entityWatcher.eventName === "entity.beforeCreate") {
|
|
275
|
+
this.#entityBeforeCreateEventEmitters.on(entityWatcher.modelSingularCode, entityWatcher.handler);
|
|
276
|
+
} else if (entityWatcher.eventName === "entity.create") {
|
|
277
|
+
this.#entityCreateEventEmitters.on(entityWatcher.modelSingularCode, entityWatcher.handler);
|
|
278
|
+
} else if (entityWatcher.eventName === "entity.beforeUpdate") {
|
|
279
|
+
this.#entityBeforeUpdateEventEmitters.on(entityWatcher.modelSingularCode, entityWatcher.handler);
|
|
280
|
+
} else if (entityWatcher.eventName === "entity.update") {
|
|
281
|
+
this.#entityUpdateEventEmitters.on(entityWatcher.modelSingularCode, entityWatcher.handler);
|
|
282
|
+
} else if (entityWatcher.eventName === "entity.beforeDelete") {
|
|
283
|
+
this.#entityBeforeDeleteEventEmitters.on(entityWatcher.modelSingularCode, entityWatcher.handler);
|
|
284
|
+
} else if (entityWatcher.eventName === "entity.delete") {
|
|
285
|
+
this.#entityDeleteEventEmitters.on(entityWatcher.modelSingularCode, entityWatcher.handler);
|
|
286
|
+
} else if (entityWatcher.eventName === "entity.addRelations") {
|
|
287
|
+
this.#entityAddRelationsEventEmitters.on(entityWatcher.modelSingularCode, entityWatcher.handler);
|
|
288
|
+
} else if (entityWatcher.eventName === "entity.removeRelations") {
|
|
289
|
+
this.#entityRemoveRelationsEventEmitters.on(entityWatcher.modelSingularCode, entityWatcher.handler);
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
|
|
234
293
|
await this.configureApplication();
|
|
235
294
|
|
|
236
295
|
this.#logger.info(`Rapid server ready.`);
|
|
@@ -327,4 +386,36 @@ export class RapidServer implements IRpdServer {
|
|
|
327
386
|
async beforeUpdateEntity(model: RpdDataModel, options: UpdateEntityByIdOptions, currentEntity: any) {
|
|
328
387
|
await this.#pluginManager.beforeUpdateEntity(model, options, currentEntity);
|
|
329
388
|
}
|
|
389
|
+
|
|
390
|
+
#handleEntityEvent(eventName: keyof RpdServerEventTypes, sender: RapidPlugin, payload: RpdEntityCreateEventPayload) {
|
|
391
|
+
const { modelSingularCode, baseModelSingularCode } = payload;
|
|
392
|
+
const entityWatchHandlerContext: EntityWatchHandlerContext<typeof eventName> = {
|
|
393
|
+
server: this,
|
|
394
|
+
payload,
|
|
395
|
+
};
|
|
396
|
+
|
|
397
|
+
let emitter: EventManager<Record<string, [EntityWatchHandlerContext<any>]>>;
|
|
398
|
+
if (eventName === "entity.beforeCreate") {
|
|
399
|
+
emitter = this.#entityBeforeCreateEventEmitters;
|
|
400
|
+
} else if (eventName === "entity.create") {
|
|
401
|
+
emitter = this.#entityCreateEventEmitters;
|
|
402
|
+
} else if (eventName === "entity.beforeUpdate") {
|
|
403
|
+
emitter = this.#entityBeforeUpdateEventEmitters;
|
|
404
|
+
} else if (eventName === "entity.update") {
|
|
405
|
+
emitter = this.#entityUpdateEventEmitters;
|
|
406
|
+
} else if (eventName === "entity.beforeDelete") {
|
|
407
|
+
emitter = this.#entityBeforeDeleteEventEmitters;
|
|
408
|
+
} else if (eventName === "entity.delete") {
|
|
409
|
+
emitter = this.#entityDeleteEventEmitters;
|
|
410
|
+
} else if (eventName === "entity.addRelations") {
|
|
411
|
+
emitter = this.#entityAddRelationsEventEmitters;
|
|
412
|
+
} else if (eventName === "entity.removeRelations") {
|
|
413
|
+
emitter = this.#entityRemoveRelationsEventEmitters;
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
emitter.emit(modelSingularCode, entityWatchHandlerContext);
|
|
417
|
+
if (baseModelSingularCode) {
|
|
418
|
+
emitter.emit(baseModelSingularCode, entityWatchHandlerContext);
|
|
419
|
+
}
|
|
420
|
+
}
|
|
330
421
|
}
|
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
|
-
}
|