@acorex/connectivity 21.0.0-next.2 → 21.0.0-next.5
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/api/index.d.ts +5 -6
- package/fesm2022/{acorex-connectivity-api-execute.command-CQt_HF1B.mjs → acorex-connectivity-api-execute.command-SGNBLcOi.mjs} +2 -2
- package/fesm2022/acorex-connectivity-api-execute.command-SGNBLcOi.mjs.map +1 -0
- package/fesm2022/acorex-connectivity-api.mjs +29 -23
- package/fesm2022/acorex-connectivity-api.mjs.map +1 -1
- package/fesm2022/acorex-connectivity-mock-get-application-versions-chart-data.query-C3eQfF0A.mjs +115 -0
- package/fesm2022/acorex-connectivity-mock-get-application-versions-chart-data.query-C3eQfF0A.mjs.map +1 -0
- package/fesm2022/acorex-connectivity-mock-get-application-versions-timeline.query-CLzDz9ob.mjs +163 -0
- package/fesm2022/acorex-connectivity-mock-get-application-versions-timeline.query-CLzDz9ob.mjs.map +1 -0
- package/fesm2022/acorex-connectivity-mock-get-product-chart-data.query-DDVVFeYN.mjs +97 -0
- package/fesm2022/acorex-connectivity-mock-get-product-chart-data.query-DDVVFeYN.mjs.map +1 -0
- package/fesm2022/acorex-connectivity-mock-get-product-list.query-ChtYlSTt.mjs +157 -0
- package/fesm2022/acorex-connectivity-mock-get-product-list.query-ChtYlSTt.mjs.map +1 -0
- package/fesm2022/acorex-connectivity-mock-get-subscriptions-chart-data.query-HxX_bCT8.mjs +56 -0
- package/fesm2022/acorex-connectivity-mock-get-subscriptions-chart-data.query-HxX_bCT8.mjs.map +1 -0
- package/fesm2022/acorex-connectivity-mock-get-subscriptions-timeline.query-dp08JqLP.mjs +168 -0
- package/fesm2022/acorex-connectivity-mock-get-subscriptions-timeline.query-dp08JqLP.mjs.map +1 -0
- package/fesm2022/acorex-connectivity-mock-get-tenant-application-access.query-IATTXcAV.mjs +180 -0
- package/fesm2022/acorex-connectivity-mock-get-tenant-application-access.query-IATTXcAV.mjs.map +1 -0
- package/fesm2022/acorex-connectivity-mock-get-tenant-registration-chart-data.query-DlXi4Rcg.mjs +56 -0
- package/fesm2022/acorex-connectivity-mock-get-tenant-registration-chart-data.query-DlXi4Rcg.mjs.map +1 -0
- package/fesm2022/acorex-connectivity-mock-get-tenant-registration-timeline.query-hskw8Ioa.mjs +216 -0
- package/fesm2022/acorex-connectivity-mock-get-tenant-registration-timeline.query-hskw8Ioa.mjs.map +1 -0
- package/fesm2022/acorex-connectivity-mock-get-tenant-user-distribution.query-Bs5U5tze.mjs +134 -0
- package/fesm2022/acorex-connectivity-mock-get-tenant-user-distribution.query-Bs5U5tze.mjs.map +1 -0
- package/fesm2022/acorex-connectivity-mock.mjs +28129 -27839
- package/fesm2022/acorex-connectivity-mock.mjs.map +1 -1
- package/mock/index.d.ts +622 -1896
- package/package.json +6 -6
- package/fesm2022/acorex-connectivity-api-execute.command-CQt_HF1B.mjs.map +0 -1
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { inject, Injectable } from '@angular/core';
|
|
3
|
+
import { AXPEntityService } from '@acorex/platform/layout/entity';
|
|
4
|
+
import { AXPSystemStatusType } from '@acorex/platform/common';
|
|
5
|
+
import { RootConfig } from '@acorex/modules/tenant-management';
|
|
6
|
+
import { RootConfig as RootConfig$1 } from '@acorex/modules/subscription-management';
|
|
7
|
+
import { RootConfig as RootConfig$2 } from '@acorex/modules/application-management';
|
|
8
|
+
|
|
9
|
+
//#endregion
|
|
10
|
+
class GetTenantApplicationAccessQuery {
|
|
11
|
+
constructor() {
|
|
12
|
+
this.entityService = inject(AXPEntityService);
|
|
13
|
+
this.tenantService = this.entityService
|
|
14
|
+
.withEntity(`${RootConfig.module.name}.${RootConfig.entities.tenant.name}`)
|
|
15
|
+
.data();
|
|
16
|
+
this.subscriptionService = this.entityService
|
|
17
|
+
.withEntity(`${RootConfig$1.module.name}.${RootConfig$1.entities.subscription.name}`)
|
|
18
|
+
.data();
|
|
19
|
+
this.planService = this.entityService
|
|
20
|
+
.withEntity(`${RootConfig$1.module.name}.${RootConfig$1.entities.subscriptionPlan.name}`)
|
|
21
|
+
.data();
|
|
22
|
+
this.planItemService = this.entityService
|
|
23
|
+
.withEntity(`${RootConfig$1.module.name}.${RootConfig$1.entities.subscriptionPlanItem.name}`)
|
|
24
|
+
.data();
|
|
25
|
+
this.applicationService = this.entityService
|
|
26
|
+
.withEntity(`${RootConfig$2.module.name}.${RootConfig$2.entities.application.name}`)
|
|
27
|
+
.data();
|
|
28
|
+
}
|
|
29
|
+
async fetch(input) {
|
|
30
|
+
// Get all tenants
|
|
31
|
+
const tenantsResult = await this.tenantService.query({
|
|
32
|
+
skip: 0,
|
|
33
|
+
take: 10000,
|
|
34
|
+
filter: input.filters && input.filters.length > 0
|
|
35
|
+
? {
|
|
36
|
+
logic: input.logic || 'and',
|
|
37
|
+
filters: input.filters.filter((f) => f.field !== 'dateRange'),
|
|
38
|
+
}
|
|
39
|
+
: undefined,
|
|
40
|
+
});
|
|
41
|
+
let tenants = tenantsResult.items;
|
|
42
|
+
// Apply date range filter if provided
|
|
43
|
+
if (input.filters) {
|
|
44
|
+
for (const filter of input.filters) {
|
|
45
|
+
if (filter.field === 'dateRange' && filter.value) {
|
|
46
|
+
tenants = this.applyDateRangeFilter(tenants, filter.value);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
// Get all subscriptions
|
|
51
|
+
const subscriptionsResult = await this.subscriptionService.query({
|
|
52
|
+
skip: 0,
|
|
53
|
+
take: 10000,
|
|
54
|
+
});
|
|
55
|
+
const subscriptions = subscriptionsResult.items.filter((s) => s.subscriberType === 'Tenant');
|
|
56
|
+
// Get all plans
|
|
57
|
+
const plansResult = await this.planService.query({
|
|
58
|
+
skip: 0,
|
|
59
|
+
take: 10000,
|
|
60
|
+
});
|
|
61
|
+
const plans = plansResult.items;
|
|
62
|
+
// Get all plan items
|
|
63
|
+
const planItemsResult = await this.planItemService.query({
|
|
64
|
+
skip: 0,
|
|
65
|
+
take: 10000,
|
|
66
|
+
});
|
|
67
|
+
const planItems = planItemsResult.items;
|
|
68
|
+
// Get all applications
|
|
69
|
+
const applicationsResult = await this.applicationService.query({
|
|
70
|
+
skip: 0,
|
|
71
|
+
take: 10000,
|
|
72
|
+
});
|
|
73
|
+
const applications = applicationsResult.items;
|
|
74
|
+
// Build results for each tenant
|
|
75
|
+
const results = [];
|
|
76
|
+
for (const tenant of tenants) {
|
|
77
|
+
// Get tenant's subscriptions
|
|
78
|
+
const tenantSubscriptions = subscriptions.filter((s) => s.subscriberId === tenant.id);
|
|
79
|
+
// Get unique applications through subscriptions → plans → plan items → editions → applications
|
|
80
|
+
const applicationSet = new Set();
|
|
81
|
+
const applicationNames = [];
|
|
82
|
+
for (const subscription of tenantSubscriptions) {
|
|
83
|
+
if (!subscription.planId)
|
|
84
|
+
continue;
|
|
85
|
+
// Get plan items for this plan
|
|
86
|
+
const planPlanItems = planItems.filter((pi) => pi.planId === subscription.planId);
|
|
87
|
+
for (const planItem of planPlanItems) {
|
|
88
|
+
if (!planItem.editionId)
|
|
89
|
+
continue;
|
|
90
|
+
// Find applications that have this edition
|
|
91
|
+
for (const application of applications) {
|
|
92
|
+
if (application.editionIds && application.editionIds.includes(planItem.editionId)) {
|
|
93
|
+
if (!applicationSet.has(application.id)) {
|
|
94
|
+
applicationSet.add(application.id);
|
|
95
|
+
applicationNames.push(application.title);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// Count active subscriptions
|
|
102
|
+
const activeSubscriptions = tenantSubscriptions.filter((s) => s.statusId === AXPSystemStatusType.Active);
|
|
103
|
+
results.push({
|
|
104
|
+
tenantId: tenant.id,
|
|
105
|
+
tenantName: tenant.title,
|
|
106
|
+
tenantStatus: tenant.statusId || 'Unknown',
|
|
107
|
+
subscriptionCount: tenantSubscriptions.length,
|
|
108
|
+
applicationsCount: applicationSet.size,
|
|
109
|
+
applicationsList: applicationNames.join(', '),
|
|
110
|
+
activeSubscriptionsCount: activeSubscriptions.length,
|
|
111
|
+
registrationDate: tenant.registrationDate,
|
|
112
|
+
registrationDateStr: tenant.registrationDate?.toISOString(),
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
// Apply sorting if provided
|
|
116
|
+
if (input.sort && input.sort.length > 0) {
|
|
117
|
+
results.sort((a, b) => {
|
|
118
|
+
for (const sortField of input.sort) {
|
|
119
|
+
const field = sortField.field;
|
|
120
|
+
const aValue = a[field];
|
|
121
|
+
const bValue = b[field];
|
|
122
|
+
const dir = sortField.dir === 'asc' ? 1 : -1;
|
|
123
|
+
if (aValue === undefined && bValue === undefined)
|
|
124
|
+
continue;
|
|
125
|
+
if (aValue === undefined)
|
|
126
|
+
return 1 * dir;
|
|
127
|
+
if (bValue === undefined)
|
|
128
|
+
return -1 * dir;
|
|
129
|
+
if (aValue < bValue)
|
|
130
|
+
return -1 * dir;
|
|
131
|
+
if (aValue > bValue)
|
|
132
|
+
return 1 * dir;
|
|
133
|
+
}
|
|
134
|
+
return 0;
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
// Default sort by tenant name
|
|
139
|
+
results.sort((a, b) => a.tenantName.localeCompare(b.tenantName));
|
|
140
|
+
}
|
|
141
|
+
// Apply pagination
|
|
142
|
+
const skip = input.skip || 0;
|
|
143
|
+
const take = input.take || 10;
|
|
144
|
+
const total = results.length;
|
|
145
|
+
const items = results.slice(skip, skip + take);
|
|
146
|
+
return {
|
|
147
|
+
items,
|
|
148
|
+
total,
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
//#region ---- Custom Filter Handlers ----
|
|
152
|
+
/**
|
|
153
|
+
* Apply date range filter to tenants
|
|
154
|
+
*/
|
|
155
|
+
applyDateRangeFilter(tenants, dateRange) {
|
|
156
|
+
if (!dateRange || !dateRange.start || !dateRange.end) {
|
|
157
|
+
return tenants;
|
|
158
|
+
}
|
|
159
|
+
const startDate = new Date(dateRange.start);
|
|
160
|
+
const endDate = new Date(dateRange.end);
|
|
161
|
+
endDate.setHours(23, 59, 59, 999);
|
|
162
|
+
return tenants.filter((tenant) => {
|
|
163
|
+
if (!tenant.registrationDate)
|
|
164
|
+
return false;
|
|
165
|
+
const regDate = new Date(tenant.registrationDate);
|
|
166
|
+
return regDate >= startDate && regDate <= endDate;
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: GetTenantApplicationAccessQuery, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
170
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: GetTenantApplicationAccessQuery, providedIn: 'root' }); }
|
|
171
|
+
}
|
|
172
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: GetTenantApplicationAccessQuery, decorators: [{
|
|
173
|
+
type: Injectable,
|
|
174
|
+
args: [{
|
|
175
|
+
providedIn: 'root',
|
|
176
|
+
}]
|
|
177
|
+
}] });
|
|
178
|
+
|
|
179
|
+
export { GetTenantApplicationAccessQuery };
|
|
180
|
+
//# sourceMappingURL=acorex-connectivity-mock-get-tenant-application-access.query-IATTXcAV.mjs.map
|
package/fesm2022/acorex-connectivity-mock-get-tenant-application-access.query-IATTXcAV.mjs.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acorex-connectivity-mock-get-tenant-application-access.query-IATTXcAV.mjs","sources":["../tmp-esm2022/mock/lib/tenant-management/reports/get-tenant-application-access.query.js"],"sourcesContent":["import { inject, Injectable } from '@angular/core';\nimport { AXPEntityService } from '@acorex/platform/layout/entity';\nimport { AXPSystemStatusType } from '@acorex/platform/common';\nimport { RootConfig as TenantRootConfig } from '@acorex/modules/tenant-management';\nimport { RootConfig as SubscriptionRootConfig } from '@acorex/modules/subscription-management';\nimport { RootConfig as ApplicationRootConfig } from '@acorex/modules/application-management';\nimport * as i0 from \"@angular/core\";\n//#endregion\nexport class GetTenantApplicationAccessQuery {\n constructor() {\n this.entityService = inject(AXPEntityService);\n this.tenantService = this.entityService\n .withEntity(`${TenantRootConfig.module.name}.${TenantRootConfig.entities.tenant.name}`)\n .data();\n this.subscriptionService = this.entityService\n .withEntity(`${SubscriptionRootConfig.module.name}.${SubscriptionRootConfig.entities.subscription.name}`)\n .data();\n this.planService = this.entityService\n .withEntity(`${SubscriptionRootConfig.module.name}.${SubscriptionRootConfig.entities.subscriptionPlan.name}`)\n .data();\n this.planItemService = this.entityService\n .withEntity(`${SubscriptionRootConfig.module.name}.${SubscriptionRootConfig.entities.subscriptionPlanItem.name}`)\n .data();\n this.applicationService = this.entityService\n .withEntity(`${ApplicationRootConfig.module.name}.${ApplicationRootConfig.entities.application.name}`)\n .data();\n }\n async fetch(input) {\n // Get all tenants\n const tenantsResult = await this.tenantService.query({\n skip: 0,\n take: 10000,\n filter: input.filters && input.filters.length > 0\n ? {\n logic: input.logic || 'and',\n filters: input.filters.filter((f) => f.field !== 'dateRange'),\n }\n : undefined,\n });\n let tenants = tenantsResult.items;\n // Apply date range filter if provided\n if (input.filters) {\n for (const filter of input.filters) {\n if (filter.field === 'dateRange' && filter.value) {\n tenants = this.applyDateRangeFilter(tenants, filter.value);\n }\n }\n }\n // Get all subscriptions\n const subscriptionsResult = await this.subscriptionService.query({\n skip: 0,\n take: 10000,\n });\n const subscriptions = subscriptionsResult.items.filter((s) => s.subscriberType === 'Tenant');\n // Get all plans\n const plansResult = await this.planService.query({\n skip: 0,\n take: 10000,\n });\n const plans = plansResult.items;\n // Get all plan items\n const planItemsResult = await this.planItemService.query({\n skip: 0,\n take: 10000,\n });\n const planItems = planItemsResult.items;\n // Get all applications\n const applicationsResult = await this.applicationService.query({\n skip: 0,\n take: 10000,\n });\n const applications = applicationsResult.items;\n // Build results for each tenant\n const results = [];\n for (const tenant of tenants) {\n // Get tenant's subscriptions\n const tenantSubscriptions = subscriptions.filter((s) => s.subscriberId === tenant.id);\n // Get unique applications through subscriptions → plans → plan items → editions → applications\n const applicationSet = new Set();\n const applicationNames = [];\n for (const subscription of tenantSubscriptions) {\n if (!subscription.planId)\n continue;\n // Get plan items for this plan\n const planPlanItems = planItems.filter((pi) => pi.planId === subscription.planId);\n for (const planItem of planPlanItems) {\n if (!planItem.editionId)\n continue;\n // Find applications that have this edition\n for (const application of applications) {\n if (application.editionIds && application.editionIds.includes(planItem.editionId)) {\n if (!applicationSet.has(application.id)) {\n applicationSet.add(application.id);\n applicationNames.push(application.title);\n }\n }\n }\n }\n }\n // Count active subscriptions\n const activeSubscriptions = tenantSubscriptions.filter((s) => s.statusId === AXPSystemStatusType.Active);\n results.push({\n tenantId: tenant.id,\n tenantName: tenant.title,\n tenantStatus: tenant.statusId || 'Unknown',\n subscriptionCount: tenantSubscriptions.length,\n applicationsCount: applicationSet.size,\n applicationsList: applicationNames.join(', '),\n activeSubscriptionsCount: activeSubscriptions.length,\n registrationDate: tenant.registrationDate,\n registrationDateStr: tenant.registrationDate?.toISOString(),\n });\n }\n // Apply sorting if provided\n if (input.sort && input.sort.length > 0) {\n results.sort((a, b) => {\n for (const sortField of input.sort) {\n const field = sortField.field;\n const aValue = a[field];\n const bValue = b[field];\n const dir = sortField.dir === 'asc' ? 1 : -1;\n if (aValue === undefined && bValue === undefined)\n continue;\n if (aValue === undefined)\n return 1 * dir;\n if (bValue === undefined)\n return -1 * dir;\n if (aValue < bValue)\n return -1 * dir;\n if (aValue > bValue)\n return 1 * dir;\n }\n return 0;\n });\n }\n else {\n // Default sort by tenant name\n results.sort((a, b) => a.tenantName.localeCompare(b.tenantName));\n }\n // Apply pagination\n const skip = input.skip || 0;\n const take = input.take || 10;\n const total = results.length;\n const items = results.slice(skip, skip + take);\n return {\n items,\n total,\n };\n }\n //#region ---- Custom Filter Handlers ----\n /**\n * Apply date range filter to tenants\n */\n applyDateRangeFilter(tenants, dateRange) {\n if (!dateRange || !dateRange.start || !dateRange.end) {\n return tenants;\n }\n const startDate = new Date(dateRange.start);\n const endDate = new Date(dateRange.end);\n endDate.setHours(23, 59, 59, 999);\n return tenants.filter((tenant) => {\n if (!tenant.registrationDate)\n return false;\n const regDate = new Date(tenant.registrationDate);\n return regDate >= startDate && regDate <= endDate;\n });\n }\n static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.12\", ngImport: i0, type: GetTenantApplicationAccessQuery, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }\n static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"20.3.12\", ngImport: i0, type: GetTenantApplicationAccessQuery, providedIn: 'root' }); }\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.3.12\", ngImport: i0, type: GetTenantApplicationAccessQuery, decorators: [{\n type: Injectable,\n args: [{\n providedIn: 'root',\n }]\n }] });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0LXRlbmFudC1hcHBsaWNhdGlvbi1hY2Nlc3MucXVlcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2Nvbm5lY3Rpdml0eS9tb2NrL3NyYy9saWIvdGVuYW50LW1hbmFnZW1lbnQvcmVwb3J0cy9nZXQtdGVuYW50LWFwcGxpY2F0aW9uLWFjY2Vzcy5xdWVyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVuRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQU1sRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsVUFBVSxJQUFJLGdCQUFnQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDbkYsT0FBTyxFQUFFLFVBQVUsSUFBSSxzQkFBc0IsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQy9GLE9BQU8sRUFBRSxVQUFVLElBQUkscUJBQXFCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQzs7QUFpQzdGLFlBQVk7QUFLWixNQUFNLE9BQU8sK0JBQStCO0lBSDVDO1FBTW1CLGtCQUFhLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDbEQsa0JBQWEsR0FBRyxJQUFJLENBQUMsYUFBYTthQUN2QyxVQUFVLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7YUFDdEYsSUFBSSxFQUFnRCxDQUFDO1FBQ2hELHdCQUFtQixHQUFHLElBQUksQ0FBQyxhQUFhO2FBQzdDLFVBQVUsQ0FBQyxHQUFHLHNCQUFzQixDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksc0JBQXNCLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxJQUFJ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QUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFYUFF1ZXJ5IH0gZnJvbSAnQGFjb3JleC9wbGF0Zm9ybS9ydW50aW1lJztcbmltcG9ydCB7IEFYUEVudGl0eVNlcnZpY2UgfSBmcm9tICdAYWNvcmV4L3BsYXRmb3JtL2xheW91dC9lbnRpdHknO1xuaW1wb3J0IHsgQVhNVGVuYW50TWFuYWdlbWVudFRlbmFudEVudGl0eU1vZGVsIH0gZnJvbSAnQGFjb3JleC9tb2R1bGVzL3RlbmFudC1tYW5hZ2VtZW50JztcbmltcG9ydCB7IEFYTVN1YnNjcmlwdGlvbk1hbmFnZW1lbnRTdWJzY3JpcHRpb25FbnRpdHlNb2RlbCB9IGZyb20gJ0BhY29yZXgvbW9kdWxlcy9zdWJzY3JpcHRpb24tbWFuYWdlbWVudCc7XG5pbXBvcnQgeyBBWE1TdWJzY3JpcHRpb25NYW5hZ2VtZW50U3Vic2NyaXB0aW9uUGxhbkVudGl0eU1vZGVsIH0gZnJvbSAnQGFjb3JleC9tb2R1bGVzL3N1YnNjcmlwdGlvbi1tYW5hZ2VtZW50JztcbmltcG9ydCB7IEFYTVN1YnNjcmlwdGlvbk1hbmFnZW1lbnRTdWJzY3JpcHRpb25QbGFuSXRlbUVudGl0eU1vZGVsIH0gZnJvbSAnQGFjb3JleC9tb2R1bGVzL3N1YnNjcmlwdGlvbi1tYW5hZ2VtZW50JztcbmltcG9ydCB7IEFYTUFwcGxpY2F0aW9uTWFuYWdlbWVudEFwcGxpY2F0aW9uRW50aXR5TW9kZWwgfSBmcm9tICdAYWNvcmV4L21vZHVsZXMvYXBwbGljYXRpb24tbWFuYWdlbWVudCc7XG5pbXBvcnQgeyBBWFBTeXN0ZW1TdGF0dXNUeXBlIH0gZnJvbSAnQGFjb3JleC9wbGF0Zm9ybS9jb21tb24nO1xuaW1wb3J0IHsgUm9vdENvbmZpZyBhcyBUZW5hbnRSb290Q29uZmlnIH0gZnJvbSAnQGFjb3JleC9tb2R1bGVzL3RlbmFudC1tYW5hZ2VtZW50JztcbmltcG9ydCB7IFJvb3RDb25maWcgYXMgU3Vic2NyaXB0aW9uUm9vdENvbmZpZyB9IGZyb20gJ0BhY29yZXgvbW9kdWxlcy9zdWJzY3JpcHRpb24tbWFuYWdlbWVudCc7XG5pbXBvcnQgeyBSb290Q29uZmlnIGFzIEFwcGxpY2F0aW9uUm9vdENvbmZpZyB9IGZyb20gJ0BhY29yZXgvbW9kdWxlcy9hcHBsaWNhdGlvbi1tYW5hZ2VtZW50JztcblxuLy8jcmVnaW9uIC0tLS0gICBRdWVyeSBJbnB1dC9PdXRwdXQgVHlwZXMgICAtLS0tXG5cbmV4cG9ydCBpbnRlcmZhY2UgR2V0VGVuYW50QXBwbGljYXRpb25BY2Nlc3NRdWVyeUlucHV0IHtcbiAgc2tpcD86IG51bWJlcjtcbiAgdGFrZT86IG51bWJlcjtcbiAgc29ydD86IEFycmF5PHsgZmllbGQ6IHN0cmluZzsgZGlyOiAnYXNjJyB8ICdkZXNjJyB9PjtcbiAgZmlsdGVycz86IEFycmF5PHtcbiAgICBmaWVsZDogc3RyaW5nO1xuICAgIG9wZXJhdG9yOiB7IHR5cGU6IHN0cmluZyB9O1xuICAgIHZhbHVlOiBhbnk7XG4gIH0+O1xuICBsb2dpYz86ICdhbmQnIHwgJ29yJztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUZW5hbnRBcHBsaWNhdGlvbkFjY2Vzc1Jlc3VsdCB7XG4gIHRlbmFudElkOiBzdHJpbmc7XG4gIHRlbmFudE5hbWU6IHN0cmluZztcbiAgdGVuYW50U3RhdHVzOiBzdHJpbmc7XG4gIHN1YnNjcmlwdGlvbkNvdW50OiBudW1iZXI7XG4gIGFwcGxpY2F0aW9uc0NvdW50OiBudW1iZXI7XG4gIGFwcGxpY2F0aW9uc0xpc3Q6IHN0cmluZztcbiAgYWN0aXZlU3Vic2NyaXB0aW9uc0NvdW50OiBudW1iZXI7XG4gIHJlZ2lzdHJhdGlvbkRhdGU/OiBEYXRlO1xuICByZWdpc3RyYXRpb25EYXRlU3RyPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdldFRlbmFudEFwcGxpY2F0aW9uQWNjZXNzUXVlcnlSZXN1bHQge1xuICBpdGVtczogVGVuYW50QXBwbGljYXRpb25BY2Nlc3NSZXN1bHRbXTtcbiAgdG90YWw6IG51bWJlcjtcbn1cblxuLy8jZW5kcmVnaW9uXG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBHZXRUZW5hbnRBcHBsaWNhdGlvbkFjY2Vzc1F1ZXJ5XG4gIGltcGxlbWVudHMgQVhQUXVlcnk8R2V0VGVuYW50QXBwbGljYXRpb25BY2Nlc3NRdWVyeUlucHV0LCBHZXRUZW5hbnRBcHBsaWNhdGlvbkFjY2Vzc1F1ZXJ5UmVzdWx0Plxue1xuICBwcml2YXRlIHJlYWRvbmx5IGVudGl0eVNlcnZpY2UgPSBpbmplY3QoQVhQRW50aXR5U2VydmljZSk7XG4gIHByaXZhdGUgdGVuYW50U2VydmljZSA9IHRoaXMuZW50aXR5U2VydmljZVxuICAgIC53aXRoRW50aXR5KGAke1RlbmFudFJvb3RDb25maWcubW9kdWxlLm5hbWV9LiR7VGVuYW50Um9vdENvbmZpZy5lbnRpdGllcy50ZW5hbnQubmFtZX1gKVxuICAgIC5kYXRhPHN0cmluZywgQVhNVGVuYW50TWFuYWdlbWVudFRlbmFudEVudGl0eU1vZGVsPigpO1xuICBwcml2YXRlIHN1YnNjcmlwdGlvblNlcnZpY2UgPSB0aGlzLmVudGl0eVNlcnZpY2VcbiAgICAud2l0aEVudGl0eShgJHtTdWJzY3JpcHRpb25Sb290Q29uZmlnLm1vZHVsZS5uYW1lfS4ke1N1YnNjcmlwdGlvblJvb3RDb25maWcuZW50aXRpZXMuc3Vic2NyaXB0aW9uLm5hbWV9YClcbiAgICAuZGF0YTxzdHJpbmcsIEFYTVN1YnNjcmlwdGlvbk1hbmFnZW1lbnRTdWJzY3JpcHRpb25FbnRpdHlNb2RlbD4oKTtcbiAgcHJpdmF0ZSBwbGFuU2VydmljZSA9IHRoaXMuZW50aXR5U2VydmljZVxuICAgIC53aXRoRW50aXR5KGAke1N1YnNjcmlwdGlvblJvb3RDb25maWcubW9kdWxlLm5hbWV9LiR7U3Vic2NyaXB0aW9uUm9vdENvbmZpZy5lbnRpdGllcy5zdWJzY3JpcHRpb25QbGFuLm5hbWV9YClcbiAgICAuZGF0YTxzdHJpbmcsIEFYTVN1YnNjcmlwdGlvbk1hbmFnZW1lbnRTdWJzY3JpcHRpb25QbGFuRW50aXR5TW9kZWw+KCk7XG4gIHByaXZhdGUgcGxhbkl0ZW1TZXJ2aWNlID0gdGhpcy5lbnRpdHlTZXJ2aWNlXG4gICAgLndpdGhFbnRpdHkoYCR7U3Vic2NyaXB0aW9uUm9vdENvbmZpZy5tb2R1bGUubmFtZX0uJHtTdWJzY3JpcHRpb25Sb290Q29uZmlnLmVudGl0aWVzLnN1YnNjcmlwdGlvblBsYW5JdGVtLm5hbWV9YClcbiAgICAuZGF0YTxzdHJpbmcsIEFYTVN1YnNjcmlwdGlvbk1hbmFnZW1lbnRTdWJzY3JpcHRpb25QbGFuSXRlbUVudGl0eU1vZGVsPigpO1xuICBwcml2YXRlIGFwcGxpY2F0aW9uU2VydmljZSA9IHRoaXMuZW50aXR5U2VydmljZVxuICAgIC53aXRoRW50aXR5KGAke0FwcGxpY2F0aW9uUm9vdENvbmZpZy5tb2R1bGUubmFtZX0uJHtBcHBsaWNhdGlvblJvb3RDb25maWcuZW50aXRpZXMuYXBwbGljYXRpb24ubmFtZX1gKVxuICAgIC5kYXRhPHN0cmluZywgQVhNQXBwbGljYXRpb25NYW5hZ2VtZW50QXBwbGljYXRpb25FbnRpdHlNb2RlbD4oKTtcblxuICBhc3luYyBmZXRjaChpbnB1dDogR2V0VGVuYW50QXBwbGljYXRpb25BY2Nlc3NRdWVyeUlucHV0KTogUHJvbWlzZTxHZXRUZW5hbnRBcHBsaWNhdGlvbkFjY2Vzc1F1ZXJ5UmVzdWx0PiB7XG4gICAgLy8gR2V0IGFsbCB0ZW5hbnRzXG4gICAgY29uc3QgdGVuYW50c1Jlc3VsdCA9IGF3YWl0IHRoaXMudGVuYW50U2VydmljZS5xdWVyeSh7XG4gICAgICBza2lwOiAwLFxuICAgICAgdGFrZTogMTAwMDAsXG4gICAgICBmaWx0ZXI6XG4gICAgICAgIGlucHV0LmZpbHRlcnMgJiYgaW5wdXQuZmlsdGVycy5sZW5ndGggPiAwXG4gICAgICAgICAgPyAoe1xuICAgICAgICAgICAgICBsb2dpYzogaW5wdXQubG9naWMgfHwgJ2FuZCcsXG4gICAgICAgICAgICAgIGZpbHRlcnM6IGlucHV0LmZpbHRlcnMuZmlsdGVyKChmKSA9PiBmLmZpZWxkICE9PSAnZGF0ZVJhbmdlJyksXG4gICAgICAgICAgICB9IGFzIGFueSlcbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICB9KTtcblxuICAgIGxldCB0ZW5hbnRzID0gdGVuYW50c1Jlc3VsdC5pdGVtcztcblxuICAgIC8vIEFwcGx5IGRhdGUgcmFuZ2UgZmlsdGVyIGlmIHByb3ZpZGVkXG4gICAgaWYgKGlucHV0LmZpbHRlcnMpIHtcbiAgICAgIGZvciAoY29uc3QgZmlsdGVyIG9mIGlucHV0LmZpbHRlcnMpIHtcbiAgICAgICAgaWYgKGZpbHRlci5maWVsZCA9PT0gJ2RhdGVSYW5nZScgJiYgZmlsdGVyLnZhbHVlKSB7XG4gICAgICAgICAgdGVuYW50cyA9IHRoaXMuYXBwbHlEYXRlUmFuZ2VGaWx0ZXIodGVuYW50cywgZmlsdGVyLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEdldCBhbGwgc3Vic2NyaXB0aW9uc1xuICAgIGNvbnN0IHN1YnNjcmlwdGlvbnNSZXN1bHQgPSBhd2FpdCB0aGlzLnN1YnNjcmlwdGlvblNlcnZpY2UucXVlcnkoe1xuICAgICAgc2tpcDogMCxcbiAgICAgIHRha2U6IDEwMDAwLFxuICAgIH0pO1xuICAgIGNvbnN0IHN1YnNjcmlwdGlvbnMgPSBzdWJzY3JpcHRpb25zUmVzdWx0Lml0ZW1zLmZpbHRlcigocykgPT4gcy5zdWJzY3JpYmVyVHlwZSA9PT0gJ1RlbmFudCcpO1xuXG4gICAgLy8gR2V0IGFsbCBwbGFuc1xuICAgIGNvbnN0IHBsYW5zUmVzdWx0ID0gYXdhaXQgdGhpcy5wbGFuU2VydmljZS5xdWVyeSh7XG4gICAgICBza2lwOiAwLFxuICAgICAgdGFrZTogMTAwMDAsXG4gICAgfSk7XG4gICAgY29uc3QgcGxhbnMgPSBwbGFuc1Jlc3VsdC5pdGVtcztcblxuICAgIC8vIEdldCBhbGwgcGxhbiBpdGVtc1xuICAgIGNvbnN0IHBsYW5JdGVtc1Jlc3VsdCA9IGF3YWl0IHRoaXMucGxhbkl0ZW1TZXJ2aWNlLnF1ZXJ5KHtcbiAgICAgIHNraXA6IDAsXG4gICAgICB0YWtlOiAxMDAwMCxcbiAgICB9KTtcbiAgICBjb25zdCBwbGFuSXRlbXMgPSBwbGFuSXRlbXNSZXN1bHQuaXRlbXM7XG5cbiAgICAvLyBHZXQgYWxsIGFwcGxpY2F0aW9uc1xuICAgIGNvbnN0IGFwcGxpY2F0aW9uc1Jlc3VsdCA9IGF3YWl0IHRoaXMuYXBwbGljYXRpb25TZXJ2aWNlLnF1ZXJ5KHtcbiAgICAgIHNraXA6IDAsXG4gICAgICB0YWtlOiAxMDAwMCxcbiAgICB9KTtcbiAgICBjb25zdCBhcHBsaWNhdGlvbnMgPSBhcHBsaWNhdGlvbnNSZXN1bHQuaXRlbXM7XG5cbiAgICAvLyBCdWlsZCByZXN1bHRzIGZvciBlYWNoIHRlbmFudFxuICAgIGNvbnN0IHJlc3VsdHM6IFRlbmFudEFwcGxpY2F0aW9uQWNjZXNzUmVzdWx0W10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgdGVuYW50IG9mIHRlbmFudHMpIHtcbiAgICAgIC8vIEdldCB0ZW5hbnQncyBzdWJzY3JpcHRpb25zXG4gICAgICBjb25zdCB0ZW5hbnRTdWJzY3JpcHRpb25zID0gc3Vic2NyaXB0aW9ucy5maWx0ZXIoKHMpID0+IHMuc3Vic2NyaWJlcklkID09PSB0ZW5hbnQuaWQpO1xuXG4gICAgICAvLyBHZXQgdW5pcXVlIGFwcGxpY2F0aW9ucyB0aHJvdWdoIHN1YnNjcmlwdGlvbnMg4oaSIHBsYW5zIOKGkiBwbGFuIGl0ZW1zIOKGkiBlZGl0aW9ucyDihpIgYXBwbGljYXRpb25zXG4gICAgICBjb25zdCBhcHBsaWNhdGlvblNldCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgY29uc3QgYXBwbGljYXRpb25OYW1lczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgZm9yIChjb25zdCBzdWJzY3JpcHRpb24gb2YgdGVuYW50U3Vic2NyaXB0aW9ucykge1xuICAgICAgICBpZiAoIXN1YnNjcmlwdGlvbi5wbGFuSWQpIGNvbnRpbnVlO1xuXG4gICAgICAgIC8vIEdldCBwbGFuIGl0ZW1zIGZvciB0aGlzIHBsYW5cbiAgICAgICAgY29uc3QgcGxhblBsYW5JdGVtcyA9IHBsYW5JdGVtcy5maWx0ZXIoKHBpKSA9PiBwaS5wbGFuSWQgPT09IHN1YnNjcmlwdGlvbi5wbGFuSWQpO1xuXG4gICAgICAgIGZvciAoY29uc3QgcGxhbkl0ZW0gb2YgcGxhblBsYW5JdGVtcykge1xuICAgICAgICAgIGlmICghcGxhbkl0ZW0uZWRpdGlvbklkKSBjb250aW51ZTtcblxuICAgICAgICAgIC8vIEZpbmQgYXBwbGljYXRpb25zIHRoYXQgaGF2ZSB0aGlzIGVkaXRpb25cbiAgICAgICAgICBmb3IgKGNvbnN0IGFwcGxpY2F0aW9uIG9mIGFwcGxpY2F0aW9ucykge1xuICAgICAgICAgICAgaWYgKGFwcGxpY2F0aW9uLmVkaXRpb25JZHMgJiYgYXBwbGljYXRpb24uZWRpdGlvbklkcy5pbmNsdWRlcyhwbGFuSXRlbS5lZGl0aW9uSWQpKSB7XG4gICAgICAgICAgICAgIGlmICghYXBwbGljYXRpb25TZXQuaGFzKGFwcGxpY2F0aW9uLmlkKSkge1xuICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uU2V0LmFkZChhcHBsaWNhdGlvbi5pZCk7XG4gICAgICAgICAgICAgICAgYXBwbGljYXRpb25OYW1lcy5wdXNoKGFwcGxpY2F0aW9uLnRpdGxlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBDb3VudCBhY3RpdmUgc3Vic2NyaXB0aW9uc1xuICAgICAgY29uc3QgYWN0aXZlU3Vic2NyaXB0aW9ucyA9IHRlbmFudFN1YnNjcmlwdGlvbnMuZmlsdGVyKFxuICAgICAgICAocykgPT4gcy5zdGF0dXNJZCA9PT0gQVhQU3lzdGVtU3RhdHVzVHlwZS5BY3RpdmVcbiAgICAgICk7XG5cbiAgICAgIHJlc3VsdHMucHVzaCh7XG4gICAgICAgIHRlbmFudElkOiB0ZW5hbnQuaWQsXG4gICAgICAgIHRlbmFudE5hbWU6IHRlbmFudC50aXRsZSxcbiAgICAgICAgdGVuYW50U3RhdHVzOiB0ZW5hbnQuc3RhdHVzSWQgfHwgJ1Vua25vd24nLFxuICAgICAgICBzdWJzY3JpcHRpb25Db3VudDogdGVuYW50U3Vic2NyaXB0aW9ucy5sZW5ndGgsXG4gICAgICAgIGFwcGxpY2F0aW9uc0NvdW50OiBhcHBsaWNhdGlvblNldC5zaXplLFxuICAgICAgICBhcHBsaWNhdGlvbnNMaXN0OiBhcHBsaWNhdGlvbk5hbWVzLmpvaW4oJywgJyksXG4gICAgICAgIGFjdGl2ZVN1YnNjcmlwdGlvbnNDb3VudDogYWN0aXZlU3Vic2NyaXB0aW9ucy5sZW5ndGgsXG4gICAgICAgIHJlZ2lzdHJhdGlvbkRhdGU6IHRlbmFudC5yZWdpc3RyYXRpb25EYXRlLFxuICAgICAgICByZWdpc3RyYXRpb25EYXRlU3RyOiB0ZW5hbnQucmVnaXN0cmF0aW9uRGF0ZT8udG9JU09TdHJpbmcoKSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEFwcGx5IHNvcnRpbmcgaWYgcHJvdmlkZWRcbiAgICBpZiAoaW5wdXQuc29ydCAmJiBpbnB1dC5zb3J0Lmxlbmd0aCA+IDApIHtcbiAgICAgIHJlc3VsdHMuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IHNvcnRGaWVsZCBvZiBpbnB1dC5zb3J0ISkge1xuICAgICAgICAgIGNvbnN0IGZpZWxkID0gc29ydEZpZWxkLmZpZWxkIGFzIGtleW9mIFRlbmFudEFwcGxpY2F0aW9uQWNjZXNzUmVzdWx0O1xuICAgICAgICAgIGNvbnN0IGFWYWx1ZSA9IGFbZmllbGRdO1xuICAgICAgICAgIGNvbnN0IGJWYWx1ZSA9IGJbZmllbGRdO1xuICAgICAgICAgIGNvbnN0IGRpciA9IHNvcnRGaWVsZC5kaXIgPT09ICdhc2MnID8gMSA6IC0xO1xuXG4gICAgICAgICAgaWYgKGFWYWx1ZSA9PT0gdW5kZWZpbmVkICYmIGJWYWx1ZSA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICAgICAgICBpZiAoYVZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiAxICogZGlyO1xuICAgICAgICAgIGlmIChiVmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIC0xICogZGlyO1xuXG4gICAgICAgICAgaWYgKGFWYWx1ZSA8IGJWYWx1ZSkgcmV0dXJuIC0xICogZGlyO1xuICAgICAgICAgIGlmIChhVmFsdWUgPiBiVmFsdWUpIHJldHVybiAxICogZGlyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIERlZmF1bHQgc29ydCBieSB0ZW5hbnQgbmFtZVxuICAgICAgcmVzdWx0cy5zb3J0KChhLCBiKSA9PiBhLnRlbmFudE5hbWUubG9jYWxlQ29tcGFyZShiLnRlbmFudE5hbWUpKTtcbiAgICB9XG5cbiAgICAvLyBBcHBseSBwYWdpbmF0aW9uXG4gICAgY29uc3Qgc2tpcCA9IGlucHV0LnNraXAgfHwgMDtcbiAgICBjb25zdCB0YWtlID0gaW5wdXQudGFrZSB8fCAxMDtcbiAgICBjb25zdCB0b3RhbCA9IHJlc3VsdHMubGVuZ3RoO1xuICAgIGNvbnN0IGl0ZW1zID0gcmVzdWx0cy5zbGljZShza2lwLCBza2lwICsgdGFrZSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgaXRlbXMsXG4gICAgICB0b3RhbCxcbiAgICB9O1xuICB9XG5cbiAgLy8jcmVnaW9uIC0tLS0gICBDdXN0b20gRmlsdGVyIEhhbmRsZXJzICAgLS0tLVxuXG4gIC8qKlxuICAgKiBBcHBseSBkYXRlIHJhbmdlIGZpbHRlciB0byB0ZW5hbnRzXG4gICAqL1xuICBwcml2YXRlIGFwcGx5RGF0ZVJhbmdlRmlsdGVyKFxuICAgIHRlbmFudHM6IEFYTVRlbmFudE1hbmFnZW1lbnRUZW5hbnRFbnRpdHlNb2RlbFtdLFxuICAgIGRhdGVSYW5nZTogYW55XG4gICk6IEFYTVRlbmFudE1hbmFnZW1lbnRUZW5hbnRFbnRpdHlNb2RlbFtdIHtcbiAgICBpZiAoIWRhdGVSYW5nZSB8fCAhZGF0ZVJhbmdlLnN0YXJ0IHx8ICFkYXRlUmFuZ2UuZW5kKSB7XG4gICAgICByZXR1cm4gdGVuYW50cztcbiAgICB9XG5cbiAgICBjb25zdCBzdGFydERhdGUgPSBuZXcgRGF0ZShkYXRlUmFuZ2Uuc3RhcnQpO1xuICAgIGNvbnN0IGVuZERhdGUgPSBuZXcgRGF0ZShkYXRlUmFuZ2UuZW5kKTtcbiAgICBlbmREYXRlLnNldEhvdXJzKDIzLCA1OSwgNTksIDk5OSk7XG5cbiAgICByZXR1cm4gdGVuYW50cy5maWx0ZXIoKHRlbmFudCkgPT4ge1xuICAgICAgaWYgKCF0ZW5hbnQucmVnaXN0cmF0aW9uRGF0ZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3QgcmVnRGF0ZSA9IG5ldyBEYXRlKHRlbmFudC5yZWdpc3RyYXRpb25EYXRlKTtcbiAgICAgIHJldHVybiByZWdEYXRlID49IHN0YXJ0RGF0ZSAmJiByZWdEYXRlIDw9IGVuZERhdGU7XG4gICAgfSk7XG4gIH1cblxuICAvLyNlbmRyZWdpb25cbn1cblxuIl19"],"names":["TenantRootConfig","SubscriptionRootConfig","ApplicationRootConfig"],"mappings":"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"}
|
package/fesm2022/acorex-connectivity-mock-get-tenant-registration-chart-data.query-DlXi4Rcg.mjs
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { inject, Injectable } from '@angular/core';
|
|
3
|
+
import { GetTenantRegistrationTimelineQuery } from './acorex-connectivity-mock-get-tenant-registration-timeline.query-hskw8Ioa.mjs';
|
|
4
|
+
|
|
5
|
+
//#endregion
|
|
6
|
+
class GetTenantRegistrationChartDataQuery {
|
|
7
|
+
constructor() {
|
|
8
|
+
this.tenantRegistrationTimelineQuery = inject(GetTenantRegistrationTimelineQuery);
|
|
9
|
+
}
|
|
10
|
+
async fetch(input) {
|
|
11
|
+
// Get all tenant registration timeline data (no pagination for charts)
|
|
12
|
+
const timelineResult = await this.tenantRegistrationTimelineQuery.fetch({
|
|
13
|
+
skip: 0,
|
|
14
|
+
take: 10000,
|
|
15
|
+
filters: input.filters,
|
|
16
|
+
logic: input.logic,
|
|
17
|
+
});
|
|
18
|
+
// Group by month
|
|
19
|
+
const monthGroups = new Map();
|
|
20
|
+
for (const item of timelineResult.items) {
|
|
21
|
+
const monthKey = `${item.year}-${String(item.monthNumber).padStart(2, '0')}`;
|
|
22
|
+
if (!monthGroups.has(monthKey)) {
|
|
23
|
+
monthGroups.set(monthKey, {
|
|
24
|
+
month: item.month,
|
|
25
|
+
year: item.year,
|
|
26
|
+
quarter: item.quarter,
|
|
27
|
+
tenantCount: 0,
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
const group = monthGroups.get(monthKey);
|
|
31
|
+
group.tenantCount++;
|
|
32
|
+
}
|
|
33
|
+
// Convert to array and sort by date
|
|
34
|
+
const results = Array.from(monthGroups.values()).sort((a, b) => {
|
|
35
|
+
if (a.year !== b.year)
|
|
36
|
+
return a.year - b.year;
|
|
37
|
+
const monthA = new Date(`${a.month} 1, ${a.year}`).getMonth();
|
|
38
|
+
const monthB = new Date(`${b.month} 1, ${b.year}`).getMonth();
|
|
39
|
+
return monthA - monthB;
|
|
40
|
+
});
|
|
41
|
+
return {
|
|
42
|
+
items: results,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: GetTenantRegistrationChartDataQuery, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
46
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: GetTenantRegistrationChartDataQuery, providedIn: 'root' }); }
|
|
47
|
+
}
|
|
48
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: GetTenantRegistrationChartDataQuery, decorators: [{
|
|
49
|
+
type: Injectable,
|
|
50
|
+
args: [{
|
|
51
|
+
providedIn: 'root',
|
|
52
|
+
}]
|
|
53
|
+
}] });
|
|
54
|
+
|
|
55
|
+
export { GetTenantRegistrationChartDataQuery };
|
|
56
|
+
//# sourceMappingURL=acorex-connectivity-mock-get-tenant-registration-chart-data.query-DlXi4Rcg.mjs.map
|
package/fesm2022/acorex-connectivity-mock-get-tenant-registration-chart-data.query-DlXi4Rcg.mjs.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acorex-connectivity-mock-get-tenant-registration-chart-data.query-DlXi4Rcg.mjs","sources":["../tmp-esm2022/mock/lib/tenant-management/reports/get-tenant-registration-chart-data.query.js"],"sourcesContent":["import { inject, Injectable } from '@angular/core';\nimport { GetTenantRegistrationTimelineQuery } from './get-tenant-registration-timeline.query';\nimport * as i0 from \"@angular/core\";\n//#endregion\nexport class GetTenantRegistrationChartDataQuery {\n constructor() {\n this.tenantRegistrationTimelineQuery = inject(GetTenantRegistrationTimelineQuery);\n }\n async fetch(input) {\n // Get all tenant registration timeline data (no pagination for charts)\n const timelineResult = await this.tenantRegistrationTimelineQuery.fetch({\n skip: 0,\n take: 10000,\n filters: input.filters,\n logic: input.logic,\n });\n // Group by month\n const monthGroups = new Map();\n for (const item of timelineResult.items) {\n const monthKey = `${item.year}-${String(item.monthNumber).padStart(2, '0')}`;\n if (!monthGroups.has(monthKey)) {\n monthGroups.set(monthKey, {\n month: item.month,\n year: item.year,\n quarter: item.quarter,\n tenantCount: 0,\n });\n }\n const group = monthGroups.get(monthKey);\n group.tenantCount++;\n }\n // Convert to array and sort by date\n const results = Array.from(monthGroups.values()).sort((a, b) => {\n if (a.year !== b.year)\n return a.year - b.year;\n const monthA = new Date(`${a.month} 1, ${a.year}`).getMonth();\n const monthB = new Date(`${b.month} 1, ${b.year}`).getMonth();\n return monthA - monthB;\n });\n return {\n items: results,\n };\n }\n static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.12\", ngImport: i0, type: GetTenantRegistrationChartDataQuery, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }\n static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"20.3.12\", ngImport: i0, type: GetTenantRegistrationChartDataQuery, providedIn: 'root' }); }\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.3.12\", ngImport: i0, type: GetTenantRegistrationChartDataQuery, decorators: [{\n type: Injectable,\n args: [{\n providedIn: 'root',\n }]\n }] });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0LXRlbmFudC1yZWdpc3RyYXRpb24tY2hhcnQtZGF0YS5xdWVyeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29ubmVjdGl2aXR5L21vY2svc3JjL2xpYi90ZW5hbnQtbWFuYWdlbWVudC9yZXBvcnRzL2dldC10ZW5hbnQtcmVnaXN0cmF0aW9uLWNoYXJ0LWRhdGEucXVlcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHbkQsT0FBTyxFQUFFLGtDQUFrQyxFQUFFLE1BQU0sMENBQTBDLENBQUM7O0FBd0I5RixZQUFZO0FBS1osTUFBTSxPQUFPLG1DQUFtQztJQUhoRDtRQU1tQixvQ0FBK0IsR0FBRyxNQUFNLENBQUMsa0NBQWtDLENBQUMsQ0FBQztLQTBDL0Y7SUF4Q0MsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUErQztRQUN6RCx1RUFBdUU7UUFDdkUsTUFBTSxjQUFjLEdBQUcsTUFBTSxJQUFJLENBQUMsK0JBQStCLENBQUMsS0FBSyxDQUFDO1lBQ3RFLElBQUksRUFBRSxDQUFDO1lBQ1AsSUFBSSxFQUFFLEtBQUs7WUFDWCxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU87WUFDdEIsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLO1NBQ25CLENBQUMsQ0FBQztRQUVILGlCQUFpQjtRQUNqQixNQUFNLFdBQVcsR0FBRyxJQUFJLEdBQUcsRUFBNkMsQ0FBQztRQUV6RSxLQUFLLE1BQU0sSUFBSSxJQUFJLGNBQWMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUN4QyxNQUFNLFFBQVEsR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFFN0UsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztnQkFDL0IsV0FBVyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUU7b0JBQ3hCLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztvQkFDakIsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO29CQUNmLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztvQkFDckIsV0FBVyxFQUFFLENBQUM7aUJBQ2YsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztZQUVELE1BQU0sS0FBSyxHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFFLENBQUM7WUFDekMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3RCLENBQUM7UUFFRCxvQ0FBb0M7UUFDcEMsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDN0QsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxJQUFJO2dCQUFFLE9BQU8sQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQzlDLE1BQU0sTUFBTSxHQUFHLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUM5RCxNQUFNLE1BQU0sR0FBRyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDOUQsT0FBTyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3pCLENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTztZQUNMLEtBQUssRUFBRSxPQUFPO1NBQ2YsQ0FBQztJQUNKLENBQUM7K0dBNUNVLG1DQUFtQzttSEFBbkMsbUNBQW1DLGNBRmxDLE1BQU07OzRGQUVQLG1DQUFtQztrQkFIL0MsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFYUFF1ZXJ5IH0gZnJvbSAnQGFjb3JleC9wbGF0Zm9ybS9ydW50aW1lJztcbmltcG9ydCB7IEdldFRlbmFudFJlZ2lzdHJhdGlvblRpbWVsaW5lUXVlcnlJbnB1dCB9IGZyb20gJy4vZ2V0LXRlbmFudC1yZWdpc3RyYXRpb24tdGltZWxpbmUucXVlcnknO1xuaW1wb3J0IHsgR2V0VGVuYW50UmVnaXN0cmF0aW9uVGltZWxpbmVRdWVyeSB9IGZyb20gJy4vZ2V0LXRlbmFudC1yZWdpc3RyYXRpb24tdGltZWxpbmUucXVlcnknO1xuXG4vLyNyZWdpb24gLS0tLSAgIFF1ZXJ5IElucHV0L091dHB1dCBUeXBlcyAgIC0tLS1cblxuZXhwb3J0IGludGVyZmFjZSBHZXRUZW5hbnRSZWdpc3RyYXRpb25DaGFydERhdGFRdWVyeUlucHV0IHtcbiAgZmlsdGVycz86IEFycmF5PHtcbiAgICBmaWVsZDogc3RyaW5nO1xuICAgIG9wZXJhdG9yOiB7IHR5cGU6IHN0cmluZyB9O1xuICAgIHZhbHVlOiBhbnk7XG4gIH0+O1xuICBsb2dpYz86ICdhbmQnIHwgJ29yJztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUZW5hbnRSZWdpc3RyYXRpb25DaGFydERhdGFSZXN1bHQge1xuICBtb250aDogc3RyaW5nO1xuICB5ZWFyOiBudW1iZXI7XG4gIHF1YXJ0ZXI6IHN0cmluZztcbiAgdGVuYW50Q291bnQ6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHZXRUZW5hbnRSZWdpc3RyYXRpb25DaGFydERhdGFRdWVyeVJlc3VsdCB7XG4gIGl0ZW1zOiBUZW5hbnRSZWdpc3RyYXRpb25DaGFydERhdGFSZXN1bHRbXTtcbn1cblxuLy8jZW5kcmVnaW9uXG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBHZXRUZW5hbnRSZWdpc3RyYXRpb25DaGFydERhdGFRdWVyeVxuICBpbXBsZW1lbnRzIEFYUFF1ZXJ5PEdldFRlbmFudFJlZ2lzdHJhdGlvbkNoYXJ0RGF0YVF1ZXJ5SW5wdXQsIEdldFRlbmFudFJlZ2lzdHJhdGlvbkNoYXJ0RGF0YVF1ZXJ5UmVzdWx0Plxue1xuICBwcml2YXRlIHJlYWRvbmx5IHRlbmFudFJlZ2lzdHJhdGlvblRpbWVsaW5lUXVlcnkgPSBpbmplY3QoR2V0VGVuYW50UmVnaXN0cmF0aW9uVGltZWxpbmVRdWVyeSk7XG5cbiAgYXN5bmMgZmV0Y2goaW5wdXQ6IEdldFRlbmFudFJlZ2lzdHJhdGlvbkNoYXJ0RGF0YVF1ZXJ5SW5wdXQpOiBQcm9taXNlPEdldFRlbmFudFJlZ2lzdHJhdGlvbkNoYXJ0RGF0YVF1ZXJ5UmVzdWx0PiB7XG4gICAgLy8gR2V0IGFsbCB0ZW5hbnQgcmVnaXN0cmF0aW9uIHRpbWVsaW5lIGRhdGEgKG5vIHBhZ2luYXRpb24gZm9yIGNoYXJ0cylcbiAgICBjb25zdCB0aW1lbGluZVJlc3VsdCA9IGF3YWl0IHRoaXMudGVuYW50UmVnaXN0cmF0aW9uVGltZWxpbmVRdWVyeS5mZXRjaCh7XG4gICAgICBza2lwOiAwLFxuICAgICAgdGFrZTogMTAwMDAsXG4gICAgICBmaWx0ZXJzOiBpbnB1dC5maWx0ZXJzLFxuICAgICAgbG9naWM6IGlucHV0LmxvZ2ljLFxuICAgIH0pO1xuXG4gICAgLy8gR3JvdXAgYnkgbW9udGhcbiAgICBjb25zdCBtb250aEdyb3VwcyA9IG5ldyBNYXA8c3RyaW5nLCBUZW5hbnRSZWdpc3RyYXRpb25DaGFydERhdGFSZXN1bHQ+KCk7XG5cbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGltZWxpbmVSZXN1bHQuaXRlbXMpIHtcbiAgICAgIGNvbnN0IG1vbnRoS2V5ID0gYCR7aXRlbS55ZWFyfS0ke1N0cmluZyhpdGVtLm1vbnRoTnVtYmVyKS5wYWRTdGFydCgyLCAnMCcpfWA7XG5cbiAgICAgIGlmICghbW9udGhHcm91cHMuaGFzKG1vbnRoS2V5KSkge1xuICAgICAgICBtb250aEdyb3Vwcy5zZXQobW9udGhLZXksIHtcbiAgICAgICAgICBtb250aDogaXRlbS5tb250aCxcbiAgICAgICAgICB5ZWFyOiBpdGVtLnllYXIsXG4gICAgICAgICAgcXVhcnRlcjogaXRlbS5xdWFydGVyLFxuICAgICAgICAgIHRlbmFudENvdW50OiAwLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZ3JvdXAgPSBtb250aEdyb3Vwcy5nZXQobW9udGhLZXkpITtcbiAgICAgIGdyb3VwLnRlbmFudENvdW50Kys7XG4gICAgfVxuXG4gICAgLy8gQ29udmVydCB0byBhcnJheSBhbmQgc29ydCBieSBkYXRlXG4gICAgY29uc3QgcmVzdWx0cyA9IEFycmF5LmZyb20obW9udGhHcm91cHMudmFsdWVzKCkpLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgIGlmIChhLnllYXIgIT09IGIueWVhcikgcmV0dXJuIGEueWVhciAtIGIueWVhcjtcbiAgICAgIGNvbnN0IG1vbnRoQSA9IG5ldyBEYXRlKGAke2EubW9udGh9IDEsICR7YS55ZWFyfWApLmdldE1vbnRoKCk7XG4gICAgICBjb25zdCBtb250aEIgPSBuZXcgRGF0ZShgJHtiLm1vbnRofSAxLCAke2IueWVhcn1gKS5nZXRNb250aCgpO1xuICAgICAgcmV0dXJuIG1vbnRoQSAtIG1vbnRoQjtcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICBpdGVtczogcmVzdWx0cyxcbiAgICB9O1xuICB9XG59XG5cbiJdfQ=="],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { inject, Injectable } from '@angular/core';
|
|
3
|
+
import { AXPEntityService } from '@acorex/platform/layout/entity';
|
|
4
|
+
import { RootConfig } from '@acorex/modules/tenant-management';
|
|
5
|
+
import { RootConfig as RootConfig$1 } from '@acorex/modules/subscription-management';
|
|
6
|
+
import { RootConfig as RootConfig$2 } from '@acorex/modules/application-management';
|
|
7
|
+
|
|
8
|
+
//#endregion
|
|
9
|
+
class GetTenantRegistrationTimelineQuery {
|
|
10
|
+
constructor() {
|
|
11
|
+
this.entityService = inject(AXPEntityService);
|
|
12
|
+
this.tenantService = this.entityService
|
|
13
|
+
.withEntity(`${RootConfig.module.name}.${RootConfig.entities.tenant.name}`)
|
|
14
|
+
.data();
|
|
15
|
+
this.tenantUserService = this.entityService
|
|
16
|
+
.withEntity(`${RootConfig.module.name}.${RootConfig.entities.tenantUser.name}`)
|
|
17
|
+
.data();
|
|
18
|
+
this.subscriptionService = this.entityService
|
|
19
|
+
.withEntity(`${RootConfig$1.module.name}.${RootConfig$1.entities.subscription.name}`)
|
|
20
|
+
.data();
|
|
21
|
+
this.planItemService = this.entityService
|
|
22
|
+
.withEntity(`${RootConfig$1.module.name}.${RootConfig$1.entities.subscriptionPlanItem.name}`)
|
|
23
|
+
.data();
|
|
24
|
+
this.applicationService = this.entityService
|
|
25
|
+
.withEntity(`${RootConfig$2.module.name}.${RootConfig$2.entities.application.name}`)
|
|
26
|
+
.data();
|
|
27
|
+
}
|
|
28
|
+
async fetch(input) {
|
|
29
|
+
// Get all tenants
|
|
30
|
+
const tenantsResult = await this.tenantService.query({
|
|
31
|
+
skip: 0,
|
|
32
|
+
take: 10000,
|
|
33
|
+
filter: input.filters && input.filters.length > 0
|
|
34
|
+
? {
|
|
35
|
+
logic: input.logic || 'and',
|
|
36
|
+
filters: input.filters.filter((f) => f.field !== 'dateRange'),
|
|
37
|
+
}
|
|
38
|
+
: undefined,
|
|
39
|
+
});
|
|
40
|
+
let tenants = tenantsResult.items.filter((t) => t.registrationDate);
|
|
41
|
+
// Apply date range filter if provided
|
|
42
|
+
if (input.filters) {
|
|
43
|
+
for (const filter of input.filters) {
|
|
44
|
+
if (filter.field === 'dateRange' && filter.value) {
|
|
45
|
+
tenants = this.applyDateRangeFilter(tenants, filter.value);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
// Get all tenant users for counting
|
|
50
|
+
const tenantUsersResult = await this.tenantUserService.query({
|
|
51
|
+
skip: 0,
|
|
52
|
+
take: 10000,
|
|
53
|
+
});
|
|
54
|
+
const tenantUsers = tenantUsersResult.items;
|
|
55
|
+
// Get all subscriptions for counting
|
|
56
|
+
const subscriptionsResult = await this.subscriptionService.query({
|
|
57
|
+
skip: 0,
|
|
58
|
+
take: 10000,
|
|
59
|
+
});
|
|
60
|
+
const subscriptions = subscriptionsResult.items.filter((s) => s.subscriberType === 'Tenant');
|
|
61
|
+
// Get all plan items and applications for application counting
|
|
62
|
+
const planItemsResult = await this.planItemService.query({
|
|
63
|
+
skip: 0,
|
|
64
|
+
take: 10000,
|
|
65
|
+
});
|
|
66
|
+
const planItems = planItemsResult.items;
|
|
67
|
+
const applicationsResult = await this.applicationService.query({
|
|
68
|
+
skip: 0,
|
|
69
|
+
take: 10000,
|
|
70
|
+
});
|
|
71
|
+
const applications = applicationsResult.items;
|
|
72
|
+
// Get application counts for tenants
|
|
73
|
+
const applicationCounts = await this.getApplicationCountsForTenants(tenants.map((t) => t.id), subscriptions, planItems, applications);
|
|
74
|
+
// Build results
|
|
75
|
+
const results = [];
|
|
76
|
+
for (const tenant of tenants) {
|
|
77
|
+
if (!tenant.registrationDate)
|
|
78
|
+
continue;
|
|
79
|
+
const registrationDate = new Date(tenant.registrationDate);
|
|
80
|
+
// Extract time period info
|
|
81
|
+
const year = registrationDate.getFullYear();
|
|
82
|
+
const month = registrationDate.getMonth() + 1;
|
|
83
|
+
const monthName = registrationDate.toLocaleString('en-US', { month: 'long' });
|
|
84
|
+
const quarter = Math.ceil(month / 3);
|
|
85
|
+
const quarterName = `Q${quarter}`;
|
|
86
|
+
// Count users for this tenant
|
|
87
|
+
const userCount = tenantUsers.filter((tu) => tu.tenantId === tenant.id).length;
|
|
88
|
+
// Count subscriptions for this tenant
|
|
89
|
+
const subscriptionCount = subscriptions.filter((s) => s.subscriberId === tenant.id).length;
|
|
90
|
+
// Get application count
|
|
91
|
+
const applicationCount = applicationCounts.get(tenant.id) || 0;
|
|
92
|
+
results.push({
|
|
93
|
+
tenantId: tenant.id,
|
|
94
|
+
tenantName: tenant.title,
|
|
95
|
+
registrationDate: registrationDate,
|
|
96
|
+
registrationDateStr: registrationDate.toISOString(),
|
|
97
|
+
status: tenant.statusId || 'Unknown',
|
|
98
|
+
country: tenant.country?.title,
|
|
99
|
+
userCount: userCount,
|
|
100
|
+
applicationCount: applicationCount,
|
|
101
|
+
subscriptionCount: subscriptionCount,
|
|
102
|
+
month: monthName,
|
|
103
|
+
monthNumber: month,
|
|
104
|
+
quarter: quarterName,
|
|
105
|
+
year: year,
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
// Apply sorting if provided
|
|
109
|
+
if (input.sort && input.sort.length > 0) {
|
|
110
|
+
results.sort((a, b) => {
|
|
111
|
+
for (const sortField of input.sort) {
|
|
112
|
+
const field = sortField.field;
|
|
113
|
+
const aValue = a[field];
|
|
114
|
+
const bValue = b[field];
|
|
115
|
+
const dir = sortField.dir === 'asc' ? 1 : -1;
|
|
116
|
+
if (aValue === undefined && bValue === undefined)
|
|
117
|
+
continue;
|
|
118
|
+
if (aValue === undefined)
|
|
119
|
+
return 1 * dir;
|
|
120
|
+
if (bValue === undefined)
|
|
121
|
+
return -1 * dir;
|
|
122
|
+
// Handle date comparison
|
|
123
|
+
if (field === 'registrationDate') {
|
|
124
|
+
const aDate = a.registrationDate.getTime();
|
|
125
|
+
const bDate = b.registrationDate.getTime();
|
|
126
|
+
if (aDate < bDate)
|
|
127
|
+
return -1 * dir;
|
|
128
|
+
if (aDate > bDate)
|
|
129
|
+
return 1 * dir;
|
|
130
|
+
continue;
|
|
131
|
+
}
|
|
132
|
+
if (aValue < bValue)
|
|
133
|
+
return -1 * dir;
|
|
134
|
+
if (aValue > bValue)
|
|
135
|
+
return 1 * dir;
|
|
136
|
+
}
|
|
137
|
+
return 0;
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
// Default sort by registration date descending (newest first)
|
|
142
|
+
results.sort((a, b) => {
|
|
143
|
+
return b.registrationDate.getTime() - a.registrationDate.getTime();
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
// Apply pagination
|
|
147
|
+
const skip = input.skip || 0;
|
|
148
|
+
const take = input.take || 10;
|
|
149
|
+
const total = results.length;
|
|
150
|
+
const items = results.slice(skip, skip + take);
|
|
151
|
+
return {
|
|
152
|
+
items,
|
|
153
|
+
total,
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
//#region ---- Helper Methods ----
|
|
157
|
+
/**
|
|
158
|
+
* Get application counts for tenants
|
|
159
|
+
*/
|
|
160
|
+
async getApplicationCountsForTenants(tenantIds, subscriptions, planItems, applications) {
|
|
161
|
+
const counts = new Map();
|
|
162
|
+
for (const tenantId of tenantIds) {
|
|
163
|
+
const tenantSubscriptions = subscriptions.filter((s) => s.subscriberId === tenantId);
|
|
164
|
+
// Get unique applications through subscriptions → plans → plan items → editions → applications
|
|
165
|
+
const applicationSet = new Set();
|
|
166
|
+
for (const subscription of tenantSubscriptions) {
|
|
167
|
+
if (!subscription.planId)
|
|
168
|
+
continue;
|
|
169
|
+
// Get plan items for this plan
|
|
170
|
+
const planPlanItems = planItems.filter((pi) => pi.planId === subscription.planId);
|
|
171
|
+
for (const planItem of planPlanItems) {
|
|
172
|
+
if (!planItem.editionId)
|
|
173
|
+
continue;
|
|
174
|
+
// Find applications that have this edition
|
|
175
|
+
for (const application of applications) {
|
|
176
|
+
if (application.editionIds && application.editionIds.includes(planItem.editionId)) {
|
|
177
|
+
applicationSet.add(application.id);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
counts.set(tenantId, applicationSet.size);
|
|
183
|
+
}
|
|
184
|
+
return counts;
|
|
185
|
+
}
|
|
186
|
+
//#endregion
|
|
187
|
+
//#region ---- Custom Filter Handlers ----
|
|
188
|
+
/**
|
|
189
|
+
* Apply date range filter to tenants
|
|
190
|
+
*/
|
|
191
|
+
applyDateRangeFilter(tenants, dateRange) {
|
|
192
|
+
if (!dateRange || !dateRange.start || !dateRange.end) {
|
|
193
|
+
return tenants;
|
|
194
|
+
}
|
|
195
|
+
const startDate = new Date(dateRange.start);
|
|
196
|
+
const endDate = new Date(dateRange.end);
|
|
197
|
+
endDate.setHours(23, 59, 59, 999);
|
|
198
|
+
return tenants.filter((tenant) => {
|
|
199
|
+
if (!tenant.registrationDate)
|
|
200
|
+
return false;
|
|
201
|
+
const regDate = new Date(tenant.registrationDate);
|
|
202
|
+
return regDate >= startDate && regDate <= endDate;
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: GetTenantRegistrationTimelineQuery, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
206
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: GetTenantRegistrationTimelineQuery, providedIn: 'root' }); }
|
|
207
|
+
}
|
|
208
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: GetTenantRegistrationTimelineQuery, decorators: [{
|
|
209
|
+
type: Injectable,
|
|
210
|
+
args: [{
|
|
211
|
+
providedIn: 'root',
|
|
212
|
+
}]
|
|
213
|
+
}] });
|
|
214
|
+
|
|
215
|
+
export { GetTenantRegistrationTimelineQuery };
|
|
216
|
+
//# sourceMappingURL=acorex-connectivity-mock-get-tenant-registration-timeline.query-hskw8Ioa.mjs.map
|