@ruiapp/rapid-core 0.1.49 → 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 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,
@@ -2996,6 +3024,9 @@ class RapidServer {
2996
3024
  this.#eventManager.on(eventName, listener);
2997
3025
  return this;
2998
3026
  }
3027
+ registerEntityWatcher(entityWatcher) {
3028
+ this.#entityWatchers.push(entityWatcher);
3029
+ }
2999
3030
  async emitEvent(eventName, payload, sender) {
3000
3031
  this.#logger.debug(`Emitting '${eventName}' event.`, { eventName, payload });
3001
3032
  await this.#eventManager.emit(eventName, sender, payload);
@@ -3024,6 +3055,33 @@ class RapidServer {
3024
3055
  await pluginManager.registerEventHandlers();
3025
3056
  await pluginManager.registerMessageHandlers();
3026
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
+ }
3027
3085
  await this.configureApplication();
3028
3086
  this.#logger.info(`Rapid server ready.`);
3029
3087
  await pluginManager.onApplicationReady(this.#applicationConfig);
@@ -3103,6 +3161,42 @@ class RapidServer {
3103
3161
  async beforeUpdateEntity(model, options, currentEntity) {
3104
3162
  await this.#pluginManager.beforeUpdateEntity(model, options, currentEntity);
3105
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
+ }
3106
3200
  }
3107
3201
 
3108
3202
  // Copyright 2018-2023 the Deno authors. All rights reserved. MIT license.
@@ -5672,91 +5766,6 @@ function getStateMachineCode(model, property) {
5672
5766
  }
5673
5767
  }
5674
5768
 
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
5769
  function isAccessAllowed(policy, allowedActions) {
5761
5770
  let isAnyCheckPassed = true;
5762
5771
  let isAllCheckPassed = true;
@@ -5867,7 +5876,6 @@ exports.AuthPlugin = AuthPlugin;
5867
5876
  exports.CronJobPlugin = CronJobPlugin;
5868
5877
  exports.DataManagePlugin = DataManager;
5869
5878
  exports.EntityAccessControlPlugin = EntityAccessControlPlugin;
5870
- exports.EntityWatchPlugin = EntityWatchPlugin;
5871
5879
  exports.FileManagePlugin = FileManager;
5872
5880
  exports.GlobalRequest = GlobalRequest;
5873
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ruiapp/rapid-core",
3
- "version": "0.1.49",
3
+ "version": "0.1.50",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
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
- }