@zeeshan60/event-processor 1.0.16 → 1.0.17

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.
Files changed (94) hide show
  1. package/dist/ActivityEventHandler.d.ts +4 -1
  2. package/dist/ActivityEventHandler.d.ts.map +1 -1
  3. package/dist/ActivityEventHandler.js +23 -7
  4. package/dist/ActivityLogEvents.d.ts.map +1 -1
  5. package/dist/ActivityLogEvents.js +1 -0
  6. package/dist/BaseEventHandler.d.ts +7 -0
  7. package/dist/BaseEventHandler.d.ts.map +1 -1
  8. package/dist/BaseEventHandler.js +4 -0
  9. package/dist/EventProcessorSDK.d.ts +4 -0
  10. package/dist/EventProcessorSDK.d.ts.map +1 -1
  11. package/dist/EventProcessorSDK.js +13 -6
  12. package/dist/FriendEventHandler.d.ts +4 -1
  13. package/dist/FriendEventHandler.d.ts.map +1 -1
  14. package/dist/FriendEventHandler.js +25 -13
  15. package/dist/GroupEventHandler.d.ts +4 -1
  16. package/dist/GroupEventHandler.d.ts.map +1 -1
  17. package/dist/GroupEventHandler.js +34 -18
  18. package/dist/GroupTransactionEventHandler.d.ts +4 -6
  19. package/dist/GroupTransactionEventHandler.d.ts.map +1 -1
  20. package/dist/GroupTransactionEventHandler.js +24 -291
  21. package/dist/TransactionEventHandler.d.ts +4 -1
  22. package/dist/TransactionEventHandler.d.ts.map +1 -1
  23. package/dist/TransactionEventHandler.js +24 -6
  24. package/dist/TransactionEvents.d.ts +10 -9
  25. package/dist/TransactionEvents.d.ts.map +1 -1
  26. package/dist/TransactionEvents.js +10 -12
  27. package/dist/UserEventHandler.d.ts +4 -1
  28. package/dist/UserEventHandler.d.ts.map +1 -1
  29. package/dist/UserEventHandler.js +25 -7
  30. package/dist/__tests__/test-helpers/IMActivityLogEventStore.d.ts +1 -0
  31. package/dist/__tests__/test-helpers/IMActivityLogEventStore.d.ts.map +1 -1
  32. package/dist/__tests__/test-helpers/IMActivityLogEventStore.js +3 -0
  33. package/dist/__tests__/test-helpers/IMActivityLogModelStore.d.ts +2 -0
  34. package/dist/__tests__/test-helpers/IMActivityLogModelStore.d.ts.map +1 -1
  35. package/dist/__tests__/test-helpers/IMActivityLogModelStore.js +10 -0
  36. package/dist/__tests__/test-helpers/IMCurrencyStore.d.ts +1 -0
  37. package/dist/__tests__/test-helpers/IMCurrencyStore.d.ts.map +1 -1
  38. package/dist/__tests__/test-helpers/IMCurrencyStore.js +3 -0
  39. package/dist/__tests__/test-helpers/IMFriendModelStore.d.ts +1 -0
  40. package/dist/__tests__/test-helpers/IMFriendModelStore.d.ts.map +1 -1
  41. package/dist/__tests__/test-helpers/IMFriendModelStore.js +7 -0
  42. package/dist/__tests__/test-helpers/IMGroupModelStore.d.ts +1 -0
  43. package/dist/__tests__/test-helpers/IMGroupModelStore.d.ts.map +1 -1
  44. package/dist/__tests__/test-helpers/IMGroupModelStore.js +7 -0
  45. package/dist/__tests__/test-helpers/IMGroupTransactionEventStore.d.ts +2 -0
  46. package/dist/__tests__/test-helpers/IMGroupTransactionEventStore.d.ts.map +1 -1
  47. package/dist/__tests__/test-helpers/IMGroupTransactionEventStore.js +18 -0
  48. package/dist/__tests__/test-helpers/IMGroupTransactionModelStore.d.ts +1 -0
  49. package/dist/__tests__/test-helpers/IMGroupTransactionModelStore.d.ts.map +1 -1
  50. package/dist/__tests__/test-helpers/IMGroupTransactionModelStore.js +7 -0
  51. package/dist/__tests__/test-helpers/IMTransactionEventStore.d.ts +2 -0
  52. package/dist/__tests__/test-helpers/IMTransactionEventStore.d.ts.map +1 -1
  53. package/dist/__tests__/test-helpers/IMTransactionEventStore.js +6 -0
  54. package/dist/__tests__/test-helpers/IMTransactionModelStore.d.ts +1 -0
  55. package/dist/__tests__/test-helpers/IMTransactionModelStore.d.ts.map +1 -1
  56. package/dist/__tests__/test-helpers/IMTransactionModelStore.js +7 -0
  57. package/dist/__tests__/test-helpers/IMUserModelStore.d.ts +1 -0
  58. package/dist/__tests__/test-helpers/IMUserModelStore.d.ts.map +1 -1
  59. package/dist/__tests__/test-helpers/IMUserModelStore.js +7 -0
  60. package/dist/client/controllers/FriendController.d.ts.map +1 -1
  61. package/dist/client/controllers/FriendController.js +40 -4
  62. package/dist/client/controllers/TransactionController.d.ts +7 -2
  63. package/dist/client/controllers/TransactionController.d.ts.map +1 -1
  64. package/dist/client/controllers/TransactionController.js +90 -17
  65. package/dist/client/handlers/UIEventHandler.d.ts +3 -0
  66. package/dist/client/handlers/UIEventHandler.d.ts.map +1 -1
  67. package/dist/client/handlers/UIEventHandler.js +36 -0
  68. package/dist/common/Model.d.ts +1 -0
  69. package/dist/common/Model.d.ts.map +1 -1
  70. package/dist/contracts/friends/index.d.ts +1 -0
  71. package/dist/contracts/friends/index.d.ts.map +1 -1
  72. package/dist/contracts/groups/index.d.ts +1 -1
  73. package/dist/contracts/groups/index.d.ts.map +1 -1
  74. package/dist/contracts/transactions/index.d.ts +33 -23
  75. package/dist/contracts/transactions/index.d.ts.map +1 -1
  76. package/dist/contracts/transactions/index.js +14 -11
  77. package/dist/converters/ActivityLogConverters.d.ts.map +1 -1
  78. package/dist/converters/ActivityLogConverters.js +3 -1
  79. package/dist/index.d.ts +0 -3
  80. package/dist/index.d.ts.map +1 -1
  81. package/dist/index.js +1 -5
  82. package/dist/store/CurrencyStore.d.ts +1 -0
  83. package/dist/store/CurrencyStore.d.ts.map +1 -1
  84. package/dist/store/ModelStore.d.ts +1 -0
  85. package/dist/store/ModelStore.d.ts.map +1 -1
  86. package/dist/utils/BalanceUtil.d.ts +5 -1
  87. package/dist/utils/BalanceUtil.d.ts.map +1 -1
  88. package/dist/utils/BalanceUtil.js +9 -1
  89. package/dist/utils/splitTypeUtils.d.ts.map +1 -1
  90. package/dist/utils/splitTypeUtils.js +21 -21
  91. package/package.json +1 -1
  92. package/dist/environment.d.ts +0 -12
  93. package/dist/environment.d.ts.map +0 -1
  94. package/dist/environment.js +0 -50
@@ -12,6 +12,9 @@ class IMActivityLogEventStore {
12
12
  getAllEvents() {
13
13
  return [...this.events];
14
14
  }
15
+ getAll() {
16
+ return this.getAllEvents();
17
+ }
15
18
  clear() {
16
19
  this.events = [];
17
20
  }
@@ -3,8 +3,10 @@ export declare class IMActivityLogModelStore implements ActivityLogModelStore {
3
3
  private models;
4
4
  getByStreamId(streamId: string): Promise<ActivityLogModel | undefined>;
5
5
  getByStreamIdWhereDeletedIsFalse(streamId: string): Promise<ActivityLogModel | undefined>;
6
+ getLatestByUpdatedAt(): Promise<ActivityLogModel | undefined>;
6
7
  save(model: ActivityLogModel): Promise<void>;
7
8
  clear(): void;
8
9
  getAllModels(): ActivityLogModel[];
10
+ getAll(): ActivityLogModel[];
9
11
  }
10
12
  //# sourceMappingURL=IMActivityLogModelStore.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"IMActivityLogModelStore.d.ts","sourceRoot":"","sources":["../../../src/__tests__/test-helpers/IMActivityLogModelStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,OAAO,CAAC;AAEhE,qBAAa,uBAAwB,YAAW,qBAAqB;IACjE,OAAO,CAAC,MAAM,CAA4C;IAEpD,aAAa,CACf,QAAQ,EAAE,MAAM,GACjB,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC;IAIlC,gCAAgC,CAClC,QAAQ,EAAE,MAAM,GACjB,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC;IAQlC,IAAI,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAKlD,KAAK,IAAI,IAAI;IAIb,YAAY,IAAI,gBAAgB,EAAE;CAGrC"}
1
+ {"version":3,"file":"IMActivityLogModelStore.d.ts","sourceRoot":"","sources":["../../../src/__tests__/test-helpers/IMActivityLogModelStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,OAAO,CAAC;AAEhE,qBAAa,uBAAwB,YAAW,qBAAqB;IACjE,OAAO,CAAC,MAAM,CAA4C;IAEpD,aAAa,CACf,QAAQ,EAAE,MAAM,GACjB,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC;IAIlC,gCAAgC,CAClC,QAAQ,EAAE,MAAM,GACjB,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC;IAQlC,oBAAoB,IAAI,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC;IAU7D,IAAI,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAKlD,KAAK,IAAI,IAAI;IAIb,YAAY,IAAI,gBAAgB,EAAE;IAIlC,MAAM,IAAI,gBAAgB,EAAE;CAG/B"}
@@ -15,6 +15,13 @@ class IMActivityLogModelStore {
15
15
  }
16
16
  return undefined;
17
17
  }
18
+ async getLatestByUpdatedAt() {
19
+ const models = Array.from(this.models.values());
20
+ if (models.length === 0) {
21
+ return undefined;
22
+ }
23
+ return models.reduce((latest, current) => current.updatedAt > latest.updatedAt ? current : latest);
24
+ }
18
25
  async save(model) {
19
26
  this.models.set(model.streamId, model);
20
27
  }
@@ -25,5 +32,8 @@ class IMActivityLogModelStore {
25
32
  getAllModels() {
26
33
  return Array.from(this.models.values());
27
34
  }
35
+ getAll() {
36
+ return this.getAllModels();
37
+ }
28
38
  }
29
39
  exports.IMActivityLogModelStore = IMActivityLogModelStore;
@@ -2,6 +2,7 @@ import { CurrencyRate, CurrencyStore } from "../..";
2
2
  export declare class IMCurrencyStore extends CurrencyStore {
3
3
  private currencyRate;
4
4
  getCurrencyRates(): Promise<CurrencyRate | undefined>;
5
+ saveCurrencyRates(rates: CurrencyRate): Promise<void>;
5
6
  setCurrencyRates(rate: CurrencyRate): void;
6
7
  clear(): void;
7
8
  }
@@ -1 +1 @@
1
- {"version":3,"file":"IMCurrencyStore.d.ts","sourceRoot":"","sources":["../../../src/__tests__/test-helpers/IMCurrencyStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAEpD,qBAAa,eAAgB,SAAQ,aAAa;IAC9C,OAAO,CAAC,YAAY,CAA2B;IAEzC,gBAAgB,IAAI,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC;IAI3D,gBAAgB,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI;IAI1C,KAAK,IAAI,IAAI;CAGhB"}
1
+ {"version":3,"file":"IMCurrencyStore.d.ts","sourceRoot":"","sources":["../../../src/__tests__/test-helpers/IMCurrencyStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAEpD,qBAAa,eAAgB,SAAQ,aAAa;IAC9C,OAAO,CAAC,YAAY,CAA2B;IAEzC,gBAAgB,IAAI,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC;IAIrD,iBAAiB,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAI3D,gBAAgB,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI;IAI1C,KAAK,IAAI,IAAI;CAGhB"}
@@ -6,6 +6,9 @@ class IMCurrencyStore extends __1.CurrencyStore {
6
6
  async getCurrencyRates() {
7
7
  return this.currencyRate;
8
8
  }
9
+ async saveCurrencyRates(rates) {
10
+ this.currencyRate = rates;
11
+ }
9
12
  setCurrencyRates(rate) {
10
13
  this.currencyRate = rate;
11
14
  }
@@ -3,6 +3,7 @@ export declare class IMFriendModelStore implements FriendModelStore {
3
3
  private models;
4
4
  getByStreamId(streamId: string): Promise<FriendModel | undefined>;
5
5
  getByStreamIdWhereDeletedIsFalse(streamId: string): Promise<FriendModel | undefined>;
6
+ getLatestByUpdatedAt(): Promise<FriendModel | undefined>;
6
7
  findByUserIdAndStreamIdAndDeletedIsFalse(userId: string, streamId: string): Promise<FriendModel | undefined>;
7
8
  findByUserIdAndFriendIdAndDeletedIsFalse(userId: string, friendId: string): Promise<FriendModel | undefined>;
8
9
  findByUserIdAndFriendEmailAndDeletedIsFalse(userId: string, email: string): Promise<FriendModel | undefined>;
@@ -1 +1 @@
1
- {"version":3,"file":"IMFriendModelStore.d.ts","sourceRoot":"","sources":["../../../src/__tests__/test-helpers/IMFriendModelStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,OAAO,CAAC;AAEtD,qBAAa,kBAAmB,YAAW,gBAAgB;IACvD,OAAO,CAAC,MAAM,CAAuC;IAE/C,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;IAKjE,gCAAgC,CAClC,QAAQ,EAAE,MAAM,GACjB,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;IAQ7B,wCAAwC,CAC1C,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACjB,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;IAa7B,wCAAwC,CAC1C,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACjB,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;IAa7B,2CAA2C,CAC7C,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACd,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;IAa7B,iDAAiD,CACnD,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,GACpB,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;IAa7B,kCAAkC,CACpC,MAAM,EAAE,MAAM,GACf,OAAO,CAAC,WAAW,EAAE,CAAC;IAUnB,IAAI,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAI7C,MAAM,IAAI,WAAW,EAAE;IAIvB,yBAAyB,IAAI,WAAW,EAAE;IAM1C,KAAK,IAAI,IAAI;CAGhB"}
1
+ {"version":3,"file":"IMFriendModelStore.d.ts","sourceRoot":"","sources":["../../../src/__tests__/test-helpers/IMFriendModelStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,OAAO,CAAC;AAEtD,qBAAa,kBAAmB,YAAW,gBAAgB;IACvD,OAAO,CAAC,MAAM,CAAuC;IAE/C,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;IAKjE,gCAAgC,CAClC,QAAQ,EAAE,MAAM,GACjB,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;IAQ7B,oBAAoB,IAAI,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;IAUxD,wCAAwC,CAC1C,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACjB,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;IAa7B,wCAAwC,CAC1C,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACjB,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;IAa7B,2CAA2C,CAC7C,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACd,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;IAa7B,iDAAiD,CACnD,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,GACpB,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;IAa7B,kCAAkC,CACpC,MAAM,EAAE,MAAM,GACf,OAAO,CAAC,WAAW,EAAE,CAAC;IAUnB,IAAI,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAI7C,MAAM,IAAI,WAAW,EAAE;IAIvB,yBAAyB,IAAI,WAAW,EAAE;IAM1C,KAAK,IAAI,IAAI;CAGhB"}
@@ -16,6 +16,13 @@ class IMFriendModelStore {
16
16
  }
17
17
  return model;
18
18
  }
19
+ async getLatestByUpdatedAt() {
20
+ const models = Array.from(this.models.values());
21
+ if (models.length === 0) {
22
+ return undefined;
23
+ }
24
+ return models.reduce((latest, current) => current.updatedAt > latest.updatedAt ? current : latest);
25
+ }
19
26
  async findByUserIdAndStreamIdAndDeletedIsFalse(userId, streamId) {
20
27
  for (const model of this.models.values()) {
21
28
  if (model.userId === userId &&
@@ -3,6 +3,7 @@ export declare class IMGroupModelStore implements GroupModelStore {
3
3
  private models;
4
4
  getByStreamId(streamId: string): Promise<GroupModel | undefined>;
5
5
  getByStreamIdWhereDeletedIsFalse(streamId: string): Promise<GroupModel | undefined>;
6
+ getLatestByUpdatedAt(): Promise<GroupModel | undefined>;
6
7
  findByUserIdAndGroupIdAndDeletedIsFalse(userId: string, groupId: string): Promise<GroupModel | undefined>;
7
8
  findAllByGroupIdAndDeletedIsFalse(groupId: string): Promise<GroupModel[]>;
8
9
  save(model: GroupModel): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"IMGroupModelStore.d.ts","sourceRoot":"","sources":["../../../src/__tests__/test-helpers/IMGroupModelStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,OAAO,CAAC;AAEpD,qBAAa,iBAAkB,YAAW,eAAe;IACrD,OAAO,CAAC,MAAM,CAAsC;IAE9C,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;IAKhE,gCAAgC,CAClC,QAAQ,EAAE,MAAM,GACjB,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;IAQ5B,uCAAuC,CACzC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,GAChB,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;IAa5B,iCAAiC,CACnC,OAAO,EAAE,MAAM,GAChB,OAAO,CAAC,UAAU,EAAE,CAAC;IAUlB,IAAI,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAI5C,MAAM,IAAI,UAAU,EAAE;IAItB,yBAAyB,IAAI,UAAU,EAAE;IAMzC,KAAK,IAAI,IAAI;CAGhB"}
1
+ {"version":3,"file":"IMGroupModelStore.d.ts","sourceRoot":"","sources":["../../../src/__tests__/test-helpers/IMGroupModelStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,OAAO,CAAC;AAEpD,qBAAa,iBAAkB,YAAW,eAAe;IACrD,OAAO,CAAC,MAAM,CAAsC;IAE9C,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;IAKhE,gCAAgC,CAClC,QAAQ,EAAE,MAAM,GACjB,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;IAQ5B,oBAAoB,IAAI,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;IAUvD,uCAAuC,CACzC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,GAChB,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;IAa5B,iCAAiC,CACnC,OAAO,EAAE,MAAM,GAChB,OAAO,CAAC,UAAU,EAAE,CAAC;IAUlB,IAAI,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAI5C,MAAM,IAAI,UAAU,EAAE;IAItB,yBAAyB,IAAI,UAAU,EAAE;IAMzC,KAAK,IAAI,IAAI;CAGhB"}
@@ -16,6 +16,13 @@ class IMGroupModelStore {
16
16
  }
17
17
  return model;
18
18
  }
19
+ async getLatestByUpdatedAt() {
20
+ const models = Array.from(this.models.values());
21
+ if (models.length === 0) {
22
+ return undefined;
23
+ }
24
+ return models.reduce((latest, current) => current.updatedAt > latest.updatedAt ? current : latest);
25
+ }
19
26
  async findByUserIdAndGroupIdAndDeletedIsFalse(userId, groupId) {
20
27
  for (const model of this.models.values()) {
21
28
  if (model.userId === userId &&
@@ -3,6 +3,8 @@ export declare class IMGroupTransactionEventStore implements GroupTransactionEve
3
3
  private events;
4
4
  addEvent(event: GroupTransactionEvent): Promise<void>;
5
5
  getEvents(userId: string): GroupTransactionEvent[];
6
+ getAll(): GroupTransactionEvent[];
7
+ clearSystemGenerated(): void;
6
8
  clear(): void;
7
9
  }
8
10
  //# sourceMappingURL=IMGroupTransactionEventStore.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"IMGroupTransactionEventStore.d.ts","sourceRoot":"","sources":["../../../src/__tests__/test-helpers/IMGroupTransactionEventStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,0BAA0B,EAAE,MAAM,OAAO,CAAC;AAE1E,qBAAa,4BACT,YAAW,0BAA0B;IAErC,OAAO,CAAC,MAAM,CAAmD;IAE3D,QAAQ,CAAC,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC;IAM3D,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,qBAAqB,EAAE;IAIlD,KAAK,IAAI,IAAI;CAGhB"}
1
+ {"version":3,"file":"IMGroupTransactionEventStore.d.ts","sourceRoot":"","sources":["../../../src/__tests__/test-helpers/IMGroupTransactionEventStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,0BAA0B,EAAE,MAAM,OAAO,CAAC;AAE1E,qBAAa,4BACT,YAAW,0BAA0B;IAErC,OAAO,CAAC,MAAM,CAAmD;IAE3D,QAAQ,CAAC,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC;IAM3D,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,qBAAqB,EAAE;IAIlD,MAAM,IAAI,qBAAqB,EAAE;IAQjC,oBAAoB,IAAI,IAAI;IAa5B,KAAK,IAAI,IAAI;CAGhB"}
@@ -13,6 +13,24 @@ class IMGroupTransactionEventStore {
13
13
  getEvents(userId) {
14
14
  return this.events.get(userId) || [];
15
15
  }
16
+ getAll() {
17
+ const allEvents = [];
18
+ for (const userEvents of this.events.values()) {
19
+ allEvents.push(...userEvents);
20
+ }
21
+ return allEvents;
22
+ }
23
+ clearSystemGenerated() {
24
+ for (const [userId, userEvents] of this.events.entries()) {
25
+ const filtered = userEvents.filter((e) => e.systemGenerated !== true);
26
+ if (filtered.length > 0) {
27
+ this.events.set(userId, filtered);
28
+ }
29
+ else {
30
+ this.events.delete(userId);
31
+ }
32
+ }
33
+ }
16
34
  clear() {
17
35
  this.events.clear();
18
36
  }
@@ -3,6 +3,7 @@ export declare class IMGroupTransactionModelStore implements GroupTransactionMod
3
3
  private models;
4
4
  getByStreamId(streamId: string): Promise<GroupTransactionModel | undefined>;
5
5
  getByStreamIdWhereDeletedIsFalse(streamId: string): Promise<GroupTransactionModel | undefined>;
6
+ getLatestByUpdatedAt(): Promise<GroupTransactionModel | undefined>;
6
7
  findAllByGroupIdAndTransactionIdAndDeletedIsFalse(groupId: string, transactionId: string): Promise<GroupTransactionModel[]>;
7
8
  findByUserIdAndTransactionId(userId: string, transactionId: string): Promise<GroupTransactionModel | undefined>;
8
9
  save(model: GroupTransactionModel): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"IMGroupTransactionModelStore.d.ts","sourceRoot":"","sources":["../../../src/__tests__/test-helpers/IMGroupTransactionModelStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,0BAA0B,EAAE,MAAM,OAAO,CAAC;AAE1E,qBAAa,4BACT,YAAW,0BAA0B;IAErC,OAAO,CAAC,MAAM,CAAiD;IAEzD,aAAa,CACf,QAAQ,EAAE,MAAM,GACjB,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC;IAKvC,gCAAgC,CAClC,QAAQ,EAAE,MAAM,GACjB,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC;IAQvC,iDAAiD,CACnD,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,MAAM,GACtB,OAAO,CAAC,qBAAqB,EAAE,CAAC;IAc7B,4BAA4B,CAC9B,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,MAAM,GACtB,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC;IAavC,IAAI,CAAC,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvD,MAAM,IAAI,qBAAqB,EAAE;IAIjC,yBAAyB,IAAI,qBAAqB,EAAE;IAMpD,KAAK,IAAI,IAAI;CAGhB"}
1
+ {"version":3,"file":"IMGroupTransactionModelStore.d.ts","sourceRoot":"","sources":["../../../src/__tests__/test-helpers/IMGroupTransactionModelStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,0BAA0B,EAAE,MAAM,OAAO,CAAC;AAE1E,qBAAa,4BACT,YAAW,0BAA0B;IAErC,OAAO,CAAC,MAAM,CAAiD;IAEzD,aAAa,CACf,QAAQ,EAAE,MAAM,GACjB,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC;IAKvC,gCAAgC,CAClC,QAAQ,EAAE,MAAM,GACjB,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC;IAQvC,oBAAoB,IAAI,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC;IAUlE,iDAAiD,CACnD,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,MAAM,GACtB,OAAO,CAAC,qBAAqB,EAAE,CAAC;IAc7B,4BAA4B,CAC9B,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,MAAM,GACtB,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC;IAavC,IAAI,CAAC,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvD,MAAM,IAAI,qBAAqB,EAAE;IAIjC,yBAAyB,IAAI,qBAAqB,EAAE;IAMpD,KAAK,IAAI,IAAI;CAGhB"}
@@ -16,6 +16,13 @@ class IMGroupTransactionModelStore {
16
16
  }
17
17
  return model;
18
18
  }
19
+ async getLatestByUpdatedAt() {
20
+ const models = Array.from(this.models.values());
21
+ if (models.length === 0) {
22
+ return undefined;
23
+ }
24
+ return models.reduce((latest, current) => current.updatedAt > latest.updatedAt ? current : latest);
25
+ }
19
26
  async findAllByGroupIdAndTransactionIdAndDeletedIsFalse(groupId, transactionId) {
20
27
  const results = [];
21
28
  for (const model of this.models.values()) {
@@ -3,7 +3,9 @@ export declare class IMTransactionEventStore implements TransactionEventStore {
3
3
  private events;
4
4
  addEvent(event: TransactionEvent): Promise<void>;
5
5
  getEvents(): TransactionEvent[];
6
+ getAll(): TransactionEvent[];
6
7
  getEventsByStreamId(streamId: string): TransactionEvent[];
8
+ clearSystemGenerated(): void;
7
9
  clear(): void;
8
10
  }
9
11
  //# sourceMappingURL=IMTransactionEventStore.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"IMTransactionEventStore.d.ts","sourceRoot":"","sources":["../../../src/__tests__/test-helpers/IMTransactionEventStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,OAAO,CAAC;AAEhE,qBAAa,uBAAwB,YAAW,qBAAqB;IACjE,OAAO,CAAC,MAAM,CAA0B;IAElC,QAAQ,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAItD,SAAS,IAAI,gBAAgB,EAAE;IAI/B,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB,EAAE;IAIzD,KAAK,IAAI,IAAI;CAGhB"}
1
+ {"version":3,"file":"IMTransactionEventStore.d.ts","sourceRoot":"","sources":["../../../src/__tests__/test-helpers/IMTransactionEventStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,OAAO,CAAC;AAEhE,qBAAa,uBAAwB,YAAW,qBAAqB;IACjE,OAAO,CAAC,MAAM,CAA0B;IAElC,QAAQ,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAItD,SAAS,IAAI,gBAAgB,EAAE;IAI/B,MAAM,IAAI,gBAAgB,EAAE;IAI5B,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB,EAAE;IAIzD,oBAAoB,IAAI,IAAI;IAI5B,KAAK,IAAI,IAAI;CAGhB"}
@@ -11,9 +11,15 @@ class IMTransactionEventStore {
11
11
  getEvents() {
12
12
  return [...this.events];
13
13
  }
14
+ getAll() {
15
+ return this.getEvents();
16
+ }
14
17
  getEventsByStreamId(streamId) {
15
18
  return this.events.filter((event) => event.streamId === streamId);
16
19
  }
20
+ clearSystemGenerated() {
21
+ this.events = this.events.filter((e) => e.systemGenerated !== true);
22
+ }
17
23
  clear() {
18
24
  this.events = [];
19
25
  }
@@ -3,6 +3,7 @@ export declare class IMTransactionModelStore implements TransactionModelStore {
3
3
  private models;
4
4
  getByStreamId(streamId: string): Promise<TransactionModel | undefined>;
5
5
  getByStreamIdWhereDeletedIsFalse(streamId: string): Promise<TransactionModel | undefined>;
6
+ getLatestByUpdatedAt(): Promise<TransactionModel | undefined>;
6
7
  findByUserAndLogicalTransactionId(userId: string, recipientUserId: string, logicalTransactionId: string): Promise<TransactionModel | undefined>;
7
8
  findByGroupTransactionId(userId: string, groupTransactionId: string): Promise<TransactionModel[]>;
8
9
  findByUserIdAndRecipientUserIdWhereDeletedIsFalse(userId: string, recipientUserId: string): Promise<TransactionModel[]>;
@@ -1 +1 @@
1
- {"version":3,"file":"IMTransactionModelStore.d.ts","sourceRoot":"","sources":["../../../src/__tests__/test-helpers/IMTransactionModelStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,OAAO,CAAC;AAEhE,qBAAa,uBAAwB,YAAW,qBAAqB;IACjE,OAAO,CAAC,MAAM,CAA4C;IAEpD,aAAa,CACf,QAAQ,EAAE,MAAM,GACjB,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC;IAKlC,gCAAgC,CAClC,QAAQ,EAAE,MAAM,GACjB,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC;IAQlC,iCAAiC,CACnC,MAAM,EAAE,MAAM,EACd,eAAe,EAAE,MAAM,EACvB,oBAAoB,EAAE,MAAM,GAC7B,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC;IAclC,wBAAwB,CAC1B,MAAM,EAAE,MAAM,EACd,kBAAkB,EAAE,MAAM,GAC3B,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAcxB,iDAAiD,CACnD,MAAM,EAAE,MAAM,EACd,eAAe,EAAE,MAAM,GACxB,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAcxB,kCAAkC,CACpC,MAAM,EAAE,MAAM,GACf,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAUxB,IAAI,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlD,MAAM,IAAI,gBAAgB,EAAE;IAI5B,yBAAyB,IAAI,gBAAgB,EAAE;IAM/C,KAAK,IAAI,IAAI;CAGhB"}
1
+ {"version":3,"file":"IMTransactionModelStore.d.ts","sourceRoot":"","sources":["../../../src/__tests__/test-helpers/IMTransactionModelStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,OAAO,CAAC;AAEhE,qBAAa,uBAAwB,YAAW,qBAAqB;IACjE,OAAO,CAAC,MAAM,CAA4C;IAEpD,aAAa,CACf,QAAQ,EAAE,MAAM,GACjB,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC;IAKlC,gCAAgC,CAClC,QAAQ,EAAE,MAAM,GACjB,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC;IAQlC,oBAAoB,IAAI,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC;IAU7D,iCAAiC,CACnC,MAAM,EAAE,MAAM,EACd,eAAe,EAAE,MAAM,EACvB,oBAAoB,EAAE,MAAM,GAC7B,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC;IAclC,wBAAwB,CAC1B,MAAM,EAAE,MAAM,EACd,kBAAkB,EAAE,MAAM,GAC3B,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAcxB,iDAAiD,CACnD,MAAM,EAAE,MAAM,EACd,eAAe,EAAE,MAAM,GACxB,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAcxB,kCAAkC,CACpC,MAAM,EAAE,MAAM,GACf,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAUxB,IAAI,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlD,MAAM,IAAI,gBAAgB,EAAE;IAI5B,yBAAyB,IAAI,gBAAgB,EAAE;IAM/C,KAAK,IAAI,IAAI;CAGhB"}
@@ -16,6 +16,13 @@ class IMTransactionModelStore {
16
16
  }
17
17
  return model;
18
18
  }
19
+ async getLatestByUpdatedAt() {
20
+ const models = Array.from(this.models.values());
21
+ if (models.length === 0) {
22
+ return undefined;
23
+ }
24
+ return models.reduce((latest, current) => current.updatedAt > latest.updatedAt ? current : latest);
25
+ }
19
26
  async findByUserAndLogicalTransactionId(userId, recipientUserId, logicalTransactionId) {
20
27
  for (const model of this.models.values()) {
21
28
  if (model.userId === userId &&
@@ -4,6 +4,7 @@ export declare class IMUserModelStore implements UserModelStore {
4
4
  private currentUser;
5
5
  getByStreamId(streamId: string): Promise<UserModel | undefined>;
6
6
  getByStreamIdWhereDeletedIsFalse(streamId: string): Promise<UserModel | undefined>;
7
+ getLatestByUpdatedAt(): Promise<UserModel | undefined>;
7
8
  save(model: UserModel): Promise<void>;
8
9
  findByEmail(email: string): Promise<UserModel | undefined>;
9
10
  findByPhone(phone: string): Promise<UserModel | undefined>;
@@ -1 +1 @@
1
- {"version":3,"file":"IMUserModelStore.d.ts","sourceRoot":"","sources":["../../../src/__tests__/test-helpers/IMUserModelStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAElD,qBAAa,gBAAiB,YAAW,cAAc;IACnD,OAAO,CAAC,MAAM,CAAqC;IACnD,OAAO,CAAC,WAAW,CAAwB;IAErC,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;IAK/D,gCAAgC,CAClC,QAAQ,EAAE,MAAM,GACjB,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;IAQ3B,IAAI,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrC,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;IAS1D,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;IAS1D,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;IASpE,MAAM,IAAI,SAAS,EAAE;IAIrB,yBAAyB,IAAI,SAAS,EAAE;IAMxC,KAAK,IAAI,IAAI;IAIb,cAAc,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI;IAI/B,OAAO,IAAI,OAAO,CAAC,SAAS,CAAC;CAOtC"}
1
+ {"version":3,"file":"IMUserModelStore.d.ts","sourceRoot":"","sources":["../../../src/__tests__/test-helpers/IMUserModelStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAElD,qBAAa,gBAAiB,YAAW,cAAc;IACnD,OAAO,CAAC,MAAM,CAAqC;IACnD,OAAO,CAAC,WAAW,CAAwB;IAErC,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;IAK/D,gCAAgC,CAClC,QAAQ,EAAE,MAAM,GACjB,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;IAQ3B,oBAAoB,IAAI,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;IAUtD,IAAI,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrC,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;IAS1D,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;IAS1D,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;IASpE,MAAM,IAAI,SAAS,EAAE;IAIrB,yBAAyB,IAAI,SAAS,EAAE;IAMxC,KAAK,IAAI,IAAI;IAIb,cAAc,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI;IAI/B,OAAO,IAAI,OAAO,CAAC,SAAS,CAAC;CAOtC"}
@@ -16,6 +16,13 @@ class IMUserModelStore {
16
16
  }
17
17
  return model;
18
18
  }
19
+ async getLatestByUpdatedAt() {
20
+ const models = Array.from(this.models.values());
21
+ if (models.length === 0) {
22
+ return undefined;
23
+ }
24
+ return models.reduce((latest, current) => current.updatedAt > latest.updatedAt ? current : latest);
25
+ }
19
26
  async save(model) {
20
27
  this.models.set(model.streamId, model);
21
28
  }
@@ -1 +1 @@
1
- {"version":3,"file":"FriendController.d.ts","sourceRoot":"","sources":["../../../src/client/controllers/FriendController.ts"],"names":[],"mappings":"AAMA,OAAO,EACH,aAAa,EACb,cAAc,EACd,eAAe,EACf,mBAAmB,EACtB,MAAM,yBAAyB,CAAC;AAMjC,qBAAa,gBAAgB;IACzB,OAAO,KAAK,UAAU,GAGrB;IAED,OAAO,KAAK,qBAAqB,GAGhC;IAED,OAAO,KAAK,cAAc,GAEzB;IAED,OAAO,KAAK,aAAa,GAExB;IAED,OAAO,KAAK,kBAAkB,GAE7B;IAED,OAAO,KAAK,WAAW,GAEtB;IAEK,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC;IA2BlE,YAAY,CACd,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,mBAAmB,GAC7B,OAAO,CAAC,IAAI,CAAC;IAuDV,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiC7D,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAiCpE,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAU9D,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAuC7D,OAAO,CAAC,gBAAgB;CAmB3B"}
1
+ {"version":3,"file":"FriendController.d.ts","sourceRoot":"","sources":["../../../src/client/controllers/FriendController.ts"],"names":[],"mappings":"AAMA,OAAO,EACH,aAAa,EACb,cAAc,EACd,eAAe,EACf,mBAAmB,EACtB,MAAM,yBAAyB,CAAC;AAMjC,qBAAa,gBAAgB;IACzB,OAAO,KAAK,UAAU,GAGrB;IAED,OAAO,KAAK,qBAAqB,GAGhC;IAED,OAAO,KAAK,cAAc,GAEzB;IAED,OAAO,KAAK,aAAa,GAExB;IAED,OAAO,KAAK,kBAAkB,GAE7B;IAED,OAAO,KAAK,WAAW,GAEtB;IAEK,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC;IAqDlE,YAAY,CACd,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,mBAAmB,GAC7B,OAAO,CAAC,IAAI,CAAC;IAgGV,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAkC7D,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAkCpE,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAU9D,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IA4C7D,OAAO,CAAC,gBAAgB;CAoB3B"}
@@ -30,6 +30,18 @@ class FriendController {
30
30
  if (!request.email && !request.phoneNumber) {
31
31
  throw new Error("Either email or phoneNumber must be provided");
32
32
  }
33
+ if (request.email) {
34
+ const existingFriendByEmail = await this.modelStore.findByUserIdAndFriendEmailAndDeletedIsFalse(userId, request.email.trim());
35
+ if (existingFriendByEmail) {
36
+ throw new Error(`Friend with email ${request.email} already exists`);
37
+ }
38
+ }
39
+ if (request.phoneNumber) {
40
+ const existingFriendByPhone = await this.modelStore.findByUserIdAndFriendPhoneNumberAndDeletedIsFalse(userId, request.phoneNumber.trim());
41
+ if (existingFriendByPhone) {
42
+ throw new Error(`Friend with phone number ${request.phoneNumber} already exists`);
43
+ }
44
+ }
33
45
  const streamId = (0, uuid_1.v4)();
34
46
  const createdAt = new Date();
35
47
  const event = new FriendEvents_1.FriendCreated({
@@ -53,11 +65,30 @@ class FriendController {
53
65
  let friendModel = await this.modelStore.findByUserIdAndFriendIdAndDeletedIsFalse(userId, friendId);
54
66
  if (!friendModel) {
55
67
  //fallback to find by streamId
56
- friendModel = await this.modelStore.findByUserIdAndStreamIdAndDeletedIsFalse(userId, friendId);
68
+ friendModel =
69
+ await this.modelStore.findByUserIdAndStreamIdAndDeletedIsFalse(userId, friendId);
57
70
  }
58
71
  if (!friendModel) {
59
72
  throw new Error(`Friend not found: ${friendId}`);
60
73
  }
74
+ if (request.email !== undefined &&
75
+ request.email.trim() !== "" &&
76
+ request.email !== friendModel.friendEmail) {
77
+ const existingFriendByEmail = await this.modelStore.findByUserIdAndFriendEmailAndDeletedIsFalse(userId, request.email.trim());
78
+ if (existingFriendByEmail &&
79
+ existingFriendByEmail.streamId !== friendModel.streamId) {
80
+ throw new Error(`Another friend with email ${request.email} already exists`);
81
+ }
82
+ }
83
+ if (request.phoneNumber !== undefined &&
84
+ request.phoneNumber.trim() !== "" &&
85
+ request.phoneNumber !== friendModel.friendPhoneNumber) {
86
+ const existingFriendByPhone = await this.modelStore.findByUserIdAndFriendPhoneNumberAndDeletedIsFalse(userId, request.phoneNumber.trim());
87
+ if (existingFriendByPhone &&
88
+ existingFriendByPhone.streamId !== friendModel.streamId) {
89
+ throw new Error(`Another friend with phone number ${request.phoneNumber} already exists`);
90
+ }
91
+ }
61
92
  const hasChanges = (request.email !== undefined &&
62
93
  request.email.trim() !== "" &&
63
94
  request.email !== friendModel.friendEmail) ||
@@ -91,7 +122,8 @@ class FriendController {
91
122
  let friendModel = await this.modelStore.findByUserIdAndFriendIdAndDeletedIsFalse(userId, friendId);
92
123
  if (!friendModel) {
93
124
  //fallback to find by streamId
94
- friendModel = await this.modelStore.findByUserIdAndStreamIdAndDeletedIsFalse(userId, friendId);
125
+ friendModel =
126
+ await this.modelStore.findByUserIdAndStreamIdAndDeletedIsFalse(userId, friendId);
95
127
  }
96
128
  if (!friendModel) {
97
129
  throw new Error(`Friend not found: ${friendId}`);
@@ -112,7 +144,8 @@ class FriendController {
112
144
  let friendModel = await this.modelStore.findByUserIdAndFriendIdAndDeletedIsFalse(userId, friendId);
113
145
  if (!friendModel) {
114
146
  //fallback to find by streamId
115
- friendModel = await this.modelStore.findByUserIdAndStreamIdAndDeletedIsFalse(userId, friendId);
147
+ friendModel =
148
+ await this.modelStore.findByUserIdAndStreamIdAndDeletedIsFalse(userId, friendId);
116
149
  }
117
150
  if (!friendModel) {
118
151
  throw new Error(`Friend not found: ${friendId}`);
@@ -132,6 +165,7 @@ class FriendController {
132
165
  async getAllFriends(userId) {
133
166
  const friendModels = await this.modelStore.findAllByUserIdWhereDeletedIsFalse(userId);
134
167
  const allTransactions = await this.transactionModelStore.findAllByUserIdWhereDeletedIsFalse(userId);
168
+ // todo: balance calculation should not use firestore it should always read from sqlite model store
135
169
  const mainBalance = await this.balanceUtil.calculateBalance(allTransactions, userId);
136
170
  const friendsWithBalance = await Promise.all(friendModels.map(async (friendModel) => {
137
171
  const recipientUserId = friendModel.friendId ?? friendModel.streamId;
@@ -140,7 +174,8 @@ class FriendController {
140
174
  return this.toFriendResponse(friendModel, friendBalance);
141
175
  }));
142
176
  return {
143
- friends: friendsWithBalance,
177
+ friends: friendsWithBalance.sort((a, b) => new Date(b.createdAt).getTime() -
178
+ new Date(a.createdAt).getTime()),
144
179
  balance: mainBalance,
145
180
  };
146
181
  }
@@ -157,6 +192,7 @@ class FriendController {
157
192
  email: friendModel.friendEmail,
158
193
  phone: friendModel.friendPhoneNumber,
159
194
  balance: balance ?? emptyBalance,
195
+ createdAt: friendModel.createdAt,
160
196
  };
161
197
  }
162
198
  }
@@ -1,18 +1,23 @@
1
- import { TransactionCreateRequest, TransactionResponse, TransactionUpdateRequest, TransactionsResponse } from "../../contracts/transactions";
1
+ import { TransactionCreateRequest, Transaction, TransactionUpdateRequest, TransactionsResponse } from "../../contracts/transactions";
2
2
  export declare class TransactionController {
3
3
  private get modelStore();
4
4
  private get transactionEventHandler();
5
5
  private get userModelStore();
6
6
  private get currencyStore();
7
7
  private get balanceUtil();
8
+ private get friendModelStore();
8
9
  private calculateAmount;
10
+ private buildUserNameMap;
9
11
  addTransaction(userId: string, request: TransactionCreateRequest): Promise<string>;
10
12
  updateTransaction(userId: string, transactionId: string, request: TransactionUpdateRequest): Promise<void>;
11
13
  deleteTransaction(userId: string, transactionId: string): Promise<void>;
12
- getTransaction(userId: string, transactionId: string): Promise<TransactionResponse>;
14
+ getTransaction(userId: string, transactionId: string): Promise<Transaction>;
13
15
  getTransactionsByMonth(userId: string, friendId: string, timeZone: string): Promise<TransactionsResponse>;
14
16
  private groupTransactionsByMonth;
15
17
  private startOfMonth;
16
18
  private toTransactionResponse;
19
+ private getUserName;
20
+ private mapHistoryToResponse;
21
+ private mapChangeTypeToTransactionChangeType;
17
22
  }
18
23
  //# sourceMappingURL=TransactionController.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"TransactionController.d.ts","sourceRoot":"","sources":["../../../src/client/controllers/TransactionController.ts"],"names":[],"mappings":"AAWA,OAAO,EACH,wBAAwB,EACxB,mBAAmB,EACnB,wBAAwB,EACxB,oBAAoB,EAEvB,MAAM,8BAA8B,CAAC;AAKtC,qBAAa,qBAAqB;IAC9B,OAAO,KAAK,UAAU,GAGrB;IAED,OAAO,KAAK,uBAAuB,GAElC;IAED,OAAO,KAAK,cAAc,GAEzB;IAED,OAAO,KAAK,aAAa,GAExB;IAED,OAAO,KAAK,WAAW,GAEtB;IAED,OAAO,CAAC,eAAe;IAYjB,cAAc,CAChB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,wBAAwB,GAClC,OAAO,CAAC,MAAM,CAAC;IAgCZ,iBAAiB,CACnB,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,wBAAwB,GAClC,OAAO,CAAC,IAAI,CAAC;IAuHV,iBAAiB,CACnB,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,MAAM,GACtB,OAAO,CAAC,IAAI,CAAC;IA6BV,cAAc,CAChB,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,MAAM,GACtB,OAAO,CAAC,mBAAmB,CAAC;IAkBzB,sBAAsB,CACxB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACjB,OAAO,CAAC,oBAAoB,CAAC;IAyChC,OAAO,CAAC,wBAAwB;IAwBhC,OAAO,CAAC,YAAY;IAapB,OAAO,CAAC,qBAAqB;CAuChC"}
1
+ {"version":3,"file":"TransactionController.d.ts","sourceRoot":"","sources":["../../../src/client/controllers/TransactionController.ts"],"names":[],"mappings":"AAaA,OAAO,EACH,wBAAwB,EACxB,WAAW,EACX,wBAAwB,EACxB,oBAAoB,EAMvB,MAAM,8BAA8B,CAAC;AAKtC,qBAAa,qBAAqB;IAC9B,OAAO,KAAK,UAAU,GAGrB;IAED,OAAO,KAAK,uBAAuB,GAElC;IAED,OAAO,KAAK,cAAc,GAEzB;IAED,OAAO,KAAK,aAAa,GAExB;IAED,OAAO,KAAK,WAAW,GAEtB;IAED,OAAO,KAAK,gBAAgB,GAG3B;IAED,OAAO,CAAC,eAAe;YAYT,gBAAgB;IAgBxB,cAAc,CAChB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,wBAAwB,GAClC,OAAO,CAAC,MAAM,CAAC;IAgCZ,iBAAiB,CACnB,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,wBAAwB,GAClC,OAAO,CAAC,IAAI,CAAC;IAuHV,iBAAiB,CACnB,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,MAAM,GACtB,OAAO,CAAC,IAAI,CAAC;IA6BV,cAAc,CAChB,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,MAAM,GACtB,OAAO,CAAC,WAAW,CAAC;IAgCjB,sBAAsB,CACxB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACjB,OAAO,CAAC,oBAAoB,CAAC;IAiDhC,OAAO,CAAC,wBAAwB;IAwBhC,OAAO,CAAC,YAAY;IAapB,OAAO,CAAC,qBAAqB;IA8D7B,OAAO,CAAC,WAAW;IAWnB,OAAO,CAAC,oBAAoB;IAqC5B,OAAO,CAAC,oCAAoC;CAkB/C"}
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.TransactionController = void 0;
4
4
  const TransactionEvents_1 = require("../../TransactionEvents");
5
+ const transactions_1 = require("../../contracts/transactions");
5
6
  const EventProcessorSDK_1 = require("../../EventProcessorSDK");
6
7
  const uuid_1 = require("uuid");
7
8
  const BalanceUtil_1 = require("../../utils/BalanceUtil");
@@ -22,15 +23,32 @@ class TransactionController {
22
23
  get balanceUtil() {
23
24
  return new BalanceUtil_1.BalanceUtil(this.userModelStore, this.currencyStore);
24
25
  }
26
+ get friendModelStore() {
27
+ return EventProcessorSDK_1.EventProcessorSDK.getInstance().getStoreConfig()
28
+ .friendModelStore;
29
+ }
25
30
  calculateAmount(splitType, totalAmount) {
26
- if (splitType === TransactionEvents_1.SplitType.TheyOweYouAll ||
27
- splitType === TransactionEvents_1.SplitType.YouOweThemAll ||
28
- splitType === TransactionEvents_1.SplitType.YouPaidToSettle ||
29
- splitType === TransactionEvents_1.SplitType.TheyPaidToSettle) {
31
+ if (splitType === TransactionEvents_1.SplitTypeEnum.TheyOweYouAll ||
32
+ splitType === TransactionEvents_1.SplitTypeEnum.YouOweThemAll ||
33
+ splitType === TransactionEvents_1.SplitTypeEnum.YouPaidToSettle ||
34
+ splitType === TransactionEvents_1.SplitTypeEnum.TheyPaidToSettle) {
30
35
  return totalAmount;
31
36
  }
32
37
  return totalAmount / 2;
33
38
  }
39
+ async buildUserNameMap(userId) {
40
+ const friends = await this.friendModelStore.findAllByUserIdWhereDeletedIsFalse(userId);
41
+ const nameMap = new Map();
42
+ for (const friend of friends) {
43
+ // Map friendId (registered user) to display name
44
+ if (friend.friendId) {
45
+ nameMap.set(friend.friendId, friend.friendDisplayName);
46
+ }
47
+ // Also map streamId (for placeholder friends) to display name
48
+ nameMap.set(friend.streamId, friend.friendDisplayName);
49
+ }
50
+ return nameMap;
51
+ }
34
52
  async addTransaction(userId, request) {
35
53
  const streamId = (0, uuid_1.v4)();
36
54
  const createdAt = new Date();
@@ -181,7 +199,12 @@ class TransactionController {
181
199
  if (transactionModel.userId !== userId) {
182
200
  throw new Error(`Unauthorized to view transaction: ${transactionId}`);
183
201
  }
184
- return this.toTransactionResponse(transactionModel);
202
+ // Fetch user, currency rates, and friend names once
203
+ const user = await this.userModelStore.getByStreamIdWhereDeletedIsFalse(userId);
204
+ const toCurrency = user?.currency ?? "USD";
205
+ const currencyRates = (await this.currencyStore.getCurrencyRates())?.rates ?? {};
206
+ const userNameMap = await this.buildUserNameMap(userId);
207
+ return this.toTransactionResponse(transactionModel, userId, toCurrency, currencyRates, userNameMap);
185
208
  }
186
209
  async getTransactionsByMonth(userId, friendId, timeZone) {
187
210
  if (!timeZone || timeZone.trim() === "") {
@@ -195,10 +218,15 @@ class TransactionController {
195
218
  }
196
219
  const transactions = await this.modelStore.findByUserIdAndRecipientUserIdWhereDeletedIsFalse(userId, friendId);
197
220
  const balance = await this.balanceUtil.calculateBalance(transactions, userId);
221
+ // Fetch user, currency rates, and friend names once for all conversions
222
+ const user = await this.userModelStore.getByStreamIdWhereDeletedIsFalse(userId);
223
+ const toCurrency = user?.currency ?? "USD";
224
+ const currencyRates = (await this.currencyStore.getCurrencyRates())?.rates ?? {};
225
+ const userNameMap = await this.buildUserNameMap(userId);
198
226
  const sortedTransactions = transactions
199
227
  .sort((a, b) => new Date(b.transactionDate).getTime() -
200
228
  new Date(a.transactionDate).getTime())
201
- .map((t) => this.toTransactionResponse(t));
229
+ .map((t) => this.toTransactionResponse(t, userId, toCurrency, currencyRates, userNameMap));
202
230
  const groupedByMonth = this.groupTransactionsByMonth(sortedTransactions, timeZone);
203
231
  return {
204
232
  balance,
@@ -234,7 +262,9 @@ class TransactionController {
234
262
  });
235
263
  return new Date(`${year}-${month}-01T00:00:00.000Z`).toISOString();
236
264
  }
237
- toTransactionResponse(transactionModel) {
265
+ toTransactionResponse(transactionModel, currentUserId, toCurrency, rates, userNameMap) {
266
+ const convertedAmount = this.balanceUtil.convertAmount(transactionModel.amount, transactionModel.currency, toCurrency, rates);
267
+ const history = this.mapHistoryToResponse(transactionModel.history, currentUserId, userNameMap);
238
268
  return {
239
269
  date: transactionModel.transactionDate.toISOString(),
240
270
  description: transactionModel.description,
@@ -249,27 +279,70 @@ class TransactionController {
249
279
  currency: transactionModel.currency,
250
280
  isOwed: transactionModel.isOwed,
251
281
  },
252
- friend: {
253
- friendId: transactionModel.recipientUserId,
254
- email: undefined,
255
- phoneNumber: undefined,
256
- photoUrl: undefined,
257
- name: undefined,
282
+ defaultCurrencyAmount: {
283
+ amount: convertedAmount.amount,
284
+ currency: convertedAmount.currency,
285
+ isOwed: transactionModel.isOwed,
258
286
  },
259
- defaultCurrencyAmount: undefined,
260
- history: [],
287
+ history,
261
288
  createdAt: transactionModel.createdAt.toISOString(),
262
289
  updatedAt: transactionModel.updatedAt.toISOString(),
263
290
  createdBy: {
264
291
  id: transactionModel.createdBy,
265
- name: "User",
292
+ name: this.getUserName(transactionModel.createdBy, currentUserId, userNameMap),
266
293
  },
267
294
  updatedBy: {
268
295
  id: transactionModel.updatedBy,
269
- name: "User",
296
+ name: this.getUserName(transactionModel.updatedBy, currentUserId, userNameMap),
270
297
  },
271
298
  deleted: transactionModel.deleted,
272
299
  };
273
300
  }
301
+ getUserName(userId, currentUserId, userNameMap) {
302
+ if (userId === currentUserId) {
303
+ return "You";
304
+ }
305
+ return userNameMap.get(userId) ?? "User";
306
+ }
307
+ mapHistoryToResponse(history, currentUserId, userNameMap) {
308
+ const grouped = new Map();
309
+ for (const change of history.changes) {
310
+ const changedByName = this.getUserName(change.changedBy, currentUserId, userNameMap);
311
+ const dto = {
312
+ date: change.changedAt.toISOString(),
313
+ changedBy: change.changedBy,
314
+ changedByName,
315
+ oldValue: String(change.oldValue),
316
+ newValue: String(change.newValue),
317
+ type: this.mapChangeTypeToTransactionChangeType(change.type),
318
+ };
319
+ const key = `${change.changedBy}_${change.changedAt.toISOString()}`;
320
+ if (!grouped.has(key)) {
321
+ grouped.set(key, []);
322
+ }
323
+ grouped.get(key).push(dto);
324
+ }
325
+ return Array.from(grouped.entries()).map(([key, changes]) => ({
326
+ changedBy: changes[0].changedBy,
327
+ changedByName: changes[0].changedByName,
328
+ changes,
329
+ }));
330
+ }
331
+ mapChangeTypeToTransactionChangeType(type) {
332
+ switch (type) {
333
+ case "DESCRIPTION_UPDATED":
334
+ return transactions_1.TransactionChangeTypeEnum.DESCRIPTION;
335
+ case "AMOUNT_UPDATED":
336
+ return transactions_1.TransactionChangeTypeEnum.AMOUNT;
337
+ case "CURRENCY_UPDATED":
338
+ return transactions_1.TransactionChangeTypeEnum.CURRENCY;
339
+ case "SPLIT_TYPE_UPDATED":
340
+ return transactions_1.TransactionChangeTypeEnum.SPLIT_TYPE;
341
+ case "TRANSACTION_DATE_UPDATED":
342
+ return transactions_1.TransactionChangeTypeEnum.TRANSACTION_DATE;
343
+ default:
344
+ return transactions_1.TransactionChangeTypeEnum.DESCRIPTION;
345
+ }
346
+ }
274
347
  }
275
348
  exports.TransactionController = TransactionController;
@@ -2,5 +2,8 @@ import { Event } from "../../index";
2
2
  export declare class UIEventHandler {
3
3
  constructor();
4
4
  handleFirestoreEvent(event: Event): Promise<void>;
5
+ handleFirestoreEvents(events: Event[]): Promise<void>;
6
+ handleSystemSettingUpdate(settingType: string, payload: unknown): Promise<void>;
7
+ private groupEventsByType;
5
8
  }
6
9
  //# sourceMappingURL=UIEventHandler.d.ts.map