@dudousxd/nestjs-notifications-database 0.4.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<unknown>;
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,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,CAAC,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC;IAgBhF,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;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,7 +28,7 @@ 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 ??
@@ -38,6 +38,7 @@ let DatabaseChannel = class DatabaseChannel {
38
38
  type,
39
39
  notifiableType: ref.type,
40
40
  notifiableId: String(ref.id),
41
+ tenantId: context?.tenant ?? null,
41
42
  data,
42
43
  });
43
44
  }
@@ -1 +1 @@
1
- {"version":3,"file":"database.channel.js","sourceRoot":"","sources":["../src/database.channel.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,mFAS6C;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,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,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;AA1CY,0CAAe;0BAAf,eAAe;IAD3B,IAAA,mBAAU,GAAE;IAKR,WAAA,IAAA,eAAM,EAAC,2BAAkB,CAAC,CAAA;;GAJlB,eAAe,CA0C3B;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"}
@@ -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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"}
@@ -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,14 +22,19 @@ 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>;
32
39
  /**
33
40
  * Optionally create the backing schema if it's missing — non-destructively (never drops).
@@ -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;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;;;;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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dudousxd/nestjs-notifications-database",
3
- "version": "0.4.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.3.0"
26
+ "@dudousxd/nestjs-notifications-core": "^0.4.0"
27
27
  },
28
28
  "scripts": {
29
29
  "build": "tsc -p tsconfig.json",