captify 0.1.19 → 1.1.1

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 (228) hide show
  1. package/dist/agents/components/agents-list-header.d.ts.map +1 -1
  2. package/dist/agents/components/agents-list-header.js +3 -2
  3. package/dist/agents/components/agents-list-header.js.map +1 -1
  4. package/dist/chat/components/chat-content-approval.d.ts.map +1 -1
  5. package/dist/chat/components/chat-content-approval.js.map +1 -1
  6. package/dist/chat/components/chat-context-toggle.d.ts.map +1 -1
  7. package/dist/chat/components/chat-context-toggle.js +2 -4
  8. package/dist/chat/components/chat-context-toggle.js.map +1 -1
  9. package/dist/comments/comments.constants.d.ts +8 -1
  10. package/dist/comments/comments.constants.d.ts.map +1 -1
  11. package/dist/comments/comments.constants.js +18 -0
  12. package/dist/comments/comments.constants.js.map +1 -1
  13. package/dist/comments/comments.interfaces.d.ts +5 -0
  14. package/dist/comments/comments.interfaces.d.ts.map +1 -1
  15. package/dist/comments/comments.utilities.d.ts +30 -1
  16. package/dist/comments/comments.utilities.d.ts.map +1 -1
  17. package/dist/comments/comments.utilities.js +41 -1
  18. package/dist/comments/comments.utilities.js.map +1 -1
  19. package/dist/comments/hooks/use-comments.d.ts.map +1 -1
  20. package/dist/comments/hooks/use-comments.js +1 -0
  21. package/dist/comments/hooks/use-comments.js.map +1 -1
  22. package/dist/comments/services/comments.factory.d.ts.map +1 -1
  23. package/dist/comments/services/comments.factory.js +5 -2
  24. package/dist/comments/services/comments.factory.js.map +1 -1
  25. package/dist/comments/services/comments.service.d.ts +9 -2
  26. package/dist/comments/services/comments.service.d.ts.map +1 -1
  27. package/dist/comments/services/comments.service.js +96 -4
  28. package/dist/comments/services/comments.service.js.map +1 -1
  29. package/dist/db/schemas/index.d.ts +6 -4
  30. package/dist/db/schemas/index.d.ts.map +1 -1
  31. package/dist/db/schemas/index.js +2 -1
  32. package/dist/db/schemas/index.js.map +1 -1
  33. package/dist/db/schemas/notifications.schema.d.ts +107 -0
  34. package/dist/db/schemas/notifications.schema.d.ts.map +1 -0
  35. package/dist/db/schemas/notifications.schema.js +124 -0
  36. package/dist/db/schemas/notifications.schema.js.map +1 -0
  37. package/dist/feedback/api/feedback.handlers.d.ts.map +1 -1
  38. package/dist/feedback/api/feedback.handlers.js +1 -0
  39. package/dist/feedback/api/feedback.handlers.js.map +1 -1
  40. package/dist/feedback/components/feedback-editor.d.ts.map +1 -1
  41. package/dist/feedback/components/feedback-editor.js +6 -4
  42. package/dist/feedback/components/feedback-editor.js.map +1 -1
  43. package/dist/feedback/feedback.interfaces.d.ts +24 -1
  44. package/dist/feedback/feedback.interfaces.d.ts.map +1 -1
  45. package/dist/feedback/services/feedback.service.d.ts +26 -3
  46. package/dist/feedback/services/feedback.service.d.ts.map +1 -1
  47. package/dist/feedback/services/feedback.service.js +270 -11
  48. package/dist/feedback/services/feedback.service.js.map +1 -1
  49. package/dist/files/components/folder-browser/folder-breadcrumb.d.ts.map +1 -1
  50. package/dist/files/components/folder-browser/folder-breadcrumb.js +1 -1
  51. package/dist/files/components/folder-browser/folder-breadcrumb.js.map +1 -1
  52. package/dist/files/components/folder-browser/folder-list-item.js +1 -1
  53. package/dist/files/components/folder-browser/folder-list-item.js.map +1 -1
  54. package/dist/files/components/folder-browser/folder-tree-item.d.ts.map +1 -1
  55. package/dist/files/components/folder-browser/folder-tree-item.js +1 -1
  56. package/dist/files/components/folder-browser/folder-tree-item.js.map +1 -1
  57. package/dist/files/components/folder-browser/folder-tree-sidebar.js +1 -1
  58. package/dist/files/components/folder-browser/folder-tree-sidebar.js.map +1 -1
  59. package/dist/notifications/api/index.d.ts +7 -0
  60. package/dist/notifications/api/index.d.ts.map +1 -0
  61. package/dist/notifications/api/index.js +8 -0
  62. package/dist/notifications/api/index.js.map +1 -0
  63. package/dist/notifications/api/notifications.client.d.ts +86 -0
  64. package/dist/notifications/api/notifications.client.d.ts.map +1 -0
  65. package/dist/notifications/api/notifications.client.js +102 -0
  66. package/dist/notifications/api/notifications.client.js.map +1 -0
  67. package/dist/notifications/api/notifications.handlers.d.ts +166 -0
  68. package/dist/notifications/api/notifications.handlers.d.ts.map +1 -0
  69. package/dist/notifications/api/notifications.handlers.js +187 -0
  70. package/dist/notifications/api/notifications.handlers.js.map +1 -0
  71. package/dist/notifications/hooks/index.d.ts +5 -0
  72. package/dist/notifications/hooks/index.d.ts.map +1 -0
  73. package/dist/notifications/hooks/index.js +5 -0
  74. package/dist/notifications/hooks/index.js.map +1 -0
  75. package/dist/notifications/hooks/use-notifications-api.d.ts +111 -0
  76. package/dist/notifications/hooks/use-notifications-api.d.ts.map +1 -0
  77. package/dist/notifications/hooks/use-notifications-api.js +253 -0
  78. package/dist/notifications/hooks/use-notifications-api.js.map +1 -0
  79. package/dist/notifications/index.d.ts +16 -0
  80. package/dist/notifications/index.d.ts.map +1 -0
  81. package/dist/notifications/index.js +18 -0
  82. package/dist/notifications/index.js.map +1 -0
  83. package/dist/notifications/notification.utilities.d.ts +12 -0
  84. package/dist/notifications/notification.utilities.d.ts.map +1 -0
  85. package/dist/notifications/notification.utilities.js +35 -0
  86. package/dist/notifications/notification.utilities.js.map +1 -0
  87. package/dist/notifications/notifications.constants.d.ts +72 -0
  88. package/dist/notifications/notifications.constants.d.ts.map +1 -0
  89. package/dist/notifications/notifications.constants.js +104 -0
  90. package/dist/notifications/notifications.constants.js.map +1 -0
  91. package/dist/notifications/notifications.errors.d.ts +35 -0
  92. package/dist/notifications/notifications.errors.d.ts.map +1 -0
  93. package/dist/notifications/notifications.errors.js +51 -0
  94. package/dist/notifications/notifications.errors.js.map +1 -0
  95. package/dist/notifications/notifications.interfaces.d.ts +116 -0
  96. package/dist/notifications/notifications.interfaces.d.ts.map +1 -0
  97. package/dist/notifications/notifications.interfaces.js +10 -0
  98. package/dist/notifications/notifications.interfaces.js.map +1 -0
  99. package/dist/notifications/notifications.schemas.d.ts +139 -0
  100. package/dist/notifications/notifications.schemas.d.ts.map +1 -0
  101. package/dist/notifications/notifications.schemas.js +167 -0
  102. package/dist/notifications/notifications.schemas.js.map +1 -0
  103. package/dist/notifications/services/index.d.ts +6 -0
  104. package/dist/notifications/services/index.d.ts.map +1 -0
  105. package/dist/notifications/services/index.js +6 -0
  106. package/dist/notifications/services/index.js.map +1 -0
  107. package/dist/notifications/services/notifications.factory.d.ts +19 -0
  108. package/dist/notifications/services/notifications.factory.d.ts.map +1 -0
  109. package/dist/notifications/services/notifications.factory.js +58 -0
  110. package/dist/notifications/services/notifications.factory.js.map +1 -0
  111. package/dist/notifications/services/notifications.service.d.ts +88 -0
  112. package/dist/notifications/services/notifications.service.d.ts.map +1 -0
  113. package/dist/notifications/services/notifications.service.js +620 -0
  114. package/dist/notifications/services/notifications.service.js.map +1 -0
  115. package/dist/permissions/api/permissions.handlers.d.ts +20 -20
  116. package/dist/permissions/components/resource-panel.d.ts.map +1 -1
  117. package/dist/permissions/components/resource-panel.js +2 -1
  118. package/dist/permissions/components/resource-panel.js.map +1 -1
  119. package/dist/permissions/hooks/index.d.ts +1 -0
  120. package/dist/permissions/hooks/index.d.ts.map +1 -1
  121. package/dist/permissions/hooks/index.js +1 -0
  122. package/dist/permissions/hooks/index.js.map +1 -1
  123. package/dist/permissions/hooks/use-notification-permissions.d.ts +19 -0
  124. package/dist/permissions/hooks/use-notification-permissions.d.ts.map +1 -0
  125. package/dist/permissions/hooks/use-notification-permissions.js +32 -0
  126. package/dist/permissions/hooks/use-notification-permissions.js.map +1 -0
  127. package/dist/permissions/hooks/use-permissions-dashboard.d.ts +6 -6
  128. package/dist/permissions/hooks/use-policies.d.ts +2 -2
  129. package/dist/permissions/permissions.constants.d.ts +5 -0
  130. package/dist/permissions/permissions.constants.d.ts.map +1 -1
  131. package/dist/permissions/permissions.constants.js +35 -0
  132. package/dist/permissions/permissions.constants.js.map +1 -1
  133. package/dist/permissions/permissions.interfaces.d.ts +12 -0
  134. package/dist/permissions/permissions.interfaces.d.ts.map +1 -1
  135. package/dist/permissions/permissions.schemas.d.ts +56 -21
  136. package/dist/permissions/permissions.schemas.d.ts.map +1 -1
  137. package/dist/permissions/permissions.schemas.js +6 -1
  138. package/dist/permissions/permissions.schemas.js.map +1 -1
  139. package/dist/search/components/global-search-bar.d.ts.map +1 -1
  140. package/dist/search/components/global-search-bar.js +10 -11
  141. package/dist/search/components/global-search-bar.js.map +1 -1
  142. package/dist/shared/components/skeleton/console-layout-skeleton.d.ts +9 -21
  143. package/dist/shared/components/skeleton/console-layout-skeleton.d.ts.map +1 -1
  144. package/dist/shared/components/skeleton/console-layout-skeleton.js +13 -29
  145. package/dist/shared/components/skeleton/console-layout-skeleton.js.map +1 -1
  146. package/dist/shared/components/ui/sidebar.js +9 -9
  147. package/dist/shared/components/ui/sidebar.js.map +1 -1
  148. package/dist/shared/shared.constants.d.ts +1 -0
  149. package/dist/shared/shared.constants.d.ts.map +1 -1
  150. package/dist/shared/shared.constants.js +1 -0
  151. package/dist/shared/shared.constants.js.map +1 -1
  152. package/dist/shared/shared.interfaces.d.ts +0 -1
  153. package/dist/shared/shared.interfaces.d.ts.map +1 -1
  154. package/dist/shell/components/ConsoleLayout.d.ts +1 -1
  155. package/dist/shell/components/ConsoleLayout.d.ts.map +1 -1
  156. package/dist/shell/components/ConsoleLayout.js +6 -3
  157. package/dist/shell/components/ConsoleLayout.js.map +1 -1
  158. package/dist/shell/components/app-launcher/app-launcher-search-bar.js +1 -1
  159. package/dist/shell/components/app-launcher/app-launcher-search-bar.js.map +1 -1
  160. package/dist/shell/components/app-launcher/app-launcher.d.ts.map +1 -1
  161. package/dist/shell/components/app-launcher/app-launcher.js +2 -1
  162. package/dist/shell/components/app-launcher/app-launcher.js.map +1 -1
  163. package/dist/shell/components/app-launcher/category-navigation.d.ts.map +1 -1
  164. package/dist/shell/components/app-launcher/category-navigation.js +9 -2
  165. package/dist/shell/components/app-launcher/category-navigation.js.map +1 -1
  166. package/dist/shell/components/app-launcher/left-sidebar.d.ts +1 -1
  167. package/dist/shell/components/app-launcher/left-sidebar.d.ts.map +1 -1
  168. package/dist/shell/components/app-launcher/left-sidebar.js +3 -4
  169. package/dist/shell/components/app-launcher/left-sidebar.js.map +1 -1
  170. package/dist/shell/components/app-launcher/service-item.d.ts.map +1 -1
  171. package/dist/shell/components/app-launcher/service-item.js +2 -2
  172. package/dist/shell/components/app-launcher/service-item.js.map +1 -1
  173. package/dist/shell/components/index.d.ts +1 -0
  174. package/dist/shell/components/index.d.ts.map +1 -1
  175. package/dist/shell/components/index.js +2 -0
  176. package/dist/shell/components/index.js.map +1 -1
  177. package/dist/shell/components/layouts/app-sidebar.d.ts +4 -1
  178. package/dist/shell/components/layouts/app-sidebar.d.ts.map +1 -1
  179. package/dist/shell/components/layouts/app-sidebar.js +39 -6
  180. package/dist/shell/components/layouts/app-sidebar.js.map +1 -1
  181. package/dist/shell/components/layouts/content-header.d.ts.map +1 -1
  182. package/dist/shell/components/layouts/content-header.js +5 -24
  183. package/dist/shell/components/layouts/content-header.js.map +1 -1
  184. package/dist/shell/components/layouts/index.d.ts +1 -3
  185. package/dist/shell/components/layouts/index.d.ts.map +1 -1
  186. package/dist/shell/components/layouts/index.js +1 -3
  187. package/dist/shell/components/layouts/index.js.map +1 -1
  188. package/dist/shell/components/layouts/sidebar-nested-item.d.ts.map +1 -1
  189. package/dist/shell/components/layouts/sidebar-nested-item.js +12 -5
  190. package/dist/shell/components/layouts/sidebar-nested-item.js.map +1 -1
  191. package/dist/shell/components/notifications/notification-container.d.ts +16 -2
  192. package/dist/shell/components/notifications/notification-container.d.ts.map +1 -1
  193. package/dist/shell/components/notifications/notification-container.js +75 -4
  194. package/dist/shell/components/notifications/notification-container.js.map +1 -1
  195. package/dist/shell/components/notifications/notification-item.d.ts +1 -1
  196. package/dist/shell/components/notifications/notification-item.d.ts.map +1 -1
  197. package/dist/shell/components/notifications/notification-item.js +26 -7
  198. package/dist/shell/components/notifications/notification-item.js.map +1 -1
  199. package/dist/shell/components/notifications/notification-panel-header.d.ts.map +1 -1
  200. package/dist/shell/components/notifications/notification-panel-header.js +4 -1
  201. package/dist/shell/components/notifications/notification-panel-header.js.map +1 -1
  202. package/dist/shell/components/notifications/notifications.d.ts +1 -1
  203. package/dist/shell/components/notifications/notifications.d.ts.map +1 -1
  204. package/dist/shell/components/notifications/notifications.js +2 -2
  205. package/dist/shell/components/notifications/notifications.js.map +1 -1
  206. package/dist/shell/components/toolbars/index.d.ts +1 -4
  207. package/dist/shell/components/toolbars/index.d.ts.map +1 -1
  208. package/dist/shell/components/toolbars/index.js +2 -5
  209. package/dist/shell/components/toolbars/index.js.map +1 -1
  210. package/dist/shell/components/toolbars/top-right-toolbar.d.ts +1 -1
  211. package/dist/shell/components/toolbars/top-right-toolbar.d.ts.map +1 -1
  212. package/dist/shell/components/toolbars/top-right-toolbar.js +2 -2
  213. package/dist/shell/components/toolbars/top-right-toolbar.js.map +1 -1
  214. package/dist/shell/components/toolbars/top-toolbar-feedback.js +1 -1
  215. package/dist/shell/components/toolbars/top-toolbar-feedback.js.map +1 -1
  216. package/dist/shell/shell.constants.d.ts +1 -1
  217. package/dist/shell/shell.constants.js +1 -1
  218. package/dist/shell/shell.interfaces.d.ts +8 -4
  219. package/dist/shell/shell.interfaces.d.ts.map +1 -1
  220. package/dist/shell/shell.utilities.d.ts +7 -0
  221. package/dist/shell/shell.utilities.d.ts.map +1 -1
  222. package/dist/shell/shell.utilities.js +17 -0
  223. package/dist/shell/shell.utilities.js.map +1 -1
  224. package/package.json +130 -12
  225. package/dist/chat/components/chat-assistant-legacy.d.ts +0 -9
  226. package/dist/chat/components/chat-assistant-legacy.d.ts.map +0 -1
  227. package/dist/chat/components/chat-assistant-legacy.js +0 -73
  228. package/dist/chat/components/chat-assistant-legacy.js.map +0 -1
@@ -0,0 +1,620 @@
1
+ /**
2
+ * Notifications Service
3
+ *
4
+ * Core service for managing in-app notifications.
5
+ * Handles CRUD operations for notifications stored in DynamoDB.
6
+ */
7
+ import { notificationKeys } from "../../db/schemas";
8
+ import { DEFAULT_NOTIFICATIONS_LIMIT, NOTIFICATION_TTL_SECONDS, } from "../notifications.constants";
9
+ import { NotificationNotFoundError, NotificationUnauthorizedError, } from "../notifications.errors";
10
+ import { createNotificationSchema, dismissNotificationSchema, getUnreadCountSchema, listNotificationsSchema, markAllAsReadSchema, markAsReadSchema, } from "../notifications.schemas";
11
+ import { BaseAwsService } from "../../shared/services/base-aws-service";
12
+ import { DynamoDbInstances } from "../../shared/services/dynamodb";
13
+ import { TABLES } from "../../shared/shared.constants";
14
+ export class NotificationsService extends BaseAwsService {
15
+ constructor(deps = {}) {
16
+ var _a, _b, _c, _d, _e;
17
+ super({ logger: deps.logger, serviceName: "NotificationsService" });
18
+ // DynamoDB instance is configured with table name - no need to pass it on each operation
19
+ this.db =
20
+ (_a = deps.dynamoDb) !== null && _a !== void 0 ? _a : DynamoDbInstances.getInstance((_c = (_b = deps.config) === null || _b === void 0 ? void 0 : _b.tableName) !== null && _c !== void 0 ? _c : TABLES.notifications);
21
+ this.defaultPageSize = (_e = (_d = deps.config) === null || _d === void 0 ? void 0 : _d.defaultPageSize) !== null && _e !== void 0 ? _e : DEFAULT_NOTIFICATIONS_LIMIT;
22
+ }
23
+ // ============================================================================
24
+ // Create Operations
25
+ // ============================================================================
26
+ /**
27
+ * Create a single notification
28
+ *
29
+ * Includes deduplication check - if a notification already exists for the same
30
+ * (userId, sourceId, sourceType, type) combination, returns the existing one.
31
+ */
32
+ async createNotification(params, options) {
33
+ const validated = createNotificationSchema.parse(params);
34
+ this.logger.info("Creating notification", {
35
+ userId: validated.userId,
36
+ type: validated.type,
37
+ actorId: validated.actorId,
38
+ });
39
+ // Check for duplicate notification
40
+ const existing = await this.findExistingNotification(validated.tenantId, validated.userId, validated.sourceId, validated.sourceType, validated.type, options);
41
+ if (existing) {
42
+ this.logger.info("Duplicate notification found, skipping creation", {
43
+ existingId: existing.id,
44
+ userId: validated.userId,
45
+ sourceId: validated.sourceId,
46
+ type: validated.type,
47
+ });
48
+ return this.dynamoItemToNotification(existing);
49
+ }
50
+ const dynamoItem = this.buildNotificationDocument(validated);
51
+ await this.db.putItem(dynamoItem, {
52
+ userCredentials: options === null || options === void 0 ? void 0 : options.userCredentials,
53
+ });
54
+ this.logger.info("Created notification", {
55
+ notificationId: dynamoItem.id,
56
+ userId: validated.userId,
57
+ type: validated.type,
58
+ });
59
+ return this.dynamoItemToNotification(dynamoItem);
60
+ }
61
+ /**
62
+ * Create multiple notifications in bulk using DynamoDB BatchWrite
63
+ * More efficient than creating notifications one by one.
64
+ *
65
+ * Includes deduplication - skips notifications that already exist for the same
66
+ * (userId, sourceId, sourceType, type) combination.
67
+ */
68
+ async createBulkNotifications(params, options) {
69
+ if (params.length === 0) {
70
+ return [];
71
+ }
72
+ this.logger.info("Creating bulk notifications", {
73
+ count: params.length,
74
+ });
75
+ // Validate all params first
76
+ const validatedParams = [];
77
+ const validationErrors = [];
78
+ for (const param of params) {
79
+ try {
80
+ const validated = createNotificationSchema.parse(param);
81
+ validatedParams.push(validated);
82
+ }
83
+ catch (error) {
84
+ validationErrors.push({
85
+ userId: param.userId,
86
+ type: param.type,
87
+ error: error instanceof Error ? error.message : "Unknown error",
88
+ });
89
+ }
90
+ }
91
+ if (validationErrors.length > 0) {
92
+ this.logger.warn("Some notifications failed validation", {
93
+ failedCount: validationErrors.length,
94
+ errors: validationErrors,
95
+ });
96
+ }
97
+ if (validatedParams.length === 0) {
98
+ this.logger.warn("No valid notifications to create");
99
+ return [];
100
+ }
101
+ // Check for duplicates and filter them out
102
+ const nonDuplicateParams = [];
103
+ const existingNotifications = [];
104
+ let duplicateCount = 0;
105
+ // Check each notification for duplicates (in parallel for efficiency)
106
+ const duplicateChecks = await Promise.all(validatedParams.map(async (param) => {
107
+ const existing = await this.findExistingNotification(param.tenantId, param.userId, param.sourceId, param.sourceType, param.type, options);
108
+ return { param, existing };
109
+ }));
110
+ for (const { param, existing } of duplicateChecks) {
111
+ if (existing) {
112
+ duplicateCount++;
113
+ existingNotifications.push(this.dynamoItemToNotification(existing));
114
+ }
115
+ else {
116
+ nonDuplicateParams.push(param);
117
+ }
118
+ }
119
+ if (duplicateCount > 0) {
120
+ this.logger.info("Filtered out duplicate notifications", {
121
+ duplicateCount,
122
+ remainingCount: nonDuplicateParams.length,
123
+ });
124
+ }
125
+ if (nonDuplicateParams.length === 0) {
126
+ this.logger.info("All notifications were duplicates, nothing to create");
127
+ return existingNotifications;
128
+ }
129
+ // Build documents for non-duplicate notifications
130
+ const documents = nonDuplicateParams.map((param) => this.buildNotificationDocument(param));
131
+ // Use batch write for efficiency
132
+ try {
133
+ await this.db.batchWrite(documents, "put", {
134
+ userCredentials: options === null || options === void 0 ? void 0 : options.userCredentials,
135
+ });
136
+ this.logger.info("Created bulk notifications successfully", {
137
+ requested: params.length,
138
+ created: documents.length,
139
+ duplicatesSkipped: duplicateCount,
140
+ validationFailed: validationErrors.length,
141
+ });
142
+ const createdNotifications = documents.map((doc) => this.dynamoItemToNotification(doc));
143
+ return [...existingNotifications, ...createdNotifications];
144
+ }
145
+ catch (error) {
146
+ // If batch write fails, fall back to individual writes
147
+ this.logger.warn("Batch write failed, falling back to individual writes", {
148
+ error: error instanceof Error ? error.message : "Unknown error",
149
+ });
150
+ const notifications = [...existingNotifications];
151
+ for (const document of documents) {
152
+ try {
153
+ await this.db.putItem(document, {
154
+ userCredentials: options === null || options === void 0 ? void 0 : options.userCredentials,
155
+ });
156
+ notifications.push(this.dynamoItemToNotification(document));
157
+ }
158
+ catch (putError) {
159
+ this.logger.warn("Failed to create notification in fallback", {
160
+ notificationId: document.id,
161
+ error: putError instanceof Error ? putError.message : "Unknown error",
162
+ });
163
+ }
164
+ }
165
+ this.logger.info("Created bulk notifications via fallback", {
166
+ requested: params.length,
167
+ created: notifications.length - existingNotifications.length,
168
+ duplicatesSkipped: duplicateCount,
169
+ });
170
+ return notifications;
171
+ }
172
+ }
173
+ /**
174
+ * Build a notification document from validated params
175
+ *
176
+ * ID format: {createdAt}-{uuid} (e.g., "1704067200000-550e8400-e29b-41d4-a716-446655440000")
177
+ * This format allows direct SK reconstruction for efficient point lookups.
178
+ */
179
+ buildNotificationDocument(validated) {
180
+ const createdAt = Date.now();
181
+ const uuid = crypto.randomUUID();
182
+ // Include createdAt in ID for direct SK reconstruction
183
+ const notificationId = `${createdAt}-${uuid}`;
184
+ const pk = notificationKeys.pk(validated.tenantId, validated.userId);
185
+ const sk = notificationKeys.sk(createdAt, notificationId);
186
+ // TTL: current time in seconds + configured TTL duration
187
+ const ttl = Math.floor(createdAt / 1000) + NOTIFICATION_TTL_SECONDS;
188
+ return {
189
+ PK: pk,
190
+ SK: sk,
191
+ id: notificationId,
192
+ tenantId: validated.tenantId,
193
+ userId: validated.userId,
194
+ type: validated.type,
195
+ title: validated.title,
196
+ message: validated.message,
197
+ read: false,
198
+ isDismissed: false,
199
+ createdAt,
200
+ updatedAt: createdAt,
201
+ createdById: validated.actorId,
202
+ url: validated.url,
203
+ actorId: validated.actorId,
204
+ actorName: validated.actorName,
205
+ entityId: validated.entityId,
206
+ entityType: validated.entityType,
207
+ sourceId: validated.sourceId,
208
+ sourceType: validated.sourceType,
209
+ ttl,
210
+ };
211
+ }
212
+ /**
213
+ * Parse notification ID to extract createdAt timestamp
214
+ *
215
+ * New format: {createdAt}-{uuid} -> returns createdAt
216
+ * Old format: {uuid} -> returns null (fallback to query)
217
+ */
218
+ parseNotificationId(notificationId) {
219
+ // New format: {createdAt}-{uuid}
220
+ // createdAt is a 13-digit timestamp, so we look for that pattern
221
+ const match = notificationId.match(/^(\d{13})-/);
222
+ if (match) {
223
+ const createdAt = parseInt(match[1], 10);
224
+ if (!isNaN(createdAt)) {
225
+ return { createdAt };
226
+ }
227
+ }
228
+ return null;
229
+ }
230
+ // ============================================================================
231
+ // Read Operations
232
+ // ============================================================================
233
+ /**
234
+ * List notifications for a user with pagination
235
+ */
236
+ async listNotifications(params, options) {
237
+ var _a;
238
+ const validated = listNotificationsSchema.parse(params);
239
+ this.logger.info("Listing notifications", {
240
+ tenantId: validated.tenantId,
241
+ userId: validated.userId,
242
+ limit: validated.limit,
243
+ unreadOnly: validated.unreadOnly,
244
+ });
245
+ const pk = notificationKeys.pk(validated.tenantId, validated.userId);
246
+ const limit = (_a = validated.limit) !== null && _a !== void 0 ? _a : this.defaultPageSize;
247
+ // Build filter expression
248
+ const filterExpressions = [];
249
+ const expressionAttributeValues = {};
250
+ // Exclude dismissed unless explicitly requested
251
+ if (!validated.includeDismissed) {
252
+ filterExpressions.push("isDismissed = :isDismissed");
253
+ expressionAttributeValues[":isDismissed"] = false;
254
+ }
255
+ // Filter for unread only if requested
256
+ if (validated.unreadOnly) {
257
+ filterExpressions.push("#read = :read");
258
+ expressionAttributeValues[":read"] = false;
259
+ }
260
+ const queryParams = {
261
+ KeyConditionExpression: "PK = :pk AND begins_with(SK, :skPrefix)",
262
+ ExpressionAttributeValues: Object.assign({ ":pk": pk, ":skPrefix": notificationKeys.skPrefix() }, expressionAttributeValues),
263
+ ScanIndexForward: false, // Descending order (newest first)
264
+ Limit: limit,
265
+ };
266
+ if (filterExpressions.length > 0) {
267
+ queryParams.FilterExpression = filterExpressions.join(" AND ");
268
+ }
269
+ if (validated.unreadOnly) {
270
+ queryParams.ExpressionAttributeNames = { "#read": "read" };
271
+ }
272
+ if (validated.cursor) {
273
+ try {
274
+ queryParams.ExclusiveStartKey = JSON.parse(Buffer.from(validated.cursor, "base64").toString("utf-8"));
275
+ }
276
+ catch (_b) {
277
+ this.logger.warn("Invalid pagination cursor", { cursor: validated.cursor });
278
+ // Ignore malformed cursor and start from beginning
279
+ }
280
+ }
281
+ const result = await this.db.queryItems(queryParams, {
282
+ userCredentials: options === null || options === void 0 ? void 0 : options.userCredentials,
283
+ });
284
+ const notifications = (result.Items || []).map((item) => this.dynamoItemToNotification(item));
285
+ let nextCursor;
286
+ if (result.LastEvaluatedKey) {
287
+ nextCursor = Buffer.from(JSON.stringify(result.LastEvaluatedKey)).toString("base64");
288
+ }
289
+ this.logger.info("Listed notifications", {
290
+ userId: validated.userId,
291
+ count: notifications.length,
292
+ hasMore: !!nextCursor,
293
+ });
294
+ return {
295
+ notifications,
296
+ nextCursor,
297
+ };
298
+ }
299
+ /**
300
+ * Get unread notification count for a user
301
+ */
302
+ async getUnreadCount(params, options) {
303
+ var _a;
304
+ const validated = getUnreadCountSchema.parse(params);
305
+ this.logger.info("Getting unread count", {
306
+ tenantId: validated.tenantId,
307
+ userId: validated.userId,
308
+ });
309
+ const pk = notificationKeys.pk(validated.tenantId, validated.userId);
310
+ // Query with filter for unread and not dismissed
311
+ const result = await this.db.queryItems({
312
+ KeyConditionExpression: "PK = :pk AND begins_with(SK, :skPrefix)",
313
+ FilterExpression: "#read = :read AND isDismissed = :isDismissed",
314
+ ExpressionAttributeNames: { "#read": "read" },
315
+ ExpressionAttributeValues: {
316
+ ":pk": pk,
317
+ ":skPrefix": notificationKeys.skPrefix(),
318
+ ":read": false,
319
+ ":isDismissed": false,
320
+ },
321
+ Select: "COUNT",
322
+ }, {
323
+ userCredentials: options === null || options === void 0 ? void 0 : options.userCredentials,
324
+ });
325
+ const count = (_a = result.Count) !== null && _a !== void 0 ? _a : 0;
326
+ this.logger.info("Got unread count", {
327
+ userId: validated.userId,
328
+ count,
329
+ });
330
+ return count;
331
+ }
332
+ // ============================================================================
333
+ // Update Operations
334
+ // ============================================================================
335
+ /**
336
+ * Mark a notification as read
337
+ */
338
+ async markAsRead(params, options) {
339
+ const validated = markAsReadSchema.parse(params);
340
+ this.logger.info("Marking notification as read", {
341
+ tenantId: validated.tenantId,
342
+ userId: validated.userId,
343
+ notificationId: validated.notificationId,
344
+ });
345
+ // Find the notification
346
+ const notification = await this.findNotificationById(validated.tenantId, validated.userId, validated.notificationId, options);
347
+ if (!notification) {
348
+ throw new NotificationNotFoundError(validated.notificationId);
349
+ }
350
+ // Verify ownership
351
+ if (notification.userId !== validated.userId || notification.tenantId !== validated.tenantId) {
352
+ throw new NotificationUnauthorizedError("mark as read");
353
+ }
354
+ // Update the notification using type-safe builder
355
+ const now = Date.now();
356
+ const { UpdateExpression, ExpressionAttributeNames, ExpressionAttributeValues } = this.db
357
+ .createUpdateBuilder()
358
+ .set("read", true)
359
+ .set("updatedAt", now)
360
+ .build();
361
+ await this.db.updateItem({ PK: notification.PK, SK: notification.SK }, UpdateExpression, ExpressionAttributeNames, ExpressionAttributeValues, { userCredentials: options === null || options === void 0 ? void 0 : options.userCredentials });
362
+ this.logger.info("Marked notification as read", {
363
+ notificationId: validated.notificationId,
364
+ userId: validated.userId,
365
+ });
366
+ return this.dynamoItemToNotification(Object.assign(Object.assign({}, notification), { read: true, updatedAt: now }));
367
+ }
368
+ /**
369
+ * Mark all notifications as read for a user
370
+ */
371
+ async markAllAsRead(params, options) {
372
+ const validated = markAllAsReadSchema.parse(params);
373
+ this.logger.info("Marking all notifications as read", {
374
+ tenantId: validated.tenantId,
375
+ userId: validated.userId,
376
+ });
377
+ const pk = notificationKeys.pk(validated.tenantId, validated.userId);
378
+ // Query all unread notifications
379
+ const result = await this.db.queryItems({
380
+ KeyConditionExpression: "PK = :pk AND begins_with(SK, :skPrefix)",
381
+ FilterExpression: "#read = :read AND isDismissed = :isDismissed",
382
+ ExpressionAttributeNames: { "#read": "read" },
383
+ ExpressionAttributeValues: {
384
+ ":pk": pk,
385
+ ":skPrefix": notificationKeys.skPrefix(),
386
+ ":read": false,
387
+ ":isDismissed": false,
388
+ },
389
+ }, {
390
+ userCredentials: options === null || options === void 0 ? void 0 : options.userCredentials,
391
+ });
392
+ const items = result.Items || [];
393
+ if (items.length === 0) {
394
+ this.logger.info("No unread notifications to mark as read", {
395
+ userId: validated.userId,
396
+ });
397
+ return 0;
398
+ }
399
+ // Build update expression once (reuse for all items)
400
+ const now = Date.now();
401
+ const { UpdateExpression, ExpressionAttributeNames, ExpressionAttributeValues } = this.db
402
+ .createUpdateBuilder()
403
+ .set("read", true)
404
+ .set("updatedAt", now)
405
+ .build();
406
+ // Update all notifications in parallel for efficiency
407
+ const updateResults = await Promise.all(items.map(async (item) => {
408
+ try {
409
+ await this.db.updateItem({ PK: item.PK, SK: item.SK }, UpdateExpression, ExpressionAttributeNames, ExpressionAttributeValues, { userCredentials: options === null || options === void 0 ? void 0 : options.userCredentials });
410
+ return { success: true, id: item.id };
411
+ }
412
+ catch (error) {
413
+ this.logger.warn("Failed to mark notification as read", {
414
+ notificationId: item.id,
415
+ error: error instanceof Error ? error.message : "Unknown error",
416
+ });
417
+ return { success: false, id: item.id };
418
+ }
419
+ }));
420
+ const updatedCount = updateResults.filter((r) => r.success).length;
421
+ this.logger.info("Marked all notifications as read", {
422
+ userId: validated.userId,
423
+ updatedCount,
424
+ totalFound: items.length,
425
+ });
426
+ return updatedCount;
427
+ }
428
+ /**
429
+ * Dismiss a notification (soft delete)
430
+ */
431
+ async dismissNotification(params, options) {
432
+ const validated = dismissNotificationSchema.parse(params);
433
+ this.logger.info("Dismissing notification", {
434
+ userId: validated.userId,
435
+ notificationId: validated.notificationId,
436
+ });
437
+ // Find the notification
438
+ const notification = await this.findNotificationById(validated.tenantId, validated.userId, validated.notificationId, options);
439
+ if (!notification) {
440
+ throw new NotificationNotFoundError(validated.notificationId);
441
+ }
442
+ // Verify ownership
443
+ if (notification.userId !== validated.userId || notification.tenantId !== validated.tenantId) {
444
+ throw new NotificationUnauthorizedError("dismiss");
445
+ }
446
+ // Update the notification using type-safe builder
447
+ const now = Date.now();
448
+ const { UpdateExpression, ExpressionAttributeNames, ExpressionAttributeValues } = this.db
449
+ .createUpdateBuilder()
450
+ .set("isDismissed", true)
451
+ .set("updatedAt", now)
452
+ .build();
453
+ await this.db.updateItem({ PK: notification.PK, SK: notification.SK }, UpdateExpression, ExpressionAttributeNames, ExpressionAttributeValues, { userCredentials: options === null || options === void 0 ? void 0 : options.userCredentials });
454
+ this.logger.info("Dismissed notification", {
455
+ notificationId: validated.notificationId,
456
+ userId: validated.userId,
457
+ });
458
+ return this.dynamoItemToNotification(Object.assign(Object.assign({}, notification), { isDismissed: true, updatedAt: now }));
459
+ }
460
+ /**
461
+ * Dismiss all notifications for a user (bulk soft delete)
462
+ */
463
+ async dismissAllNotifications(params, // Reuse same params (just tenantId + userId)
464
+ options) {
465
+ const validated = markAllAsReadSchema.parse(params);
466
+ this.logger.info("Dismissing all notifications", {
467
+ tenantId: validated.tenantId,
468
+ userId: validated.userId,
469
+ });
470
+ const pk = notificationKeys.pk(validated.tenantId, validated.userId);
471
+ // Query all non-dismissed notifications
472
+ const result = await this.db.queryItems({
473
+ KeyConditionExpression: "PK = :pk AND begins_with(SK, :skPrefix)",
474
+ FilterExpression: "isDismissed = :isDismissed",
475
+ ExpressionAttributeValues: {
476
+ ":pk": pk,
477
+ ":skPrefix": notificationKeys.skPrefix(),
478
+ ":isDismissed": false,
479
+ },
480
+ }, {
481
+ userCredentials: options === null || options === void 0 ? void 0 : options.userCredentials,
482
+ });
483
+ const items = result.Items || [];
484
+ if (items.length === 0) {
485
+ this.logger.info("No notifications to dismiss", {
486
+ userId: validated.userId,
487
+ });
488
+ return 0;
489
+ }
490
+ // Build update expression once (reuse for all items)
491
+ const now = Date.now();
492
+ const { UpdateExpression, ExpressionAttributeNames, ExpressionAttributeValues } = this.db
493
+ .createUpdateBuilder()
494
+ .set("isDismissed", true)
495
+ .set("updatedAt", now)
496
+ .build();
497
+ // Update all notifications in parallel for efficiency
498
+ const updateResults = await Promise.all(items.map(async (item) => {
499
+ try {
500
+ await this.db.updateItem({ PK: item.PK, SK: item.SK }, UpdateExpression, ExpressionAttributeNames, ExpressionAttributeValues, { userCredentials: options === null || options === void 0 ? void 0 : options.userCredentials });
501
+ return { success: true, id: item.id };
502
+ }
503
+ catch (error) {
504
+ this.logger.warn("Failed to dismiss notification", {
505
+ notificationId: item.id,
506
+ error: error instanceof Error ? error.message : "Unknown error",
507
+ });
508
+ return { success: false, id: item.id };
509
+ }
510
+ }));
511
+ const dismissedCount = updateResults.filter((r) => r.success).length;
512
+ this.logger.info("Dismissed all notifications", {
513
+ userId: validated.userId,
514
+ dismissedCount,
515
+ totalFound: items.length,
516
+ });
517
+ return dismissedCount;
518
+ }
519
+ // ============================================================================
520
+ // Private Helpers
521
+ // ============================================================================
522
+ /**
523
+ * Find an existing notification by source to prevent duplicates.
524
+ *
525
+ * Checks if a notification already exists for the same user, source, and type combination.
526
+ * This prevents duplicate notifications when the same action triggers multiple times.
527
+ *
528
+ * @returns The existing notification if found, null otherwise
529
+ */
530
+ async findExistingNotification(tenantId, userId, sourceId, sourceType, type, options) {
531
+ var _a, _b;
532
+ const pk = notificationKeys.pk(tenantId, userId);
533
+ const result = await this.db.queryItems({
534
+ KeyConditionExpression: "PK = :pk AND begins_with(SK, :skPrefix)",
535
+ FilterExpression: "sourceId = :sourceId AND sourceType = :sourceType AND #type = :type AND isDismissed = :isDismissed",
536
+ ExpressionAttributeNames: { "#type": "type" },
537
+ ExpressionAttributeValues: {
538
+ ":pk": pk,
539
+ ":skPrefix": notificationKeys.skPrefix(),
540
+ ":sourceId": sourceId,
541
+ ":sourceType": sourceType,
542
+ ":type": type,
543
+ ":isDismissed": false,
544
+ },
545
+ Limit: 1,
546
+ }, {
547
+ userCredentials: options === null || options === void 0 ? void 0 : options.userCredentials,
548
+ });
549
+ return (_b = (_a = result.Items) === null || _a === void 0 ? void 0 : _a[0]) !== null && _b !== void 0 ? _b : null;
550
+ }
551
+ /**
552
+ * Find a notification by ID using the most efficient method available.
553
+ *
554
+ * For new IDs (format: {createdAt}-{uuid}): Uses direct getItem (O(1) lookup)
555
+ * For old IDs (format: {uuid}): Falls back to query + filter (scans user's notifications)
556
+ */
557
+ async findNotificationById(tenantId, userId, notificationId, options) {
558
+ var _a, _b;
559
+ const pk = notificationKeys.pk(tenantId, userId);
560
+ // Try to parse createdAt from the new ID format for direct lookup
561
+ const parsed = this.parseNotificationId(notificationId);
562
+ if (parsed) {
563
+ // New ID format: Direct getItem lookup (most efficient)
564
+ const sk = notificationKeys.sk(parsed.createdAt, notificationId);
565
+ const result = await this.db.getItem({ PK: pk, SK: sk }, {
566
+ userCredentials: options === null || options === void 0 ? void 0 : options.userCredentials,
567
+ });
568
+ // Verify the ID matches (in case of SK collision, though unlikely)
569
+ if (result.Item && result.Item.id === notificationId) {
570
+ return result.Item;
571
+ }
572
+ // If direct lookup failed, fall through to query (handles edge cases)
573
+ }
574
+ // Fallback: Query with filter for old ID format or if direct lookup failed
575
+ this.logger.debug("Using fallback query for notification lookup", {
576
+ notificationId,
577
+ reason: parsed ? "direct lookup failed" : "old ID format",
578
+ });
579
+ const result = await this.db.queryItems({
580
+ KeyConditionExpression: "PK = :pk AND begins_with(SK, :skPrefix)",
581
+ FilterExpression: "id = :id",
582
+ ExpressionAttributeValues: {
583
+ ":pk": pk,
584
+ ":skPrefix": notificationKeys.skPrefix(),
585
+ ":id": notificationId,
586
+ },
587
+ }, {
588
+ userCredentials: options === null || options === void 0 ? void 0 : options.userCredentials,
589
+ });
590
+ return (_b = (_a = result.Items) === null || _a === void 0 ? void 0 : _a[0]) !== null && _b !== void 0 ? _b : null;
591
+ }
592
+ /**
593
+ * Convert DynamoDB item to Notification entity
594
+ */
595
+ dynamoItemToNotification(item) {
596
+ return {
597
+ id: item.id,
598
+ tenantId: item.tenantId,
599
+ userId: item.userId,
600
+ type: item.type,
601
+ title: item.title,
602
+ message: item.message,
603
+ read: item.read,
604
+ isDismissed: item.isDismissed,
605
+ createdAt: item.createdAt,
606
+ updatedAt: item.updatedAt,
607
+ createdById: item.createdById,
608
+ modifiedById: item.modifiedById,
609
+ url: item.url,
610
+ actorId: item.actorId,
611
+ actorName: item.actorName,
612
+ entityId: item.entityId,
613
+ entityType: item.entityType,
614
+ sourceId: item.sourceId,
615
+ sourceType: item.sourceType,
616
+ ttl: item.ttl,
617
+ };
618
+ }
619
+ }
620
+ //# sourceMappingURL=notifications.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notifications.service.js","sourceRoot":"","sources":["../../../lib/notifications/services/notifications.service.ts"],"names":[],"mappings":"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"}