@dudousxd/nestjs-notifications-database 0.3.0 → 0.5.0

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.
@@ -1,4 +1,4 @@
1
- import { type ChannelDriver, type Notifiable, type Notification } from '@dudousxd/nestjs-notifications-core';
1
+ import { type ChannelDriver, type DeliveryContext, type Notifiable, type Notification } from '@dudousxd/nestjs-notifications-core';
2
2
  import type { NotificationStore } from './interfaces';
3
3
  /** Channel handle: use as `@Database()` on a payload method, or as a token in `via()`. */
4
4
  export declare const Database: import("@dudousxd/nestjs-notifications-core").ChannelHandle;
@@ -10,7 +10,7 @@ export declare class DatabaseChannel implements ChannelDriver {
10
10
  private readonly store;
11
11
  readonly channel = "database";
12
12
  constructor(store: NotificationStore);
13
- send(notifiable: Notifiable, notification: Notification): Promise<void>;
13
+ send(notifiable: Notifiable, notification: Notification, context?: DeliveryContext): Promise<unknown>;
14
14
  private referenceFor;
15
15
  private payloadFor;
16
16
  }
@@ -1 +1 @@
1
- {"version":3,"file":"database.channel.d.ts","sourceRoot":"","sources":["../src/database.channel.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,UAAU,EAEf,KAAK,YAAY,EAGlB,MAAM,qCAAqC,CAAC;AAE7C,OAAO,KAAK,EAAwB,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAG5E,0FAA0F;AAC1F,eAAO,MAAM,QAAQ,6DAA4B,CAAC;AAElD;;;GAGG;AACH,qBACa,eAAgB,YAAW,aAAa;IAKjD,OAAO,CAAC,QAAQ,CAAC,KAAK;IAJxB,QAAQ,CAAC,OAAO,cAAc;gBAIX,KAAK,EAAE,iBAAiB;IAGrC,IAAI,CAAC,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAe7E,OAAO,CAAC,YAAY;IAUpB,OAAO,CAAC,UAAU;CAUnB"}
1
+ {"version":3,"file":"database.channel.d.ts","sourceRoot":"","sources":["../src/database.channel.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,UAAU,EAEf,KAAK,YAAY,EAKlB,MAAM,qCAAqC,CAAC;AAE7C,OAAO,KAAK,EAAwB,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAG5E,0FAA0F;AAC1F,eAAO,MAAM,QAAQ,6DAA4B,CAAC;AAElD;;;GAGG;AACH,qBACa,eAAgB,YAAW,aAAa;IAKjD,OAAO,CAAC,QAAQ,CAAC,KAAK;IAJxB,QAAQ,CAAC,OAAO,cAAc;gBAIX,KAAK,EAAE,iBAAiB;IAGrC,IAAI,CACR,UAAU,EAAE,UAAU,EACtB,YAAY,EAAE,YAAY,EAC1B,OAAO,CAAC,EAAE,eAAe,GACxB,OAAO,CAAC,OAAO,CAAC;IAiBnB,OAAO,CAAC,YAAY;IAQpB,OAAO,CAAC,UAAU;CAUnB"}
@@ -28,26 +28,27 @@ let DatabaseChannel = class DatabaseChannel {
28
28
  constructor(store) {
29
29
  this.store = store;
30
30
  }
31
- async send(notifiable, notification) {
31
+ async send(notifiable, notification, context) {
32
32
  const ref = this.referenceFor(notifiable, notification);
33
33
  const data = this.payloadFor(notifiable, notification);
34
34
  const type = notification.constructor.notificationName ??
35
35
  notification.constructor.name;
36
- await this.store.save({
36
+ // Return the stored row so it flows into afterSending() and the SendResult.
37
+ return this.store.save({
37
38
  type,
38
39
  notifiableType: ref.type,
39
40
  notifiableId: String(ref.id),
41
+ tenantId: context?.tenant ?? null,
40
42
  data,
41
43
  });
42
44
  }
43
45
  referenceFor(notifiable, notification) {
44
- const routed = notifiable.routeNotificationFor('database', notification);
46
+ // A { type, id } returned from the 'database' route wins; otherwise derive the ref from
47
+ // toNotifiableRef() or the @Notifiable/@NotifiableId decorators.
48
+ const routed = (0, nestjs_notifications_core_1.routeFor)(notifiable, 'database', notification);
45
49
  if (isRef(routed))
46
50
  return routed;
47
- if (typeof notifiable.toNotifiableRef === 'function')
48
- return notifiable.toNotifiableRef();
49
- throw new Error('The database channel needs a notifiable reference. Implement toNotifiableRef() on the ' +
50
- 'notifiable, or return { type, id } from routeNotificationFor("database").');
51
+ return (0, nestjs_notifications_core_1.notifiableRef)(notifiable);
51
52
  }
52
53
  payloadFor(notifiable, notification) {
53
54
  const handler = (0, nestjs_notifications_core_1.getHandler)(notification, 'database', 'toDatabase');
@@ -1 +1 @@
1
- {"version":3,"file":"database.channel.js","sourceRoot":"","sources":["../src/database.channel.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,mFAO6C;AAC7C,2CAAoD;AAEpD,qCAA8C;AAE9C,0FAA0F;AAC7E,QAAA,QAAQ,GAAG,IAAA,yCAAa,EAAC,UAAU,CAAC,CAAC;AAElD;;;GAGG;AAEI,IAAM,eAAe,GAArB,MAAM,eAAe;IAKP;IAJV,OAAO,GAAG,UAAU,CAAC;IAE9B,YAEmB,KAAwB;QAAxB,UAAK,GAAL,KAAK,CAAmB;IACxC,CAAC;IAEJ,KAAK,CAAC,IAAI,CAAC,UAAsB,EAAE,YAA0B;QAC3D,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;QACxD,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;QACvD,MAAM,IAAI,GACP,YAAY,CAAC,WAA6C,CAAC,gBAAgB;YAC5E,YAAY,CAAC,WAAW,CAAC,IAAI,CAAC;QAEhC,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;YACpB,IAAI;YACJ,cAAc,EAAE,GAAG,CAAC,IAAI;YACxB,YAAY,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5B,IAAI;SACL,CAAC,CAAC;IACL,CAAC;IAEO,YAAY,CAAC,UAAsB,EAAE,YAA0B;QACrE,MAAM,MAAM,GAAG,UAAU,CAAC,oBAAoB,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;QACzE,IAAI,KAAK,CAAC,MAAM,CAAC;YAAE,OAAO,MAAM,CAAC;QACjC,IAAI,OAAO,UAAU,CAAC,eAAe,KAAK,UAAU;YAAE,OAAO,UAAU,CAAC,eAAe,EAAE,CAAC;QAC1F,MAAM,IAAI,KAAK,CACb,wFAAwF;YACtF,2EAA2E,CAC9E,CAAC;IACJ,CAAC;IAEO,UAAU,CAChB,UAAsB,EACtB,YAAkC;QAElC,MAAM,OAAO,GAAG,IAAA,sCAAU,EAAC,YAAY,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC;QACnE,IAAI,OAAO;YAAE,OAAO,OAAO,CAAC,UAAU,CAA4B,CAAC;QACnE,IAAI,OAAO,YAAY,CAAC,OAAO,KAAK,UAAU;YAAE,OAAO,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACxF,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,YAAkD,CAAC;QACvE,OAAO,IAAI,CAAC;IACd,CAAC;CACF,CAAA;AA3CY,0CAAe;0BAAf,eAAe;IAD3B,IAAA,mBAAU,GAAE;IAKR,WAAA,IAAA,eAAM,EAAC,2BAAkB,CAAC,CAAA;;GAJlB,eAAe,CA2C3B;AAED,SAAS,KAAK,CAAC,KAAc;IAC3B,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,MAAM,IAAI,KAAK;QACf,IAAI,IAAI,KAAK;QACb,OAAQ,KAAuB,CAAC,IAAI,KAAK,QAAQ,CAClD,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"database.channel.js","sourceRoot":"","sources":["../src/database.channel.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,mFAU6C;AAC7C,2CAAoD;AAEpD,qCAA8C;AAE9C,0FAA0F;AAC7E,QAAA,QAAQ,GAAG,IAAA,yCAAa,EAAC,UAAU,CAAC,CAAC;AAElD;;;GAGG;AAEI,IAAM,eAAe,GAArB,MAAM,eAAe;IAKP;IAJV,OAAO,GAAG,UAAU,CAAC;IAE9B,YAEmB,KAAwB;QAAxB,UAAK,GAAL,KAAK,CAAmB;IACxC,CAAC;IAEJ,KAAK,CAAC,IAAI,CACR,UAAsB,EACtB,YAA0B,EAC1B,OAAyB;QAEzB,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;QACxD,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;QACvD,MAAM,IAAI,GACP,YAAY,CAAC,WAA6C,CAAC,gBAAgB;YAC5E,YAAY,CAAC,WAAW,CAAC,IAAI,CAAC;QAEhC,4EAA4E;QAC5E,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;YACrB,IAAI;YACJ,cAAc,EAAE,GAAG,CAAC,IAAI;YACxB,YAAY,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5B,QAAQ,EAAE,OAAO,EAAE,MAAM,IAAI,IAAI;YACjC,IAAI;SACL,CAAC,CAAC;IACL,CAAC;IAEO,YAAY,CAAC,UAAsB,EAAE,YAA0B;QACrE,wFAAwF;QACxF,iEAAiE;QACjE,MAAM,MAAM,GAAG,IAAA,oCAAQ,EAAC,UAAU,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC;QAC9D,IAAI,KAAK,CAAC,MAAM,CAAC;YAAE,OAAO,MAAM,CAAC;QACjC,OAAO,IAAA,yCAAa,EAAC,UAAU,CAAC,CAAC;IACnC,CAAC;IAEO,UAAU,CAChB,UAAsB,EACtB,YAAkC;QAElC,MAAM,OAAO,GAAG,IAAA,sCAAU,EAAC,YAAY,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC;QACnE,IAAI,OAAO;YAAE,OAAO,OAAO,CAAC,UAAU,CAA4B,CAAC;QACnE,IAAI,OAAO,YAAY,CAAC,OAAO,KAAK,UAAU;YAAE,OAAO,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACxF,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,YAAkD,CAAC;QACvE,OAAO,IAAI,CAAC;IACd,CAAC;CACF,CAAA;AA/CY,0CAAe;0BAAf,eAAe;IAD3B,IAAA,mBAAU,GAAE;IAKR,WAAA,IAAA,eAAM,EAAC,2BAAkB,CAAC,CAAA;;GAJlB,eAAe,CA+C3B;AAED,SAAS,KAAK,CAAC,KAAc;IAC3B,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,MAAM,IAAI,KAAK;QACf,IAAI,IAAI,KAAK;QACb,OAAQ,KAAuB,CAAC,IAAI,KAAK,QAAQ,CAClD,CAAC;AACJ,CAAC"}
@@ -7,10 +7,19 @@ export interface DatabaseChannelOptions {
7
7
  global?: boolean;
8
8
  /** Extra modules to import (e.g. the ORM module providing the store's dependencies). */
9
9
  imports?: DynamicModule['imports'];
10
+ /**
11
+ * Create the backing schema on bootstrap if it's missing (non-destructive). Default true —
12
+ * set to false to manage the schema through your ORM's migrations instead.
13
+ */
14
+ autoCreateSchema?: boolean;
15
+ }
16
+ export interface DatabaseChannelFeatureOptions {
17
+ /** See {@link DatabaseChannelOptions.autoCreateSchema}. Default true. */
18
+ autoCreateSchema?: boolean;
10
19
  }
11
20
  /**
12
21
  * Registers the database channel. Pair with an ORM adapter package
13
- * (`@dudousxd/nestjs-notifications-database-typeorm` or `-mikro-orm`) or pass a custom store.
22
+ * (`@dudousxd/nestjs-notifications-database-typeorm`, `-mikro-orm`, `-prisma`) or pass a store.
14
23
  *
15
24
  * ```ts
16
25
  * DatabaseChannelModule.forRoot({ store: TypeOrmNotificationStore, imports: [TypeOrmModule.forFeature([...])] })
@@ -19,6 +28,6 @@ export interface DatabaseChannelOptions {
19
28
  export declare class DatabaseChannelModule {
20
29
  static forRoot(options?: DatabaseChannelOptions): DynamicModule;
21
30
  /** Register with an already-provided store token (e.g. provided by an ORM adapter module). */
22
- static forFeature(): DynamicModule;
31
+ static forFeature(options?: DatabaseChannelFeatureOptions): DynamicModule;
23
32
  }
24
33
  //# sourceMappingURL=database.module.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"database.module.d.ts","sourceRoot":"","sources":["../src/database.module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAyB,KAAK,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAGtF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAItD,MAAM,WAAW,sBAAsB;IACrC,wEAAwE;IACxE,KAAK,CAAC,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAChC,+EAA+E;IAC/E,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,wFAAwF;IACxF,OAAO,CAAC,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;CACpC;AAED;;;;;;;GAOG;AACH,qBACa,qBAAqB;IAChC,MAAM,CAAC,OAAO,CAAC,OAAO,GAAE,sBAA2B,GAAG,aAAa;IAiBnE,8FAA8F;IAC9F,MAAM,CAAC,UAAU,IAAI,aAAa;CAOnC"}
1
+ {"version":3,"file":"database.module.d.ts","sourceRoot":"","sources":["../src/database.module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAyB,KAAK,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAGtF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAKtD,MAAM,WAAW,sBAAsB;IACrC,wEAAwE;IACxE,KAAK,CAAC,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAChC,+EAA+E;IAC/E,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,wFAAwF;IACxF,OAAO,CAAC,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;IACnC;;;OAGG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,6BAA6B;IAC5C,yEAAyE;IACzE,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED;;;;;;;GAOG;AACH,qBACa,qBAAqB;IAChC,MAAM,CAAC,OAAO,CAAC,OAAO,GAAE,sBAA2B,GAAG,aAAa;IAmBnE,8FAA8F;IAC9F,MAAM,CAAC,UAAU,CAAC,OAAO,GAAE,6BAAkC,GAAG,aAAa;CAY9E"}
@@ -12,10 +12,11 @@ const common_1 = require("@nestjs/common");
12
12
  const database_channel_1 = require("./database.channel");
13
13
  const in_memory_store_1 = require("./in-memory.store");
14
14
  const notifications_query_service_1 = require("./notifications-query.service");
15
+ const schema_initializer_1 = require("./schema-initializer");
15
16
  const tokens_1 = require("./tokens");
16
17
  /**
17
18
  * Registers the database channel. Pair with an ORM adapter package
18
- * (`@dudousxd/nestjs-notifications-database-typeorm` or `-mikro-orm`) or pass a custom store.
19
+ * (`@dudousxd/nestjs-notifications-database-typeorm`, `-mikro-orm`, `-prisma`) or pass a store.
19
20
  *
20
21
  * ```ts
21
22
  * DatabaseChannelModule.forRoot({ store: TypeOrmNotificationStore, imports: [TypeOrmModule.forFeature([...])] })
@@ -27,8 +28,10 @@ let DatabaseChannelModule = DatabaseChannelModule_1 = class DatabaseChannelModul
27
28
  const providers = [
28
29
  storeClass,
29
30
  { provide: tokens_1.NOTIFICATION_STORE, useExisting: storeClass },
31
+ { provide: tokens_1.AUTO_CREATE_SCHEMA, useValue: options.autoCreateSchema ?? true },
30
32
  database_channel_1.DatabaseChannel,
31
33
  notifications_query_service_1.NotificationsQueryService,
34
+ schema_initializer_1.SchemaInitializer,
32
35
  ];
33
36
  return {
34
37
  module: DatabaseChannelModule_1,
@@ -39,10 +42,15 @@ let DatabaseChannelModule = DatabaseChannelModule_1 = class DatabaseChannelModul
39
42
  };
40
43
  }
41
44
  /** Register with an already-provided store token (e.g. provided by an ORM adapter module). */
42
- static forFeature() {
45
+ static forFeature(options = {}) {
43
46
  return {
44
47
  module: DatabaseChannelModule_1,
45
- providers: [database_channel_1.DatabaseChannel, notifications_query_service_1.NotificationsQueryService],
48
+ providers: [
49
+ { provide: tokens_1.AUTO_CREATE_SCHEMA, useValue: options.autoCreateSchema ?? true },
50
+ database_channel_1.DatabaseChannel,
51
+ notifications_query_service_1.NotificationsQueryService,
52
+ schema_initializer_1.SchemaInitializer,
53
+ ],
46
54
  exports: [database_channel_1.DatabaseChannel, notifications_query_service_1.NotificationsQueryService],
47
55
  };
48
56
  }
@@ -1 +1 @@
1
- {"version":3,"file":"database.module.js","sourceRoot":"","sources":["../src/database.module.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,2CAAsF;AACtF,yDAAqD;AACrD,uDAAkD;AAElD,+EAA0E;AAC1E,qCAA8C;AAW9C;;;;;;;GAOG;AAEI,IAAM,qBAAqB,6BAA3B,MAAM,qBAAqB;IAChC,MAAM,CAAC,OAAO,CAAC,UAAkC,EAAE;QACjD,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,IAAI,+BAAa,CAAC;QAClD,MAAM,SAAS,GAAe;YAC5B,UAAU;YACV,EAAE,OAAO,EAAE,2BAAkB,EAAE,WAAW,EAAE,UAAU,EAAE;YACxD,kCAAe;YACf,uDAAyB;SAC1B,CAAC;QACF,OAAO;YACL,MAAM,EAAE,uBAAqB;YAC7B,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,IAAI;YAC9B,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE;YAC9B,SAAS;YACT,OAAO,EAAE,CAAC,kCAAe,EAAE,2BAAkB,EAAE,uDAAyB,CAAC;SAC1E,CAAC;IACJ,CAAC;IAED,8FAA8F;IAC9F,MAAM,CAAC,UAAU;QACf,OAAO;YACL,MAAM,EAAE,uBAAqB;YAC7B,SAAS,EAAE,CAAC,kCAAe,EAAE,uDAAyB,CAAC;YACvD,OAAO,EAAE,CAAC,kCAAe,EAAE,uDAAyB,CAAC;SACtD,CAAC;IACJ,CAAC;CACF,CAAA;AA1BY,sDAAqB;gCAArB,qBAAqB;IADjC,IAAA,eAAM,EAAC,EAAE,CAAC;GACE,qBAAqB,CA0BjC"}
1
+ {"version":3,"file":"database.module.js","sourceRoot":"","sources":["../src/database.module.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,2CAAsF;AACtF,yDAAqD;AACrD,uDAAkD;AAElD,+EAA0E;AAC1E,6DAAyD;AACzD,qCAAkE;AAqBlE;;;;;;;GAOG;AAEI,IAAM,qBAAqB,6BAA3B,MAAM,qBAAqB;IAChC,MAAM,CAAC,OAAO,CAAC,UAAkC,EAAE;QACjD,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,IAAI,+BAAa,CAAC;QAClD,MAAM,SAAS,GAAe;YAC5B,UAAU;YACV,EAAE,OAAO,EAAE,2BAAkB,EAAE,WAAW,EAAE,UAAU,EAAE;YACxD,EAAE,OAAO,EAAE,2BAAkB,EAAE,QAAQ,EAAE,OAAO,CAAC,gBAAgB,IAAI,IAAI,EAAE;YAC3E,kCAAe;YACf,uDAAyB;YACzB,sCAAiB;SAClB,CAAC;QACF,OAAO;YACL,MAAM,EAAE,uBAAqB;YAC7B,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,IAAI;YAC9B,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE;YAC9B,SAAS;YACT,OAAO,EAAE,CAAC,kCAAe,EAAE,2BAAkB,EAAE,uDAAyB,CAAC;SAC1E,CAAC;IACJ,CAAC;IAED,8FAA8F;IAC9F,MAAM,CAAC,UAAU,CAAC,UAAyC,EAAE;QAC3D,OAAO;YACL,MAAM,EAAE,uBAAqB;YAC7B,SAAS,EAAE;gBACT,EAAE,OAAO,EAAE,2BAAkB,EAAE,QAAQ,EAAE,OAAO,CAAC,gBAAgB,IAAI,IAAI,EAAE;gBAC3E,kCAAe;gBACf,uDAAyB;gBACzB,sCAAiB;aAClB;YACD,OAAO,EAAE,CAAC,kCAAe,EAAE,uDAAyB,CAAC;SACtD,CAAC;IACJ,CAAC;CACF,CAAA;AAjCY,sDAAqB;gCAArB,qBAAqB;IADjC,IAAA,eAAM,EAAC,EAAE,CAAC;GACE,qBAAqB,CAiCjC"}
@@ -4,9 +4,9 @@ export declare class InMemoryStore implements NotificationStore {
4
4
  private readonly rows;
5
5
  save(input: NewStoredNotification): Promise<StoredNotification>;
6
6
  markAsRead(id: string): Promise<void>;
7
- markAllAsRead(notifiableType: string, notifiableId: string): Promise<void>;
8
- getForNotifiable(notifiableType: string, notifiableId: string): Promise<StoredNotification[]>;
9
- getUnread(notifiableType: string, notifiableId: string): Promise<StoredNotification[]>;
7
+ markAllAsRead(notifiableType: string, notifiableId: string, tenantId?: string): Promise<void>;
8
+ getForNotifiable(notifiableType: string, notifiableId: string, tenantId?: string): Promise<StoredNotification[]>;
9
+ getUnread(notifiableType: string, notifiableId: string, tenantId?: string): Promise<StoredNotification[]>;
10
10
  delete(id: string): Promise<void>;
11
11
  private all;
12
12
  }
@@ -1 +1 @@
1
- {"version":3,"file":"in-memory.store.d.ts","sourceRoot":"","sources":["../src/in-memory.store.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAEjG,yFAAyF;AACzF,qBACa,aAAc,YAAW,iBAAiB;IACrD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAyC;IAExD,IAAI,CAAC,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAgB/D,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQrC,aAAa,CAAC,cAAc,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAa1E,gBAAgB,CACpB,cAAc,EAAE,MAAM,EACtB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAM1B,SAAS,CAAC,cAAc,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAItF,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvC,OAAO,CAAC,GAAG;CAGZ"}
1
+ {"version":3,"file":"in-memory.store.d.ts","sourceRoot":"","sources":["../src/in-memory.store.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAEjG,yFAAyF;AACzF,qBACa,aAAc,YAAW,iBAAiB;IACrD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAyC;IAExD,IAAI,CAAC,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAiB/D,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQrC,aAAa,CACjB,cAAc,EAAE,MAAM,EACtB,YAAY,EAAE,MAAM,EACpB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC;IAcV,gBAAgB,CACpB,cAAc,EAAE,MAAM,EACtB,YAAY,EAAE,MAAM,EACpB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAS1B,SAAS,CACb,cAAc,EAAE,MAAM,EACtB,YAAY,EAAE,MAAM,EACpB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAM1B,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvC,OAAO,CAAC,GAAG;CAGZ"}
@@ -19,6 +19,7 @@ let InMemoryStore = class InMemoryStore {
19
19
  type: input.type,
20
20
  notifiableType: input.notifiableType,
21
21
  notifiableId: input.notifiableId,
22
+ tenantId: input.tenantId ?? null,
22
23
  data: input.data,
23
24
  readAt: null,
24
25
  createdAt: now,
@@ -34,21 +35,24 @@ let InMemoryStore = class InMemoryStore {
34
35
  row.updatedAt = new Date();
35
36
  }
36
37
  }
37
- async markAllAsRead(notifiableType, notifiableId) {
38
+ async markAllAsRead(notifiableType, notifiableId, tenantId) {
38
39
  for (const row of this.rows.values()) {
39
40
  if (row.notifiableType === notifiableType &&
40
41
  row.notifiableId === notifiableId &&
42
+ (tenantId === undefined || row.tenantId === tenantId) &&
41
43
  !row.readAt) {
42
44
  row.readAt = new Date();
43
45
  row.updatedAt = new Date();
44
46
  }
45
47
  }
46
48
  }
47
- async getForNotifiable(notifiableType, notifiableId) {
48
- return this.all().filter((r) => r.notifiableType === notifiableType && r.notifiableId === notifiableId);
49
+ async getForNotifiable(notifiableType, notifiableId, tenantId) {
50
+ return this.all().filter((r) => r.notifiableType === notifiableType &&
51
+ r.notifiableId === notifiableId &&
52
+ (tenantId === undefined || r.tenantId === tenantId));
49
53
  }
50
- async getUnread(notifiableType, notifiableId) {
51
- return (await this.getForNotifiable(notifiableType, notifiableId)).filter((r) => !r.readAt);
54
+ async getUnread(notifiableType, notifiableId, tenantId) {
55
+ return (await this.getForNotifiable(notifiableType, notifiableId, tenantId)).filter((r) => !r.readAt);
52
56
  }
53
57
  async delete(id) {
54
58
  this.rows.delete(id);
@@ -1 +1 @@
1
- {"version":3,"file":"in-memory.store.js","sourceRoot":"","sources":["../src/in-memory.store.ts"],"names":[],"mappings":";;;;;;;;;AAAA,6CAAyC;AACzC,2CAA4C;AAG5C,yFAAyF;AAElF,IAAM,aAAa,GAAnB,MAAM,aAAa;IACP,IAAI,GAAG,IAAI,GAAG,EAA8B,CAAC;IAE9D,KAAK,CAAC,IAAI,CAAC,KAA4B;QACrC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,GAAG,GAAuB;YAC9B,EAAE,EAAE,IAAA,wBAAU,GAAE;YAChB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,cAAc,EAAE,KAAK,CAAC,cAAc;YACpC,YAAY,EAAE,KAAK,CAAC,YAAY;YAChC,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,MAAM,EAAE,IAAI;YACZ,SAAS,EAAE,GAAG;YACd,SAAS,EAAE,GAAG;SACf,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QAC3B,OAAO,GAAG,CAAC;IACb,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,EAAU;QACzB,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC9B,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;YACvB,GAAG,CAAC,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACxB,GAAG,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,cAAsB,EAAE,YAAoB;QAC9D,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;YACrC,IACE,GAAG,CAAC,cAAc,KAAK,cAAc;gBACrC,GAAG,CAAC,YAAY,KAAK,YAAY;gBACjC,CAAC,GAAG,CAAC,MAAM,EACX,CAAC;gBACD,GAAG,CAAC,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACxB,GAAG,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;YAC7B,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,CAAC,gBAAgB,CACpB,cAAsB,EACtB,YAAoB;QAEpB,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,CACtB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,KAAK,cAAc,IAAI,CAAC,CAAC,YAAY,KAAK,YAAY,CAC9E,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,cAAsB,EAAE,YAAoB;QAC1D,OAAO,CAAC,MAAM,IAAI,CAAC,gBAAgB,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAC9F,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,EAAU;QACrB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACvB,CAAC;IAEO,GAAG;QACT,OAAO,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC;IAC/F,CAAC;CACF,CAAA;AA5DY,sCAAa;wBAAb,aAAa;IADzB,IAAA,mBAAU,GAAE;GACA,aAAa,CA4DzB"}
1
+ {"version":3,"file":"in-memory.store.js","sourceRoot":"","sources":["../src/in-memory.store.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,8 +1,9 @@
1
1
  export * from './interfaces';
2
- export { NOTIFICATION_STORE } from './tokens';
2
+ export { NOTIFICATION_STORE, AUTO_CREATE_SCHEMA } from './tokens';
3
3
  export { Database, DatabaseChannel } from './database.channel';
4
4
  export { InMemoryStore } from './in-memory.store';
5
- export { DatabaseChannelModule, type DatabaseChannelOptions } from './database.module';
5
+ export { DatabaseChannelModule, type DatabaseChannelOptions, type DatabaseChannelFeatureOptions, } from './database.module';
6
+ export { SchemaInitializer } from './schema-initializer';
6
7
  export { NotificationsQueryService, type NotifiableTarget, type PaginateOptions, type PaginatedNotifications, } from './notifications-query.service';
7
8
  export { createNotificationsController, type NotificationsControllerOptions, } from './notifications.controller';
8
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,qBAAqB,EAAE,KAAK,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AACvF,OAAO,EACL,yBAAyB,EACzB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,sBAAsB,GAC5B,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,6BAA6B,EAC7B,KAAK,8BAA8B,GACpC,MAAM,4BAA4B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAClE,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EACL,qBAAqB,EACrB,KAAK,sBAAsB,EAC3B,KAAK,6BAA6B,GACnC,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EACL,yBAAyB,EACzB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,sBAAsB,GAC5B,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,6BAA6B,EAC7B,KAAK,8BAA8B,GACpC,MAAM,4BAA4B,CAAC"}
package/dist/index.js CHANGED
@@ -14,10 +14,11 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- exports.createNotificationsController = exports.NotificationsQueryService = exports.DatabaseChannelModule = exports.InMemoryStore = exports.DatabaseChannel = exports.Database = exports.NOTIFICATION_STORE = void 0;
17
+ exports.createNotificationsController = exports.NotificationsQueryService = exports.SchemaInitializer = exports.DatabaseChannelModule = exports.InMemoryStore = exports.DatabaseChannel = exports.Database = exports.AUTO_CREATE_SCHEMA = exports.NOTIFICATION_STORE = void 0;
18
18
  __exportStar(require("./interfaces"), exports);
19
19
  var tokens_1 = require("./tokens");
20
20
  Object.defineProperty(exports, "NOTIFICATION_STORE", { enumerable: true, get: function () { return tokens_1.NOTIFICATION_STORE; } });
21
+ Object.defineProperty(exports, "AUTO_CREATE_SCHEMA", { enumerable: true, get: function () { return tokens_1.AUTO_CREATE_SCHEMA; } });
21
22
  var database_channel_1 = require("./database.channel");
22
23
  Object.defineProperty(exports, "Database", { enumerable: true, get: function () { return database_channel_1.Database; } });
23
24
  Object.defineProperty(exports, "DatabaseChannel", { enumerable: true, get: function () { return database_channel_1.DatabaseChannel; } });
@@ -25,6 +26,8 @@ var in_memory_store_1 = require("./in-memory.store");
25
26
  Object.defineProperty(exports, "InMemoryStore", { enumerable: true, get: function () { return in_memory_store_1.InMemoryStore; } });
26
27
  var database_module_1 = require("./database.module");
27
28
  Object.defineProperty(exports, "DatabaseChannelModule", { enumerable: true, get: function () { return database_module_1.DatabaseChannelModule; } });
29
+ var schema_initializer_1 = require("./schema-initializer");
30
+ Object.defineProperty(exports, "SchemaInitializer", { enumerable: true, get: function () { return schema_initializer_1.SchemaInitializer; } });
28
31
  var notifications_query_service_1 = require("./notifications-query.service");
29
32
  Object.defineProperty(exports, "NotificationsQueryService", { enumerable: true, get: function () { return notifications_query_service_1.NotificationsQueryService; } });
30
33
  var notifications_controller_1 = require("./notifications.controller");
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,+CAA6B;AAC7B,mCAA8C;AAArC,4GAAA,kBAAkB,OAAA;AAC3B,uDAA+D;AAAtD,4GAAA,QAAQ,OAAA;AAAE,mHAAA,eAAe,OAAA;AAClC,qDAAkD;AAAzC,gHAAA,aAAa,OAAA;AACtB,qDAAuF;AAA9E,wHAAA,qBAAqB,OAAA;AAC9B,6EAKuC;AAJrC,wIAAA,yBAAyB,OAAA;AAK3B,uEAGoC;AAFlC,yIAAA,6BAA6B,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,+CAA6B;AAC7B,mCAAkE;AAAzD,4GAAA,kBAAkB,OAAA;AAAE,4GAAA,kBAAkB,OAAA;AAC/C,uDAA+D;AAAtD,4GAAA,QAAQ,OAAA;AAAE,mHAAA,eAAe,OAAA;AAClC,qDAAkD;AAAzC,gHAAA,aAAa,OAAA;AACtB,qDAI2B;AAHzB,wHAAA,qBAAqB,OAAA;AAIvB,2DAAyD;AAAhD,uHAAA,iBAAiB,OAAA;AAC1B,6EAKuC;AAJrC,wIAAA,yBAAyB,OAAA;AAK3B,uEAGoC;AAFlC,yIAAA,6BAA6B,OAAA"}
@@ -8,6 +8,8 @@ export interface StoredNotification {
8
8
  notifiableType: string;
9
9
  /** Notifiable reference id. */
10
10
  notifiableId: string;
11
+ /** Tenant scope (workspace) this row belongs to, or null for single-tenant. */
12
+ tenantId: string | null;
11
13
  /** Arbitrary payload returned by `toDatabase()`. */
12
14
  data: Record<string, unknown>;
13
15
  readAt: Date | null;
@@ -20,15 +22,26 @@ export interface NewStoredNotification {
20
22
  notifiableType: string;
21
23
  notifiableId: string;
22
24
  data: Record<string, unknown>;
25
+ tenantId?: string | null;
23
26
  }
24
- /** Persistence abstraction. Implemented by the in-memory store and ORM adapter packages. */
27
+ /**
28
+ * Persistence abstraction. Implemented by the in-memory store and ORM adapter packages. The
29
+ * `tenantId` filter on the read methods scopes results to a tenant; `undefined` matches all
30
+ * tenants (single-tenant behavior).
31
+ */
25
32
  export interface NotificationStore {
26
33
  save(notification: NewStoredNotification): Promise<StoredNotification>;
27
34
  markAsRead(id: string): Promise<void>;
28
- markAllAsRead(notifiableType: string, notifiableId: string): Promise<void>;
29
- getForNotifiable(notifiableType: string, notifiableId: string): Promise<StoredNotification[]>;
30
- getUnread(notifiableType: string, notifiableId: string): Promise<StoredNotification[]>;
35
+ markAllAsRead(notifiableType: string, notifiableId: string, tenantId?: string): Promise<void>;
36
+ getForNotifiable(notifiableType: string, notifiableId: string, tenantId?: string): Promise<StoredNotification[]>;
37
+ getUnread(notifiableType: string, notifiableId: string, tenantId?: string): Promise<StoredNotification[]>;
31
38
  delete(id: string): Promise<void>;
39
+ /**
40
+ * Optionally create the backing schema if it's missing — non-destructively (never drops).
41
+ * Called on bootstrap when `autoCreateSchema` is enabled. Stores that don't manage schema
42
+ * (in-memory, or schema-first ORMs like Prisma) may omit it or make it a no-op.
43
+ */
44
+ ensureSchema?(): Promise<void>;
32
45
  }
33
46
  /**
34
47
  * Implement this on a notification to define its persisted payload. Falls back to
@@ -1 +1 @@
1
- {"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../src/interfaces.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AAEpF,+EAA+E;AAC/E,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,oDAAoD;IACpD,IAAI,EAAE,MAAM,CAAC;IACb,+CAA+C;IAC/C,cAAc,EAAE,MAAM,CAAC;IACvB,+BAA+B;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,oDAAoD;IACpD,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,MAAM,EAAE,IAAI,GAAG,IAAI,CAAC;IACpB,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,gGAAgG;AAChG,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAED,4FAA4F;AAC5F,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,YAAY,EAAE,qBAAqB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACvE,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,aAAa,CAAC,cAAc,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3E,gBAAgB,CAAC,cAAc,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAC;IAC9F,SAAS,CAAC,cAAc,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAC;IACvF,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACnC;AAED;;;GAGG;AACH,MAAM,WAAW,oBAAqB,SAAQ,YAAY;IACxD,UAAU,CAAC,CAAC,UAAU,EAAE,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7D,OAAO,CAAC,CAAC,UAAU,EAAE,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC3D"}
1
+ {"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../src/interfaces.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AAEpF,+EAA+E;AAC/E,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,oDAAoD;IACpD,IAAI,EAAE,MAAM,CAAC;IACb,+CAA+C;IAC/C,cAAc,EAAE,MAAM,CAAC;IACvB,+BAA+B;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,+EAA+E;IAC/E,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,oDAAoD;IACpD,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,MAAM,EAAE,IAAI,GAAG,IAAI,CAAC;IACpB,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,gGAAgG;AAChG,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,YAAY,EAAE,qBAAqB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACvE,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,aAAa,CAAC,cAAc,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9F,gBAAgB,CACd,cAAc,EAAE,MAAM,EACtB,YAAY,EAAE,MAAM,EACpB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAC;IACjC,SAAS,CACP,cAAc,EAAE,MAAM,EACtB,YAAY,EAAE,MAAM,EACpB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAC;IACjC,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC;;;;OAIG;IACH,YAAY,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAChC;AAED;;;GAGG;AACH,MAAM,WAAW,oBAAqB,SAAQ,YAAY;IACxD,UAAU,CAAC,CAAC,UAAU,EAAE,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7D,OAAO,CAAC,CAAC,UAAU,EAAE,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC3D"}
@@ -1,4 +1,4 @@
1
- import type { Notifiable, NotifiableRef } from '@dudousxd/nestjs-notifications-core';
1
+ import { type Notifiable, type NotifiableRef } from '@dudousxd/nestjs-notifications-core';
2
2
  import type { NotificationStore, StoredNotification } from './interfaces';
3
3
  /** A notifiable, or just a stable reference to one. Accepted by every query method. */
4
4
  export type NotifiableTarget = Notifiable | NotifiableRef;
@@ -16,38 +16,44 @@ export interface PaginatedNotifications {
16
16
  perPage: number;
17
17
  total: number;
18
18
  }
19
+ /** Tenant-scoped read API — same methods as {@link NotificationsQueryService}. */
20
+ export interface ScopedNotificationsQuery {
21
+ all(target: NotifiableTarget): Promise<StoredNotification[]>;
22
+ unread(target: NotifiableTarget): Promise<StoredNotification[]>;
23
+ paginate(target: NotifiableTarget, options?: PaginateOptions): Promise<PaginatedNotifications>;
24
+ unreadCount(target: NotifiableTarget): Promise<number>;
25
+ markAsRead(id: string): Promise<void>;
26
+ markAllAsRead(target: NotifiableTarget): Promise<void>;
27
+ delete(id: string): Promise<void>;
28
+ }
19
29
  /**
20
30
  * Read side of the database channel: lists and mutates the notifications the channel
21
- * persisted, mirroring Laravel's `$user->notifications`, `unreadNotifications`,
22
- * `markAsRead()` and friends. Wraps the {@link NotificationStore} it does not extend
23
- * the store interface.
31
+ * persisted, mirroring Laravel's `$user->notifications`, `unreadNotifications`, `markAsRead()`.
32
+ * Scope to a tenant with `forTenant(id)` the same user has an isolated feed per tenant.
24
33
  *
25
34
  * ```ts
26
- * constructor(private readonly notifications: NotificationsQueryService) {}
27
35
  * const inbox = await this.notifications.all(user);
36
+ * const wsInbox = await this.notifications.forTenant(workspaceId).unread(user);
28
37
  * ```
29
38
  */
30
- export declare class NotificationsQueryService {
39
+ export declare class NotificationsQueryService implements ScopedNotificationsQuery {
31
40
  private readonly store;
32
41
  constructor(store: NotificationStore);
33
- /** All notifications for the target, newest first (store ordering). */
34
42
  all(target: NotifiableTarget): Promise<StoredNotification[]>;
35
- /** Unread notifications for the target. */
36
43
  unread(target: NotifiableTarget): Promise<StoredNotification[]>;
37
- /** A single page over {@link all}. */
38
- paginate(target: NotifiableTarget, { page, perPage }?: PaginateOptions): Promise<PaginatedNotifications>;
39
- /** Number of unread notifications for the target. */
44
+ paginate(target: NotifiableTarget, options?: PaginateOptions): Promise<PaginatedNotifications>;
40
45
  unreadCount(target: NotifiableTarget): Promise<number>;
41
- /** Mark one notification read by id. */
42
46
  markAsRead(id: string): Promise<void>;
43
- /** Mark every notification for the target read. */
44
47
  markAllAsRead(target: NotifiableTarget): Promise<void>;
45
- /** Delete one notification by id. */
46
48
  delete(id: string): Promise<void>;
47
- /**
48
- * Derive a {@link NotifiableRef} from the target. Accepts a raw ref directly, otherwise
49
- * prefers `toNotifiableRef()`. Throws if neither is available.
50
- */
49
+ /** Scope every read/mutation to a tenant (workspace). */
50
+ forTenant(tenant: string): ScopedNotificationsQuery;
51
+ private allScoped;
52
+ private unreadScoped;
53
+ private paginateScoped;
54
+ private unreadCountScoped;
55
+ private markAllAsReadScoped;
56
+ /** Accepts a raw ref, a `toNotifiableRef()`, or a `@NotifiableId()`-decorated notifiable. */
51
57
  private refOf;
52
58
  }
53
59
  //# sourceMappingURL=notifications-query.service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"notifications-query.service.d.ts","sourceRoot":"","sources":["../src/notifications-query.service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AAErF,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAG1E,uFAAuF;AACvF,MAAM,MAAM,gBAAgB,GAAG,UAAU,GAAG,aAAa,CAAC;AAE1D,yEAAyE;AACzE,MAAM,WAAW,eAAe;IAC9B,sCAAsC;IACtC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,6BAA6B;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,sCAAsC;AACtC,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,kBAAkB,EAAE,CAAC;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;;;;GAUG;AACH,qBACa,yBAAyB;IAGlC,OAAO,CAAC,QAAQ,CAAC,KAAK;gBAAL,KAAK,EAAE,iBAAiB;IAG3C,uEAAuE;IACjE,GAAG,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAKlE,2CAA2C;IACrC,MAAM,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAKrE,sCAAsC;IAChC,QAAQ,CACZ,MAAM,EAAE,gBAAgB,EACxB,EAAE,IAAQ,EAAE,OAAY,EAAE,GAAE,eAAoB,GAC/C,OAAO,CAAC,sBAAsB,CAAC;IAalC,qDAAqD;IAC/C,WAAW,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC;IAI5D,wCAAwC;IAClC,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI3C,mDAAmD;IAC7C,aAAa,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAK5D,qCAAqC;IAC/B,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvC;;;OAGG;IACH,OAAO,CAAC,KAAK;CAWd"}
1
+ {"version":3,"file":"notifications-query.service.d.ts","sourceRoot":"","sources":["../src/notifications-query.service.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,UAAU,EACf,KAAK,aAAa,EAEnB,MAAM,qCAAqC,CAAC;AAE7C,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAG1E,uFAAuF;AACvF,MAAM,MAAM,gBAAgB,GAAG,UAAU,GAAG,aAAa,CAAC;AAE1D,yEAAyE;AACzE,MAAM,WAAW,eAAe;IAC9B,sCAAsC;IACtC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,6BAA6B;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,sCAAsC;AACtC,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,kBAAkB,EAAE,CAAC;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,kFAAkF;AAClF,MAAM,WAAW,wBAAwB;IACvC,GAAG,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAC;IAC7D,MAAM,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAC;IAChE,QAAQ,CAAC,MAAM,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAC/F,WAAW,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACvD,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,aAAa,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvD,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACnC;AAED;;;;;;;;;GASG;AACH,qBACa,yBAA0B,YAAW,wBAAwB;IAGtE,OAAO,CAAC,QAAQ,CAAC,KAAK;gBAAL,KAAK,EAAE,iBAAiB;IAG3C,GAAG,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAI5D,MAAM,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAI/D,QAAQ,CACN,MAAM,EAAE,gBAAgB,EACxB,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,sBAAsB,CAAC;IAIlC,WAAW,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC;IAIhD,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI3C,aAAa,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhD,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvC,yDAAyD;IACzD,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,wBAAwB;YAYrC,SAAS;YAQT,YAAY;YAQZ,cAAc;YAiBd,iBAAiB;YAIjB,mBAAmB;IAKjC,6FAA6F;IAC7F,OAAO,CAAC,KAAK;CAGd"}
@@ -13,17 +13,17 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
13
13
  };
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
15
  exports.NotificationsQueryService = void 0;
16
+ const nestjs_notifications_core_1 = require("@dudousxd/nestjs-notifications-core");
16
17
  const common_1 = require("@nestjs/common");
17
18
  const tokens_1 = require("./tokens");
18
19
  /**
19
20
  * Read side of the database channel: lists and mutates the notifications the channel
20
- * persisted, mirroring Laravel's `$user->notifications`, `unreadNotifications`,
21
- * `markAsRead()` and friends. Wraps the {@link NotificationStore} it does not extend
22
- * the store interface.
21
+ * persisted, mirroring Laravel's `$user->notifications`, `unreadNotifications`, `markAsRead()`.
22
+ * Scope to a tenant with `forTenant(id)` the same user has an isolated feed per tenant.
23
23
  *
24
24
  * ```ts
25
- * constructor(private readonly notifications: NotificationsQueryService) {}
26
25
  * const inbox = await this.notifications.all(user);
26
+ * const wsInbox = await this.notifications.forTenant(workspaceId).unread(user);
27
27
  * ```
28
28
  */
29
29
  let NotificationsQueryService = class NotificationsQueryService {
@@ -31,21 +31,51 @@ let NotificationsQueryService = class NotificationsQueryService {
31
31
  constructor(store) {
32
32
  this.store = store;
33
33
  }
34
- /** All notifications for the target, newest first (store ordering). */
35
- async all(target) {
34
+ all(target) {
35
+ return this.allScoped(target, undefined);
36
+ }
37
+ unread(target) {
38
+ return this.unreadScoped(target, undefined);
39
+ }
40
+ paginate(target, options = {}) {
41
+ return this.paginateScoped(target, options, undefined);
42
+ }
43
+ unreadCount(target) {
44
+ return this.unreadCountScoped(target, undefined);
45
+ }
46
+ async markAsRead(id) {
47
+ await this.store.markAsRead(id);
48
+ }
49
+ markAllAsRead(target) {
50
+ return this.markAllAsReadScoped(target, undefined);
51
+ }
52
+ async delete(id) {
53
+ await this.store.delete(id);
54
+ }
55
+ /** Scope every read/mutation to a tenant (workspace). */
56
+ forTenant(tenant) {
57
+ return {
58
+ all: (target) => this.allScoped(target, tenant),
59
+ unread: (target) => this.unreadScoped(target, tenant),
60
+ paginate: (target, options) => this.paginateScoped(target, options ?? {}, tenant),
61
+ unreadCount: (target) => this.unreadCountScoped(target, tenant),
62
+ markAsRead: (id) => this.markAsRead(id),
63
+ markAllAsRead: (target) => this.markAllAsReadScoped(target, tenant),
64
+ delete: (id) => this.delete(id),
65
+ };
66
+ }
67
+ async allScoped(target, tenant) {
36
68
  const ref = this.refOf(target);
37
- return this.store.getForNotifiable(ref.type, String(ref.id));
69
+ return this.store.getForNotifiable(ref.type, String(ref.id), tenant);
38
70
  }
39
- /** Unread notifications for the target. */
40
- async unread(target) {
71
+ async unreadScoped(target, tenant) {
41
72
  const ref = this.refOf(target);
42
- return this.store.getUnread(ref.type, String(ref.id));
73
+ return this.store.getUnread(ref.type, String(ref.id), tenant);
43
74
  }
44
- /** A single page over {@link all}. */
45
- async paginate(target, { page = 1, perPage = 20 } = {}) {
75
+ async paginateScoped(target, { page = 1, perPage = 20 }, tenant) {
46
76
  const safePage = Math.max(1, Math.floor(page));
47
77
  const safePerPage = Math.max(1, Math.floor(perPage));
48
- const items = await this.all(target);
78
+ const items = await this.allScoped(target, tenant);
49
79
  const start = (safePage - 1) * safePerPage;
50
80
  return {
51
81
  items: items.slice(start, start + safePerPage),
@@ -54,36 +84,16 @@ let NotificationsQueryService = class NotificationsQueryService {
54
84
  total: items.length,
55
85
  };
56
86
  }
57
- /** Number of unread notifications for the target. */
58
- async unreadCount(target) {
59
- return (await this.unread(target)).length;
60
- }
61
- /** Mark one notification read by id. */
62
- async markAsRead(id) {
63
- await this.store.markAsRead(id);
87
+ async unreadCountScoped(target, tenant) {
88
+ return (await this.unreadScoped(target, tenant)).length;
64
89
  }
65
- /** Mark every notification for the target read. */
66
- async markAllAsRead(target) {
90
+ async markAllAsReadScoped(target, tenant) {
67
91
  const ref = this.refOf(target);
68
- await this.store.markAllAsRead(ref.type, String(ref.id));
69
- }
70
- /** Delete one notification by id. */
71
- async delete(id) {
72
- await this.store.delete(id);
92
+ await this.store.markAllAsRead(ref.type, String(ref.id), tenant);
73
93
  }
74
- /**
75
- * Derive a {@link NotifiableRef} from the target. Accepts a raw ref directly, otherwise
76
- * prefers `toNotifiableRef()`. Throws if neither is available.
77
- */
94
+ /** Accepts a raw ref, a `toNotifiableRef()`, or a `@NotifiableId()`-decorated notifiable. */
78
95
  refOf(target) {
79
- if (isRef(target))
80
- return target;
81
- const toRef = target.toNotifiableRef;
82
- if (typeof toRef === 'function') {
83
- return toRef.call(target);
84
- }
85
- throw new Error('NotificationsQueryService needs a notifiable reference. Pass a { type, id } ref, or ' +
86
- 'implement toNotifiableRef() on the notifiable.');
96
+ return isRef(target) ? target : (0, nestjs_notifications_core_1.notifiableRef)(target);
87
97
  }
88
98
  };
89
99
  exports.NotificationsQueryService = NotificationsQueryService;
@@ -1 +1 @@
1
- {"version":3,"file":"notifications-query.service.js","sourceRoot":"","sources":["../src/notifications-query.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"notifications-query.service.js","sourceRoot":"","sources":["../src/notifications-query.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { type OnApplicationBootstrap } from '@nestjs/common';
2
+ import type { NotificationStore } from './interfaces';
3
+ /**
4
+ * On bootstrap, asks the store to create its schema if missing (non-destructively), so the
5
+ * library is self-contained out of the box. Disable with `autoCreateSchema: false` and manage
6
+ * the schema through your ORM's migrations instead.
7
+ */
8
+ export declare class SchemaInitializer implements OnApplicationBootstrap {
9
+ private readonly store;
10
+ private readonly autoCreateSchema;
11
+ private readonly logger;
12
+ constructor(store: NotificationStore, autoCreateSchema: boolean);
13
+ onApplicationBootstrap(): Promise<void>;
14
+ }
15
+ //# sourceMappingURL=schema-initializer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-initializer.d.ts","sourceRoot":"","sources":["../src/schema-initializer.ts"],"names":[],"mappings":"AAAA,OAAO,EAA8B,KAAK,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACzF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAGtD;;;;GAIG;AACH,qBACa,iBAAkB,YAAW,sBAAsB;IAK5D,OAAO,CAAC,QAAQ,CAAC,KAAK;IAEtB,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IANnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA+B;gBAInC,KAAK,EAAE,iBAAiB,EAExB,gBAAgB,EAAE,OAAO;IAGtC,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC;CAa9C"}
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.SchemaInitializer = void 0;
16
+ const common_1 = require("@nestjs/common");
17
+ const tokens_1 = require("./tokens");
18
+ /**
19
+ * On bootstrap, asks the store to create its schema if missing (non-destructively), so the
20
+ * library is self-contained out of the box. Disable with `autoCreateSchema: false` and manage
21
+ * the schema through your ORM's migrations instead.
22
+ */
23
+ let SchemaInitializer = class SchemaInitializer {
24
+ store;
25
+ autoCreateSchema;
26
+ logger = new common_1.Logger('Notifications');
27
+ constructor(store, autoCreateSchema) {
28
+ this.store = store;
29
+ this.autoCreateSchema = autoCreateSchema;
30
+ }
31
+ async onApplicationBootstrap() {
32
+ if (!this.autoCreateSchema)
33
+ return;
34
+ if (typeof this.store.ensureSchema !== 'function')
35
+ return;
36
+ try {
37
+ await this.store.ensureSchema();
38
+ }
39
+ catch (error) {
40
+ this.logger.error(`Failed to ensure the notifications schema: ${error instanceof Error ? error.message : String(error)}. Set autoCreateSchema: false and manage the schema via migrations if this is expected.`);
41
+ }
42
+ }
43
+ };
44
+ exports.SchemaInitializer = SchemaInitializer;
45
+ exports.SchemaInitializer = SchemaInitializer = __decorate([
46
+ (0, common_1.Injectable)(),
47
+ __param(0, (0, common_1.Inject)(tokens_1.NOTIFICATION_STORE)),
48
+ __param(1, (0, common_1.Inject)(tokens_1.AUTO_CREATE_SCHEMA)),
49
+ __metadata("design:paramtypes", [Object, Boolean])
50
+ ], SchemaInitializer);
51
+ //# sourceMappingURL=schema-initializer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-initializer.js","sourceRoot":"","sources":["../src/schema-initializer.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAAyF;AAEzF,qCAAkE;AAElE;;;;GAIG;AAEI,IAAM,iBAAiB,GAAvB,MAAM,iBAAiB;IAKT;IAEA;IANF,MAAM,GAAG,IAAI,eAAM,CAAC,eAAe,CAAC,CAAC;IAEtD,YAEmB,KAAwB,EAExB,gBAAyB;QAFzB,UAAK,GAAL,KAAK,CAAmB;QAExB,qBAAgB,GAAhB,gBAAgB,CAAS;IACzC,CAAC;IAEJ,KAAK,CAAC,sBAAsB;QAC1B,IAAI,CAAC,IAAI,CAAC,gBAAgB;YAAE,OAAO;QACnC,IAAI,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,KAAK,UAAU;YAAE,OAAO;QAC1D,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;QAClC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,8CACE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CACvD,yFAAyF,CAC1F,CAAC;QACJ,CAAC;IACH,CAAC;CACF,CAAA;AAvBY,8CAAiB;4BAAjB,iBAAiB;IAD7B,IAAA,mBAAU,GAAE;IAKR,WAAA,IAAA,eAAM,EAAC,2BAAkB,CAAC,CAAA;IAE1B,WAAA,IAAA,eAAM,EAAC,2BAAkB,CAAC,CAAA;;GANlB,iBAAiB,CAuB7B"}
package/dist/tokens.d.ts CHANGED
@@ -1,3 +1,5 @@
1
1
  /** DI token for the {@link NotificationStore} implementation backing the database channel. */
2
2
  export declare const NOTIFICATION_STORE: unique symbol;
3
+ /** DI token for the `autoCreateSchema` flag consumed by the SchemaInitializer. */
4
+ export declare const AUTO_CREATE_SCHEMA: unique symbol;
3
5
  //# sourceMappingURL=tokens.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../src/tokens.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,eAAO,MAAM,kBAAkB,eAA+B,CAAC"}
1
+ {"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../src/tokens.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,eAAO,MAAM,kBAAkB,eAA+B,CAAC;AAE/D,kFAAkF;AAClF,eAAO,MAAM,kBAAkB,eAA+B,CAAC"}
package/dist/tokens.js CHANGED
@@ -1,6 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.NOTIFICATION_STORE = void 0;
3
+ exports.AUTO_CREATE_SCHEMA = exports.NOTIFICATION_STORE = void 0;
4
4
  /** DI token for the {@link NotificationStore} implementation backing the database channel. */
5
5
  exports.NOTIFICATION_STORE = Symbol('NOTIFICATION_STORE');
6
+ /** DI token for the `autoCreateSchema` flag consumed by the SchemaInitializer. */
7
+ exports.AUTO_CREATE_SCHEMA = Symbol('AUTO_CREATE_SCHEMA');
6
8
  //# sourceMappingURL=tokens.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tokens.js","sourceRoot":"","sources":["../src/tokens.ts"],"names":[],"mappings":";;;AAAA,8FAA8F;AACjF,QAAA,kBAAkB,GAAG,MAAM,CAAC,oBAAoB,CAAC,CAAC"}
1
+ {"version":3,"file":"tokens.js","sourceRoot":"","sources":["../src/tokens.ts"],"names":[],"mappings":";;;AAAA,8FAA8F;AACjF,QAAA,kBAAkB,GAAG,MAAM,CAAC,oBAAoB,CAAC,CAAC;AAE/D,kFAAkF;AACrE,QAAA,kBAAkB,GAAG,MAAM,CAAC,oBAAoB,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dudousxd/nestjs-notifications-database",
3
- "version": "0.3.0",
3
+ "version": "0.5.0",
4
4
  "description": "Database channel for nestjs-notifications — persist notifications for in-app display",
5
5
  "license": "MIT",
6
6
  "author": "Davide Carvalho",
@@ -23,7 +23,7 @@
23
23
  "@nestjs/common": "^11.0.0",
24
24
  "reflect-metadata": "^0.2.2",
25
25
  "typescript": "^5.7.2",
26
- "@dudousxd/nestjs-notifications-core": "^0.2.0"
26
+ "@dudousxd/nestjs-notifications-core": "^0.4.0"
27
27
  },
28
28
  "scripts": {
29
29
  "build": "tsc -p tsconfig.json",