@dudousxd/nestjs-notifications-database 0.5.0 → 0.7.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.
@@ -9,8 +9,10 @@ export declare const Database: import("@dudousxd/nestjs-notifications-core").Cha
9
9
  export declare class DatabaseChannel implements ChannelDriver {
10
10
  private readonly store;
11
11
  readonly channel = "database";
12
+ private readonly logger;
12
13
  constructor(store: NotificationStore);
13
14
  send(notifiable: Notifiable, notification: Notification, context?: DeliveryContext): Promise<unknown>;
15
+ private upsertKeyFor;
14
16
  private referenceFor;
15
17
  private payloadFor;
16
18
  }
@@ -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,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"}
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;IAMjD,OAAO,CAAC,QAAQ,CAAC,KAAK;IALxB,QAAQ,CAAC,OAAO,cAAc;IAC9B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA+B;gBAInC,KAAK,EAAE,iBAAiB;IAGrC,IAAI,CACR,UAAU,EAAE,UAAU,EACtB,YAAY,EAAE,YAAY,EAC1B,OAAO,CAAC,EAAE,eAAe,GACxB,OAAO,CAAC,OAAO,CAAC;IA8BnB,OAAO,CAAC,YAAY;IASpB,OAAO,CAAC,YAAY;IAQpB,OAAO,CAAC,UAAU;CAUnB"}
@@ -25,6 +25,7 @@ exports.Database = (0, nestjs_notifications_core_1.createChannel)('database');
25
25
  let DatabaseChannel = class DatabaseChannel {
26
26
  store;
27
27
  channel = 'database';
28
+ logger = new common_1.Logger('Notifications');
28
29
  constructor(store) {
29
30
  this.store = store;
30
31
  }
@@ -33,14 +34,28 @@ let DatabaseChannel = class DatabaseChannel {
33
34
  const data = this.payloadFor(notifiable, notification);
34
35
  const type = notification.constructor.notificationName ??
35
36
  notification.constructor.name;
36
- // Return the stored row so it flows into afterSending() and the SendResult.
37
- return this.store.save({
37
+ const input = {
38
38
  type,
39
39
  notifiableType: ref.type,
40
40
  notifiableId: String(ref.id),
41
41
  tenantId: context?.tenant ?? null,
42
42
  data,
43
- });
43
+ };
44
+ // A stable databaseKey means "update this row in place" (live/progress notifications).
45
+ const key = this.upsertKeyFor(notifiable, notification);
46
+ if (key != null) {
47
+ if (typeof this.store.upsert === 'function') {
48
+ return this.store.upsert({ id: key, ...input });
49
+ }
50
+ this.logger.warn(`Notification "${type}" returned a databaseKey but the store does not implement upsert(); inserting a new row instead. Implement NotificationStore.upsert to update in place.`);
51
+ }
52
+ // Return the stored row so it flows into afterSending() and the SendResult.
53
+ return this.store.save(input);
54
+ }
55
+ upsertKeyFor(notifiable, notification) {
56
+ return typeof notification.databaseKey === 'function'
57
+ ? notification.databaseKey(notifiable)
58
+ : undefined;
44
59
  }
45
60
  referenceFor(notifiable, notification) {
46
61
  // A { type, id } returned from the 'database' route wins; otherwise derive the ref from
@@ -1 +1 @@
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"}
1
+ {"version":3,"file":"database.channel.js","sourceRoot":"","sources":["../src/database.channel.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,14 @@
1
+ import type { NotifiableRef } from '@dudousxd/nestjs-notifications-core';
1
2
  import { type DynamicModule, type Type } from '@nestjs/common';
2
3
  import type { NotificationStore } from './interfaces';
4
+ import { type PruneOptions } from './notification-pruner';
5
+ /** Resolves the current notifiable from the request for the auto-mounted inbox controller. */
6
+ type ResolveRef = (req: any) => NotifiableRef | Promise<NotifiableRef>;
7
+ /** Config for the auto-mounted inbox REST controller. */
8
+ export interface InboxControllerOptions {
9
+ /** How to resolve the current notifiable from the request. Default `{ type: 'User', id: req.user?.id }`. */
10
+ resolveRef?: ResolveRef;
11
+ }
3
12
  export interface DatabaseChannelOptions {
4
13
  /** A store class to instantiate, or omit to use the in-memory store. */
5
14
  store?: Type<NotificationStore>;
@@ -12,10 +21,29 @@ export interface DatabaseChannelOptions {
12
21
  * set to false to manage the schema through your ORM's migrations instead.
13
22
  */
14
23
  autoCreateSchema?: boolean;
24
+ /**
25
+ * Auto-mount the inbox REST controller (`GET/POST/DELETE /notifications`). **Default true.**
26
+ * Pass `false` to mount it yourself with {@link createNotificationsController}, or an object to
27
+ * customize how the current notifiable is resolved from the request (defaults to
28
+ * `{ type: 'User', id: req.user?.id }`).
29
+ */
30
+ controller?: boolean | InboxControllerOptions;
31
+ /**
32
+ * Schedule periodic deletion of old notifications. Omit to disable. See {@link PruneOptions}.
33
+ *
34
+ * ```ts
35
+ * DatabaseChannelModule.forRoot({ prune: { olderThan: 90 * 24 * 60 * 60 * 1000, onlyRead: true } })
36
+ * ```
37
+ */
38
+ prune?: PruneOptions;
15
39
  }
16
40
  export interface DatabaseChannelFeatureOptions {
17
41
  /** See {@link DatabaseChannelOptions.autoCreateSchema}. Default true. */
18
42
  autoCreateSchema?: boolean;
43
+ /** See {@link DatabaseChannelOptions.controller}. Default true. */
44
+ controller?: boolean | InboxControllerOptions;
45
+ /** See {@link DatabaseChannelOptions.prune}. */
46
+ prune?: PruneOptions;
19
47
  }
20
48
  /**
21
49
  * Registers the database channel. Pair with an ORM adapter package
@@ -30,4 +58,5 @@ export declare class DatabaseChannelModule {
30
58
  /** Register with an already-provided store token (e.g. provided by an ORM adapter module). */
31
59
  static forFeature(options?: DatabaseChannelFeatureOptions): DynamicModule;
32
60
  }
61
+ export {};
33
62
  //# 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;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"}
1
+ {"version":3,"file":"database.module.d.ts","sourceRoot":"","sources":["../src/database.module.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AACzE,OAAO,EAAE,KAAK,aAAa,EAAyB,KAAK,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAGtF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAsB,KAAK,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAM9E,8FAA8F;AAC9F,KAAK,UAAU,GAAG,CAAC,GAAG,EAAE,GAAG,KAAK,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;AAEvE,yDAAyD;AACzD,MAAM,WAAW,sBAAsB;IACrC,4GAA4G;IAC5G,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB;AAKD,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;IAC3B;;;;;OAKG;IACH,UAAU,CAAC,EAAE,OAAO,GAAG,sBAAsB,CAAC;IAC9C;;;;;;OAMG;IACH,KAAK,CAAC,EAAE,YAAY,CAAC;CACtB;AAED,MAAM,WAAW,6BAA6B;IAC5C,yEAAyE;IACzE,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,mEAAmE;IACnE,UAAU,CAAC,EAAE,OAAO,GAAG,sBAAsB,CAAC;IAC9C,gDAAgD;IAChD,KAAK,CAAC,EAAE,YAAY,CAAC;CACtB;AAUD;;;;;;;GAOG;AACH,qBACa,qBAAqB;IAChC,MAAM,CAAC,OAAO,CAAC,OAAO,GAAE,sBAA2B,GAAG,aAAa;IAsBnE,8FAA8F;IAC9F,MAAM,CAAC,UAAU,CAAC,OAAO,GAAE,6BAAkC,GAAG,aAAa;CAe9E"}
@@ -11,9 +11,20 @@ exports.DatabaseChannelModule = void 0;
11
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
+ const notification_pruner_1 = require("./notification-pruner");
14
15
  const notifications_query_service_1 = require("./notifications-query.service");
16
+ const notifications_controller_1 = require("./notifications.controller");
15
17
  const schema_initializer_1 = require("./schema-initializer");
16
18
  const tokens_1 = require("./tokens");
19
+ /** Default ref resolver — reads `req.user.id` and assumes a `User` notifiable type. */
20
+ const defaultResolveRef = (req) => ({ type: 'User', id: String(req?.user?.id) });
21
+ /** Build the controllers array for the inbox endpoints based on the `controller` option. */
22
+ function inboxControllers(option) {
23
+ if (option === false)
24
+ return [];
25
+ const resolveRef = (option && option !== true ? option.resolveRef : undefined) ?? defaultResolveRef;
26
+ return [(0, notifications_controller_1.createNotificationsController)({ resolveRef })];
27
+ }
17
28
  /**
18
29
  * Registers the database channel. Pair with an ORM adapter package
19
30
  * (`@dudousxd/nestjs-notifications-database-typeorm`, `-mikro-orm`, `-prisma`) or pass a store.
@@ -29,14 +40,17 @@ let DatabaseChannelModule = DatabaseChannelModule_1 = class DatabaseChannelModul
29
40
  storeClass,
30
41
  { provide: tokens_1.NOTIFICATION_STORE, useExisting: storeClass },
31
42
  { provide: tokens_1.AUTO_CREATE_SCHEMA, useValue: options.autoCreateSchema ?? true },
43
+ { provide: tokens_1.PRUNE_OPTIONS, useValue: options.prune ?? null },
32
44
  database_channel_1.DatabaseChannel,
33
45
  notifications_query_service_1.NotificationsQueryService,
34
46
  schema_initializer_1.SchemaInitializer,
47
+ notification_pruner_1.NotificationPruner,
35
48
  ];
36
49
  return {
37
50
  module: DatabaseChannelModule_1,
38
51
  global: options.global ?? true,
39
52
  imports: options.imports ?? [],
53
+ controllers: inboxControllers(options.controller),
40
54
  providers,
41
55
  exports: [database_channel_1.DatabaseChannel, tokens_1.NOTIFICATION_STORE, notifications_query_service_1.NotificationsQueryService],
42
56
  };
@@ -45,11 +59,14 @@ let DatabaseChannelModule = DatabaseChannelModule_1 = class DatabaseChannelModul
45
59
  static forFeature(options = {}) {
46
60
  return {
47
61
  module: DatabaseChannelModule_1,
62
+ controllers: inboxControllers(options.controller),
48
63
  providers: [
49
64
  { provide: tokens_1.AUTO_CREATE_SCHEMA, useValue: options.autoCreateSchema ?? true },
65
+ { provide: tokens_1.PRUNE_OPTIONS, useValue: options.prune ?? null },
50
66
  database_channel_1.DatabaseChannel,
51
67
  notifications_query_service_1.NotificationsQueryService,
52
68
  schema_initializer_1.SchemaInitializer,
69
+ notification_pruner_1.NotificationPruner,
53
70
  ],
54
71
  exports: [database_channel_1.DatabaseChannel, notifications_query_service_1.NotificationsQueryService],
55
72
  };
@@ -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,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"}
1
+ {"version":3,"file":"database.module.js","sourceRoot":"","sources":["../src/database.module.ts"],"names":[],"mappings":";;;;;;;;;;AACA,2CAAsF;AACtF,yDAAqD;AACrD,uDAAkD;AAElD,+DAA8E;AAC9E,+EAA0E;AAC1E,yEAA2E;AAC3E,6DAAyD;AACzD,qCAAiF;AAWjF,uFAAuF;AACvF,MAAM,iBAAiB,GAAe,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;AAwC7F,4FAA4F;AAC5F,SAAS,gBAAgB,CAAC,MAAoD;IAC5E,IAAI,MAAM,KAAK,KAAK;QAAE,OAAO,EAAE,CAAC;IAChC,MAAM,UAAU,GACd,CAAC,MAAM,IAAI,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,iBAAiB,CAAC;IACnF,OAAO,CAAC,IAAA,wDAA6B,EAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC;AACzD,CAAC;AAED;;;;;;;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,EAAE,OAAO,EAAE,sBAAa,EAAE,QAAQ,EAAE,OAAO,CAAC,KAAK,IAAI,IAAI,EAAE;YAC3D,kCAAe;YACf,uDAAyB;YACzB,sCAAiB;YACjB,wCAAkB;SACnB,CAAC;QACF,OAAO;YACL,MAAM,EAAE,uBAAqB;YAC7B,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,IAAI;YAC9B,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE;YAC9B,WAAW,EAAE,gBAAgB,CAAC,OAAO,CAAC,UAAU,CAAC;YACjD,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,WAAW,EAAE,gBAAgB,CAAC,OAAO,CAAC,UAAU,CAAC;YACjD,SAAS,EAAE;gBACT,EAAE,OAAO,EAAE,2BAAkB,EAAE,QAAQ,EAAE,OAAO,CAAC,gBAAgB,IAAI,IAAI,EAAE;gBAC3E,EAAE,OAAO,EAAE,sBAAa,EAAE,QAAQ,EAAE,OAAO,CAAC,KAAK,IAAI,IAAI,EAAE;gBAC3D,kCAAe;gBACf,uDAAyB;gBACzB,sCAAiB;gBACjB,wCAAkB;aACnB;YACD,OAAO,EAAE,CAAC,kCAAe,EAAE,uDAAyB,CAAC;SACtD,CAAC;IACJ,CAAC;CACF,CAAA;AAvCY,sDAAqB;gCAArB,qBAAqB;IADjC,IAAA,eAAM,EAAC,EAAE,CAAC;GACE,qBAAqB,CAuCjC"}
@@ -1,4 +1,4 @@
1
- import type { NewStoredNotification, NotificationStore, StoredNotification } from './interfaces';
1
+ import type { NewStoredNotification, NotificationStore, StoredNotification, UpsertStoredNotification } from './interfaces';
2
2
  /** In-memory {@link NotificationStore} for tests and prototyping. Not for production. */
3
3
  export declare class InMemoryStore implements NotificationStore {
4
4
  private readonly rows;
@@ -8,6 +8,11 @@ export declare class InMemoryStore implements NotificationStore {
8
8
  getForNotifiable(notifiableType: string, notifiableId: string, tenantId?: string): Promise<StoredNotification[]>;
9
9
  getUnread(notifiableType: string, notifiableId: string, tenantId?: string): Promise<StoredNotification[]>;
10
10
  delete(id: string): Promise<void>;
11
+ upsert(input: UpsertStoredNotification): Promise<StoredNotification>;
12
+ prune(options: {
13
+ before: Date;
14
+ onlyRead?: boolean;
15
+ }): Promise<number>;
11
16
  private all;
12
17
  }
13
18
  //# sourceMappingURL=in-memory.store.d.ts.map
@@ -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;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"}
1
+ {"version":3,"file":"in-memory.store.d.ts","sourceRoot":"","sources":["../src/in-memory.store.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,qBAAqB,EACrB,iBAAiB,EACjB,kBAAkB,EAClB,wBAAwB,EACzB,MAAM,cAAc,CAAC;AAEtB,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;IAIjC,MAAM,CAAC,KAAK,EAAE,wBAAwB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAmBpE,KAAK,CAAC,OAAO,EAAE;QAAE,MAAM,EAAE,IAAI,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAY3E,OAAO,CAAC,GAAG;CAGZ"}
@@ -57,6 +57,35 @@ let InMemoryStore = class InMemoryStore {
57
57
  async delete(id) {
58
58
  this.rows.delete(id);
59
59
  }
60
+ async upsert(input) {
61
+ const now = new Date();
62
+ const existing = this.rows.get(input.id);
63
+ const row = {
64
+ id: input.id,
65
+ type: input.type,
66
+ notifiableType: input.notifiableType,
67
+ notifiableId: input.notifiableId,
68
+ tenantId: input.tenantId ?? null,
69
+ data: input.data,
70
+ // An update is a fresh, unread event; createdAt is preserved across updates.
71
+ readAt: null,
72
+ createdAt: existing?.createdAt ?? now,
73
+ updatedAt: now,
74
+ };
75
+ this.rows.set(row.id, row);
76
+ return row;
77
+ }
78
+ async prune(options) {
79
+ const cutoff = options.before.getTime();
80
+ let deleted = 0;
81
+ for (const [id, row] of this.rows) {
82
+ if (row.createdAt.getTime() <= cutoff && (!options.onlyRead || row.readAt != null)) {
83
+ this.rows.delete(id);
84
+ deleted++;
85
+ }
86
+ }
87
+ return deleted;
88
+ }
60
89
  all() {
61
90
  return [...this.rows.values()].sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime());
62
91
  }
@@ -1 +1 @@
1
- {"version":3,"file":"in-memory.store.js","sourceRoot":"","sources":["../src/in-memory.store.ts"],"names":[],"mappings":"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"}
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, AUTO_CREATE_SCHEMA } from './tokens';
2
+ export { NOTIFICATION_STORE, AUTO_CREATE_SCHEMA, PRUNE_OPTIONS } from './tokens';
3
3
  export { Database, DatabaseChannel } from './database.channel';
4
4
  export { InMemoryStore } from './in-memory.store';
5
- export { DatabaseChannelModule, type DatabaseChannelOptions, type DatabaseChannelFeatureOptions, } from './database.module';
5
+ export { DatabaseChannelModule, type DatabaseChannelOptions, type DatabaseChannelFeatureOptions, type InboxControllerOptions, } from './database.module';
6
+ export { NotificationPruner, type PruneOptions } from './notification-pruner';
6
7
  export { SchemaInitializer } from './schema-initializer';
7
8
  export { NotificationsQueryService, type NotifiableTarget, type PaginateOptions, type PaginatedNotifications, } from './notifications-query.service';
8
9
  export { createNotificationsController, type NotificationsControllerOptions, } from './notifications.controller';
@@ -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,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"}
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,aAAa,EAAE,MAAM,UAAU,CAAC;AACjF,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,EAClC,KAAK,sBAAsB,GAC5B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,kBAAkB,EAAE,KAAK,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC9E,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,11 +14,12 @@ 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.SchemaInitializer = exports.DatabaseChannelModule = exports.InMemoryStore = exports.DatabaseChannel = exports.Database = exports.AUTO_CREATE_SCHEMA = exports.NOTIFICATION_STORE = void 0;
17
+ exports.createNotificationsController = exports.NotificationsQueryService = exports.SchemaInitializer = exports.NotificationPruner = exports.DatabaseChannelModule = exports.InMemoryStore = exports.DatabaseChannel = exports.Database = exports.PRUNE_OPTIONS = 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
21
  Object.defineProperty(exports, "AUTO_CREATE_SCHEMA", { enumerable: true, get: function () { return tokens_1.AUTO_CREATE_SCHEMA; } });
22
+ Object.defineProperty(exports, "PRUNE_OPTIONS", { enumerable: true, get: function () { return tokens_1.PRUNE_OPTIONS; } });
22
23
  var database_channel_1 = require("./database.channel");
23
24
  Object.defineProperty(exports, "Database", { enumerable: true, get: function () { return database_channel_1.Database; } });
24
25
  Object.defineProperty(exports, "DatabaseChannel", { enumerable: true, get: function () { return database_channel_1.DatabaseChannel; } });
@@ -26,6 +27,8 @@ var in_memory_store_1 = require("./in-memory.store");
26
27
  Object.defineProperty(exports, "InMemoryStore", { enumerable: true, get: function () { return in_memory_store_1.InMemoryStore; } });
27
28
  var database_module_1 = require("./database.module");
28
29
  Object.defineProperty(exports, "DatabaseChannelModule", { enumerable: true, get: function () { return database_module_1.DatabaseChannelModule; } });
30
+ var notification_pruner_1 = require("./notification-pruner");
31
+ Object.defineProperty(exports, "NotificationPruner", { enumerable: true, get: function () { return notification_pruner_1.NotificationPruner; } });
29
32
  var schema_initializer_1 = require("./schema-initializer");
30
33
  Object.defineProperty(exports, "SchemaInitializer", { enumerable: true, get: function () { return schema_initializer_1.SchemaInitializer; } });
31
34
  var notifications_query_service_1 = require("./notifications-query.service");
package/dist/index.js.map CHANGED
@@ -1 +1 @@
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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,+CAA6B;AAC7B,mCAAiF;AAAxE,4GAAA,kBAAkB,OAAA;AAAE,4GAAA,kBAAkB,OAAA;AAAE,uGAAA,aAAa,OAAA;AAC9D,uDAA+D;AAAtD,4GAAA,QAAQ,OAAA;AAAE,mHAAA,eAAe,OAAA;AAClC,qDAAkD;AAAzC,gHAAA,aAAa,OAAA;AACtB,qDAK2B;AAJzB,wHAAA,qBAAqB,OAAA;AAKvB,6DAA8E;AAArE,yHAAA,kBAAkB,OAAA;AAC3B,2DAAyD;AAAhD,uHAAA,iBAAiB,OAAA;AAC1B,6EAKuC;AAJrC,wIAAA,yBAAyB,OAAA;AAK3B,uEAGoC;AAFlC,yIAAA,6BAA6B,OAAA"}
@@ -24,6 +24,10 @@ export interface NewStoredNotification {
24
24
  data: Record<string, unknown>;
25
25
  tenantId?: string | null;
26
26
  }
27
+ /** Data for an upsert — same as {@link NewStoredNotification} plus the caller-controlled id. */
28
+ export interface UpsertStoredNotification extends NewStoredNotification {
29
+ id: string;
30
+ }
27
31
  /**
28
32
  * Persistence abstraction. Implemented by the in-memory store and ORM adapter packages. The
29
33
  * `tenantId` filter on the read methods scopes results to a tenant; `undefined` matches all
@@ -42,6 +46,26 @@ export interface NotificationStore {
42
46
  * (in-memory, or schema-first ORMs like Prisma) may omit it or make it a no-op.
43
47
  */
44
48
  ensureSchema?(): Promise<void>;
49
+ /**
50
+ * Optionally bulk-delete notifications older than a cutoff, for the scheduled
51
+ * {@link import('./notification-pruner').NotificationPruner}. Removes rows created at or
52
+ * before `before`; `onlyRead` limits deletion to rows that have been read. Returns how many
53
+ * were deleted. Stores that don't implement it are skipped (the pruner logs a warning).
54
+ */
55
+ prune?(options: {
56
+ before: Date;
57
+ onlyRead?: boolean;
58
+ }): Promise<number>;
59
+ /**
60
+ * Optionally insert-or-update a notification by its caller-controlled `id`, for "live" /
61
+ * progress notifications that evolve in place (e.g. an export going 0% → 100%). When the row
62
+ * exists it updates `type`/`data`/`notifiable*`/`tenantId`/`updatedAt` and **resets `readAt` to
63
+ * null** (an update is treated as a fresh, unread event); `createdAt` is preserved. When it
64
+ * doesn't exist it inserts with the given id. Used by the database channel when a notification
65
+ * exposes a {@link DatabaseNotification.databaseKey}. Stores that don't implement it fall back to
66
+ * `save()` (the channel logs a warning).
67
+ */
68
+ upsert?(notification: UpsertStoredNotification): Promise<StoredNotification>;
45
69
  }
46
70
  /**
47
71
  * Implement this on a notification to define its persisted payload. Falls back to
@@ -50,5 +74,14 @@ export interface NotificationStore {
50
74
  export interface DatabaseNotification extends Notification {
51
75
  toDatabase?(notifiable: Notifiable): Record<string, unknown>;
52
76
  toArray?(notifiable: Notifiable): Record<string, unknown>;
77
+ /**
78
+ * A stable, caller-controlled id for "live"/progress notifications that should update a single row
79
+ * in place across multiple sends (e.g. an export progressing 0% → 100%) instead of inserting a new
80
+ * row each time. Return the same string on each `send()` for the same logical notification — the
81
+ * database channel then {@link NotificationStore.upsert | upserts} that row. The value is used
82
+ * directly as the row id, so namespace it for uniqueness (e.g. `file-export:${exportId}`). Return
83
+ * `undefined` (the default — omit the method) for normal insert-per-send behavior.
84
+ */
85
+ databaseKey?(notifiable: Notifiable): string | undefined;
53
86
  }
54
87
  //# sourceMappingURL=interfaces.d.ts.map
@@ -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,+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
+ {"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,gGAAgG;AAChG,MAAM,WAAW,wBAAyB,SAAQ,qBAAqB;IACrE,EAAE,EAAE,MAAM,CAAC;CACZ;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;IAC/B;;;;;OAKG;IACH,KAAK,CAAC,CAAC,OAAO,EAAE;QAAE,MAAM,EAAE,IAAI,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACvE;;;;;;;;OAQG;IACH,MAAM,CAAC,CAAC,YAAY,EAAE,wBAAwB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;CAC9E;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;IAC1D;;;;;;;OAOG;IACH,WAAW,CAAC,CAAC,UAAU,EAAE,UAAU,GAAG,MAAM,GAAG,SAAS,CAAC;CAC1D"}
@@ -0,0 +1,31 @@
1
+ import { type OnApplicationBootstrap, type OnModuleDestroy } from '@nestjs/common';
2
+ import type { NotificationStore } from './interfaces';
3
+ /** Configures the scheduled deletion of old notifications. */
4
+ export interface PruneOptions {
5
+ /** Delete notifications older than this age, in milliseconds (e.g. `90 * 24 * 60 * 60 * 1000`). */
6
+ olderThan: number;
7
+ /** How often to run the prune sweep, in milliseconds. Default `3600000` (1 hour). */
8
+ every?: number;
9
+ /** Only delete notifications that have been read. Default `false` (prune by age regardless). */
10
+ onlyRead?: boolean;
11
+ /** Run a sweep immediately on bootstrap, before the first interval. Default `false`. */
12
+ runOnStartup?: boolean;
13
+ }
14
+ /**
15
+ * Periodically deletes notifications older than {@link PruneOptions.olderThan} by calling the
16
+ * store's optional `prune()`. Runs on a plain `setInterval` (no extra scheduler dependency); the
17
+ * timer is `unref`'d so it never keeps the process alive on its own. Disabled unless `prune` is
18
+ * passed to `DatabaseChannelModule.forRoot`.
19
+ */
20
+ export declare class NotificationPruner implements OnApplicationBootstrap, OnModuleDestroy {
21
+ private readonly store;
22
+ private readonly options;
23
+ private readonly logger;
24
+ private timer?;
25
+ constructor(store: NotificationStore, options: PruneOptions | null);
26
+ onApplicationBootstrap(): void;
27
+ onModuleDestroy(): void;
28
+ /** Run one prune sweep now. Returns how many notifications were deleted. */
29
+ sweep(): Promise<number>;
30
+ }
31
+ //# sourceMappingURL=notification-pruner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notification-pruner.d.ts","sourceRoot":"","sources":["../src/notification-pruner.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,sBAAsB,EAC3B,KAAK,eAAe,EACrB,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAGtD,8DAA8D;AAC9D,MAAM,WAAW,YAAY;IAC3B,mGAAmG;IACnG,SAAS,EAAE,MAAM,CAAC;IAClB,qFAAqF;IACrF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gGAAgG;IAChG,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,wFAAwF;IACxF,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;;;;GAKG;AACH,qBACa,kBAAmB,YAAW,sBAAsB,EAAE,eAAe;IAM9E,OAAO,CAAC,QAAQ,CAAC,KAAK;IAEtB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAP1B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA+B;IACtD,OAAO,CAAC,KAAK,CAAC,CAAiC;gBAI5B,KAAK,EAAE,iBAAiB,EAExB,OAAO,EAAE,YAAY,GAAG,IAAI;IAG/C,sBAAsB,IAAI,IAAI;IAe9B,eAAe,IAAI,IAAI;IAIvB,4EAA4E;IACtE,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;CAgB/B"}
@@ -0,0 +1,76 @@
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.NotificationPruner = void 0;
16
+ const common_1 = require("@nestjs/common");
17
+ const tokens_1 = require("./tokens");
18
+ /**
19
+ * Periodically deletes notifications older than {@link PruneOptions.olderThan} by calling the
20
+ * store's optional `prune()`. Runs on a plain `setInterval` (no extra scheduler dependency); the
21
+ * timer is `unref`'d so it never keeps the process alive on its own. Disabled unless `prune` is
22
+ * passed to `DatabaseChannelModule.forRoot`.
23
+ */
24
+ let NotificationPruner = class NotificationPruner {
25
+ store;
26
+ options;
27
+ logger = new common_1.Logger('Notifications');
28
+ timer;
29
+ constructor(store, options) {
30
+ this.store = store;
31
+ this.options = options;
32
+ }
33
+ onApplicationBootstrap() {
34
+ if (!this.options)
35
+ return;
36
+ if (typeof this.store.prune !== 'function') {
37
+ this.logger.warn('Notification prune is configured but the store does not implement prune(); skipping.');
38
+ return;
39
+ }
40
+ if (this.options.runOnStartup)
41
+ void this.sweep();
42
+ const every = this.options.every ?? 3_600_000;
43
+ this.timer = setInterval(() => void this.sweep(), every);
44
+ // Don't keep the event loop alive solely for pruning.
45
+ this.timer.unref?.();
46
+ }
47
+ onModuleDestroy() {
48
+ if (this.timer)
49
+ clearInterval(this.timer);
50
+ }
51
+ /** Run one prune sweep now. Returns how many notifications were deleted. */
52
+ async sweep() {
53
+ if (!this.options || typeof this.store.prune !== 'function')
54
+ return 0;
55
+ const before = new Date(Date.now() - this.options.olderThan);
56
+ try {
57
+ const deleted = await this.store.prune({ before, onlyRead: this.options.onlyRead });
58
+ if (deleted > 0) {
59
+ this.logger.log(`Pruned ${deleted} notification(s) older than ${before.toISOString()}.`);
60
+ }
61
+ return deleted;
62
+ }
63
+ catch (error) {
64
+ this.logger.error(`Notification prune failed: ${error instanceof Error ? error.message : String(error)}`);
65
+ return 0;
66
+ }
67
+ }
68
+ };
69
+ exports.NotificationPruner = NotificationPruner;
70
+ exports.NotificationPruner = NotificationPruner = __decorate([
71
+ (0, common_1.Injectable)(),
72
+ __param(0, (0, common_1.Inject)(tokens_1.NOTIFICATION_STORE)),
73
+ __param(1, (0, common_1.Inject)(tokens_1.PRUNE_OPTIONS)),
74
+ __metadata("design:paramtypes", [Object, Object])
75
+ ], NotificationPruner);
76
+ //# sourceMappingURL=notification-pruner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notification-pruner.js","sourceRoot":"","sources":["../src/notification-pruner.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAMwB;AAExB,qCAA6D;AAc7D;;;;;GAKG;AAEI,IAAM,kBAAkB,GAAxB,MAAM,kBAAkB;IAMV;IAEA;IAPF,MAAM,GAAG,IAAI,eAAM,CAAC,eAAe,CAAC,CAAC;IAC9C,KAAK,CAAkC;IAE/C,YAEmB,KAAwB,EAExB,OAA4B;QAF5B,UAAK,GAAL,KAAK,CAAmB;QAExB,YAAO,GAAP,OAAO,CAAqB;IAC5C,CAAC;IAEJ,sBAAsB;QACpB,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO;QAC1B,IAAI,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;YAC3C,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,sFAAsF,CACvF,CAAC;YACF,OAAO;QACT,CAAC;QACD,IAAI,IAAI,CAAC,OAAO,CAAC,YAAY;YAAE,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;QACjD,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,SAAS,CAAC;QAC9C,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,KAAK,IAAI,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,CAAC;QACzD,sDAAsD;QACtD,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;IACvB,CAAC;IAED,eAAe;QACb,IAAI,IAAI,CAAC,KAAK;YAAE,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5C,CAAC;IAED,4EAA4E;IAC5E,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,UAAU;YAAE,OAAO,CAAC,CAAC;QACtE,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAC7D,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;YACpF,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;gBAChB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,OAAO,+BAA+B,MAAM,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;YAC3F,CAAC;YACD,OAAO,OAAO,CAAC;QACjB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,8BAA8B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CACvF,CAAC;YACF,OAAO,CAAC,CAAC;QACX,CAAC;IACH,CAAC;CACF,CAAA;AA/CY,gDAAkB;6BAAlB,kBAAkB;IAD9B,IAAA,mBAAU,GAAE;IAMR,WAAA,IAAA,eAAM,EAAC,2BAAkB,CAAC,CAAA;IAE1B,WAAA,IAAA,eAAM,EAAC,sBAAa,CAAC,CAAA;;GAPb,kBAAkB,CA+C9B"}
@@ -1,11 +1,18 @@
1
1
  import type { NotifiableRef } from '@dudousxd/nestjs-notifications-core';
2
- import { type Type } from '@nestjs/common';
2
+ import { type CanActivate, type Type } from '@nestjs/common';
3
3
  /** Options for {@link createNotificationsController}. */
4
4
  export interface NotificationsControllerOptions {
5
5
  /**
6
6
  * Resolves the current notifiable from the request (e.g. from `req.user`). May be async.
7
7
  */
8
8
  resolveRef: (req: any) => NotifiableRef | Promise<NotifiableRef>;
9
+ /** Controller base path. Default `'notifications'`. */
10
+ path?: string;
11
+ /**
12
+ * Guards to protect the endpoints with (e.g. your auth guard). Applied via `@UseGuards` — the
13
+ * inbox is per-user, so it should almost always be authenticated.
14
+ */
15
+ guards?: Array<Type<CanActivate> | CanActivate>;
9
16
  }
10
17
  /**
11
18
  * Builds a `@Controller('notifications')` exposing the in-app inbox endpoints:
@@ -1 +1 @@
1
- {"version":3,"file":"notifications.controller.d.ts","sourceRoot":"","sources":["../src/notifications.controller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AACzE,OAAO,EAAoD,KAAK,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAI7F,yDAAyD;AACzD,MAAM,WAAW,8BAA8B;IAC7C;;OAEG;IACH,UAAU,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;CAClE;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,8BAA8B,GACtC,IAAI,CAAC,OAAO,CAAC,CAgDf"}
1
+ {"version":3,"file":"notifications.controller.d.ts","sourceRoot":"","sources":["../src/notifications.controller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AACzE,OAAO,EACL,KAAK,WAAW,EAQhB,KAAK,IAAI,EAEV,MAAM,gBAAgB,CAAC;AAIxB,yDAAyD;AACzD,MAAM,WAAW,8BAA8B;IAC7C;;OAEG;IACH,UAAU,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IACjE,uDAAuD;IACvD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,MAAM,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,WAAW,CAAC,CAAC;CACjD;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,8BAA8B,GACtC,IAAI,CAAC,OAAO,CAAC,CAoDf"}
@@ -117,9 +117,12 @@ function createNotificationsController(options) {
117
117
  __metadata("design:returntype", Promise)
118
118
  ], NotificationsController.prototype, "remove", null);
119
119
  NotificationsController = __decorate([
120
- (0, common_1.Controller)('notifications'),
120
+ (0, common_1.Controller)(options.path ?? 'notifications'),
121
121
  __metadata("design:paramtypes", [notifications_query_service_1.NotificationsQueryService])
122
122
  ], NotificationsController);
123
+ if (options.guards && options.guards.length > 0) {
124
+ (0, common_1.UseGuards)(...options.guards)(NotificationsController);
125
+ }
123
126
  return NotificationsController;
124
127
  }
125
128
  //# sourceMappingURL=notifications.controller.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"notifications.controller.js","sourceRoot":"","sources":["../src/notifications.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAsCA,sEAkDC;AAvFD,2CAA6F;AAE7F,+EAA0E;AAU1E;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,SAAgB,6BAA6B,CAC3C,OAAuC;IAEvC,IACM,uBAAuB,GAD7B,MACM,uBAAuB;QACE;QAA7B,YAA6B,aAAwC;YAAxC,kBAAa,GAAb,aAAa,CAA2B;QAAG,CAAC;QAGnE,AAAN,KAAK,CAAC,IAAI,CACD,GAAQ,EACA,IAAa,EACV,OAAgB;YAElC,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YAC1C,OAAO,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,GAAG,EAAE;gBACtC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;gBACrC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS;aAC/C,CAAC,CAAC;QACL,CAAC;QAGK,AAAN,KAAK,CAAC,MAAM,CAAQ,GAAQ;YAC1B,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YAC1C,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACxC,CAAC;QAGK,AAAN,KAAK,CAAC,WAAW,CAAQ,GAAQ;YAC/B,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;QAC9D,CAAC;QAGK,AAAN,KAAK,CAAC,UAAU,CAAc,EAAU;YACtC,MAAM,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAC1C,CAAC;QAGK,AAAN,KAAK,CAAC,aAAa,CAAQ,GAAQ;YACjC,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YAC1C,MAAM,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;QAC9C,CAAC;QAGK,AAAN,KAAK,CAAC,MAAM,CAAc,EAAU;YAClC,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACtC,CAAC;KACF,CAAA;IAvCO;QADL,IAAA,YAAG,GAAE;QAEH,WAAA,IAAA,YAAG,GAAE,CAAA;QACL,WAAA,IAAA,cAAK,EAAC,MAAM,CAAC,CAAA;QACb,WAAA,IAAA,cAAK,EAAC,SAAS,CAAC,CAAA;;;;uDAOlB;IAGK;QADL,IAAA,YAAG,EAAC,QAAQ,CAAC;QACA,WAAA,IAAA,YAAG,GAAE,CAAA;;;;yDAGlB;IAGK;QADL,IAAA,YAAG,EAAC,cAAc,CAAC;QACD,WAAA,IAAA,YAAG,GAAE,CAAA;;;;8DAGvB;IAGK;QADL,IAAA,aAAI,EAAC,UAAU,CAAC;QACC,WAAA,IAAA,cAAK,EAAC,IAAI,CAAC,CAAA;;;;6DAE5B;IAGK;QADL,IAAA,aAAI,EAAC,UAAU,CAAC;QACI,WAAA,IAAA,YAAG,GAAE,CAAA;;;;gEAGzB;IAGK;QADL,IAAA,eAAM,EAAC,KAAK,CAAC;QACA,WAAA,IAAA,cAAK,EAAC,IAAI,CAAC,CAAA;;;;yDAExB;IA1CG,uBAAuB;QAD5B,IAAA,mBAAU,EAAC,eAAe,CAAC;yCAEkB,uDAAyB;OADjE,uBAAuB,CA2C5B;IAED,OAAO,uBAAuB,CAAC;AACjC,CAAC"}
1
+ {"version":3,"file":"notifications.controller.js","sourceRoot":"","sources":["../src/notifications.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAwDA,sEAsDC;AA7GD,2CAWwB;AAExB,+EAA0E;AAiB1E;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,SAAgB,6BAA6B,CAC3C,OAAuC;IAEvC,IACM,uBAAuB,GAD7B,MACM,uBAAuB;QACE;QAA7B,YAA6B,aAAwC;YAAxC,kBAAa,GAAb,aAAa,CAA2B;QAAG,CAAC;QAGnE,AAAN,KAAK,CAAC,IAAI,CACD,GAAQ,EACA,IAAa,EACV,OAAgB;YAElC,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YAC1C,OAAO,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,GAAG,EAAE;gBACtC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;gBACrC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS;aAC/C,CAAC,CAAC;QACL,CAAC;QAGK,AAAN,KAAK,CAAC,MAAM,CAAQ,GAAQ;YAC1B,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YAC1C,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACxC,CAAC;QAGK,AAAN,KAAK,CAAC,WAAW,CAAQ,GAAQ;YAC/B,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;QAC9D,CAAC;QAGK,AAAN,KAAK,CAAC,UAAU,CAAc,EAAU;YACtC,MAAM,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAC1C,CAAC;QAGK,AAAN,KAAK,CAAC,aAAa,CAAQ,GAAQ;YACjC,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YAC1C,MAAM,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;QAC9C,CAAC;QAGK,AAAN,KAAK,CAAC,MAAM,CAAc,EAAU;YAClC,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACtC,CAAC;KACF,CAAA;IAvCO;QADL,IAAA,YAAG,GAAE;QAEH,WAAA,IAAA,YAAG,GAAE,CAAA;QACL,WAAA,IAAA,cAAK,EAAC,MAAM,CAAC,CAAA;QACb,WAAA,IAAA,cAAK,EAAC,SAAS,CAAC,CAAA;;;;uDAOlB;IAGK;QADL,IAAA,YAAG,EAAC,QAAQ,CAAC;QACA,WAAA,IAAA,YAAG,GAAE,CAAA;;;;yDAGlB;IAGK;QADL,IAAA,YAAG,EAAC,cAAc,CAAC;QACD,WAAA,IAAA,YAAG,GAAE,CAAA;;;;8DAGvB;IAGK;QADL,IAAA,aAAI,EAAC,UAAU,CAAC;QACC,WAAA,IAAA,cAAK,EAAC,IAAI,CAAC,CAAA;;;;6DAE5B;IAGK;QADL,IAAA,aAAI,EAAC,UAAU,CAAC;QACI,WAAA,IAAA,YAAG,GAAE,CAAA;;;;gEAGzB;IAGK;QADL,IAAA,eAAM,EAAC,KAAK,CAAC;QACA,WAAA,IAAA,cAAK,EAAC,IAAI,CAAC,CAAA;;;;yDAExB;IA1CG,uBAAuB;QAD5B,IAAA,mBAAU,EAAC,OAAO,CAAC,IAAI,IAAI,eAAe,CAAC;yCAEE,uDAAyB;OADjE,uBAAuB,CA2C5B;IAED,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChD,IAAA,kBAAS,EAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,uBAAuB,CAAC,CAAC;IACxD,CAAC;IAED,OAAO,uBAAuB,CAAC;AACjC,CAAC"}
package/dist/tokens.d.ts CHANGED
@@ -2,4 +2,6 @@
2
2
  export declare const NOTIFICATION_STORE: unique symbol;
3
3
  /** DI token for the `autoCreateSchema` flag consumed by the SchemaInitializer. */
4
4
  export declare const AUTO_CREATE_SCHEMA: unique symbol;
5
+ /** DI token for the {@link import('./notification-pruner').PruneOptions} (or null when disabled). */
6
+ export declare const PRUNE_OPTIONS: unique symbol;
5
7
  //# 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;AAE/D,kFAAkF;AAClF,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;AAE/D,qGAAqG;AACrG,eAAO,MAAM,aAAa,eAA0B,CAAC"}
package/dist/tokens.js CHANGED
@@ -1,8 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.AUTO_CREATE_SCHEMA = exports.NOTIFICATION_STORE = void 0;
3
+ exports.PRUNE_OPTIONS = 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
6
  /** DI token for the `autoCreateSchema` flag consumed by the SchemaInitializer. */
7
7
  exports.AUTO_CREATE_SCHEMA = Symbol('AUTO_CREATE_SCHEMA');
8
+ /** DI token for the {@link import('./notification-pruner').PruneOptions} (or null when disabled). */
9
+ exports.PRUNE_OPTIONS = Symbol('PRUNE_OPTIONS');
8
10
  //# 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;AAE/D,kFAAkF;AACrE,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;AAE/D,qGAAqG;AACxF,QAAA,aAAa,GAAG,MAAM,CAAC,eAAe,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dudousxd/nestjs-notifications-database",
3
- "version": "0.5.0",
3
+ "version": "0.7.0",
4
4
  "description": "Database channel for nestjs-notifications — persist notifications for in-app display",
5
5
  "license": "MIT",
6
6
  "author": "Davide Carvalho",
@@ -20,10 +20,10 @@
20
20
  "@nestjs/common": "^10.0.0 || ^11.0.0"
21
21
  },
22
22
  "devDependencies": {
23
- "@nestjs/common": "^11.0.0",
24
- "reflect-metadata": "^0.2.2",
25
- "typescript": "^5.7.2",
26
- "@dudousxd/nestjs-notifications-core": "^0.4.0"
23
+ "@nestjs/common": "11.1.26",
24
+ "reflect-metadata": "0.2.2",
25
+ "typescript": "5.9.3",
26
+ "@dudousxd/nestjs-notifications-core": "^0.5.0"
27
27
  },
28
28
  "scripts": {
29
29
  "build": "tsc -p tsconfig.json",