@pipeline-builder/pipeline-data 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/README.md +34 -0
- package/drizzle.config.ts +17 -0
- package/lib/api/access-control-builder.d.ts +109 -0
- package/lib/api/access-control-builder.js +181 -0
- package/lib/api/crud-service.d.ts +170 -0
- package/lib/api/crud-service.js +387 -0
- package/lib/api/query-builders.d.ts +74 -0
- package/lib/api/query-builders.js +336 -0
- package/lib/api/reporting-service.d.ts +131 -0
- package/lib/api/reporting-service.js +248 -0
- package/lib/core/query-filters.d.ts +235 -0
- package/lib/core/query-filters.js +23 -0
- package/lib/database/drizzle-schema.d.ts +10043 -0
- package/lib/database/drizzle-schema.js +715 -0
- package/lib/database/index.d.ts +3 -0
- package/lib/database/index.js +22 -0
- package/lib/database/postgres-connection.d.ts +232 -0
- package/lib/database/postgres-connection.js +456 -0
- package/lib/database/retry-strategy.d.ts +68 -0
- package/lib/database/retry-strategy.js +126 -0
- package/lib/index.d.ts +30 -0
- package/lib/index.js +52 -0
- package/package.json +125 -0
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { SQL } from 'drizzle-orm';
|
|
2
|
+
import { MessageFilter, PipelineFilter, PluginFilter, CompliancePolicyFilter, ComplianceRuleFilter, ComplianceExemptionFilter, ComplianceAuditFilter, ComplianceScanFilter, ComplianceRuleSubscriptionFilter } from '../core/query-filters';
|
|
3
|
+
/**
|
|
4
|
+
* Build SQL conditions for pipeline queries
|
|
5
|
+
*
|
|
6
|
+
* Access control behavior:
|
|
7
|
+
* - No orgId: system org public only
|
|
8
|
+
* - accessModifier='private': Own org private only
|
|
9
|
+
* - accessModifier='public': Own org public only
|
|
10
|
+
* - No accessModifier (default): Own org public + system org public
|
|
11
|
+
*
|
|
12
|
+
* @param filter - Pipeline filter criteria
|
|
13
|
+
* @param orgId - User's organization ID (optional — anonymous gets system public only)
|
|
14
|
+
* @returns Array of SQL conditions
|
|
15
|
+
*/
|
|
16
|
+
export declare function buildPipelineConditions(filter: Partial<PipelineFilter>, orgId?: string): SQL[];
|
|
17
|
+
/**
|
|
18
|
+
* Build SQL conditions for plugin queries
|
|
19
|
+
*
|
|
20
|
+
* Access control behavior:
|
|
21
|
+
* - No orgId: system org public only
|
|
22
|
+
* - accessModifier='private': Own org private only
|
|
23
|
+
* - accessModifier='public': Own org public only
|
|
24
|
+
* - No accessModifier (default): Own org public + system org public
|
|
25
|
+
*
|
|
26
|
+
* @param filter - Plugin filter criteria
|
|
27
|
+
* @param orgId - User's organization ID (optional — anonymous gets system public only)
|
|
28
|
+
* @returns Array of SQL conditions
|
|
29
|
+
*/
|
|
30
|
+
export declare function buildPluginConditions(filter: Partial<PluginFilter>, orgId?: string): SQL[];
|
|
31
|
+
/**
|
|
32
|
+
* Build SQL conditions for message queries.
|
|
33
|
+
*
|
|
34
|
+
* Custom access control for messages:
|
|
35
|
+
* - Messages are visible to the sender org (orgId) OR the recipient org (recipientOrgId)
|
|
36
|
+
* - Broadcast announcements (recipientOrgId = '*') are visible to all orgs
|
|
37
|
+
* - System org can see all messages
|
|
38
|
+
*
|
|
39
|
+
* @param filter - Message filter criteria
|
|
40
|
+
* @param orgId - User's organization ID
|
|
41
|
+
* @returns Array of SQL conditions
|
|
42
|
+
*/
|
|
43
|
+
export declare function buildMessageConditions(filter: Partial<MessageFilter>, orgId: string): SQL[];
|
|
44
|
+
/**
|
|
45
|
+
* Build SQL conditions for compliance policy queries.
|
|
46
|
+
* Org-scoped: always filters by orgId.
|
|
47
|
+
*/
|
|
48
|
+
export declare function buildCompliancePolicyConditions(filter: Partial<CompliancePolicyFilter>, orgId?: string): SQL[];
|
|
49
|
+
/**
|
|
50
|
+
* Build SQL conditions for compliance rule queries.
|
|
51
|
+
* Returns only the requesting org's own rules (org-scoped).
|
|
52
|
+
*/
|
|
53
|
+
export declare function buildComplianceRuleConditions(filter: Partial<ComplianceRuleFilter>, orgId?: string): SQL[];
|
|
54
|
+
/**
|
|
55
|
+
* Build SQL conditions for browsing the published rules catalog.
|
|
56
|
+
* Only returns system-org published rules.
|
|
57
|
+
*/
|
|
58
|
+
export declare function buildPublishedRuleCatalogConditions(filter: Partial<ComplianceRuleFilter>): SQL[];
|
|
59
|
+
/**
|
|
60
|
+
* Build SQL conditions for compliance rule subscription queries.
|
|
61
|
+
*/
|
|
62
|
+
export declare function buildComplianceRuleSubscriptionConditions(filter: Partial<ComplianceRuleSubscriptionFilter>, orgId?: string): SQL[];
|
|
63
|
+
/**
|
|
64
|
+
* Build SQL conditions for compliance exemption queries.
|
|
65
|
+
*/
|
|
66
|
+
export declare function buildComplianceExemptionConditions(filter: Partial<ComplianceExemptionFilter>, orgId?: string): SQL[];
|
|
67
|
+
/**
|
|
68
|
+
* Build SQL conditions for compliance audit log queries.
|
|
69
|
+
*/
|
|
70
|
+
export declare function buildComplianceAuditConditions(filter: Partial<ComplianceAuditFilter>, orgId?: string): SQL[];
|
|
71
|
+
/**
|
|
72
|
+
* Build SQL conditions for compliance scan queries.
|
|
73
|
+
*/
|
|
74
|
+
export declare function buildComplianceScanConditions(filter: Partial<ComplianceScanFilter>, orgId?: string): SQL[];
|
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Copyright 2026 Pipeline Builder Contributors
|
|
3
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
exports.buildPipelineConditions = buildPipelineConditions;
|
|
6
|
+
exports.buildPluginConditions = buildPluginConditions;
|
|
7
|
+
exports.buildMessageConditions = buildMessageConditions;
|
|
8
|
+
exports.buildCompliancePolicyConditions = buildCompliancePolicyConditions;
|
|
9
|
+
exports.buildComplianceRuleConditions = buildComplianceRuleConditions;
|
|
10
|
+
exports.buildPublishedRuleCatalogConditions = buildPublishedRuleCatalogConditions;
|
|
11
|
+
exports.buildComplianceRuleSubscriptionConditions = buildComplianceRuleSubscriptionConditions;
|
|
12
|
+
exports.buildComplianceExemptionConditions = buildComplianceExemptionConditions;
|
|
13
|
+
exports.buildComplianceAuditConditions = buildComplianceAuditConditions;
|
|
14
|
+
exports.buildComplianceScanConditions = buildComplianceScanConditions;
|
|
15
|
+
const api_core_1 = require("@pipeline-builder/api-core");
|
|
16
|
+
const drizzle_orm_1 = require("drizzle-orm");
|
|
17
|
+
const access_control_builder_1 = require("./access-control-builder");
|
|
18
|
+
const drizzle_schema_1 = require("../database/drizzle-schema");
|
|
19
|
+
// Query builder instances
|
|
20
|
+
const pipelineBuilder = new access_control_builder_1.AccessControlQueryBuilder(drizzle_schema_1.schema.pipeline);
|
|
21
|
+
const pluginBuilder = new access_control_builder_1.AccessControlQueryBuilder(drizzle_schema_1.schema.plugin);
|
|
22
|
+
/**
|
|
23
|
+
* Build SQL conditions for pipeline queries
|
|
24
|
+
*
|
|
25
|
+
* Access control behavior:
|
|
26
|
+
* - No orgId: system org public only
|
|
27
|
+
* - accessModifier='private': Own org private only
|
|
28
|
+
* - accessModifier='public': Own org public only
|
|
29
|
+
* - No accessModifier (default): Own org public + system org public
|
|
30
|
+
*
|
|
31
|
+
* @param filter - Pipeline filter criteria
|
|
32
|
+
* @param orgId - User's organization ID (optional — anonymous gets system public only)
|
|
33
|
+
* @returns Array of SQL conditions
|
|
34
|
+
*/
|
|
35
|
+
function buildPipelineConditions(filter, orgId) {
|
|
36
|
+
// Use generic builder for common conditions (access control, ID, booleans, accessModifier)
|
|
37
|
+
const conditions = pipelineBuilder.buildCommonConditions(filter, orgId);
|
|
38
|
+
// Add pipeline-specific filters
|
|
39
|
+
if (filter.project !== undefined) {
|
|
40
|
+
conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.pipeline.project, (0, access_control_builder_1.normalizeStringFilter)(filter.project)));
|
|
41
|
+
}
|
|
42
|
+
if (filter.organization !== undefined) {
|
|
43
|
+
conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.pipeline.organization, (0, access_control_builder_1.normalizeStringFilter)(filter.organization)));
|
|
44
|
+
}
|
|
45
|
+
if (filter.keyword !== undefined) {
|
|
46
|
+
conditions.push((0, access_control_builder_1.buildJsonbKeywordCondition)(drizzle_schema_1.schema.pipeline.keywords, (0, access_control_builder_1.normalizeStringFilter)(filter.keyword)));
|
|
47
|
+
}
|
|
48
|
+
return conditions;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Build SQL conditions for plugin queries
|
|
52
|
+
*
|
|
53
|
+
* Access control behavior:
|
|
54
|
+
* - No orgId: system org public only
|
|
55
|
+
* - accessModifier='private': Own org private only
|
|
56
|
+
* - accessModifier='public': Own org public only
|
|
57
|
+
* - No accessModifier (default): Own org public + system org public
|
|
58
|
+
*
|
|
59
|
+
* @param filter - Plugin filter criteria
|
|
60
|
+
* @param orgId - User's organization ID (optional — anonymous gets system public only)
|
|
61
|
+
* @returns Array of SQL conditions
|
|
62
|
+
*/
|
|
63
|
+
function buildPluginConditions(filter, orgId) {
|
|
64
|
+
// Use generic builder for common conditions (access control, ID, booleans, accessModifier)
|
|
65
|
+
const conditions = pluginBuilder.buildCommonConditions(filter, orgId);
|
|
66
|
+
// Add plugin-specific filters
|
|
67
|
+
if (filter.orgId !== undefined) {
|
|
68
|
+
conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.plugin.orgId, (0, access_control_builder_1.normalizeStringFilter)(filter.orgId)));
|
|
69
|
+
}
|
|
70
|
+
if (filter.name !== undefined) {
|
|
71
|
+
conditions.push((0, drizzle_orm_1.ilike)(drizzle_schema_1.schema.plugin.name, `%${(0, access_control_builder_1.escapeLikeWildcards)((0, access_control_builder_1.normalizeStringFilter)(filter.name))}%`));
|
|
72
|
+
}
|
|
73
|
+
if (filter.version !== undefined) {
|
|
74
|
+
conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.plugin.version, filter.version));
|
|
75
|
+
}
|
|
76
|
+
if (filter.imageTag !== undefined) {
|
|
77
|
+
conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.plugin.imageTag, filter.imageTag));
|
|
78
|
+
}
|
|
79
|
+
if (filter.keyword !== undefined) {
|
|
80
|
+
conditions.push((0, access_control_builder_1.buildJsonbKeywordCondition)(drizzle_schema_1.schema.plugin.keywords, (0, access_control_builder_1.normalizeStringFilter)(filter.keyword)));
|
|
81
|
+
}
|
|
82
|
+
if (filter.category !== undefined) {
|
|
83
|
+
conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.plugin.category, filter.category));
|
|
84
|
+
}
|
|
85
|
+
return conditions;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Build SQL conditions for message queries.
|
|
89
|
+
*
|
|
90
|
+
* Custom access control for messages:
|
|
91
|
+
* - Messages are visible to the sender org (orgId) OR the recipient org (recipientOrgId)
|
|
92
|
+
* - Broadcast announcements (recipientOrgId = '*') are visible to all orgs
|
|
93
|
+
* - System org can see all messages
|
|
94
|
+
*
|
|
95
|
+
* @param filter - Message filter criteria
|
|
96
|
+
* @param orgId - User's organization ID
|
|
97
|
+
* @returns Array of SQL conditions
|
|
98
|
+
*/
|
|
99
|
+
function buildMessageConditions(filter, orgId) {
|
|
100
|
+
const conditions = [];
|
|
101
|
+
const normalizedOrgId = orgId.toLowerCase();
|
|
102
|
+
// Custom access control: sender OR recipient OR broadcast
|
|
103
|
+
if (normalizedOrgId === api_core_1.SYSTEM_ORG_ID) {
|
|
104
|
+
// System org can see all messages
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
conditions.push((0, drizzle_orm_1.or)((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.message.orgId, normalizedOrgId), (0, drizzle_orm_1.eq)(drizzle_schema_1.schema.message.recipientOrgId, normalizedOrgId), (0, drizzle_orm_1.eq)(drizzle_schema_1.schema.message.recipientOrgId, '*')));
|
|
108
|
+
}
|
|
109
|
+
// Active filter (default to active only)
|
|
110
|
+
if (filter.isActive !== undefined) {
|
|
111
|
+
conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.message.isActive, (0, access_control_builder_1.parseBooleanFilter)(filter.isActive)));
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.message.isActive, true));
|
|
115
|
+
}
|
|
116
|
+
// Thread filter (null = root messages only via IS NULL)
|
|
117
|
+
if (filter.threadId !== undefined) {
|
|
118
|
+
if (filter.threadId === null) {
|
|
119
|
+
conditions.push((0, drizzle_orm_1.isNull)(drizzle_schema_1.schema.message.threadId));
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.message.threadId, filter.threadId));
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
// Recipient org filter
|
|
126
|
+
if (filter.recipientOrgId !== undefined) {
|
|
127
|
+
conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.message.recipientOrgId, (0, access_control_builder_1.normalizeStringFilter)(filter.recipientOrgId)));
|
|
128
|
+
}
|
|
129
|
+
// Message type filter
|
|
130
|
+
if (filter.messageType !== undefined) {
|
|
131
|
+
conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.message.messageType, filter.messageType));
|
|
132
|
+
}
|
|
133
|
+
// Read status filter
|
|
134
|
+
if (filter.isRead !== undefined) {
|
|
135
|
+
conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.message.isRead, (0, access_control_builder_1.parseBooleanFilter)(filter.isRead)));
|
|
136
|
+
}
|
|
137
|
+
// Priority filter
|
|
138
|
+
if (filter.priority !== undefined) {
|
|
139
|
+
conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.message.priority, filter.priority));
|
|
140
|
+
}
|
|
141
|
+
// ID filter
|
|
142
|
+
if (filter.id !== undefined) {
|
|
143
|
+
const id = typeof filter.id === 'string' ? filter.id : filter.id[0];
|
|
144
|
+
conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.message.id, id));
|
|
145
|
+
}
|
|
146
|
+
return conditions;
|
|
147
|
+
}
|
|
148
|
+
// ========================================
|
|
149
|
+
// Compliance Query Builders
|
|
150
|
+
// ========================================
|
|
151
|
+
/**
|
|
152
|
+
* Build SQL conditions for compliance policy queries.
|
|
153
|
+
* Org-scoped: always filters by orgId.
|
|
154
|
+
*/
|
|
155
|
+
function buildCompliancePolicyConditions(filter, orgId) {
|
|
156
|
+
const conditions = [];
|
|
157
|
+
if (orgId) {
|
|
158
|
+
conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.compliancePolicy.orgId, orgId));
|
|
159
|
+
}
|
|
160
|
+
if (filter.id !== undefined) {
|
|
161
|
+
const id = typeof filter.id === 'string' ? filter.id : filter.id[0];
|
|
162
|
+
conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.compliancePolicy.id, id));
|
|
163
|
+
}
|
|
164
|
+
if (filter.name !== undefined) {
|
|
165
|
+
conditions.push((0, drizzle_orm_1.ilike)(drizzle_schema_1.schema.compliancePolicy.name, `%${(0, access_control_builder_1.escapeLikeWildcards)((0, access_control_builder_1.normalizeStringFilter)(filter.name))}%`));
|
|
166
|
+
}
|
|
167
|
+
if (filter.isTemplate !== undefined) {
|
|
168
|
+
conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.compliancePolicy.isTemplate, (0, access_control_builder_1.parseBooleanFilter)(filter.isTemplate)));
|
|
169
|
+
}
|
|
170
|
+
if (filter.isActive !== undefined) {
|
|
171
|
+
conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.compliancePolicy.isActive, (0, access_control_builder_1.parseBooleanFilter)(filter.isActive)));
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.compliancePolicy.isActive, true));
|
|
175
|
+
}
|
|
176
|
+
return conditions;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Build SQL conditions for compliance rule queries.
|
|
180
|
+
* Returns only the requesting org's own rules (org-scoped).
|
|
181
|
+
*/
|
|
182
|
+
function buildComplianceRuleConditions(filter, orgId) {
|
|
183
|
+
const conditions = [];
|
|
184
|
+
if (orgId) {
|
|
185
|
+
conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.complianceRule.orgId, orgId));
|
|
186
|
+
}
|
|
187
|
+
if (filter.id !== undefined) {
|
|
188
|
+
const id = typeof filter.id === 'string' ? filter.id : filter.id[0];
|
|
189
|
+
conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.complianceRule.id, id));
|
|
190
|
+
}
|
|
191
|
+
if (filter.name !== undefined) {
|
|
192
|
+
conditions.push((0, drizzle_orm_1.ilike)(drizzle_schema_1.schema.complianceRule.name, `%${(0, access_control_builder_1.escapeLikeWildcards)((0, access_control_builder_1.normalizeStringFilter)(filter.name))}%`));
|
|
193
|
+
}
|
|
194
|
+
if (filter.policyId !== undefined) {
|
|
195
|
+
conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.complianceRule.policyId, filter.policyId));
|
|
196
|
+
}
|
|
197
|
+
if (filter.target !== undefined) {
|
|
198
|
+
conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.complianceRule.target, filter.target));
|
|
199
|
+
}
|
|
200
|
+
if (filter.severity !== undefined) {
|
|
201
|
+
conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.complianceRule.severity, filter.severity));
|
|
202
|
+
}
|
|
203
|
+
if (filter.scope !== undefined) {
|
|
204
|
+
conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.complianceRule.scope, filter.scope));
|
|
205
|
+
}
|
|
206
|
+
if (filter.tag !== undefined) {
|
|
207
|
+
conditions.push((0, access_control_builder_1.buildJsonbKeywordCondition)(drizzle_schema_1.schema.complianceRule.tags, (0, access_control_builder_1.normalizeStringFilter)(filter.tag)));
|
|
208
|
+
}
|
|
209
|
+
if (filter.isActive !== undefined) {
|
|
210
|
+
conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.complianceRule.isActive, (0, access_control_builder_1.parseBooleanFilter)(filter.isActive)));
|
|
211
|
+
}
|
|
212
|
+
else if (filter.id === undefined) {
|
|
213
|
+
// Only default to active=true for list queries, not single-entity lookups by ID
|
|
214
|
+
conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.complianceRule.isActive, true));
|
|
215
|
+
}
|
|
216
|
+
return conditions;
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Build SQL conditions for browsing the published rules catalog.
|
|
220
|
+
* Only returns system-org published rules.
|
|
221
|
+
*/
|
|
222
|
+
function buildPublishedRuleCatalogConditions(filter) {
|
|
223
|
+
const conditions = [];
|
|
224
|
+
// Only scope='published' is needed — the create endpoint already enforces
|
|
225
|
+
// that only the system org can create published rules, so filtering by orgId
|
|
226
|
+
// is redundant and breaks when the system org's DB ID differs from SYSTEM_ORG_ID.
|
|
227
|
+
conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.complianceRule.scope, 'published'));
|
|
228
|
+
if (filter.name !== undefined) {
|
|
229
|
+
conditions.push((0, drizzle_orm_1.ilike)(drizzle_schema_1.schema.complianceRule.name, `%${(0, access_control_builder_1.escapeLikeWildcards)((0, access_control_builder_1.normalizeStringFilter)(filter.name))}%`));
|
|
230
|
+
}
|
|
231
|
+
if (filter.target !== undefined) {
|
|
232
|
+
conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.complianceRule.target, filter.target));
|
|
233
|
+
}
|
|
234
|
+
if (filter.severity !== undefined) {
|
|
235
|
+
conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.complianceRule.severity, filter.severity));
|
|
236
|
+
}
|
|
237
|
+
if (filter.tag !== undefined) {
|
|
238
|
+
conditions.push((0, access_control_builder_1.buildJsonbKeywordCondition)(drizzle_schema_1.schema.complianceRule.tags, (0, access_control_builder_1.normalizeStringFilter)(filter.tag)));
|
|
239
|
+
}
|
|
240
|
+
if (filter.isActive !== undefined) {
|
|
241
|
+
conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.complianceRule.isActive, (0, access_control_builder_1.parseBooleanFilter)(filter.isActive)));
|
|
242
|
+
}
|
|
243
|
+
else {
|
|
244
|
+
conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.complianceRule.isActive, true));
|
|
245
|
+
}
|
|
246
|
+
return conditions;
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Build SQL conditions for compliance rule subscription queries.
|
|
250
|
+
*/
|
|
251
|
+
function buildComplianceRuleSubscriptionConditions(filter, orgId) {
|
|
252
|
+
const conditions = [];
|
|
253
|
+
if (orgId) {
|
|
254
|
+
conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.complianceRuleSubscription.orgId, orgId));
|
|
255
|
+
}
|
|
256
|
+
if (filter.ruleId !== undefined) {
|
|
257
|
+
conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.complianceRuleSubscription.ruleId, filter.ruleId));
|
|
258
|
+
}
|
|
259
|
+
if (filter.isActive !== undefined) {
|
|
260
|
+
conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.complianceRuleSubscription.isActive, (0, access_control_builder_1.parseBooleanFilter)(filter.isActive)));
|
|
261
|
+
}
|
|
262
|
+
else {
|
|
263
|
+
conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.complianceRuleSubscription.isActive, true));
|
|
264
|
+
}
|
|
265
|
+
return conditions;
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Build SQL conditions for compliance exemption queries.
|
|
269
|
+
*/
|
|
270
|
+
function buildComplianceExemptionConditions(filter, orgId) {
|
|
271
|
+
const conditions = [];
|
|
272
|
+
if (orgId) {
|
|
273
|
+
conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.complianceExemption.orgId, orgId));
|
|
274
|
+
}
|
|
275
|
+
if (filter.ruleId !== undefined) {
|
|
276
|
+
conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.complianceExemption.ruleId, filter.ruleId));
|
|
277
|
+
}
|
|
278
|
+
if (filter.entityType !== undefined) {
|
|
279
|
+
conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.complianceExemption.entityType, filter.entityType));
|
|
280
|
+
}
|
|
281
|
+
if (filter.entityId !== undefined) {
|
|
282
|
+
conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.complianceExemption.entityId, filter.entityId));
|
|
283
|
+
}
|
|
284
|
+
if (filter.status !== undefined) {
|
|
285
|
+
conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.complianceExemption.status, filter.status));
|
|
286
|
+
}
|
|
287
|
+
return conditions;
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Build SQL conditions for compliance audit log queries.
|
|
291
|
+
*/
|
|
292
|
+
function buildComplianceAuditConditions(filter, orgId) {
|
|
293
|
+
const conditions = [];
|
|
294
|
+
if (orgId) {
|
|
295
|
+
conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.complianceAuditLog.orgId, orgId));
|
|
296
|
+
}
|
|
297
|
+
if (filter.target !== undefined) {
|
|
298
|
+
conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.complianceAuditLog.target, filter.target));
|
|
299
|
+
}
|
|
300
|
+
if (filter.action !== undefined) {
|
|
301
|
+
conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.complianceAuditLog.action, filter.action));
|
|
302
|
+
}
|
|
303
|
+
if (filter.result !== undefined) {
|
|
304
|
+
conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.complianceAuditLog.result, filter.result));
|
|
305
|
+
}
|
|
306
|
+
if (filter.scanId !== undefined) {
|
|
307
|
+
conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.complianceAuditLog.scanId, filter.scanId));
|
|
308
|
+
}
|
|
309
|
+
if (filter.dateFrom !== undefined) {
|
|
310
|
+
conditions.push((0, drizzle_orm_1.gte)(drizzle_schema_1.schema.complianceAuditLog.createdAt, new Date(filter.dateFrom)));
|
|
311
|
+
}
|
|
312
|
+
if (filter.dateTo !== undefined) {
|
|
313
|
+
conditions.push((0, drizzle_orm_1.lte)(drizzle_schema_1.schema.complianceAuditLog.createdAt, new Date(filter.dateTo)));
|
|
314
|
+
}
|
|
315
|
+
return conditions;
|
|
316
|
+
}
|
|
317
|
+
/**
|
|
318
|
+
* Build SQL conditions for compliance scan queries.
|
|
319
|
+
*/
|
|
320
|
+
function buildComplianceScanConditions(filter, orgId) {
|
|
321
|
+
const conditions = [];
|
|
322
|
+
if (orgId) {
|
|
323
|
+
conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.complianceScan.orgId, orgId));
|
|
324
|
+
}
|
|
325
|
+
if (filter.target !== undefined) {
|
|
326
|
+
conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.complianceScan.target, filter.target));
|
|
327
|
+
}
|
|
328
|
+
if (filter.status !== undefined) {
|
|
329
|
+
conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.complianceScan.status, filter.status));
|
|
330
|
+
}
|
|
331
|
+
if (filter.triggeredBy !== undefined) {
|
|
332
|
+
conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.complianceScan.triggeredBy, filter.triggeredBy));
|
|
333
|
+
}
|
|
334
|
+
return conditions;
|
|
335
|
+
}
|
|
336
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktYnVpbGRlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBpL3F1ZXJ5LWJ1aWxkZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDOztBQWdEdEMsMERBcUJDO0FBZUQsc0RBaUNDO0FBY0Qsd0RBK0RDO0FBVUQsMEVBOEJDO0FBTUQsc0VBK0NDO0FBTUQsa0ZBaUNDO0FBS0QsOEZBcUJDO0FBS0QsZ0ZBMkJDO0FBS0Qsd0VBbUNDO0FBS0Qsc0VBdUJDO0FBbGNELHlEQUEyRDtBQUMzRCw2Q0FBbUU7QUFDbkUscUVBTWtDO0FBWWxDLCtEQU9vQztBQUVwQywwQkFBMEI7QUFDMUIsTUFBTSxlQUFlLEdBQUcsSUFBSSxrREFBeUIsQ0FBQyx1QkFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ3ZFLE1BQU0sYUFBYSxHQUFHLElBQUksa0RBQXlCLENBQUMsdUJBQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUVuRTs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxTQUFnQix1QkFBdUIsQ0FDckMsTUFBK0IsRUFDL0IsS0FBYztJQUVkLDJGQUEyRjtJQUMzRixNQUFNLFVBQVUsR0FBRyxlQUFlLENBQUMscUJBQXFCLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBRXhFLGdDQUFnQztJQUNoQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDakMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFBLGdCQUFFLEVBQUMsdUJBQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLElBQUEsOENBQXFCLEVBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN0RixDQUFDO0lBRUQsSUFBSSxNQUFNLENBQUMsWUFBWSxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ3RDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBQSxnQkFBRSxFQUFDLHVCQUFNLENB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Q29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IFNZU1RFTV9PUkdfSUQgfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9hcGktY29yZSc7XG5pbXBvcnQgeyBlcSwgaWxpa2UsIGlzTnVsbCwgb3IsIGd0ZSwgbHRlLCBTUUwgfSBmcm9tICdkcml6emxlLW9ybSc7XG5pbXBvcnQge1xuICBBY2Nlc3NDb250cm9sUXVlcnlCdWlsZGVyLFxuICBidWlsZEpzb25iS2V5d29yZENvbmRpdGlvbixcbiAgZXNjYXBlTGlrZVdpbGRjYXJkcyxcbiAgbm9ybWFsaXplU3RyaW5nRmlsdGVyLFxuICBwYXJzZUJvb2xlYW5GaWx0ZXIsXG59IGZyb20gJy4vYWNjZXNzLWNvbnRyb2wtYnVpbGRlcic7XG5pbXBvcnQge1xuICBNZXNzYWdlRmlsdGVyLFxuICBQaXBlbGluZUZpbHRlcixcbiAgUGx1Z2luRmlsdGVyLFxuICBDb21wbGlhbmNlUG9saWN5RmlsdGVyLFxuICBDb21wbGlhbmNlUnVsZUZpbHRlcixcbiAgQ29tcGxpYW5jZUV4ZW1wdGlvbkZpbHRlcixcbiAgQ29tcGxpYW5jZUF1ZGl0RmlsdGVyLFxuICBDb21wbGlhbmNlU2NhbkZpbHRlcixcbiAgQ29tcGxpYW5jZVJ1bGVTdWJzY3JpcHRpb25GaWx0ZXIsXG59IGZyb20gJy4uL2NvcmUvcXVlcnktZmlsdGVycyc7XG5pbXBvcnQge1xuICBzY2hlbWEsXG4gIHR5cGUgTWVzc2FnZVByaW9yaXR5LFxuICB0eXBlIE1lc3NhZ2VUeXBlLFxuICB0eXBlIFJ1bGVUYXJnZXQsXG4gIHR5cGUgUnVsZVNldmVyaXR5LFxuICB0eXBlIFJ1bGVTY29wZSxcbn0gZnJvbSAnLi4vZGF0YWJhc2UvZHJpenpsZS1zY2hlbWEnO1xuXG4vLyBRdWVyeSBidWlsZGVyIGluc3RhbmNlc1xuY29uc3QgcGlwZWxpbmVCdWlsZGVyID0gbmV3IEFjY2Vzc0NvbnRyb2xRdWVyeUJ1aWxkZXIoc2NoZW1hLnBpcGVsaW5lKTtcbmNvbnN0IHBsdWdpbkJ1aWxkZXIgPSBuZXcgQWNjZXNzQ29udHJvbFF1ZXJ5QnVpbGRlcihzY2hlbWEucGx1Z2luKTtcblxuLyoqXG4gKiBCdWlsZCBTUUwgY29uZGl0aW9ucyBmb3IgcGlwZWxpbmUgcXVlcmllc1xuICpcbiAqIEFjY2VzcyBjb250cm9sIGJlaGF2aW9yOlxuICogLSBObyBvcmdJZDogc3lzdGVtIG9yZyBwdWJsaWMgb25seVxuICogLSBhY2Nlc3NNb2RpZmllcj0ncHJpdmF0ZSc6IE93biBvcmcgcHJpdmF0ZSBvbmx5XG4gKiAtIGFjY2Vzc01vZGlmaWVyPSdwdWJsaWMnOiBPd24gb3JnIHB1YmxpYyBvbmx5XG4gKiAtIE5vIGFjY2Vzc01vZGlmaWVyIChkZWZhdWx0KTogT3duIG9yZyBwdWJsaWMgKyBzeXN0ZW0gb3JnIHB1YmxpY1xuICpcbiAqIEBwYXJhbSBmaWx0ZXIgLSBQaXBlbGluZSBmaWx0ZXIgY3JpdGVyaWFcbiAqIEBwYXJhbSBvcmdJZCAtIFVzZXIncyBvcmdhbml6YXRpb24gSUQgKG9wdGlvbmFsIOKAlCBhbm9ueW1vdXMgZ2V0cyBzeXN0ZW0gcHVibGljIG9ubHkpXG4gKiBAcmV0dXJucyBBcnJheSBvZiBTUUwgY29uZGl0aW9uc1xuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRQaXBlbGluZUNvbmRpdGlvbnMoXG4gIGZpbHRlcjogUGFydGlhbDxQaXBlbGluZUZpbHRlcj4sXG4gIG9yZ0lkPzogc3RyaW5nLFxuKTogU1FMW10ge1xuICAvLyBVc2UgZ2VuZXJpYyBidWlsZGVyIGZvciBjb21tb24gY29uZGl0aW9ucyAoYWNjZXNzIGNvbnRyb2wsIElELCBib29sZWFucywgYWNjZXNzTW9kaWZpZXIpXG4gIGNvbnN0IGNvbmRpdGlvbnMgPSBwaXBlbGluZUJ1aWxkZXIuYnVpbGRDb21tb25Db25kaXRpb25zKGZpbHRlciwgb3JnSWQpO1xuXG4gIC8vIEFkZCBwaXBlbGluZS1zcGVjaWZpYyBmaWx0ZXJzXG4gIGlmIChmaWx0ZXIucHJvamVjdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5waXBlbGluZS5wcm9qZWN0LCBub3JtYWxpemVTdHJpbmdGaWx0ZXIoZmlsdGVyLnByb2plY3QpKSk7XG4gIH1cblxuICBpZiAoZmlsdGVyLm9yZ2FuaXphdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5waXBlbGluZS5vcmdhbml6YXRpb24sIG5vcm1hbGl6ZVN0cmluZ0ZpbHRlcihmaWx0ZXIub3JnYW5pemF0aW9uKSkpO1xuICB9XG5cbiAgaWYgKGZpbHRlci5rZXl3b3JkICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goYnVpbGRKc29uYktleXdvcmRDb25kaXRpb24oc2NoZW1hLnBpcGVsaW5lLmtleXdvcmRzLCBub3JtYWxpemVTdHJpbmdGaWx0ZXIoZmlsdGVyLmtleXdvcmQpKSk7XG4gIH1cblxuICByZXR1cm4gY29uZGl0aW9ucztcbn1cblxuLyoqXG4gKiBCdWlsZCBTUUwgY29uZGl0aW9ucyBmb3IgcGx1Z2luIHF1ZXJpZXNcbiAqXG4gKiBBY2Nlc3MgY29udHJvbCBiZWhhdmlvcjpcbiAqIC0gTm8gb3JnSWQ6IHN5c3RlbSBvcmcgcHVibGljIG9ubHlcbiAqIC0gYWNjZXNzTW9kaWZpZXI9J3ByaXZhdGUnOiBPd24gb3JnIHByaXZhdGUgb25seVxuICogLSBhY2Nlc3NNb2RpZmllcj0ncHVibGljJzogT3duIG9yZyBwdWJsaWMgb25seVxuICogLSBObyBhY2Nlc3NNb2RpZmllciAoZGVmYXVsdCk6IE93biBvcmcgcHVibGljICsgc3lzdGVtIG9yZyBwdWJsaWNcbiAqXG4gKiBAcGFyYW0gZmlsdGVyIC0gUGx1Z2luIGZpbHRlciBjcml0ZXJpYVxuICogQHBhcmFtIG9yZ0lkIC0gVXNlcidzIG9yZ2FuaXphdGlvbiBJRCAob3B0aW9uYWwg4oCUIGFub255bW91cyBnZXRzIHN5c3RlbSBwdWJsaWMgb25seSlcbiAqIEByZXR1cm5zIEFycmF5IG9mIFNRTCBjb25kaXRpb25zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFBsdWdpbkNvbmRpdGlvbnMoXG4gIGZpbHRlcjogUGFydGlhbDxQbHVnaW5GaWx0ZXI+LFxuICBvcmdJZD86IHN0cmluZyxcbik6IFNRTFtdIHtcbiAgLy8gVXNlIGdlbmVyaWMgYnVpbGRlciBmb3IgY29tbW9uIGNvbmRpdGlvbnMgKGFjY2VzcyBjb250cm9sLCBJRCwgYm9vbGVhbnMsIGFjY2Vzc01vZGlmaWVyKVxuICBjb25zdCBjb25kaXRpb25zID0gcGx1Z2luQnVpbGRlci5idWlsZENvbW1vbkNvbmRpdGlvbnMoZmlsdGVyLCBvcmdJZCk7XG5cbiAgLy8gQWRkIHBsdWdpbi1zcGVjaWZpYyBmaWx0ZXJzXG4gIGlmIChmaWx0ZXIub3JnSWQgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEucGx1Z2luLm9yZ0lkLCBub3JtYWxpemVTdHJpbmdGaWx0ZXIoZmlsdGVyLm9yZ0lkKSkpO1xuICB9XG5cbiAgaWYgKGZpbHRlci5uYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goaWxpa2Uoc2NoZW1hLnBsdWdpbi5uYW1lLCBgJSR7ZXNjYXBlTGlrZVdpbGRjYXJkcyhub3JtYWxpemVTdHJpbmdGaWx0ZXIoZmlsdGVyLm5hbWUpKX0lYCkpO1xuICB9XG5cbiAgaWYgKGZpbHRlci52ZXJzaW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLnBsdWdpbi52ZXJzaW9uLCBmaWx0ZXIudmVyc2lvbiBhcyBzdHJpbmcpKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIuaW1hZ2VUYWcgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEucGx1Z2luLmltYWdlVGFnLCBmaWx0ZXIuaW1hZ2VUYWcgYXMgc3RyaW5nKSk7XG4gIH1cblxuICBpZiAoZmlsdGVyLmtleXdvcmQgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChidWlsZEpzb25iS2V5d29yZENvbmRpdGlvbihzY2hlbWEucGx1Z2luLmtleXdvcmRzLCBub3JtYWxpemVTdHJpbmdGaWx0ZXIoZmlsdGVyLmtleXdvcmQpKSk7XG4gIH1cblxuICBpZiAoZmlsdGVyLmNhdGVnb3J5ICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLnBsdWdpbi5jYXRlZ29yeSwgZmlsdGVyLmNhdGVnb3J5IGFzIHN0cmluZykpO1xuICB9XG5cbiAgcmV0dXJuIGNvbmRpdGlvbnM7XG59XG5cbi8qKlxuICogQnVpbGQgU1FMIGNvbmRpdGlvbnMgZm9yIG1lc3NhZ2UgcXVlcmllcy5cbiAqXG4gKiBDdXN0b20gYWNjZXNzIGNvbnRyb2wgZm9yIG1lc3NhZ2VzOlxuICogLSBNZXNzYWdlcyBhcmUgdmlzaWJsZSB0byB0aGUgc2VuZGVyIG9yZyAob3JnSWQpIE9SIHRoZSByZWNpcGllbnQgb3JnIChyZWNpcGllbnRPcmdJZClcbiAqIC0gQnJvYWRjYXN0IGFubm91bmNlbWVudHMgKHJlY2lwaWVudE9yZ0lkID0gJyonKSBhcmUgdmlzaWJsZSB0byBhbGwgb3Jnc1xuICogLSBTeXN0ZW0gb3JnIGNhbiBzZWUgYWxsIG1lc3NhZ2VzXG4gKlxuICogQHBhcmFtIGZpbHRlciAtIE1lc3NhZ2UgZmlsdGVyIGNyaXRlcmlhXG4gKiBAcGFyYW0gb3JnSWQgLSBVc2VyJ3Mgb3JnYW5pemF0aW9uIElEXG4gKiBAcmV0dXJucyBBcnJheSBvZiBTUUwgY29uZGl0aW9uc1xuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRNZXNzYWdlQ29uZGl0aW9ucyhcbiAgZmlsdGVyOiBQYXJ0aWFsPE1lc3NhZ2VGaWx0ZXI+LFxuICBvcmdJZDogc3RyaW5nLFxuKTogU1FMW10ge1xuICBjb25zdCBjb25kaXRpb25zOiBTUUxbXSA9IFtdO1xuICBjb25zdCBub3JtYWxpemVkT3JnSWQgPSBvcmdJZC50b0xvd2VyQ2FzZSgpO1xuXG4gIC8vIEN1c3RvbSBhY2Nlc3MgY29udHJvbDogc2VuZGVyIE9SIHJlY2lwaWVudCBPUiBicm9hZGNhc3RcbiAgaWYgKG5vcm1hbGl6ZWRPcmdJZCA9PT0gU1lTVEVNX09SR19JRCkge1xuICAgIC8vIFN5c3RlbSBvcmcgY2FuIHNlZSBhbGwgbWVzc2FnZXNcbiAgfSBlbHNlIHtcbiAgICBjb25kaXRpb25zLnB1c2goXG4gICAgICBvcihcbiAgICAgICAgZXEoc2NoZW1hLm1lc3NhZ2Uub3JnSWQsIG5vcm1hbGl6ZWRPcmdJZCksXG4gICAgICAgIGVxKHNjaGVtYS5tZXNzYWdlLnJlY2lwaWVudE9yZ0lkLCBub3JtYWxpemVkT3JnSWQpLFxuICAgICAgICBlcShzY2hlbWEubWVzc2FnZS5yZWNpcGllbnRPcmdJZCwgJyonKSxcbiAgICAgICkhLFxuICAgICk7XG4gIH1cblxuICAvLyBBY3RpdmUgZmlsdGVyIChkZWZhdWx0IHRvIGFjdGl2ZSBvbmx5KVxuICBpZiAoZmlsdGVyLmlzQWN0aXZlICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLm1lc3NhZ2UuaXNBY3RpdmUsIHBhcnNlQm9vbGVhbkZpbHRlcihmaWx0ZXIuaXNBY3RpdmUpKSk7XG4gIH0gZWxzZSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5tZXNzYWdlLmlzQWN0aXZlLCB0cnVlKSk7XG4gIH1cblxuICAvLyBUaHJlYWQgZmlsdGVyIChudWxsID0gcm9vdCBtZXNzYWdlcyBvbmx5IHZpYSBJUyBOVUxMKVxuICBpZiAoZmlsdGVyLnRocmVhZElkICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAoZmlsdGVyLnRocmVhZElkID09PSBudWxsKSB7XG4gICAgICBjb25kaXRpb25zLnB1c2goaXNOdWxsKHNjaGVtYS5tZXNzYWdlLnRocmVhZElkKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEubWVzc2FnZS50aHJlYWRJZCwgZmlsdGVyLnRocmVhZElkKSk7XG4gICAgfVxuICB9XG5cbiAgLy8gUmVjaXBpZW50IG9yZyBmaWx0ZXJcbiAgaWYgKGZpbHRlci5yZWNpcGllbnRPcmdJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5tZXNzYWdlLnJlY2lwaWVudE9yZ0lkLCBub3JtYWxpemVTdHJpbmdGaWx0ZXIoZmlsdGVyLnJlY2lwaWVudE9yZ0lkKSkpO1xuICB9XG5cbiAgLy8gTWVzc2FnZSB0eXBlIGZpbHRlclxuICBpZiAoZmlsdGVyLm1lc3NhZ2VUeXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLm1lc3NhZ2UubWVzc2FnZVR5cGUsIGZpbHRlci5tZXNzYWdlVHlwZSBhcyBNZXNzYWdlVHlwZSkpO1xuICB9XG5cbiAgLy8gUmVhZCBzdGF0dXMgZmlsdGVyXG4gIGlmIChmaWx0ZXIuaXNSZWFkICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLm1lc3NhZ2UuaXNSZWFkLCBwYXJzZUJvb2xlYW5GaWx0ZXIoZmlsdGVyLmlzUmVhZCkpKTtcbiAgfVxuXG4gIC8vIFByaW9yaXR5IGZpbHRlclxuICBpZiAoZmlsdGVyLnByaW9yaXR5ICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLm1lc3NhZ2UucHJpb3JpdHksIGZpbHRlci5wcmlvcml0eSBhcyBNZXNzYWdlUHJpb3JpdHkpKTtcbiAgfVxuXG4gIC8vIElEIGZpbHRlclxuICBpZiAoZmlsdGVyLmlkICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBpZCA9IHR5cGVvZiBmaWx0ZXIuaWQgPT09ICdzdHJpbmcnID8gZmlsdGVyLmlkIDogZmlsdGVyLmlkWzBdO1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEubWVzc2FnZS5pZCwgaWQpKTtcbiAgfVxuXG4gIHJldHVybiBjb25kaXRpb25zO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBDb21wbGlhbmNlIFF1ZXJ5IEJ1aWxkZXJzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogQnVpbGQgU1FMIGNvbmRpdGlvbnMgZm9yIGNvbXBsaWFuY2UgcG9saWN5IHF1ZXJpZXMuXG4gKiBPcmctc2NvcGVkOiBhbHdheXMgZmlsdGVycyBieSBvcmdJZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQ29tcGxpYW5jZVBvbGljeUNvbmRpdGlvbnMoXG4gIGZpbHRlcjogUGFydGlhbDxDb21wbGlhbmNlUG9saWN5RmlsdGVyPixcbiAgb3JnSWQ/OiBzdHJpbmcsXG4pOiBTUUxbXSB7XG4gIGNvbnN0IGNvbmRpdGlvbnM6IFNRTFtdID0gW107XG5cbiAgaWYgKG9yZ0lkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5jb21wbGlhbmNlUG9saWN5Lm9yZ0lkLCBvcmdJZCkpO1xuICB9XG5cbiAgaWYgKGZpbHRlci5pZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgaWQgPSB0eXBlb2YgZmlsdGVyLmlkID09PSAnc3RyaW5nJyA/IGZpbHRlci5pZCA6IGZpbHRlci5pZFswXTtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLmNvbXBsaWFuY2VQb2xpY3kuaWQsIGlkKSk7XG4gIH1cblxuICBpZiAoZmlsdGVyLm5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChpbGlrZShzY2hlbWEuY29tcGxpYW5jZVBvbGljeS5uYW1lLCBgJSR7ZXNjYXBlTGlrZVdpbGRjYXJkcyhub3JtYWxpemVTdHJpbmdGaWx0ZXIoZmlsdGVyLm5hbWUpKX0lYCkpO1xuICB9XG5cbiAgaWYgKGZpbHRlci5pc1RlbXBsYXRlICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLmNvbXBsaWFuY2VQb2xpY3kuaXNUZW1wbGF0ZSwgcGFyc2VCb29sZWFuRmlsdGVyKGZpbHRlci5pc1RlbXBsYXRlKSkpO1xuICB9XG5cbiAgaWYgKGZpbHRlci5pc0FjdGl2ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5jb21wbGlhbmNlUG9saWN5LmlzQWN0aXZlLCBwYXJzZUJvb2xlYW5GaWx0ZXIoZmlsdGVyLmlzQWN0aXZlKSkpO1xuICB9IGVsc2Uge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEuY29tcGxpYW5jZVBvbGljeS5pc0FjdGl2ZSwgdHJ1ZSkpO1xuICB9XG5cbiAgcmV0dXJuIGNvbmRpdGlvbnM7XG59XG5cbi8qKlxuICogQnVpbGQgU1FMIGNvbmRpdGlvbnMgZm9yIGNvbXBsaWFuY2UgcnVsZSBxdWVyaWVzLlxuICogUmV0dXJucyBvbmx5IHRoZSByZXF1ZXN0aW5nIG9yZydzIG93biBydWxlcyAob3JnLXNjb3BlZCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZENvbXBsaWFuY2VSdWxlQ29uZGl0aW9ucyhcbiAgZmlsdGVyOiBQYXJ0aWFsPENvbXBsaWFuY2VSdWxlRmlsdGVyPixcbiAgb3JnSWQ/OiBzdHJpbmcsXG4pOiBTUUxbXSB7XG4gIGNvbnN0IGNvbmRpdGlvbnM6IFNRTFtdID0gW107XG5cbiAgaWYgKG9yZ0lkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5jb21wbGlhbmNlUnVsZS5vcmdJZCwgb3JnSWQpKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIuaWQgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IGlkID0gdHlwZW9mIGZpbHRlci5pZCA9PT0gJ3N0cmluZycgPyBmaWx0ZXIuaWQgOiBmaWx0ZXIuaWRbMF07XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5jb21wbGlhbmNlUnVsZS5pZCwgaWQpKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIubmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGlsaWtlKHNjaGVtYS5jb21wbGlhbmNlUnVsZS5uYW1lLCBgJSR7ZXNjYXBlTGlrZVdpbGRjYXJkcyhub3JtYWxpemVTdHJpbmdGaWx0ZXIoZmlsdGVyLm5hbWUpKX0lYCkpO1xuICB9XG5cbiAgaWYgKGZpbHRlci5wb2xpY3lJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5jb21wbGlhbmNlUnVsZS5wb2xpY3lJZCwgZmlsdGVyLnBvbGljeUlkKSk7XG4gIH1cblxuICBpZiAoZmlsdGVyLnRhcmdldCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5jb21wbGlhbmNlUnVsZS50YXJnZXQsIGZpbHRlci50YXJnZXQgYXMgUnVsZVRhcmdldCkpO1xuICB9XG5cbiAgaWYgKGZpbHRlci5zZXZlcml0eSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5jb21wbGlhbmNlUnVsZS5zZXZlcml0eSwgZmlsdGVyLnNldmVyaXR5IGFzIFJ1bGVTZXZlcml0eSkpO1xuICB9XG5cbiAgaWYgKGZpbHRlci5zY29wZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5jb21wbGlhbmNlUnVsZS5zY29wZSwgZmlsdGVyLnNjb3BlIGFzIFJ1bGVTY29wZSkpO1xuICB9XG5cbiAgaWYgKGZpbHRlci50YWcgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChidWlsZEpzb25iS2V5d29yZENvbmRpdGlvbihzY2hlbWEuY29tcGxpYW5jZVJ1bGUudGFncywgbm9ybWFsaXplU3RyaW5nRmlsdGVyKGZpbHRlci50YWcpKSk7XG4gIH1cblxuICBpZiAoZmlsdGVyLmlzQWN0aXZlICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLmNvbXBsaWFuY2VSdWxlLmlzQWN0aXZlLCBwYXJzZUJvb2xlYW5GaWx0ZXIoZmlsdGVyLmlzQWN0aXZlKSkpO1xuICB9IGVsc2UgaWYgKGZpbHRlci5pZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gT25seSBkZWZhdWx0IHRvIGFjdGl2ZT10cnVlIGZvciBsaXN0IHF1ZXJpZXMsIG5vdCBzaW5nbGUtZW50aXR5IGxvb2t1cHMgYnkgSURcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLmNvbXBsaWFuY2VSdWxlLmlzQWN0aXZlLCB0cnVlKSk7XG4gIH1cblxuICByZXR1cm4gY29uZGl0aW9ucztcbn1cblxuLyoqXG4gKiBCdWlsZCBTUUwgY29uZGl0aW9ucyBmb3IgYnJvd3NpbmcgdGhlIHB1Ymxpc2hlZCBydWxlcyBjYXRhbG9nLlxuICogT25seSByZXR1cm5zIHN5c3RlbS1vcmcgcHVibGlzaGVkIHJ1bGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRQdWJsaXNoZWRSdWxlQ2F0YWxvZ0NvbmRpdGlvbnMoXG4gIGZpbHRlcjogUGFydGlhbDxDb21wbGlhbmNlUnVsZUZpbHRlcj4sXG4pOiBTUUxbXSB7XG4gIGNvbnN0IGNvbmRpdGlvbnM6IFNRTFtdID0gW107XG5cbiAgLy8gT25seSBzY29wZT0ncHVibGlzaGVkJyBpcyBuZWVkZWQg4oCUIHRoZSBjcmVhdGUgZW5kcG9pbnQgYWxyZWFkeSBlbmZvcmNlc1xuICAvLyB0aGF0IG9ubHkgdGhlIHN5c3RlbSBvcmcgY2FuIGNyZWF0ZSBwdWJsaXNoZWQgcnVsZXMsIHNvIGZpbHRlcmluZyBieSBvcmdJZFxuICAvLyBpcyByZWR1bmRhbnQgYW5kIGJyZWFrcyB3aGVuIHRoZSBzeXN0ZW0gb3JnJ3MgREIgSUQgZGlmZmVycyBmcm9tIFNZU1RFTV9PUkdfSUQuXG4gIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEuY29tcGxpYW5jZVJ1bGUuc2NvcGUsICdwdWJsaXNoZWQnIGFzIFJ1bGVTY29wZSkpO1xuXG4gIGlmIChmaWx0ZXIubmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGlsaWtlKHNjaGVtYS5jb21wbGlhbmNlUnVsZS5uYW1lLCBgJSR7ZXNjYXBlTGlrZVdpbGRjYXJkcyhub3JtYWxpemVTdHJpbmdGaWx0ZXIoZmlsdGVyLm5hbWUpKX0lYCkpO1xuICB9XG5cbiAgaWYgKGZpbHRlci50YXJnZXQgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEuY29tcGxpYW5jZVJ1bGUudGFyZ2V0LCBmaWx0ZXIudGFyZ2V0IGFzIFJ1bGVUYXJnZXQpKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIuc2V2ZXJpdHkgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEuY29tcGxpYW5jZVJ1bGUuc2V2ZXJpdHksIGZpbHRlci5zZXZlcml0eSBhcyBSdWxlU2V2ZXJpdHkpKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIudGFnICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goYnVpbGRKc29uYktleXdvcmRDb25kaXRpb24oc2NoZW1hLmNvbXBsaWFuY2VSdWxlLnRhZ3MsIG5vcm1hbGl6ZVN0cmluZ0ZpbHRlcihmaWx0ZXIudGFnKSkpO1xuICB9XG5cbiAgaWYgKGZpbHRlci5pc0FjdGl2ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5jb21wbGlhbmNlUnVsZS5pc0FjdGl2ZSwgcGFyc2VCb29sZWFuRmlsdGVyKGZpbHRlci5pc0FjdGl2ZSkpKTtcbiAgfSBlbHNlIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLmNvbXBsaWFuY2VSdWxlLmlzQWN0aXZlLCB0cnVlKSk7XG4gIH1cblxuICByZXR1cm4gY29uZGl0aW9ucztcbn1cblxuLyoqXG4gKiBCdWlsZCBTUUwgY29uZGl0aW9ucyBmb3IgY29tcGxpYW5jZSBydWxlIHN1YnNjcmlwdGlvbiBxdWVyaWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRDb21wbGlhbmNlUnVsZVN1YnNjcmlwdGlvbkNvbmRpdGlvbnMoXG4gIGZpbHRlcjogUGFydGlhbDxDb21wbGlhbmNlUnVsZVN1YnNjcmlwdGlvbkZpbHRlcj4sXG4gIG9yZ0lkPzogc3RyaW5nLFxuKTogU1FMW10ge1xuICBjb25zdCBjb25kaXRpb25zOiBTUUxbXSA9IFtdO1xuXG4gIGlmIChvcmdJZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEuY29tcGxpYW5jZVJ1bGVTdWJzY3JpcHRpb24ub3JnSWQsIG9yZ0lkKSk7XG4gIH1cblxuICBpZiAoZmlsdGVyLnJ1bGVJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5jb21wbGlhbmNlUnVsZVN1YnNjcmlwdGlvbi5ydWxlSWQsIGZpbHRlci5ydWxlSWQpKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIuaXNBY3RpdmUgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEuY29tcGxpYW5jZVJ1bGVTdWJzY3JpcHRpb24uaXNBY3RpdmUsIHBhcnNlQm9vbGVhbkZpbHRlcihmaWx0ZXIuaXNBY3RpdmUpKSk7XG4gIH0gZWxzZSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5jb21wbGlhbmNlUnVsZVN1YnNjcmlwdGlvbi5pc0FjdGl2ZSwgdHJ1ZSkpO1xuICB9XG5cbiAgcmV0dXJuIGNvbmRpdGlvbnM7XG59XG5cbi8qKlxuICogQnVpbGQgU1FMIGNvbmRpdGlvbnMgZm9yIGNvbXBsaWFuY2UgZXhlbXB0aW9uIHF1ZXJpZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZENvbXBsaWFuY2VFeGVtcHRpb25Db25kaXRpb25zKFxuICBmaWx0ZXI6IFBhcnRpYWw8Q29tcGxpYW5jZUV4ZW1wdGlvbkZpbHRlcj4sXG4gIG9yZ0lkPzogc3RyaW5nLFxuKTogU1FMW10ge1xuICBjb25zdCBjb25kaXRpb25zOiBTUUxbXSA9IFtdO1xuXG4gIGlmIChvcmdJZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEuY29tcGxpYW5jZUV4ZW1wdGlvbi5vcmdJZCwgb3JnSWQpKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIucnVsZUlkICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLmNvbXBsaWFuY2VFeGVtcHRpb24ucnVsZUlkLCBmaWx0ZXIucnVsZUlkKSk7XG4gIH1cblxuICBpZiAoZmlsdGVyLmVudGl0eVR5cGUgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEuY29tcGxpYW5jZUV4ZW1wdGlvbi5lbnRpdHlUeXBlLCBmaWx0ZXIuZW50aXR5VHlwZSBhcyBSdWxlVGFyZ2V0KSk7XG4gIH1cblxuICBpZiAoZmlsdGVyLmVudGl0eUlkICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLmNvbXBsaWFuY2VFeGVtcHRpb24uZW50aXR5SWQsIGZpbHRlci5lbnRpdHlJZCkpO1xuICB9XG5cbiAgaWYgKGZpbHRlci5zdGF0dXMgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEuY29tcGxpYW5jZUV4ZW1wdGlvbi5zdGF0dXMsIGZpbHRlci5zdGF0dXMpKTtcbiAgfVxuXG4gIHJldHVybiBjb25kaXRpb25zO1xufVxuXG4vKipcbiAqIEJ1aWxkIFNRTCBjb25kaXRpb25zIGZvciBjb21wbGlhbmNlIGF1ZGl0IGxvZyBxdWVyaWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRDb21wbGlhbmNlQXVkaXRDb25kaXRpb25zKFxuICBmaWx0ZXI6IFBhcnRpYWw8Q29tcGxpYW5jZUF1ZGl0RmlsdGVyPixcbiAgb3JnSWQ/OiBzdHJpbmcsXG4pOiBTUUxbXSB7XG4gIGNvbnN0IGNvbmRpdGlvbnM6IFNRTFtdID0gW107XG5cbiAgaWYgKG9yZ0lkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5jb21wbGlhbmNlQXVkaXRMb2cub3JnSWQsIG9yZ0lkKSk7XG4gIH1cblxuICBpZiAoZmlsdGVyLnRhcmdldCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5jb21wbGlhbmNlQXVkaXRMb2cudGFyZ2V0LCBmaWx0ZXIudGFyZ2V0IGFzIFJ1bGVUYXJnZXQpKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIuYWN0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLmNvbXBsaWFuY2VBdWRpdExvZy5hY3Rpb24sIGZpbHRlci5hY3Rpb24pKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIucmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLmNvbXBsaWFuY2VBdWRpdExvZy5yZXN1bHQsIGZpbHRlci5yZXN1bHQpKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIuc2NhbklkICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLmNvbXBsaWFuY2VBdWRpdExvZy5zY2FuSWQsIGZpbHRlci5zY2FuSWQpKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIuZGF0ZUZyb20gIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChndGUoc2NoZW1hLmNvbXBsaWFuY2VBdWRpdExvZy5jcmVhdGVkQXQsIG5ldyBEYXRlKGZpbHRlci5kYXRlRnJvbSkpKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIuZGF0ZVRvICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2gobHRlKHNjaGVtYS5jb21wbGlhbmNlQXVkaXRMb2cuY3JlYXRlZEF0LCBuZXcgRGF0ZShmaWx0ZXIuZGF0ZVRvKSkpO1xuICB9XG5cbiAgcmV0dXJuIGNvbmRpdGlvbnM7XG59XG5cbi8qKlxuICogQnVpbGQgU1FMIGNvbmRpdGlvbnMgZm9yIGNvbXBsaWFuY2Ugc2NhbiBxdWVyaWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRDb21wbGlhbmNlU2NhbkNvbmRpdGlvbnMoXG4gIGZpbHRlcjogUGFydGlhbDxDb21wbGlhbmNlU2NhbkZpbHRlcj4sXG4gIG9yZ0lkPzogc3RyaW5nLFxuKTogU1FMW10ge1xuICBjb25zdCBjb25kaXRpb25zOiBTUUxbXSA9IFtdO1xuXG4gIGlmIChvcmdJZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEuY29tcGxpYW5jZVNjYW4ub3JnSWQsIG9yZ0lkKSk7XG4gIH1cblxuICBpZiAoZmlsdGVyLnRhcmdldCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5jb21wbGlhbmNlU2Nhbi50YXJnZXQsIGZpbHRlci50YXJnZXQpKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIuc3RhdHVzICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLmNvbXBsaWFuY2VTY2FuLnN0YXR1cywgZmlsdGVyLnN0YXR1cykpO1xuICB9XG5cbiAgaWYgKGZpbHRlci50cmlnZ2VyZWRCeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5jb21wbGlhbmNlU2Nhbi50cmlnZ2VyZWRCeSwgZmlsdGVyLnRyaWdnZXJlZEJ5KSk7XG4gIH1cblxuICByZXR1cm4gY29uZGl0aW9ucztcbn1cbiJdfQ==
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
interface ExecutionCount {
|
|
2
|
+
id: string;
|
|
3
|
+
project: string;
|
|
4
|
+
organization: string;
|
|
5
|
+
pipelineName: string | null;
|
|
6
|
+
total: number;
|
|
7
|
+
succeeded: number;
|
|
8
|
+
failed: number;
|
|
9
|
+
canceled: number;
|
|
10
|
+
firstExecution: string | null;
|
|
11
|
+
lastExecution: string | null;
|
|
12
|
+
}
|
|
13
|
+
interface TimeSeriesEntry {
|
|
14
|
+
period: string;
|
|
15
|
+
succeeded: number;
|
|
16
|
+
failed: number;
|
|
17
|
+
canceled: number;
|
|
18
|
+
successPct: number;
|
|
19
|
+
}
|
|
20
|
+
interface DurationStats {
|
|
21
|
+
id: string;
|
|
22
|
+
project: string;
|
|
23
|
+
pipelineName: string | null;
|
|
24
|
+
avgMs: number;
|
|
25
|
+
minMs: number;
|
|
26
|
+
maxMs: number;
|
|
27
|
+
p95Ms: number;
|
|
28
|
+
executions: number;
|
|
29
|
+
}
|
|
30
|
+
interface StageFailure {
|
|
31
|
+
stageName: string;
|
|
32
|
+
failures: number;
|
|
33
|
+
total: number;
|
|
34
|
+
failurePct: number;
|
|
35
|
+
}
|
|
36
|
+
interface StageBottleneck {
|
|
37
|
+
id: string;
|
|
38
|
+
pipelineName: string | null;
|
|
39
|
+
stageName: string;
|
|
40
|
+
avgMs: number;
|
|
41
|
+
maxMs: number;
|
|
42
|
+
}
|
|
43
|
+
interface ActionFailure {
|
|
44
|
+
actionName: string;
|
|
45
|
+
failures: number;
|
|
46
|
+
total: number;
|
|
47
|
+
failurePct: number;
|
|
48
|
+
}
|
|
49
|
+
interface ErrorEntry {
|
|
50
|
+
errorPattern: string;
|
|
51
|
+
occurrences: number;
|
|
52
|
+
affectedPipelines: number;
|
|
53
|
+
lastSeen: string;
|
|
54
|
+
}
|
|
55
|
+
interface PluginSummary {
|
|
56
|
+
total: number;
|
|
57
|
+
active: number;
|
|
58
|
+
inactive: number;
|
|
59
|
+
public: number;
|
|
60
|
+
private: number;
|
|
61
|
+
uniqueNames: number;
|
|
62
|
+
}
|
|
63
|
+
interface TypeComputeDistribution {
|
|
64
|
+
pluginType: string;
|
|
65
|
+
computeType: string;
|
|
66
|
+
count: number;
|
|
67
|
+
}
|
|
68
|
+
interface VersionCount {
|
|
69
|
+
name: string;
|
|
70
|
+
versionCount: number;
|
|
71
|
+
latestVersion: string;
|
|
72
|
+
hasDefault: boolean;
|
|
73
|
+
}
|
|
74
|
+
interface BuildTimeSeriesEntry {
|
|
75
|
+
period: string;
|
|
76
|
+
succeeded: number;
|
|
77
|
+
failed: number;
|
|
78
|
+
successPct: number;
|
|
79
|
+
}
|
|
80
|
+
interface BuildDuration {
|
|
81
|
+
pluginName: string;
|
|
82
|
+
avgMs: number;
|
|
83
|
+
maxMs: number;
|
|
84
|
+
builds: number;
|
|
85
|
+
}
|
|
86
|
+
interface BuildFailure {
|
|
87
|
+
pluginName: string;
|
|
88
|
+
errorMessage: string;
|
|
89
|
+
occurrences: number;
|
|
90
|
+
lastSeen: string;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Read-only reporting service for pipeline execution and plugin inventory aggregations.
|
|
94
|
+
* Does not extend CrudService — reports are aggregate queries, not entity CRUD.
|
|
95
|
+
*
|
|
96
|
+
* All queries are cached in-memory to avoid repeated expensive SQL aggregations:
|
|
97
|
+
* - Inventory queries (plugin summary/distribution/versions): 5 min TTL
|
|
98
|
+
* - Timeseries queries (execution/build metrics with date ranges): 2 min TTL
|
|
99
|
+
*/
|
|
100
|
+
export declare class ReportingService {
|
|
101
|
+
/** Invalidate all cached reports for an org (call after event ingest). */
|
|
102
|
+
invalidateOrg(orgId: string): Promise<void>;
|
|
103
|
+
/** 1.1 Execution count per pipeline with status breakdown. */
|
|
104
|
+
getExecutionCount(orgId: string): Promise<ExecutionCount[]>;
|
|
105
|
+
/** 1.2 Success rate over time for an org. */
|
|
106
|
+
getSuccessRate(orgId: string, interval: string, from: string, to: string): Promise<TimeSeriesEntry[]>;
|
|
107
|
+
/** 1.3 Average duration per pipeline. */
|
|
108
|
+
getAverageDuration(orgId: string, from: string, to: string): Promise<DurationStats[]>;
|
|
109
|
+
/** 1.5 Stage failure heatmap — which stages fail most. */
|
|
110
|
+
getStageFailures(orgId: string, from: string, to: string): Promise<StageFailure[]>;
|
|
111
|
+
/** 1.6 Stage bottlenecks — slowest stages per pipeline. */
|
|
112
|
+
getStageBottlenecks(orgId: string, from: string, to: string): Promise<StageBottleneck[]>;
|
|
113
|
+
/** 1.7 Action failure rate — which plugin steps fail most. */
|
|
114
|
+
getActionFailures(orgId: string, from: string, to: string): Promise<ActionFailure[]>;
|
|
115
|
+
/** 1.8 Error categorization — group failure messages. */
|
|
116
|
+
getErrors(orgId: string, from: string, to: string, limit?: number): Promise<ErrorEntry[]>;
|
|
117
|
+
/** 2.1 Plugin summary — counts and breakdowns. */
|
|
118
|
+
getPluginSummary(orgId: string): Promise<PluginSummary>;
|
|
119
|
+
/** 2.2 Type & compute distribution. */
|
|
120
|
+
getPluginDistribution(orgId: string): Promise<TypeComputeDistribution[]>;
|
|
121
|
+
/** 2.3 Version counts per plugin name. */
|
|
122
|
+
getPluginVersions(orgId: string): Promise<VersionCount[]>;
|
|
123
|
+
/** 2.4 Build success rate over time. */
|
|
124
|
+
getBuildSuccessRate(orgId: string, interval: string, from: string, to: string): Promise<BuildTimeSeriesEntry[]>;
|
|
125
|
+
/** 2.5 Build duration per plugin. */
|
|
126
|
+
getBuildDuration(orgId: string, from: string, to: string): Promise<BuildDuration[]>;
|
|
127
|
+
/** 2.6 Build failures — top error messages. */
|
|
128
|
+
getBuildFailures(orgId: string, from: string, to: string, limit?: number): Promise<BuildFailure[]>;
|
|
129
|
+
}
|
|
130
|
+
export declare const reportingService: ReportingService;
|
|
131
|
+
export {};
|