@zeeshan60/event-processor 1.0.123 → 1.0.126

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 (179) hide show
  1. package/dist/EventProcessorSDK.d.ts +30 -3
  2. package/dist/EventProcessorSDK.d.ts.map +1 -1
  3. package/dist/EventProcessorSDK.js +58 -3
  4. package/dist/EventProcessorSDK.js.map +1 -1
  5. package/dist/ExpenseAccountEventHandler.d.ts.map +1 -1
  6. package/dist/ExpenseAccountEventHandler.js +1 -2
  7. package/dist/ExpenseAccountEventHandler.js.map +1 -1
  8. package/dist/ExpenseEventHandler.d.ts +2 -3
  9. package/dist/ExpenseEventHandler.d.ts.map +1 -1
  10. package/dist/ExpenseEventHandler.js +19 -8
  11. package/dist/ExpenseEventHandler.js.map +1 -1
  12. package/dist/ExpenseEvents.d.ts +8 -20
  13. package/dist/ExpenseEvents.d.ts.map +1 -1
  14. package/dist/ExpenseEvents.js +5 -62
  15. package/dist/ExpenseEvents.js.map +1 -1
  16. package/dist/GroupTransactionEventHandler.d.ts +1 -3
  17. package/dist/GroupTransactionEventHandler.d.ts.map +1 -1
  18. package/dist/GroupTransactionEventHandler.js +1 -4
  19. package/dist/GroupTransactionEventHandler.js.map +1 -1
  20. package/dist/GroupTransactionEvents.d.ts +7 -20
  21. package/dist/GroupTransactionEvents.d.ts.map +1 -1
  22. package/dist/GroupTransactionEvents.js +5 -52
  23. package/dist/GroupTransactionEvents.js.map +1 -1
  24. package/dist/RecurringExpenseEventHandler.d.ts +20 -0
  25. package/dist/RecurringExpenseEventHandler.d.ts.map +1 -0
  26. package/dist/RecurringExpenseEventHandler.js +90 -0
  27. package/dist/RecurringExpenseEventHandler.js.map +1 -0
  28. package/dist/RecurringExpenseEvents.d.ts +160 -0
  29. package/dist/RecurringExpenseEvents.d.ts.map +1 -0
  30. package/dist/RecurringExpenseEvents.js +161 -0
  31. package/dist/RecurringExpenseEvents.js.map +1 -0
  32. package/dist/RecurringGroupTransactionEventHandler.d.ts +20 -0
  33. package/dist/RecurringGroupTransactionEventHandler.d.ts.map +1 -0
  34. package/dist/RecurringGroupTransactionEventHandler.js +90 -0
  35. package/dist/RecurringGroupTransactionEventHandler.js.map +1 -0
  36. package/dist/RecurringGroupTransactionEvents.d.ts +173 -0
  37. package/dist/RecurringGroupTransactionEvents.d.ts.map +1 -0
  38. package/dist/RecurringGroupTransactionEvents.js +171 -0
  39. package/dist/RecurringGroupTransactionEvents.js.map +1 -0
  40. package/dist/RecurringTransactionEventHandler.d.ts +20 -0
  41. package/dist/RecurringTransactionEventHandler.d.ts.map +1 -0
  42. package/dist/RecurringTransactionEventHandler.js +90 -0
  43. package/dist/RecurringTransactionEventHandler.js.map +1 -0
  44. package/dist/RecurringTransactionEvents.d.ts +172 -0
  45. package/dist/RecurringTransactionEvents.d.ts.map +1 -0
  46. package/dist/RecurringTransactionEvents.js +171 -0
  47. package/dist/RecurringTransactionEvents.js.map +1 -0
  48. package/dist/SuggestionEventHandler.d.ts +2 -1
  49. package/dist/SuggestionEventHandler.d.ts.map +1 -1
  50. package/dist/SuggestionEventHandler.js +16 -0
  51. package/dist/SuggestionEventHandler.js.map +1 -1
  52. package/dist/SuggestionEvents.d.ts +6 -0
  53. package/dist/SuggestionEvents.d.ts.map +1 -1
  54. package/dist/SuggestionEvents.js +5 -0
  55. package/dist/SuggestionEvents.js.map +1 -1
  56. package/dist/TransactionEventHandler.d.ts +1 -3
  57. package/dist/TransactionEventHandler.d.ts.map +1 -1
  58. package/dist/TransactionEventHandler.js +1 -4
  59. package/dist/TransactionEventHandler.js.map +1 -1
  60. package/dist/TransactionEvents.d.ts +8 -32
  61. package/dist/TransactionEvents.d.ts.map +1 -1
  62. package/dist/TransactionEvents.js +5 -71
  63. package/dist/TransactionEvents.js.map +1 -1
  64. package/dist/client/controllers/BudgetController.d.ts.map +1 -1
  65. package/dist/client/controllers/BudgetController.js +19 -5
  66. package/dist/client/controllers/BudgetController.js.map +1 -1
  67. package/dist/client/controllers/CategoryController.d.ts.map +1 -1
  68. package/dist/client/controllers/CategoryController.js.map +1 -1
  69. package/dist/client/controllers/ExpenseAccountController.d.ts.map +1 -1
  70. package/dist/client/controllers/ExpenseAccountController.js.map +1 -1
  71. package/dist/client/controllers/ExpenseController.d.ts.map +1 -1
  72. package/dist/client/controllers/ExpenseController.js +82 -20
  73. package/dist/client/controllers/ExpenseController.js.map +1 -1
  74. package/dist/client/controllers/ExportsController.d.ts +46 -0
  75. package/dist/client/controllers/ExportsController.d.ts.map +1 -0
  76. package/dist/client/controllers/ExportsController.js +176 -0
  77. package/dist/client/controllers/ExportsController.js.map +1 -0
  78. package/dist/client/controllers/FriendController.d.ts.map +1 -1
  79. package/dist/client/controllers/FriendController.js.map +1 -1
  80. package/dist/client/controllers/GroupController.d.ts.map +1 -1
  81. package/dist/client/controllers/GroupController.js.map +1 -1
  82. package/dist/client/controllers/ImportsController.d.ts +1 -1
  83. package/dist/client/controllers/ImportsController.d.ts.map +1 -1
  84. package/dist/client/controllers/ImportsController.js +2 -3
  85. package/dist/client/controllers/ImportsController.js.map +1 -1
  86. package/dist/client/controllers/NotificationController.d.ts.map +1 -1
  87. package/dist/client/controllers/NotificationController.js.map +1 -1
  88. package/dist/client/controllers/RecurringController.d.ts +30 -0
  89. package/dist/client/controllers/RecurringController.d.ts.map +1 -0
  90. package/dist/client/controllers/RecurringController.js +606 -0
  91. package/dist/client/controllers/RecurringController.js.map +1 -0
  92. package/dist/client/controllers/SuggestionController.d.ts +19 -0
  93. package/dist/client/controllers/SuggestionController.d.ts.map +1 -1
  94. package/dist/client/controllers/SuggestionController.js +70 -10
  95. package/dist/client/controllers/SuggestionController.js.map +1 -1
  96. package/dist/client/controllers/TransactionController.d.ts.map +1 -1
  97. package/dist/client/controllers/TransactionController.js +7 -20
  98. package/dist/client/controllers/TransactionController.js.map +1 -1
  99. package/dist/common/DomainEvents.d.ts +6 -0
  100. package/dist/common/DomainEvents.d.ts.map +1 -1
  101. package/dist/common/EventTypes.d.ts +12 -0
  102. package/dist/common/EventTypes.d.ts.map +1 -1
  103. package/dist/common/EventTypes.js +15 -0
  104. package/dist/common/EventTypes.js.map +1 -1
  105. package/dist/common/recurringUtil.d.ts +2 -19
  106. package/dist/common/recurringUtil.d.ts.map +1 -1
  107. package/dist/common/recurringUtil.js +26 -32
  108. package/dist/common/recurringUtil.js.map +1 -1
  109. package/dist/contracts/Logger.d.ts.map +1 -1
  110. package/dist/contracts/Logger.js.map +1 -1
  111. package/dist/contracts/expenses/index.d.ts +4 -0
  112. package/dist/contracts/expenses/index.d.ts.map +1 -1
  113. package/dist/contracts/expenses/index.js +1 -0
  114. package/dist/contracts/expenses/index.js.map +1 -1
  115. package/dist/contracts/groups/index.d.ts +7 -1
  116. package/dist/contracts/groups/index.d.ts.map +1 -1
  117. package/dist/contracts/groups/index.js +1 -0
  118. package/dist/contracts/groups/index.js.map +1 -1
  119. package/dist/contracts/index.d.ts +3 -0
  120. package/dist/contracts/index.d.ts.map +1 -1
  121. package/dist/contracts/index.js +3 -0
  122. package/dist/contracts/index.js.map +1 -1
  123. package/dist/contracts/recurringExpenses/index.d.ts +61 -0
  124. package/dist/contracts/recurringExpenses/index.d.ts.map +1 -0
  125. package/dist/contracts/recurringExpenses/index.js +3 -0
  126. package/dist/contracts/recurringExpenses/index.js.map +1 -0
  127. package/dist/contracts/recurringGroupTransactions/index.d.ts +68 -0
  128. package/dist/contracts/recurringGroupTransactions/index.d.ts.map +1 -0
  129. package/dist/contracts/recurringGroupTransactions/index.js +3 -0
  130. package/dist/contracts/recurringGroupTransactions/index.js.map +1 -0
  131. package/dist/contracts/recurringTransactions/index.d.ts +67 -0
  132. package/dist/contracts/recurringTransactions/index.d.ts.map +1 -0
  133. package/dist/contracts/recurringTransactions/index.js +3 -0
  134. package/dist/contracts/recurringTransactions/index.js.map +1 -0
  135. package/dist/contracts/suggestions.d.ts +2 -0
  136. package/dist/contracts/suggestions.d.ts.map +1 -1
  137. package/dist/contracts/transactions/index.d.ts +10 -0
  138. package/dist/contracts/transactions/index.d.ts.map +1 -1
  139. package/dist/contracts/transactions/index.js +5 -0
  140. package/dist/contracts/transactions/index.js.map +1 -1
  141. package/dist/converters/eventConverter.d.ts.map +1 -1
  142. package/dist/converters/eventConverter.js +72 -0
  143. package/dist/converters/eventConverter.js.map +1 -1
  144. package/dist/events.d.ts +12 -0
  145. package/dist/events.d.ts.map +1 -1
  146. package/dist/events.js +16 -1
  147. package/dist/events.js.map +1 -1
  148. package/dist/index.d.ts +7 -5
  149. package/dist/index.d.ts.map +1 -1
  150. package/dist/index.js +13 -3
  151. package/dist/index.js.map +1 -1
  152. package/dist/stores/RecurringExpenseEventStore.d.ts +5 -0
  153. package/dist/stores/RecurringExpenseEventStore.d.ts.map +1 -0
  154. package/dist/stores/RecurringExpenseEventStore.js +3 -0
  155. package/dist/stores/RecurringExpenseEventStore.js.map +1 -0
  156. package/dist/stores/RecurringExpenseModelStore.d.ts +14 -0
  157. package/dist/stores/RecurringExpenseModelStore.d.ts.map +1 -0
  158. package/dist/stores/RecurringExpenseModelStore.js +5 -0
  159. package/dist/stores/RecurringExpenseModelStore.js.map +1 -0
  160. package/dist/stores/RecurringGroupTransactionEventStore.d.ts +6 -0
  161. package/dist/stores/RecurringGroupTransactionEventStore.d.ts.map +1 -0
  162. package/dist/stores/RecurringGroupTransactionEventStore.js +5 -0
  163. package/dist/stores/RecurringGroupTransactionEventStore.js.map +1 -0
  164. package/dist/stores/RecurringGroupTransactionModelStore.d.ts +14 -0
  165. package/dist/stores/RecurringGroupTransactionModelStore.d.ts.map +1 -0
  166. package/dist/stores/RecurringGroupTransactionModelStore.js +5 -0
  167. package/dist/stores/RecurringGroupTransactionModelStore.js.map +1 -0
  168. package/dist/stores/RecurringTransactionEventStore.d.ts +6 -0
  169. package/dist/stores/RecurringTransactionEventStore.d.ts.map +1 -0
  170. package/dist/stores/RecurringTransactionEventStore.js +5 -0
  171. package/dist/stores/RecurringTransactionEventStore.js.map +1 -0
  172. package/dist/stores/RecurringTransactionModelStore.d.ts +14 -0
  173. package/dist/stores/RecurringTransactionModelStore.d.ts.map +1 -0
  174. package/dist/stores/RecurringTransactionModelStore.js +5 -0
  175. package/dist/stores/RecurringTransactionModelStore.js.map +1 -0
  176. package/dist/utils/GroupUtil.d.ts.map +1 -1
  177. package/dist/utils/GroupUtil.js +7 -14
  178. package/dist/utils/GroupUtil.js.map +1 -1
  179. package/package.json +1 -1
@@ -0,0 +1,606 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RecurringController = void 0;
4
+ const contracts_1 = require("../../contracts");
5
+ const RecurringExpenseEvents_1 = require("../../RecurringExpenseEvents");
6
+ const RecurringTransactionEvents_1 = require("../../RecurringTransactionEvents");
7
+ const RecurringGroupTransactionEvents_1 = require("../../RecurringGroupTransactionEvents");
8
+ const uuid_1 = require("uuid");
9
+ class RecurringController {
10
+ constructor(sdk) {
11
+ this.sdk = sdk;
12
+ }
13
+ get logger() {
14
+ return this.sdk.getLogger();
15
+ }
16
+ get userModelStore() {
17
+ return this.sdk.getStoreConfig().userModelStore;
18
+ }
19
+ get tagModelStore() {
20
+ return this.sdk.getStoreConfig().tagModelStore;
21
+ }
22
+ async buildTagColorMap(userId) {
23
+ const tags = await this.tagModelStore.findAllByUserIdAndDeletedIsFalse(userId);
24
+ const tagColorMap = new Map();
25
+ for (const tag of tags) {
26
+ tagColorMap.set(tag.name.toLowerCase(), tag.color);
27
+ }
28
+ return tagColorMap;
29
+ }
30
+ resolveTagsWithColors(tagNames, tagColorMap) {
31
+ if (!tagNames || tagNames.length === 0) {
32
+ return undefined;
33
+ }
34
+ return tagNames.map((name) => ({
35
+ name,
36
+ color: tagColorMap.get(name.toLowerCase()) ?? contracts_1.DEFAULT_TAG_COLOR,
37
+ }));
38
+ }
39
+ async queryRecurringExpenses(userId, request) {
40
+ this.logger.log("[RecurringController.queryRecurringExpenses]", {
41
+ userId,
42
+ request,
43
+ });
44
+ const modelStore = this.sdk.getStoreConfig().recurringExpenseModelStore;
45
+ let models = await modelStore.findAllByUserIdWhereDeletedIsFalse(userId);
46
+ if (request.accountId) {
47
+ models = models.filter((m) => m.accountId === request.accountId);
48
+ }
49
+ if (request.transactionType) {
50
+ models = models.filter((m) => m.transactionType === request.transactionType);
51
+ }
52
+ if (request.status) {
53
+ models = models.filter((m) => m.status === request.status);
54
+ }
55
+ if (request.includeDeleted) {
56
+ const allModels = await modelStore.getByUserId(userId);
57
+ models = allModels;
58
+ if (request.accountId) {
59
+ models = models.filter((m) => m.accountId === request.accountId);
60
+ }
61
+ if (request.transactionType) {
62
+ models = models.filter((m) => m.transactionType === request.transactionType);
63
+ }
64
+ if (request.status) {
65
+ models = models.filter((m) => m.status === request.status);
66
+ }
67
+ }
68
+ const total = models.length;
69
+ const offset = request.offset || 0;
70
+ const limit = request.limit || models.length;
71
+ models = models.slice(offset, offset + limit);
72
+ const tagColorMap = await this.buildTagColorMap(userId);
73
+ const response = {
74
+ recurringExpenses: models.map((m) => this.mapExpenseModelToResponse(m, tagColorMap)),
75
+ total,
76
+ };
77
+ this.logger.log("[RecurringController.queryRecurringExpenses] Returning", {
78
+ count: response.recurringExpenses.length,
79
+ total: response.total,
80
+ });
81
+ return response;
82
+ }
83
+ async createRecurringExpense(userId, request) {
84
+ this.logger.log("[RecurringController.createRecurringExpense]", {
85
+ userId,
86
+ request,
87
+ });
88
+ if (!request.accountId) {
89
+ throw new Error("accountId is required");
90
+ }
91
+ const currency = request.currency || (await this.getUserCurrency(userId));
92
+ const modelStore = this.sdk.getStoreConfig().recurringExpenseModelStore;
93
+ const streamId = (0, uuid_1.v4)();
94
+ const event = new RecurringExpenseEvents_1.RecurringExpenseCreated({
95
+ eventId: (0, uuid_1.v4)(),
96
+ streamId,
97
+ userId,
98
+ version: 1,
99
+ createdAt: Date.now(),
100
+ createdBy: userId,
101
+ systemGenerated: false,
102
+ description: request.description,
103
+ amount: request.amount,
104
+ currency,
105
+ category: request.category,
106
+ transactionType: request.transactionType,
107
+ accountId: request.accountId,
108
+ frequency: request.frequency,
109
+ interval: request.interval,
110
+ startDate: request.startDate,
111
+ status: "active",
112
+ tags: request.tags,
113
+ attachmentsUrls: request.attachmentsUrls,
114
+ });
115
+ await this.sdk.getRecurringExpenseEventHandler().handleEvent(event);
116
+ const model = await modelStore.getByStreamId(streamId);
117
+ if (!model) {
118
+ throw new Error("Failed to create recurring expense");
119
+ }
120
+ this.logger.log("[RecurringController.createRecurringExpense] Created successfully", { streamId });
121
+ const tagColorMap = await this.buildTagColorMap(userId);
122
+ return this.mapExpenseModelToResponse(model, tagColorMap);
123
+ }
124
+ async deleteRecurringExpense(userId, streamId, reason) {
125
+ this.logger.log("[RecurringController.deleteRecurringExpense]", {
126
+ userId,
127
+ streamId,
128
+ reason,
129
+ });
130
+ const modelStore = this.sdk.getStoreConfig().recurringExpenseModelStore;
131
+ const existingModel = await modelStore.getByStreamId(streamId);
132
+ if (!existingModel) {
133
+ throw new Error("Recurring expense not found");
134
+ }
135
+ if (existingModel.userId !== userId) {
136
+ throw new Error("Forbidden: Expense belongs to different user");
137
+ }
138
+ if (existingModel.deleted) {
139
+ throw new Error("Recurring expense already deleted");
140
+ }
141
+ const event = new RecurringExpenseEvents_1.RecurringExpenseDeleted({
142
+ eventId: (0, uuid_1.v4)(),
143
+ streamId,
144
+ userId,
145
+ version: existingModel.version + 1,
146
+ createdAt: Date.now(),
147
+ createdBy: userId,
148
+ systemGenerated: false,
149
+ deletedAt: Date.now(),
150
+ deletedBy: userId,
151
+ reason,
152
+ });
153
+ await this.sdk.getRecurringExpenseEventHandler().handleEvent(event);
154
+ this.logger.log("[RecurringController.deleteRecurringExpense] Deleted successfully", { streamId });
155
+ }
156
+ async updateRecurringExpense(userId, streamId, request) {
157
+ this.logger.log("[RecurringController.updateRecurringExpense]", {
158
+ userId,
159
+ streamId,
160
+ request,
161
+ });
162
+ const modelStore = this.sdk.getStoreConfig().recurringExpenseModelStore;
163
+ const existingModel = await modelStore.getByStreamId(streamId);
164
+ if (!existingModel) {
165
+ throw new Error("Recurring expense not found");
166
+ }
167
+ if (existingModel.userId !== userId) {
168
+ throw new Error("Forbidden: Expense belongs to different user");
169
+ }
170
+ if (existingModel.deleted) {
171
+ throw new Error("Cannot update deleted recurring expense");
172
+ }
173
+ const event = new RecurringExpenseEvents_1.RecurringExpenseUpdated({
174
+ eventId: (0, uuid_1.v4)(),
175
+ streamId,
176
+ userId,
177
+ version: existingModel.version + 1,
178
+ createdAt: Date.now(),
179
+ createdBy: userId,
180
+ systemGenerated: false,
181
+ description: request.description,
182
+ amount: request.amount,
183
+ currency: request.currency,
184
+ category: request.category,
185
+ transactionType: request.transactionType,
186
+ frequency: request.frequency,
187
+ interval: request.interval,
188
+ startDate: request.startDate,
189
+ status: request.status,
190
+ tags: request.tags,
191
+ attachmentsUrls: request.attachmentsUrls,
192
+ });
193
+ await this.sdk.getRecurringExpenseEventHandler().handleEvent(event);
194
+ const updatedModel = await modelStore.getByStreamId(streamId);
195
+ if (!updatedModel) {
196
+ throw new Error("Failed to update recurring expense");
197
+ }
198
+ this.logger.log("[RecurringController.updateRecurringExpense] Updated successfully", { streamId });
199
+ const tagColorMap = await this.buildTagColorMap(userId);
200
+ return this.mapExpenseModelToResponse(updatedModel, tagColorMap);
201
+ }
202
+ async queryRecurringTransactions(userId, request) {
203
+ this.logger.log("[RecurringController.queryRecurringTransactions]", {
204
+ userId,
205
+ request,
206
+ });
207
+ const modelStore = this.sdk.getStoreConfig().recurringTransactionModelStore;
208
+ let models = await modelStore.findAllByUserIdWhereDeletedIsFalse(userId);
209
+ if (request.recipientUserId) {
210
+ models = models.filter((m) => m.recipientUserId === request.recipientUserId);
211
+ }
212
+ if (request.status) {
213
+ models = models.filter((m) => m.status === request.status);
214
+ }
215
+ if (request.includeDeleted) {
216
+ const allModels = await modelStore.getByUserId(userId);
217
+ models = allModels;
218
+ if (request.recipientUserId) {
219
+ models = models.filter((m) => m.recipientUserId === request.recipientUserId);
220
+ }
221
+ if (request.status) {
222
+ models = models.filter((m) => m.status === request.status);
223
+ }
224
+ }
225
+ const total = models.length;
226
+ const offset = request.offset || 0;
227
+ const limit = request.limit || models.length;
228
+ models = models.slice(offset, offset + limit);
229
+ const tagColorMap = await this.buildTagColorMap(userId);
230
+ const response = {
231
+ recurringTransactions: models.map((m) => this.mapTransactionModelToResponse(m, tagColorMap)),
232
+ total,
233
+ };
234
+ this.logger.log("[RecurringController.queryRecurringTransactions] Returning", {
235
+ count: response.recurringTransactions.length,
236
+ total: response.total,
237
+ });
238
+ return response;
239
+ }
240
+ async createRecurringTransaction(userId, request) {
241
+ this.logger.log("[RecurringController.createRecurringTransaction]", {
242
+ userId,
243
+ request,
244
+ });
245
+ if (!request.recipientUserId) {
246
+ throw new Error("recipientUserId is required");
247
+ }
248
+ const currency = request.currency || (await this.getUserCurrency(userId));
249
+ const modelStore = this.sdk.getStoreConfig().recurringTransactionModelStore;
250
+ const streamId = (0, uuid_1.v4)();
251
+ const event = new RecurringTransactionEvents_1.RecurringTransactionCreated({
252
+ eventId: (0, uuid_1.v4)(),
253
+ streamId,
254
+ userId,
255
+ version: 1,
256
+ createdAt: Date.now(),
257
+ createdBy: userId,
258
+ systemGenerated: false,
259
+ recipientUserId: request.recipientUserId,
260
+ description: request.description,
261
+ currency,
262
+ splitType: request.splitType,
263
+ totalAmount: request.totalAmount,
264
+ amount: request.amount,
265
+ isOwed: request.isOwed,
266
+ frequency: request.frequency,
267
+ interval: request.interval,
268
+ startDate: request.startDate,
269
+ status: "active",
270
+ tags: request.tags,
271
+ attachmentsUrls: request.attachmentsUrls,
272
+ category: request.category,
273
+ });
274
+ await this.sdk.getRecurringTransactionEventHandler().handleEvent(event);
275
+ const model = await modelStore.getByStreamId(streamId);
276
+ if (!model) {
277
+ throw new Error("Failed to create recurring transaction");
278
+ }
279
+ this.logger.log("[RecurringController.createRecurringTransaction] Created successfully", { streamId });
280
+ const tagColorMap = await this.buildTagColorMap(userId);
281
+ return this.mapTransactionModelToResponse(model, tagColorMap);
282
+ }
283
+ async deleteRecurringTransaction(userId, streamId, reason) {
284
+ this.logger.log("[RecurringController.deleteRecurringTransaction]", {
285
+ userId,
286
+ streamId,
287
+ reason,
288
+ });
289
+ const modelStore = this.sdk.getStoreConfig().recurringTransactionModelStore;
290
+ const existingModel = await modelStore.getByStreamId(streamId);
291
+ if (!existingModel) {
292
+ throw new Error("Recurring transaction not found");
293
+ }
294
+ if (existingModel.userId !== userId) {
295
+ throw new Error("Forbidden: Transaction belongs to different user");
296
+ }
297
+ if (existingModel.deleted) {
298
+ throw new Error("Recurring transaction already deleted");
299
+ }
300
+ const event = new RecurringTransactionEvents_1.RecurringTransactionDeleted({
301
+ eventId: (0, uuid_1.v4)(),
302
+ streamId,
303
+ userId,
304
+ version: existingModel.version + 1,
305
+ createdAt: Date.now(),
306
+ createdBy: userId,
307
+ systemGenerated: false,
308
+ deletedAt: Date.now(),
309
+ deletedBy: userId,
310
+ reason,
311
+ });
312
+ await this.sdk.getRecurringTransactionEventHandler().handleEvent(event);
313
+ this.logger.log("[RecurringController.deleteRecurringTransaction] Deleted successfully", { streamId });
314
+ }
315
+ async updateRecurringTransaction(userId, streamId, request) {
316
+ this.logger.log("[RecurringController.updateRecurringTransaction]", {
317
+ userId,
318
+ streamId,
319
+ request,
320
+ });
321
+ const modelStore = this.sdk.getStoreConfig().recurringTransactionModelStore;
322
+ const existingModel = await modelStore.getByStreamId(streamId);
323
+ if (!existingModel) {
324
+ throw new Error("Recurring transaction not found");
325
+ }
326
+ if (existingModel.userId !== userId) {
327
+ throw new Error("Forbidden: Transaction belongs to different user");
328
+ }
329
+ if (existingModel.deleted) {
330
+ throw new Error("Cannot update deleted recurring transaction");
331
+ }
332
+ const event = new RecurringTransactionEvents_1.RecurringTransactionUpdated({
333
+ eventId: (0, uuid_1.v4)(),
334
+ streamId,
335
+ userId,
336
+ version: existingModel.version + 1,
337
+ createdAt: Date.now(),
338
+ createdBy: userId,
339
+ systemGenerated: false,
340
+ description: request.description,
341
+ currency: request.currency,
342
+ splitType: request.splitType,
343
+ totalAmount: request.totalAmount,
344
+ amount: request.amount,
345
+ isOwed: request.isOwed,
346
+ frequency: request.frequency,
347
+ interval: request.interval,
348
+ startDate: request.startDate,
349
+ status: request.status,
350
+ tags: request.tags,
351
+ attachmentsUrls: request.attachmentsUrls,
352
+ category: request.category,
353
+ });
354
+ await this.sdk.getRecurringTransactionEventHandler().handleEvent(event);
355
+ const updatedModel = await modelStore.getByStreamId(streamId);
356
+ if (!updatedModel) {
357
+ throw new Error("Failed to update recurring transaction");
358
+ }
359
+ this.logger.log("[RecurringController.updateRecurringTransaction] Updated successfully", { streamId });
360
+ const tagColorMap = await this.buildTagColorMap(userId);
361
+ return this.mapTransactionModelToResponse(updatedModel, tagColorMap);
362
+ }
363
+ async queryRecurringGroupTransactions(userId, request) {
364
+ this.logger.log("[RecurringController.queryRecurringGroupTransactions]", {
365
+ userId,
366
+ request,
367
+ });
368
+ const modelStore = this.sdk.getStoreConfig().recurringGroupTransactionModelStore;
369
+ let models = await modelStore.findAllByUserIdWhereDeletedIsFalse(userId);
370
+ if (request.groupId) {
371
+ models = models.filter((m) => m.groupId === request.groupId);
372
+ }
373
+ if (request.status) {
374
+ models = models.filter((m) => m.status === request.status);
375
+ }
376
+ if (request.includeDeleted) {
377
+ const allModels = await modelStore.getByUserId(userId);
378
+ models = allModels;
379
+ if (request.groupId) {
380
+ models = models.filter((m) => m.groupId === request.groupId);
381
+ }
382
+ if (request.status) {
383
+ models = models.filter((m) => m.status === request.status);
384
+ }
385
+ }
386
+ const total = models.length;
387
+ const offset = request.offset || 0;
388
+ const limit = request.limit || models.length;
389
+ models = models.slice(offset, offset + limit);
390
+ const tagColorMap = await this.buildTagColorMap(userId);
391
+ const response = {
392
+ recurringGroupTransactions: models.map((m) => this.mapGroupTransactionModelToResponse(m, tagColorMap)),
393
+ total,
394
+ };
395
+ this.logger.log("[RecurringController.queryRecurringGroupTransactions] Returning", {
396
+ count: response.recurringGroupTransactions.length,
397
+ total: response.total,
398
+ });
399
+ return response;
400
+ }
401
+ async createRecurringGroupTransaction(userId, request) {
402
+ this.logger.log("[RecurringController.createRecurringGroupTransaction]", {
403
+ userId,
404
+ request,
405
+ });
406
+ if (!request.groupId) {
407
+ throw new Error("groupId is required");
408
+ }
409
+ const currency = request.currency || (await this.getUserCurrency(userId));
410
+ const modelStore = this.sdk.getStoreConfig().recurringGroupTransactionModelStore;
411
+ const streamId = (0, uuid_1.v4)();
412
+ const event = new RecurringGroupTransactionEvents_1.RecurringGroupTransactionCreated({
413
+ eventId: (0, uuid_1.v4)(),
414
+ streamId,
415
+ userId,
416
+ version: 1,
417
+ createdAt: Date.now(),
418
+ createdBy: userId,
419
+ systemGenerated: false,
420
+ groupId: request.groupId,
421
+ description: request.description,
422
+ notes: request.notes,
423
+ totalAmount: request.totalAmount,
424
+ currency,
425
+ splitType: request.splitType,
426
+ memberPayments: request.memberPayments,
427
+ frequency: request.frequency,
428
+ interval: request.interval,
429
+ startDate: request.startDate,
430
+ status: "active",
431
+ tags: request.tags,
432
+ attachmentsUrls: request.attachmentsUrls,
433
+ category: request.category,
434
+ });
435
+ await this.sdk
436
+ .getRecurringGroupTransactionEventHandler()
437
+ .handleEvent(event);
438
+ const model = await modelStore.getByStreamId(streamId);
439
+ if (!model) {
440
+ throw new Error("Failed to create recurring group transaction");
441
+ }
442
+ this.logger.log("[RecurringController.createRecurringGroupTransaction] Created successfully", { streamId });
443
+ const tagColorMap = await this.buildTagColorMap(userId);
444
+ return this.mapGroupTransactionModelToResponse(model, tagColorMap);
445
+ }
446
+ async deleteRecurringGroupTransaction(userId, streamId, reason) {
447
+ this.logger.log("[RecurringController.deleteRecurringGroupTransaction]", {
448
+ userId,
449
+ streamId,
450
+ reason,
451
+ });
452
+ const modelStore = this.sdk.getStoreConfig().recurringGroupTransactionModelStore;
453
+ const existingModel = await modelStore.getByStreamId(streamId);
454
+ if (!existingModel) {
455
+ throw new Error("Recurring group transaction not found");
456
+ }
457
+ if (existingModel.userId !== userId) {
458
+ throw new Error("Forbidden: Group transaction belongs to different user");
459
+ }
460
+ if (existingModel.deleted) {
461
+ throw new Error("Recurring group transaction already deleted");
462
+ }
463
+ const event = new RecurringGroupTransactionEvents_1.RecurringGroupTransactionDeleted({
464
+ eventId: (0, uuid_1.v4)(),
465
+ streamId,
466
+ userId,
467
+ version: existingModel.version + 1,
468
+ createdAt: Date.now(),
469
+ createdBy: userId,
470
+ systemGenerated: false,
471
+ deletedAt: Date.now(),
472
+ deletedBy: userId,
473
+ reason,
474
+ });
475
+ await this.sdk
476
+ .getRecurringGroupTransactionEventHandler()
477
+ .handleEvent(event);
478
+ this.logger.log("[RecurringController.deleteRecurringGroupTransaction] Deleted successfully", { streamId });
479
+ }
480
+ async updateRecurringGroupTransaction(userId, streamId, request) {
481
+ this.logger.log("[RecurringController.updateRecurringGroupTransaction]", {
482
+ userId,
483
+ streamId,
484
+ request,
485
+ });
486
+ const modelStore = this.sdk.getStoreConfig().recurringGroupTransactionModelStore;
487
+ const existingModel = await modelStore.getByStreamId(streamId);
488
+ if (!existingModel) {
489
+ throw new Error("Recurring group transaction not found");
490
+ }
491
+ if (existingModel.userId !== userId) {
492
+ throw new Error("Forbidden: Group transaction belongs to different user");
493
+ }
494
+ if (existingModel.deleted) {
495
+ throw new Error("Cannot update deleted recurring group transaction");
496
+ }
497
+ const event = new RecurringGroupTransactionEvents_1.RecurringGroupTransactionUpdated({
498
+ eventId: (0, uuid_1.v4)(),
499
+ streamId,
500
+ userId,
501
+ version: existingModel.version + 1,
502
+ createdAt: Date.now(),
503
+ createdBy: userId,
504
+ systemGenerated: false,
505
+ description: request.description,
506
+ notes: request.notes,
507
+ totalAmount: request.totalAmount,
508
+ currency: request.currency,
509
+ splitType: request.splitType,
510
+ memberPayments: request.memberPayments,
511
+ frequency: request.frequency,
512
+ interval: request.interval,
513
+ startDate: request.startDate,
514
+ status: request.status,
515
+ tags: request.tags,
516
+ attachmentsUrls: request.attachmentsUrls,
517
+ category: request.category,
518
+ });
519
+ await this.sdk
520
+ .getRecurringGroupTransactionEventHandler()
521
+ .handleEvent(event);
522
+ const updatedModel = await modelStore.getByStreamId(streamId);
523
+ if (!updatedModel) {
524
+ throw new Error("Failed to update recurring group transaction");
525
+ }
526
+ this.logger.log("[RecurringController.updateRecurringGroupTransaction] Updated successfully", { streamId });
527
+ const tagColorMap = await this.buildTagColorMap(userId);
528
+ return this.mapGroupTransactionModelToResponse(updatedModel, tagColorMap);
529
+ }
530
+ async getUserCurrency(userId) {
531
+ const userModel = await this.userModelStore.getByStreamIdWhereDeletedIsFalse(userId);
532
+ return userModel?.currency || "USD";
533
+ }
534
+ mapExpenseModelToResponse(model, tagColorMap) {
535
+ return {
536
+ id: model.streamId,
537
+ streamId: model.streamId,
538
+ userId: model.userId,
539
+ description: model.description,
540
+ amount: model.amount,
541
+ currency: model.currency,
542
+ category: model.category,
543
+ transactionType: model.transactionType,
544
+ accountId: model.accountId,
545
+ frequency: model.frequency,
546
+ interval: model.interval,
547
+ startDate: model.startDate,
548
+ status: model.status,
549
+ tags: this.resolveTagsWithColors(model.tags, tagColorMap),
550
+ attachmentsUrls: model.attachmentsUrls,
551
+ deleted: model.deleted,
552
+ createdAt: model.createdAt,
553
+ updatedAt: model.updatedAt,
554
+ };
555
+ }
556
+ mapTransactionModelToResponse(model, tagColorMap) {
557
+ return {
558
+ id: model.streamId,
559
+ streamId: model.streamId,
560
+ userId: model.userId,
561
+ recipientUserId: model.recipientUserId,
562
+ description: model.description,
563
+ currency: model.currency,
564
+ splitType: model.splitType,
565
+ totalAmount: model.totalAmount,
566
+ amount: model.amount,
567
+ isOwed: model.isOwed,
568
+ frequency: model.frequency,
569
+ interval: model.interval,
570
+ startDate: model.startDate,
571
+ status: model.status,
572
+ tags: this.resolveTagsWithColors(model.tags, tagColorMap),
573
+ attachmentsUrls: model.attachmentsUrls,
574
+ category: model.category,
575
+ deleted: model.deleted,
576
+ createdAt: model.createdAt,
577
+ updatedAt: model.updatedAt,
578
+ };
579
+ }
580
+ mapGroupTransactionModelToResponse(model, tagColorMap) {
581
+ return {
582
+ id: model.streamId,
583
+ streamId: model.streamId,
584
+ userId: model.userId,
585
+ groupId: model.groupId,
586
+ description: model.description,
587
+ notes: model.notes,
588
+ totalAmount: model.totalAmount,
589
+ currency: model.currency,
590
+ splitType: model.splitType,
591
+ memberPayments: model.memberPayments,
592
+ frequency: model.frequency,
593
+ interval: model.interval,
594
+ startDate: model.startDate,
595
+ status: model.status,
596
+ tags: this.resolveTagsWithColors(model.tags, tagColorMap),
597
+ attachmentsUrls: model.attachmentsUrls,
598
+ category: model.category,
599
+ deleted: model.deleted,
600
+ createdAt: model.createdAt,
601
+ updatedAt: model.updatedAt,
602
+ };
603
+ }
604
+ }
605
+ exports.RecurringController = RecurringController;
606
+ //# sourceMappingURL=RecurringController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RecurringController.js","sourceRoot":"","sources":["../../../src/client/controllers/RecurringController.ts"],"names":[],"mappings":"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"}
@@ -13,6 +13,25 @@ export declare class SuggestionController {
13
13
  getSuggestionById(userId: string, suggestionId: string): Promise<SuggestionResponse | undefined>;
14
14
  updateSuggestion(userId: string, suggestionId: string, request: SuggestionUpdateRequest): Promise<void>;
15
15
  deleteSuggestion(userId: string, suggestionId: string): Promise<void>;
16
+ bulkUpdateSuggestions(userId: string, updates: Array<{
17
+ suggestionId: string;
18
+ request: SuggestionUpdateRequest;
19
+ }>): Promise<{
20
+ successCount: number;
21
+ failedCount: number;
22
+ errors?: Array<{
23
+ suggestionId: string;
24
+ error: string;
25
+ }>;
26
+ }>;
27
+ bulkDeleteSuggestions(userId: string, suggestionIds: string[]): Promise<{
28
+ successCount: number;
29
+ failedCount: number;
30
+ errors?: Array<{
31
+ suggestionId: string;
32
+ error: string;
33
+ }>;
34
+ }>;
16
35
  /**
17
36
  * Commit all suggestions for an import process.
18
37
  * This converts all suggestions into actual expense transactions.