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.
- package/dist/agents/components/agents-list-header.d.ts.map +1 -1
- package/dist/agents/components/agents-list-header.js +3 -2
- package/dist/agents/components/agents-list-header.js.map +1 -1
- package/dist/chat/components/chat-content-approval.d.ts.map +1 -1
- package/dist/chat/components/chat-content-approval.js.map +1 -1
- package/dist/chat/components/chat-context-toggle.d.ts.map +1 -1
- package/dist/chat/components/chat-context-toggle.js +2 -4
- package/dist/chat/components/chat-context-toggle.js.map +1 -1
- package/dist/comments/comments.constants.d.ts +8 -1
- package/dist/comments/comments.constants.d.ts.map +1 -1
- package/dist/comments/comments.constants.js +18 -0
- package/dist/comments/comments.constants.js.map +1 -1
- package/dist/comments/comments.interfaces.d.ts +5 -0
- package/dist/comments/comments.interfaces.d.ts.map +1 -1
- package/dist/comments/comments.utilities.d.ts +30 -1
- package/dist/comments/comments.utilities.d.ts.map +1 -1
- package/dist/comments/comments.utilities.js +41 -1
- package/dist/comments/comments.utilities.js.map +1 -1
- package/dist/comments/hooks/use-comments.d.ts.map +1 -1
- package/dist/comments/hooks/use-comments.js +1 -0
- package/dist/comments/hooks/use-comments.js.map +1 -1
- package/dist/comments/services/comments.factory.d.ts.map +1 -1
- package/dist/comments/services/comments.factory.js +5 -2
- package/dist/comments/services/comments.factory.js.map +1 -1
- package/dist/comments/services/comments.service.d.ts +9 -2
- package/dist/comments/services/comments.service.d.ts.map +1 -1
- package/dist/comments/services/comments.service.js +96 -4
- package/dist/comments/services/comments.service.js.map +1 -1
- package/dist/db/schemas/index.d.ts +6 -4
- package/dist/db/schemas/index.d.ts.map +1 -1
- package/dist/db/schemas/index.js +2 -1
- package/dist/db/schemas/index.js.map +1 -1
- package/dist/db/schemas/notifications.schema.d.ts +107 -0
- package/dist/db/schemas/notifications.schema.d.ts.map +1 -0
- package/dist/db/schemas/notifications.schema.js +124 -0
- package/dist/db/schemas/notifications.schema.js.map +1 -0
- package/dist/feedback/api/feedback.handlers.d.ts.map +1 -1
- package/dist/feedback/api/feedback.handlers.js +1 -0
- package/dist/feedback/api/feedback.handlers.js.map +1 -1
- package/dist/feedback/components/feedback-editor.d.ts.map +1 -1
- package/dist/feedback/components/feedback-editor.js +6 -4
- package/dist/feedback/components/feedback-editor.js.map +1 -1
- package/dist/feedback/feedback.interfaces.d.ts +24 -1
- package/dist/feedback/feedback.interfaces.d.ts.map +1 -1
- package/dist/feedback/services/feedback.service.d.ts +26 -3
- package/dist/feedback/services/feedback.service.d.ts.map +1 -1
- package/dist/feedback/services/feedback.service.js +270 -11
- package/dist/feedback/services/feedback.service.js.map +1 -1
- package/dist/files/components/folder-browser/folder-breadcrumb.d.ts.map +1 -1
- package/dist/files/components/folder-browser/folder-breadcrumb.js +1 -1
- package/dist/files/components/folder-browser/folder-breadcrumb.js.map +1 -1
- package/dist/files/components/folder-browser/folder-list-item.js +1 -1
- package/dist/files/components/folder-browser/folder-list-item.js.map +1 -1
- package/dist/files/components/folder-browser/folder-tree-item.d.ts.map +1 -1
- package/dist/files/components/folder-browser/folder-tree-item.js +1 -1
- package/dist/files/components/folder-browser/folder-tree-item.js.map +1 -1
- package/dist/files/components/folder-browser/folder-tree-sidebar.js +1 -1
- package/dist/files/components/folder-browser/folder-tree-sidebar.js.map +1 -1
- package/dist/notifications/api/index.d.ts +7 -0
- package/dist/notifications/api/index.d.ts.map +1 -0
- package/dist/notifications/api/index.js +8 -0
- package/dist/notifications/api/index.js.map +1 -0
- package/dist/notifications/api/notifications.client.d.ts +86 -0
- package/dist/notifications/api/notifications.client.d.ts.map +1 -0
- package/dist/notifications/api/notifications.client.js +102 -0
- package/dist/notifications/api/notifications.client.js.map +1 -0
- package/dist/notifications/api/notifications.handlers.d.ts +166 -0
- package/dist/notifications/api/notifications.handlers.d.ts.map +1 -0
- package/dist/notifications/api/notifications.handlers.js +187 -0
- package/dist/notifications/api/notifications.handlers.js.map +1 -0
- package/dist/notifications/hooks/index.d.ts +5 -0
- package/dist/notifications/hooks/index.d.ts.map +1 -0
- package/dist/notifications/hooks/index.js +5 -0
- package/dist/notifications/hooks/index.js.map +1 -0
- package/dist/notifications/hooks/use-notifications-api.d.ts +111 -0
- package/dist/notifications/hooks/use-notifications-api.d.ts.map +1 -0
- package/dist/notifications/hooks/use-notifications-api.js +253 -0
- package/dist/notifications/hooks/use-notifications-api.js.map +1 -0
- package/dist/notifications/index.d.ts +16 -0
- package/dist/notifications/index.d.ts.map +1 -0
- package/dist/notifications/index.js +18 -0
- package/dist/notifications/index.js.map +1 -0
- package/dist/notifications/notification.utilities.d.ts +12 -0
- package/dist/notifications/notification.utilities.d.ts.map +1 -0
- package/dist/notifications/notification.utilities.js +35 -0
- package/dist/notifications/notification.utilities.js.map +1 -0
- package/dist/notifications/notifications.constants.d.ts +72 -0
- package/dist/notifications/notifications.constants.d.ts.map +1 -0
- package/dist/notifications/notifications.constants.js +104 -0
- package/dist/notifications/notifications.constants.js.map +1 -0
- package/dist/notifications/notifications.errors.d.ts +35 -0
- package/dist/notifications/notifications.errors.d.ts.map +1 -0
- package/dist/notifications/notifications.errors.js +51 -0
- package/dist/notifications/notifications.errors.js.map +1 -0
- package/dist/notifications/notifications.interfaces.d.ts +116 -0
- package/dist/notifications/notifications.interfaces.d.ts.map +1 -0
- package/dist/notifications/notifications.interfaces.js +10 -0
- package/dist/notifications/notifications.interfaces.js.map +1 -0
- package/dist/notifications/notifications.schemas.d.ts +139 -0
- package/dist/notifications/notifications.schemas.d.ts.map +1 -0
- package/dist/notifications/notifications.schemas.js +167 -0
- package/dist/notifications/notifications.schemas.js.map +1 -0
- package/dist/notifications/services/index.d.ts +6 -0
- package/dist/notifications/services/index.d.ts.map +1 -0
- package/dist/notifications/services/index.js +6 -0
- package/dist/notifications/services/index.js.map +1 -0
- package/dist/notifications/services/notifications.factory.d.ts +19 -0
- package/dist/notifications/services/notifications.factory.d.ts.map +1 -0
- package/dist/notifications/services/notifications.factory.js +58 -0
- package/dist/notifications/services/notifications.factory.js.map +1 -0
- package/dist/notifications/services/notifications.service.d.ts +88 -0
- package/dist/notifications/services/notifications.service.d.ts.map +1 -0
- package/dist/notifications/services/notifications.service.js +620 -0
- package/dist/notifications/services/notifications.service.js.map +1 -0
- package/dist/permissions/api/permissions.handlers.d.ts +20 -20
- package/dist/permissions/components/resource-panel.d.ts.map +1 -1
- package/dist/permissions/components/resource-panel.js +2 -1
- package/dist/permissions/components/resource-panel.js.map +1 -1
- package/dist/permissions/hooks/index.d.ts +1 -0
- package/dist/permissions/hooks/index.d.ts.map +1 -1
- package/dist/permissions/hooks/index.js +1 -0
- package/dist/permissions/hooks/index.js.map +1 -1
- package/dist/permissions/hooks/use-notification-permissions.d.ts +19 -0
- package/dist/permissions/hooks/use-notification-permissions.d.ts.map +1 -0
- package/dist/permissions/hooks/use-notification-permissions.js +32 -0
- package/dist/permissions/hooks/use-notification-permissions.js.map +1 -0
- package/dist/permissions/hooks/use-permissions-dashboard.d.ts +6 -6
- package/dist/permissions/hooks/use-policies.d.ts +2 -2
- package/dist/permissions/permissions.constants.d.ts +5 -0
- package/dist/permissions/permissions.constants.d.ts.map +1 -1
- package/dist/permissions/permissions.constants.js +35 -0
- package/dist/permissions/permissions.constants.js.map +1 -1
- package/dist/permissions/permissions.interfaces.d.ts +12 -0
- package/dist/permissions/permissions.interfaces.d.ts.map +1 -1
- package/dist/permissions/permissions.schemas.d.ts +56 -21
- package/dist/permissions/permissions.schemas.d.ts.map +1 -1
- package/dist/permissions/permissions.schemas.js +6 -1
- package/dist/permissions/permissions.schemas.js.map +1 -1
- package/dist/search/components/global-search-bar.d.ts.map +1 -1
- package/dist/search/components/global-search-bar.js +10 -11
- package/dist/search/components/global-search-bar.js.map +1 -1
- package/dist/shared/components/skeleton/console-layout-skeleton.d.ts +9 -21
- package/dist/shared/components/skeleton/console-layout-skeleton.d.ts.map +1 -1
- package/dist/shared/components/skeleton/console-layout-skeleton.js +13 -29
- package/dist/shared/components/skeleton/console-layout-skeleton.js.map +1 -1
- package/dist/shared/components/ui/sidebar.js +9 -9
- package/dist/shared/components/ui/sidebar.js.map +1 -1
- package/dist/shared/shared.constants.d.ts +1 -0
- package/dist/shared/shared.constants.d.ts.map +1 -1
- package/dist/shared/shared.constants.js +1 -0
- package/dist/shared/shared.constants.js.map +1 -1
- package/dist/shared/shared.interfaces.d.ts +0 -1
- package/dist/shared/shared.interfaces.d.ts.map +1 -1
- package/dist/shell/components/ConsoleLayout.d.ts +1 -1
- package/dist/shell/components/ConsoleLayout.d.ts.map +1 -1
- package/dist/shell/components/ConsoleLayout.js +6 -3
- package/dist/shell/components/ConsoleLayout.js.map +1 -1
- package/dist/shell/components/app-launcher/app-launcher-search-bar.js +1 -1
- package/dist/shell/components/app-launcher/app-launcher-search-bar.js.map +1 -1
- package/dist/shell/components/app-launcher/app-launcher.d.ts.map +1 -1
- package/dist/shell/components/app-launcher/app-launcher.js +2 -1
- package/dist/shell/components/app-launcher/app-launcher.js.map +1 -1
- package/dist/shell/components/app-launcher/category-navigation.d.ts.map +1 -1
- package/dist/shell/components/app-launcher/category-navigation.js +9 -2
- package/dist/shell/components/app-launcher/category-navigation.js.map +1 -1
- package/dist/shell/components/app-launcher/left-sidebar.d.ts +1 -1
- package/dist/shell/components/app-launcher/left-sidebar.d.ts.map +1 -1
- package/dist/shell/components/app-launcher/left-sidebar.js +3 -4
- package/dist/shell/components/app-launcher/left-sidebar.js.map +1 -1
- package/dist/shell/components/app-launcher/service-item.d.ts.map +1 -1
- package/dist/shell/components/app-launcher/service-item.js +2 -2
- package/dist/shell/components/app-launcher/service-item.js.map +1 -1
- package/dist/shell/components/index.d.ts +1 -0
- package/dist/shell/components/index.d.ts.map +1 -1
- package/dist/shell/components/index.js +2 -0
- package/dist/shell/components/index.js.map +1 -1
- package/dist/shell/components/layouts/app-sidebar.d.ts +4 -1
- package/dist/shell/components/layouts/app-sidebar.d.ts.map +1 -1
- package/dist/shell/components/layouts/app-sidebar.js +39 -6
- package/dist/shell/components/layouts/app-sidebar.js.map +1 -1
- package/dist/shell/components/layouts/content-header.d.ts.map +1 -1
- package/dist/shell/components/layouts/content-header.js +5 -24
- package/dist/shell/components/layouts/content-header.js.map +1 -1
- package/dist/shell/components/layouts/index.d.ts +1 -3
- package/dist/shell/components/layouts/index.d.ts.map +1 -1
- package/dist/shell/components/layouts/index.js +1 -3
- package/dist/shell/components/layouts/index.js.map +1 -1
- package/dist/shell/components/layouts/sidebar-nested-item.d.ts.map +1 -1
- package/dist/shell/components/layouts/sidebar-nested-item.js +12 -5
- package/dist/shell/components/layouts/sidebar-nested-item.js.map +1 -1
- package/dist/shell/components/notifications/notification-container.d.ts +16 -2
- package/dist/shell/components/notifications/notification-container.d.ts.map +1 -1
- package/dist/shell/components/notifications/notification-container.js +75 -4
- package/dist/shell/components/notifications/notification-container.js.map +1 -1
- package/dist/shell/components/notifications/notification-item.d.ts +1 -1
- package/dist/shell/components/notifications/notification-item.d.ts.map +1 -1
- package/dist/shell/components/notifications/notification-item.js +26 -7
- package/dist/shell/components/notifications/notification-item.js.map +1 -1
- package/dist/shell/components/notifications/notification-panel-header.d.ts.map +1 -1
- package/dist/shell/components/notifications/notification-panel-header.js +4 -1
- package/dist/shell/components/notifications/notification-panel-header.js.map +1 -1
- package/dist/shell/components/notifications/notifications.d.ts +1 -1
- package/dist/shell/components/notifications/notifications.d.ts.map +1 -1
- package/dist/shell/components/notifications/notifications.js +2 -2
- package/dist/shell/components/notifications/notifications.js.map +1 -1
- package/dist/shell/components/toolbars/index.d.ts +1 -4
- package/dist/shell/components/toolbars/index.d.ts.map +1 -1
- package/dist/shell/components/toolbars/index.js +2 -5
- package/dist/shell/components/toolbars/index.js.map +1 -1
- package/dist/shell/components/toolbars/top-right-toolbar.d.ts +1 -1
- package/dist/shell/components/toolbars/top-right-toolbar.d.ts.map +1 -1
- package/dist/shell/components/toolbars/top-right-toolbar.js +2 -2
- package/dist/shell/components/toolbars/top-right-toolbar.js.map +1 -1
- package/dist/shell/components/toolbars/top-toolbar-feedback.js +1 -1
- package/dist/shell/components/toolbars/top-toolbar-feedback.js.map +1 -1
- package/dist/shell/shell.constants.d.ts +1 -1
- package/dist/shell/shell.constants.js +1 -1
- package/dist/shell/shell.interfaces.d.ts +8 -4
- package/dist/shell/shell.interfaces.d.ts.map +1 -1
- package/dist/shell/shell.utilities.d.ts +7 -0
- package/dist/shell/shell.utilities.d.ts.map +1 -1
- package/dist/shell/shell.utilities.js +17 -0
- package/dist/shell/shell.utilities.js.map +1 -1
- package/package.json +130 -12
- package/dist/chat/components/chat-assistant-legacy.d.ts +0 -9
- package/dist/chat/components/chat-assistant-legacy.d.ts.map +0 -1
- package/dist/chat/components/chat-assistant-legacy.js +0 -73
- 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":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EACL,2BAA2B,EAC3B,wBAAwB,GACzB,MAAM,6CAA6C,CAAC;AACrD,OAAO,EACL,yBAAyB,EACzB,6BAA6B,GAC9B,MAAM,0CAA0C,CAAC;AAalD,OAAO,EACL,wBAAwB,EACxB,yBAAyB,EACzB,oBAAoB,EACpB,uBAAuB,EACvB,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,2CAA2C,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,wCAAwC,CAAC;AAExE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAC;AAEvD,MAAM,OAAO,oBAAqB,SAAQ,cAAc;IAItD,YAAY,OAAyC,EAAE;;QACrD,KAAK,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,WAAW,EAAE,sBAAsB,EAAE,CAAC,CAAC;QACpE,yFAAyF;QACzF,IAAI,CAAC,EAAE;YACL,MAAA,IAAI,CAAC,QAAQ,mCACb,iBAAiB,CAAC,WAAW,CAC3B,MAAA,MAAA,IAAI,CAAC,MAAM,0CAAE,SAAS,mCAAI,MAAM,CAAC,aAAa,CAC/C,CAAC;QACJ,IAAI,CAAC,eAAe,GAAG,MAAA,MAAA,IAAI,CAAC,MAAM,0CAAE,eAAe,mCAAI,2BAA2B,CAAC;IACrF,CAAC;IAED,+EAA+E;IAC/E,oBAAoB;IACpB,+EAA+E;IAE/E;;;;;OAKG;IACH,KAAK,CAAC,kBAAkB,CACtB,MAAgC,EAChC,OAAuC;QAEvC,MAAM,SAAS,GAAG,wBAAwB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAEzD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,uBAAuB,EAAE;YACxC,MAAM,EAAE,SAAS,CAAC,MAAM;YACxB,IAAI,EAAE,SAAS,CAAC,IAAI;YACpB,OAAO,EAAE,SAAS,CAAC,OAAO;SAC3B,CAAC,CAAC;QAEH,mCAAmC;QACnC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,wBAAwB,CAClD,SAAS,CAAC,QAAQ,EAClB,SAAS,CAAC,MAAM,EAChB,SAAS,CAAC,QAAQ,EAClB,SAAS,CAAC,UAAU,EACpB,SAAS,CAAC,IAAI,EACd,OAAO,CACR,CAAC;QAEF,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,iDAAiD,EAAE;gBAClE,UAAU,EAAE,QAAQ,CAAC,EAAE;gBACvB,MAAM,EAAE,SAAS,CAAC,MAAM;gBACxB,QAAQ,EAAE,SAAS,CAAC,QAAQ;gBAC5B,IAAI,EAAE,SAAS,CAAC,IAAI;aACrB,CAAC,CAAC;YACH,OAAO,IAAI,CAAC,wBAAwB,CAAC,QAAQ,CAAC,CAAC;QACjD,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,yBAAyB,CAAC,SAAS,CAAC,CAAC;QAE7D,MAAM,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,UAAU,EAAE;YAChC,eAAe,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,eAAe;SAC1C,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE;YACvC,cAAc,EAAE,UAAU,CAAC,EAAE;YAC7B,MAAM,EAAE,SAAS,CAAC,MAAM;YACxB,IAAI,EAAE,SAAS,CAAC,IAAI;SACrB,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,wBAAwB,CAAC,UAAU,CAAC,CAAC;IACnD,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,uBAAuB,CAC3B,MAAkC,EAClC,OAAuC;QAEvC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,6BAA6B,EAAE;YAC9C,KAAK,EAAE,MAAM,CAAC,MAAM;SACrB,CAAC,CAAC;QAEH,4BAA4B;QAC5B,MAAM,eAAe,GAA+B,EAAE,CAAC;QACvD,MAAM,gBAAgB,GAA2D,EAAE,CAAC;QAEpF,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,IAAI,CAAC;gBACH,MAAM,SAAS,GAAG,wBAAwB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBACxD,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAClC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,gBAAgB,CAAC,IAAI,CAAC;oBACpB,MAAM,EAAE,KAAK,CAAC,MAAM;oBACpB,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;iBAChE,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,sCAAsC,EAAE;gBACvD,WAAW,EAAE,gBAAgB,CAAC,MAAM;gBACpC,MAAM,EAAE,gBAAgB;aACzB,CAAC,CAAC;QACL,CAAC;QAED,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;YACrD,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,2CAA2C;QAC3C,MAAM,kBAAkB,GAA+B,EAAE,CAAC;QAC1D,MAAM,qBAAqB,GAAmB,EAAE,CAAC;QACjD,IAAI,cAAc,GAAG,CAAC,CAAC;QAEvB,sEAAsE;QACtE,MAAM,eAAe,GAAG,MAAM,OAAO,CAAC,GAAG,CACvC,eAAe,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;YAClC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,wBAAwB,CAClD,KAAK,CAAC,QAAQ,EACd,KAAK,CAAC,MAAM,EACZ,KAAK,CAAC,QAAQ,EACd,KAAK,CAAC,UAAU,EAChB,KAAK,CAAC,IAAI,EACV,OAAO,CACR,CAAC;YACF,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;QAC7B,CAAC,CAAC,CACH,CAAC;QAEF,KAAK,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,eAAe,EAAE,CAAC;YAClD,IAAI,QAAQ,EAAE,CAAC;gBACb,cAAc,EAAE,CAAC;gBACjB,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,wBAAwB,CAAC,QAAQ,CAAC,CAAC,CAAC;YACtE,CAAC;iBAAM,CAAC;gBACN,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;QAED,IAAI,cAAc,GAAG,CAAC,EAAE,CAAC;YACvB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,sCAAsC,EAAE;gBACvD,cAAc;gBACd,cAAc,EAAE,kBAAkB,CAAC,MAAM;aAC1C,CAAC,CAAC;QACL,CAAC;QAED,IAAI,kBAAkB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAC;YACzE,OAAO,qBAAqB,CAAC;QAC/B,CAAC;QAED,kDAAkD;QAClD,MAAM,SAAS,GAA2B,kBAAkB,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACzE,IAAI,CAAC,yBAAyB,CAAC,KAAK,CAAC,CACtC,CAAC;QAEF,iCAAiC;QACjC,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,EAAE,KAAK,EAAE;gBACzC,eAAe,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,eAAe;aAC1C,CAAC,CAAC;YAEH,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,yCAAyC,EAAE;gBAC1D,SAAS,EAAE,MAAM,CAAC,MAAM;gBACxB,OAAO,EAAE,SAAS,CAAC,MAAM;gBACzB,iBAAiB,EAAE,cAAc;gBACjC,gBAAgB,EAAE,gBAAgB,CAAC,MAAM;aAC1C,CAAC,CAAC;YAEH,MAAM,oBAAoB,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,CAAC,CAAC;YACxF,OAAO,CAAC,GAAG,qBAAqB,EAAE,GAAG,oBAAoB,CAAC,CAAC;QAC7D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,uDAAuD;YACvD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,uDAAuD,EAAE;gBACxE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;aAChE,CAAC,CAAC;YAEH,MAAM,aAAa,GAAmB,CAAC,GAAG,qBAAqB,CAAC,CAAC;YACjE,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;gBACjC,IAAI,CAAC;oBACH,MAAM,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE;wBAC9B,eAAe,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,eAAe;qBAC1C,CAAC,CAAC;oBACH,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,wBAAwB,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAC9D,CAAC;gBAAC,OAAO,QAAQ,EAAE,CAAC;oBAClB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,2CAA2C,EAAE;wBAC5D,cAAc,EAAE,QAAQ,CAAC,EAAE;wBAC3B,KAAK,EAAE,QAAQ,YAAY,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;qBACtE,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAED,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,yCAAyC,EAAE;gBAC1D,SAAS,EAAE,MAAM,CAAC,MAAM;gBACxB,OAAO,EAAE,aAAa,CAAC,MAAM,GAAG,qBAAqB,CAAC,MAAM;gBAC5D,iBAAiB,EAAE,cAAc;aAClC,CAAC,CAAC;YAEH,OAAO,aAAa,CAAC;QACvB,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACK,yBAAyB,CAAC,SAAmC;QACnE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;QACjC,uDAAuD;QACvD,MAAM,cAAc,GAAG,GAAG,SAAS,IAAI,IAAI,EAAE,CAAC;QAE9C,MAAM,EAAE,GAAG,gBAAgB,CAAC,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;QACrE,MAAM,EAAE,GAAG,gBAAgB,CAAC,EAAE,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;QAE1D,yDAAyD;QACzD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,wBAAwB,CAAC;QAEpE,OAAO;YACL,EAAE,EAAE,EAAE;YACN,EAAE,EAAE,EAAE;YACN,EAAE,EAAE,cAAc;YAClB,QAAQ,EAAE,SAAS,CAAC,QAAQ;YAC5B,MAAM,EAAE,SAAS,CAAC,MAAM;YACxB,IAAI,EAAE,SAAS,CAAC,IAAI;YACpB,KAAK,EAAE,SAAS,CAAC,KAAK;YACtB,OAAO,EAAE,SAAS,CAAC,OAAO;YAC1B,IAAI,EAAE,KAAK;YACX,WAAW,EAAE,KAAK;YAClB,SAAS;YACT,SAAS,EAAE,SAAS;YACpB,WAAW,EAAE,SAAS,CAAC,OAAO;YAC9B,GAAG,EAAE,SAAS,CAAC,GAAG;YAClB,OAAO,EAAE,SAAS,CAAC,OAAO;YAC1B,SAAS,EAAE,SAAS,CAAC,SAAS;YAC9B,QAAQ,EAAE,SAAS,CAAC,QAAQ;YAC5B,UAAU,EAAE,SAAS,CAAC,UAAU;YAChC,QAAQ,EAAE,SAAS,CAAC,QAAQ;YAC5B,UAAU,EAAE,SAAS,CAAC,UAAU;YAChC,GAAG;SACJ,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACK,mBAAmB,CAAC,cAAsB;QAChD,iCAAiC;QACjC,iEAAiE;QACjE,MAAM,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QACjD,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACzC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;gBACtB,OAAO,EAAE,SAAS,EAAE,CAAC;YACvB,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,+EAA+E;IAC/E,kBAAkB;IAClB,+EAA+E;IAE/E;;OAEG;IACH,KAAK,CAAC,iBAAiB,CACrB,MAA+B,EAC/B,OAAuC;;QAEvC,MAAM,SAAS,GAAG,uBAAuB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAExD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,uBAAuB,EAAE;YACxC,QAAQ,EAAE,SAAS,CAAC,QAAQ;YAC5B,MAAM,EAAE,SAAS,CAAC,MAAM;YACxB,KAAK,EAAE,SAAS,CAAC,KAAK;YACtB,UAAU,EAAE,SAAS,CAAC,UAAU;SACjC,CAAC,CAAC;QAEH,MAAM,EAAE,GAAG,gBAAgB,CAAC,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;QACrE,MAAM,KAAK,GAAG,MAAA,SAAS,CAAC,KAAK,mCAAI,IAAI,CAAC,eAAe,CAAC;QAEtD,0BAA0B;QAC1B,MAAM,iBAAiB,GAAa,EAAE,CAAC;QACvC,MAAM,yBAAyB,GAA4B,EAAE,CAAC;QAE9D,gDAAgD;QAChD,IAAI,CAAC,SAAS,CAAC,gBAAgB,EAAE,CAAC;YAChC,iBAAiB,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;YACrD,yBAAyB,CAAC,cAAc,CAAC,GAAG,KAAK,CAAC;QACpD,CAAC;QAED,sCAAsC;QACtC,IAAI,SAAS,CAAC,UAAU,EAAE,CAAC;YACzB,iBAAiB,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YACxC,yBAAyB,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC;QAC7C,CAAC;QAED,MAAM,WAAW,GAA6C;YAC5D,sBAAsB,EAAE,yCAAyC;YACjE,yBAAyB,kBACvB,KAAK,EAAE,EAAE,EACT,WAAW,EAAE,gBAAgB,CAAC,QAAQ,EAAE,IACrC,yBAAyB,CAC7B;YACD,gBAAgB,EAAE,KAAK,EAAE,kCAAkC;YAC3D,KAAK,EAAE,KAAK;SACb,CAAC;QAEF,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACjC,WAAW,CAAC,gBAAgB,GAAG,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACjE,CAAC;QAED,IAAI,SAAS,CAAC,UAAU,EAAE,CAAC;YACzB,WAAW,CAAC,wBAAwB,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QAC7D,CAAC;QAED,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC;YACrB,IAAI,CAAC;gBACH,WAAW,CAAC,iBAAiB,GAAG,IAAI,CAAC,KAAK,CACxC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAC1D,CAAC;YACJ,CAAC;YAAC,WAAM,CAAC;gBACP,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,2BAA2B,EAAE,EAAE,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;gBAC5E,mDAAmD;YACrD,CAAC;QACH,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,EAAE;YACnD,eAAe,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,eAAe;SAC1C,CAAC,CAAC;QAEH,MAAM,aAAa,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC,CAAC;QAE9F,IAAI,UAA8B,CAAC;QACnC,IAAI,MAAM,CAAC,gBAAgB,EAAE,CAAC;YAC5B,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACvF,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE;YACvC,MAAM,EAAE,SAAS,CAAC,MAAM;YACxB,KAAK,EAAE,aAAa,CAAC,MAAM;YAC3B,OAAO,EAAE,CAAC,CAAC,UAAU;SACtB,CAAC,CAAC;QAEH,OAAO;YACL,aAAa;YACb,UAAU;SACX,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc,CAClB,MAA4B,EAC5B,OAAuC;;QAEvC,MAAM,SAAS,GAAG,oBAAoB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAErD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE;YACvC,QAAQ,EAAE,SAAS,CAAC,QAAQ;YAC5B,MAAM,EAAE,SAAS,CAAC,MAAM;SACzB,CAAC,CAAC;QAEH,MAAM,EAAE,GAAG,gBAAgB,CAAC,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;QAErE,iDAAiD;QACjD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,UAAU,CACrC;YACE,sBAAsB,EAAE,yCAAyC;YACjE,gBAAgB,EAAE,8CAA8C;YAChE,wBAAwB,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE;YAC7C,yBAAyB,EAAE;gBACzB,KAAK,EAAE,EAAE;gBACT,WAAW,EAAE,gBAAgB,CAAC,QAAQ,EAAE;gBACxC,OAAO,EAAE,KAAK;gBACd,cAAc,EAAE,KAAK;aACtB;YACD,MAAM,EAAE,OAAO;SAChB,EACD;YACE,eAAe,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,eAAe;SAC1C,CACF,CAAC;QAEF,MAAM,KAAK,GAAG,MAAA,MAAM,CAAC,KAAK,mCAAI,CAAC,CAAC;QAEhC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAkB,EAAE;YACnC,MAAM,EAAE,SAAS,CAAC,MAAM;YACxB,KAAK;SACN,CAAC,CAAC;QAEH,OAAO,KAAK,CAAC;IACf,CAAC;IAED,+EAA+E;IAC/E,oBAAoB;IACpB,+EAA+E;IAE/E;;OAEG;IACH,KAAK,CAAC,UAAU,CACd,MAAwB,EACxB,OAAuC;QAEvC,MAAM,SAAS,GAAG,gBAAgB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAEjD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,8BAA8B,EAAE;YAC/C,QAAQ,EAAE,SAAS,CAAC,QAAQ;YAC5B,MAAM,EAAE,SAAS,CAAC,MAAM;YACxB,cAAc,EAAE,SAAS,CAAC,cAAc;SACzC,CAAC,CAAC;QAEH,wBAAwB;QACxB,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAClD,SAAS,CAAC,QAAQ,EAClB,SAAS,CAAC,MAAM,EAChB,SAAS,CAAC,cAAc,EACxB,OAAO,CACR,CAAC;QAEF,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,MAAM,IAAI,yBAAyB,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QAChE,CAAC;QAED,mBAAmB;QACnB,IAAI,YAAY,CAAC,MAAM,KAAK,SAAS,CAAC,MAAM,IAAI,YAAY,CAAC,QAAQ,KAAK,SAAS,CAAC,QAAQ,EAAE,CAAC;YAC7F,MAAM,IAAI,6BAA6B,CAAC,cAAc,CAAC,CAAC;QAC1D,CAAC;QAED,kDAAkD;QAClD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,yBAAyB,EAAE,GAAG,IAAI,CAAC,EAAE;aACtF,mBAAmB,EAAE;aACrB,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC;aACjB,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC;aACrB,KAAK,EAAE,CAAC;QAEX,MAAM,IAAI,CAAC,EAAE,CAAC,UAAU,CACtB,EAAE,EAAE,EAAE,YAAY,CAAC,EAAE,EAAE,EAAE,EAAE,YAAY,CAAC,EAAE,EAAE,EAC5C,gBAAgB,EAChB,wBAAwB,EACxB,yBAAyB,EACzB,EAAE,eAAe,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,eAAe,EAAE,CAC9C,CAAC;QAEF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,6BAA6B,EAAE;YAC9C,cAAc,EAAE,SAAS,CAAC,cAAc;YACxC,MAAM,EAAE,SAAS,CAAC,MAAM;SACzB,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,wBAAwB,iCAAM,YAAY,KAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,IAAG,CAAC;IACxF,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa,CACjB,MAA2B,EAC3B,OAAuC;QAEvC,MAAM,SAAS,GAAG,mBAAmB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAEpD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,mCAAmC,EAAE;YACpD,QAAQ,EAAE,SAAS,CAAC,QAAQ;YAC5B,MAAM,EAAE,SAAS,CAAC,MAAM;SACzB,CAAC,CAAC;QAEH,MAAM,EAAE,GAAG,gBAAgB,CAAC,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;QAErE,iCAAiC;QACjC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,UAAU,CACrC;YACE,sBAAsB,EAAE,yCAAyC;YACjE,gBAAgB,EAAE,8CAA8C;YAChE,wBAAwB,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE;YAC7C,yBAAyB,EAAE;gBACzB,KAAK,EAAE,EAAE;gBACT,WAAW,EAAE,gBAAgB,CAAC,QAAQ,EAAE;gBACxC,OAAO,EAAE,KAAK;gBACd,cAAc,EAAE,KAAK;aACtB;SACF,EACD;YACE,eAAe,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,eAAe;SAC1C,CACF,CAAC;QAEF,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;QAEjC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,yCAAyC,EAAE;gBAC1D,MAAM,EAAE,SAAS,CAAC,MAAM;aACzB,CAAC,CAAC;YACH,OAAO,CAAC,CAAC;QACX,CAAC;QAED,qDAAqD;QACrD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,yBAAyB,EAAE,GAAG,IAAI,CAAC,EAAE;aACtF,mBAAmB,EAAE;aACrB,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC;aACjB,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC;aACrB,KAAK,EAAE,CAAC;QAEX,sDAAsD;QACtD,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,GAAG,CACrC,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;YACvB,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,EAAE,CAAC,UAAU,CACtB,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,EAC5B,gBAAgB,EAChB,wBAAwB,EACxB,yBAAyB,EACzB,EAAE,eAAe,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,eAAe,EAAE,CAC9C,CAAC;gBACF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;YACxC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,qCAAqC,EAAE;oBACtD,cAAc,EAAE,IAAI,CAAC,EAAE;oBACvB,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;iBAChE,CAAC,CAAC;gBACH,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;YACzC,CAAC;QACH,CAAC,CAAC,CACH,CAAC;QAEF,MAAM,YAAY,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;QAEnE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,kCAAkC,EAAE;YACnD,MAAM,EAAE,SAAS,CAAC,MAAM;YACxB,YAAY;YACZ,UAAU,EAAE,KAAK,CAAC,MAAM;SACzB,CAAC,CAAC;QAEH,OAAO,YAAY,CAAC;IACtB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,mBAAmB,CACvB,MAAiC,EACjC,OAAuC;QAEvC,MAAM,SAAS,GAAG,yBAAyB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAE1D,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,yBAAyB,EAAE;YAC1C,MAAM,EAAE,SAAS,CAAC,MAAM;YACxB,cAAc,EAAE,SAAS,CAAC,cAAc;SACzC,CAAC,CAAC;QAEH,wBAAwB;QACxB,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAClD,SAAS,CAAC,QAAQ,EAClB,SAAS,CAAC,MAAM,EAChB,SAAS,CAAC,cAAc,EACxB,OAAO,CACR,CAAC;QAEF,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,MAAM,IAAI,yBAAyB,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QAChE,CAAC;QAED,mBAAmB;QACnB,IAAI,YAAY,CAAC,MAAM,KAAK,SAAS,CAAC,MAAM,IAAI,YAAY,CAAC,QAAQ,KAAK,SAAS,CAAC,QAAQ,EAAE,CAAC;YAC7F,MAAM,IAAI,6BAA6B,CAAC,SAAS,CAAC,CAAC;QACrD,CAAC;QAED,kDAAkD;QAClD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,yBAAyB,EAAE,GAAG,IAAI,CAAC,EAAE;aACtF,mBAAmB,EAAE;aACrB,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC;aACxB,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC;aACrB,KAAK,EAAE,CAAC;QAEX,MAAM,IAAI,CAAC,EAAE,CAAC,UAAU,CACtB,EAAE,EAAE,EAAE,YAAY,CAAC,EAAE,EAAE,EAAE,EAAE,YAAY,CAAC,EAAE,EAAE,EAC5C,gBAAgB,EAChB,wBAAwB,EACxB,yBAAyB,EACzB,EAAE,eAAe,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,eAAe,EAAE,CAC9C,CAAC;QAEF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,wBAAwB,EAAE;YACzC,cAAc,EAAE,SAAS,CAAC,cAAc;YACxC,MAAM,EAAE,SAAS,CAAC,MAAM;SACzB,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,wBAAwB,iCAAM,YAAY,KAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,IAAG,CAAC;IAC/F,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,uBAAuB,CAC3B,MAA2B,EAAE,6CAA6C;IAC1E,OAAuC;QAEvC,MAAM,SAAS,GAAG,mBAAmB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAEpD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,8BAA8B,EAAE;YAC/C,QAAQ,EAAE,SAAS,CAAC,QAAQ;YAC5B,MAAM,EAAE,SAAS,CAAC,MAAM;SACzB,CAAC,CAAC;QAEH,MAAM,EAAE,GAAG,gBAAgB,CAAC,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;QAErE,wCAAwC;QACxC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,UAAU,CACrC;YACE,sBAAsB,EAAE,yCAAyC;YACjE,gBAAgB,EAAE,4BAA4B;YAC9C,yBAAyB,EAAE;gBACzB,KAAK,EAAE,EAAE;gBACT,WAAW,EAAE,gBAAgB,CAAC,QAAQ,EAAE;gBACxC,cAAc,EAAE,KAAK;aACtB;SACF,EACD;YACE,eAAe,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,eAAe;SAC1C,CACF,CAAC;QAEF,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;QAEjC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,6BAA6B,EAAE;gBAC9C,MAAM,EAAE,SAAS,CAAC,MAAM;aACzB,CAAC,CAAC;YACH,OAAO,CAAC,CAAC;QACX,CAAC;QAED,qDAAqD;QACrD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,yBAAyB,EAAE,GAAG,IAAI,CAAC,EAAE;aACtF,mBAAmB,EAAE;aACrB,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC;aACxB,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC;aACrB,KAAK,EAAE,CAAC;QAEX,sDAAsD;QACtD,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,GAAG,CACrC,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;YACvB,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,EAAE,CAAC,UAAU,CACtB,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,EAC5B,gBAAgB,EAChB,wBAAwB,EACxB,yBAAyB,EACzB,EAAE,eAAe,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,eAAe,EAAE,CAC9C,CAAC;gBACF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;YACxC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,gCAAgC,EAAE;oBACjD,cAAc,EAAE,IAAI,CAAC,EAAE;oBACvB,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;iBAChE,CAAC,CAAC;gBACH,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;YACzC,CAAC;QACH,CAAC,CAAC,CACH,CAAC;QAEF,MAAM,cAAc,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;QAErE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,6BAA6B,EAAE;YAC9C,MAAM,EAAE,SAAS,CAAC,MAAM;YACxB,cAAc;YACd,UAAU,EAAE,KAAK,CAAC,MAAM;SACzB,CAAC,CAAC;QAEH,OAAO,cAAc,CAAC;IACxB,CAAC;IAED,+EAA+E;IAC/E,kBAAkB;IAClB,+EAA+E;IAE/E;;;;;;;OAOG;IACK,KAAK,CAAC,wBAAwB,CACpC,QAAgB,EAChB,MAAc,EACd,QAAgB,EAChB,UAAkB,EAClB,IAAY,EACZ,OAAuC;;QAEvC,MAAM,EAAE,GAAG,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAEjD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,UAAU,CACrC;YACE,sBAAsB,EAAE,yCAAyC;YACjE,gBAAgB,EACd,oGAAoG;YACtG,wBAAwB,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE;YAC7C,yBAAyB,EAAE;gBACzB,KAAK,EAAE,EAAE;gBACT,WAAW,EAAE,gBAAgB,CAAC,QAAQ,EAAE;gBACxC,WAAW,EAAE,QAAQ;gBACrB,aAAa,EAAE,UAAU;gBACzB,OAAO,EAAE,IAAI;gBACb,cAAc,EAAE,KAAK;aACtB;YACD,KAAK,EAAE,CAAC;SACT,EACD;YACE,eAAe,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,eAAe;SAC1C,CACF,CAAC;QAEF,OAAO,MAAA,MAAA,MAAM,CAAC,KAAK,0CAAG,CAAC,CAAC,mCAAI,IAAI,CAAC;IACnC,CAAC;IAED;;;;;OAKG;IACK,KAAK,CAAC,oBAAoB,CAChC,QAAgB,EAChB,MAAc,EACd,cAAsB,EACtB,OAAuC;;QAEvC,MAAM,EAAE,GAAG,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAEjD,kEAAkE;QAClE,MAAM,MAAM,GAAG,IAAI,CAAC,mBAAmB,CAAC,cAAc,CAAC,CAAC;QAExD,IAAI,MAAM,EAAE,CAAC;YACX,wDAAwD;YACxD,MAAM,EAAE,GAAG,gBAAgB,CAAC,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;YAEjE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,OAAO,CAClC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAClB;gBACE,eAAe,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,eAAe;aAC1C,CACF,CAAC;YAEF,mEAAmE;YACnE,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,cAAc,EAAE,CAAC;gBACrD,OAAO,MAAM,CAAC,IAAI,CAAC;YACrB,CAAC;YAED,sEAAsE;QACxE,CAAC;QAED,2EAA2E;QAC3E,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,8CAA8C,EAAE;YAChE,cAAc;YACd,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,eAAe;SAC1D,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,UAAU,CACrC;YACE,sBAAsB,EAAE,yCAAyC;YACjE,gBAAgB,EAAE,UAAU;YAC5B,yBAAyB,EAAE;gBACzB,KAAK,EAAE,EAAE;gBACT,WAAW,EAAE,gBAAgB,CAAC,QAAQ,EAAE;gBACxC,KAAK,EAAE,cAAc;aACtB;SACF,EACD;YACE,eAAe,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,eAAe;SAC1C,CACF,CAAC;QAEF,OAAO,MAAA,MAAA,MAAM,CAAC,KAAK,0CAAG,CAAC,CAAC,mCAAI,IAAI,CAAC;IACnC,CAAC;IAED;;OAEG;IACK,wBAAwB,CAAC,IAA0B;QACzD,OAAO;YACL,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,GAAG,EAAE,IAAI,CAAC,GAAG;SACd,CAAC;IACJ,CAAC;CACF"}
|