@researchdatabox/redbox-core 0.0.1-beta.9700 → 0.0.1-beta.9873

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (125) hide show
  1. package/dist/HarvestRunService.d.ts +49 -0
  2. package/dist/HarvestRunService.d.ts.map +1 -0
  3. package/dist/HarvestRunService.js +13 -0
  4. package/dist/api-routes/groups/harvest-runs.d.ts +5 -0
  5. package/dist/api-routes/groups/harvest-runs.d.ts.map +1 -0
  6. package/dist/api-routes/groups/harvest-runs.js +79 -0
  7. package/dist/api-routes/groups/named-query.d.ts +8 -0
  8. package/dist/api-routes/groups/named-query.d.ts.map +1 -0
  9. package/dist/api-routes/groups/named-query.js +54 -0
  10. package/dist/api-routes/groups/records.d.ts.map +1 -1
  11. package/dist/api-routes/groups/records.js +6 -2
  12. package/dist/api-routes/groups/reports.d.ts +6 -0
  13. package/dist/api-routes/groups/reports.d.ts.map +1 -1
  14. package/dist/api-routes/groups/reports.js +45 -2
  15. package/dist/api-routes/groups/users.js +3 -3
  16. package/dist/api-routes/index.d.ts +2 -0
  17. package/dist/api-routes/index.d.ts.map +1 -1
  18. package/dist/api-routes/index.js +3 -1
  19. package/dist/api-routes/openapi.d.ts +0 -1
  20. package/dist/api-routes/openapi.d.ts.map +1 -1
  21. package/dist/api-routes/openapi.js +27 -8
  22. package/dist/api-routes/route-registry.d.ts.map +1 -1
  23. package/dist/api-routes/route-registry.js +5 -1
  24. package/dist/api-routes/route-resolution.d.ts.map +1 -1
  25. package/dist/api-routes/route-resolution.js +15 -1
  26. package/dist/api-routes/schemas/common.d.ts +1 -2
  27. package/dist/api-routes/schemas/common.d.ts.map +1 -1
  28. package/dist/api-routes/schemas/common.js +10 -11
  29. package/dist/api-routes/schemas/responses.d.ts +6635 -1887
  30. package/dist/api-routes/schemas/responses.d.ts.map +1 -1
  31. package/dist/api-routes/schemas/responses.js +364 -269
  32. package/dist/api-routes/zod-openapi.d.ts +3 -0
  33. package/dist/api-routes/zod-openapi.d.ts.map +1 -0
  34. package/dist/api-routes/zod-openapi.js +8 -0
  35. package/dist/bootstrap.js +3 -3
  36. package/dist/config/auth.config.d.ts.map +1 -1
  37. package/dist/config/auth.config.js +8 -1
  38. package/dist/config/brandingConfigurationDefaults.config.d.ts.map +1 -1
  39. package/dist/config/brandingConfigurationDefaults.config.js +4 -2
  40. package/dist/config/harvestRuns.config.d.ts +9 -0
  41. package/dist/config/harvestRuns.config.d.ts.map +1 -0
  42. package/dist/config/harvestRuns.config.js +11 -0
  43. package/dist/config/index.d.ts +4 -3
  44. package/dist/config/index.d.ts.map +1 -1
  45. package/dist/config/index.js +4 -3
  46. package/dist/config/namedQuery.config.d.ts +16 -2
  47. package/dist/config/namedQuery.config.d.ts.map +1 -1
  48. package/dist/config/namedQuery.config.js +7 -350
  49. package/dist/config/report.config.d.ts +2 -11
  50. package/dist/config/report.config.d.ts.map +1 -1
  51. package/dist/config/report.config.js +3 -49
  52. package/dist/config/reusableContributorFormDefinitions.config.d.ts.map +1 -1
  53. package/dist/config/reusableContributorFormDefinitions.config.js +10 -4
  54. package/dist/config/routes.config.d.ts.map +1 -1
  55. package/dist/config/routes.config.js +15 -1
  56. package/dist/configmodels/AdminSidebarConfig.d.ts.map +1 -1
  57. package/dist/configmodels/AdminSidebarConfig.js +2 -1
  58. package/dist/controllers/AdminController.d.ts +1 -0
  59. package/dist/controllers/AdminController.d.ts.map +1 -1
  60. package/dist/controllers/AdminController.js +5 -1
  61. package/dist/controllers/NamedQueryController.d.ts +8 -0
  62. package/dist/controllers/NamedQueryController.d.ts.map +1 -0
  63. package/dist/controllers/NamedQueryController.js +17 -0
  64. package/dist/controllers/ReportController.d.ts +7 -0
  65. package/dist/controllers/ReportController.d.ts.map +1 -1
  66. package/dist/controllers/ReportController.js +75 -2
  67. package/dist/controllers/ReportsController.d.ts +1 -0
  68. package/dist/controllers/ReportsController.d.ts.map +1 -1
  69. package/dist/controllers/ReportsController.js +12 -2
  70. package/dist/controllers/index.d.ts.map +1 -1
  71. package/dist/controllers/index.js +10 -1
  72. package/dist/controllers/webservice/HarvestRunController.d.ts +13 -0
  73. package/dist/controllers/webservice/HarvestRunController.d.ts.map +1 -0
  74. package/dist/controllers/webservice/HarvestRunController.js +148 -0
  75. package/dist/controllers/webservice/NamedQueryController.d.ts +17 -0
  76. package/dist/controllers/webservice/NamedQueryController.d.ts.map +1 -0
  77. package/dist/controllers/webservice/NamedQueryController.js +127 -0
  78. package/dist/controllers/webservice/RecordController.d.ts.map +1 -1
  79. package/dist/controllers/webservice/RecordController.js +30 -74
  80. package/dist/controllers/webservice/ReportController.d.ts +7 -0
  81. package/dist/controllers/webservice/ReportController.d.ts.map +1 -1
  82. package/dist/controllers/webservice/ReportController.js +111 -3
  83. package/dist/form-config/dataRecord-1.0-draft.js +3 -3
  84. package/dist/form-config/default-1.0-draft.js +2 -2
  85. package/dist/index.d.ts +2 -0
  86. package/dist/index.d.ts.map +1 -1
  87. package/dist/index.js +2 -1
  88. package/dist/model/config/ReportConfig.d.ts +1 -1
  89. package/dist/model/config/ReportConfig.d.ts.map +1 -1
  90. package/dist/model/config/ReportConfig.js +2 -2
  91. package/dist/model/storage/HarvestRunModel.d.ts +140 -0
  92. package/dist/model/storage/HarvestRunModel.d.ts.map +1 -0
  93. package/dist/model/storage/HarvestRunModel.js +110 -0
  94. package/dist/model/storage/ReportModel.d.ts +1 -0
  95. package/dist/model/storage/ReportModel.d.ts.map +1 -1
  96. package/dist/model/storage/index.d.ts +1 -0
  97. package/dist/model/storage/index.d.ts.map +1 -1
  98. package/dist/model/storage/index.js +10 -2
  99. package/dist/services/HarvestRunService.d.ts +73 -0
  100. package/dist/services/HarvestRunService.d.ts.map +1 -0
  101. package/dist/services/HarvestRunService.js +1317 -0
  102. package/dist/services/NamedQueryService.d.ts +25 -4
  103. package/dist/services/NamedQueryService.d.ts.map +1 -1
  104. package/dist/services/NamedQueryService.js +444 -115
  105. package/dist/services/ReportsService.d.ts +57 -1
  106. package/dist/services/ReportsService.d.ts.map +1 -1
  107. package/dist/services/ReportsService.js +252 -34
  108. package/dist/services/index.d.ts +3 -0
  109. package/dist/services/index.d.ts.map +1 -1
  110. package/dist/services/index.js +7 -2
  111. package/dist/visitor/construct.visitor.d.ts.map +1 -1
  112. package/dist/visitor/construct.visitor.js +8 -3
  113. package/dist/waterline-models/HarvestRecordEvent.d.ts +43 -0
  114. package/dist/waterline-models/HarvestRecordEvent.d.ts.map +1 -0
  115. package/dist/waterline-models/HarvestRecordEvent.js +107 -0
  116. package/dist/waterline-models/HarvestRun.d.ts +51 -0
  117. package/dist/waterline-models/HarvestRun.d.ts.map +1 -0
  118. package/dist/waterline-models/HarvestRun.js +125 -0
  119. package/dist/waterline-models/HarvestRunChunk.d.ts +57 -0
  120. package/dist/waterline-models/HarvestRunChunk.d.ts.map +1 -0
  121. package/dist/waterline-models/HarvestRunChunk.js +140 -0
  122. package/dist/waterline-models/index.d.ts +6 -0
  123. package/dist/waterline-models/index.d.ts.map +1 -1
  124. package/dist/waterline-models/index.js +10 -1
  125. package/package.json +27 -27
@@ -17,12 +17,47 @@
17
17
  // You should have received a copy of the GNU General Public License along
18
18
  // with this program; if not, write to the Free Software Foundation, Inc.,
19
19
  // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
21
+ if (k2 === undefined) k2 = k;
22
+ var desc = Object.getOwnPropertyDescriptor(m, k);
23
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
24
+ desc = { enumerable: true, get: function() { return m[k]; } };
25
+ }
26
+ Object.defineProperty(o, k2, desc);
27
+ }) : (function(o, m, k, k2) {
28
+ if (k2 === undefined) k2 = k;
29
+ o[k2] = m[k];
30
+ }));
31
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
32
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
33
+ }) : function(o, v) {
34
+ o["default"] = v;
35
+ });
36
+ var __importStar = (this && this.__importStar) || (function () {
37
+ var ownKeys = function(o) {
38
+ ownKeys = Object.getOwnPropertyNames || function (o) {
39
+ var ar = [];
40
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
41
+ return ar;
42
+ };
43
+ return ownKeys(o);
44
+ };
45
+ return function (mod) {
46
+ if (mod && mod.__esModule) return mod;
47
+ var result = {};
48
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
49
+ __setModuleDefault(result, mod);
50
+ return result;
51
+ };
52
+ })();
20
53
  var __importDefault = (this && this.__importDefault) || function (mod) {
21
54
  return (mod && mod.__esModule) ? mod : { "default": mod };
22
55
  };
23
56
  Object.defineProperty(exports, "__esModule", { value: true });
24
57
  exports.NamedQueryResponseRecord = exports.NamedQueryConfig = exports.RelatedRecordFilter = exports.Services = void 0;
25
58
  const CoreService_1 = require("../CoreService");
59
+ const fs = __importStar(require("node:fs/promises"));
60
+ const path = __importStar(require("node:path"));
26
61
  const luxon_1 = require("luxon");
27
62
  const handlebars_1 = __importDefault(require("handlebars"));
28
63
  const sails_ng_common_1 = require("@researchdatabox/sails-ng-common");
@@ -80,6 +115,7 @@ const parseObjectParamValue = (queryParamKey, value) => {
80
115
  }
81
116
  throw Error(`${queryParamKey} must be a valid JSON object`);
82
117
  };
118
+ const DEFAULT_BOOTSTRAP_DATA_PATH = 'bootstrap-data';
83
119
  let namedQueryHandlebarsHelpersRegistered = false;
84
120
  const ensureNamedQueryHandlebarsHelpers = () => {
85
121
  if (namedQueryHandlebarsHelpersRegistered) {
@@ -96,51 +132,299 @@ var Services;
96
132
  */
97
133
  class NamedQueryService extends CoreService_1.Services.Core.Service {
98
134
  _exportedMethods = [
99
- "bootstrap",
135
+ "bootstrapData",
100
136
  "getNamedQueryConfig",
137
+ "getSupportedCollections",
101
138
  "performNamedQuery",
102
139
  "performNamedQueryFromConfig",
103
140
  "performNamedQueryFromConfigResults",
141
+ "create",
142
+ "list",
143
+ "update",
144
+ "delete",
104
145
  ];
105
- async bootstrap(defBrand) {
106
- const namedQueries = await (0, rxjs_1.firstValueFrom)(super.getObservable(NamedQuery.find({
107
- branding: defBrand.id
108
- })));
109
- if (!_.isEmpty(namedQueries)) {
110
- if (sails.config.appmode.bootstrapAlways) {
111
- for (const namedQuery of namedQueries) {
112
- await NamedQuery.destroyOne({ id: namedQuery.id });
146
+ async bootstrapData(defBrand) {
147
+ const bootstrapPath = this.getBootstrapDataPath();
148
+ let fileNames = [];
149
+ const fileOps = this.getBootstrapFileOps();
150
+ try {
151
+ const fileEntries = await fileOps.readdir(bootstrapPath, { withFileTypes: true });
152
+ fileNames = fileEntries
153
+ .filter((entry) => entry.isFile() && entry.name.endsWith('.json'))
154
+ .map((entry) => entry.name)
155
+ .sort((a, b) => a.localeCompare(b));
156
+ }
157
+ catch (error) {
158
+ const ioError = error;
159
+ if (ioError.code === 'ENOENT') {
160
+ sails.log.verbose(`Named query bootstrap data path not found: ${bootstrapPath}`);
161
+ return;
162
+ }
163
+ sails.log.error(`Failed to read named query bootstrap data path: ${bootstrapPath}`, error);
164
+ return;
165
+ }
166
+ for (const fileName of fileNames) {
167
+ try {
168
+ const filePath = path.join(bootstrapPath, fileName);
169
+ const definition = await this.readJsonFile(filePath);
170
+ if (!definition) {
171
+ continue;
172
+ }
173
+ const name = fileName.replace(/\.json$/, '');
174
+ if (!name || typeof definition.collectionName !== 'string' || definition.collectionName.length === 0) {
175
+ sails.log.error(`Skipping named query bootstrap file with missing name or collectionName: ${fileName}`);
176
+ continue;
177
+ }
178
+ const existing = await NamedQuery.findOne({ key: `${defBrand.id}_${name}` });
179
+ if (existing) {
180
+ sails.log.verbose(`Skipping existing named query bootstrap data: ${name}`);
181
+ continue;
182
+ }
183
+ await this.create(defBrand, name, definition);
184
+ sails.log.verbose(`Bootstrapped named query: ${name}`);
185
+ }
186
+ catch (error) {
187
+ sails.log.error(`Failed to bootstrap named query from file: ${fileName}`, error);
188
+ }
189
+ }
190
+ }
191
+ getBootstrapDataPath() {
192
+ const configuredPath = _.get(sails.config, 'bootstrap.bootstrapDataPath', DEFAULT_BOOTSTRAP_DATA_PATH);
193
+ return path.resolve(String(configuredPath), 'namedqueries');
194
+ }
195
+ getBootstrapFileOps() {
196
+ return fs;
197
+ }
198
+ async readJsonFile(filePath) {
199
+ try {
200
+ const content = await this.getBootstrapFileOps().readFile(filePath, 'utf8');
201
+ return JSON.parse(content);
202
+ }
203
+ catch (error) {
204
+ sails.log.error(`Failed to read named query bootstrap file: ${path.basename(filePath)}`, error);
205
+ return null;
206
+ }
207
+ }
208
+ getModel(collectionName) {
209
+ return sails.models?.[collectionName];
210
+ }
211
+ resolveBrandScope(collectionName) {
212
+ if (_.isEmpty(collectionName)) {
213
+ throw new Error('collectionName is required');
214
+ }
215
+ if (collectionName === 'record') {
216
+ return { type: 'field', fieldPath: 'metaMetadata.brandId' };
217
+ }
218
+ if (collectionName === 'user') {
219
+ return { type: 'userRoles', fieldPath: '' };
220
+ }
221
+ const model = this.getModel(collectionName);
222
+ if (!model) {
223
+ throw new Error(`Invalid collectionName '${collectionName}': model not found`);
224
+ }
225
+ const attributes = model.attributes;
226
+ if (attributes && Object.prototype.hasOwnProperty.call(attributes, 'branding')) {
227
+ return { type: 'field', fieldPath: 'branding' };
228
+ }
229
+ throw new Error(`Invalid collectionName '${collectionName}': model does not expose a brand scope`);
230
+ }
231
+ hasRoleInBrand(user, brandId) {
232
+ return _.some(user.roles ?? [], (role) => {
233
+ const roleObj = role;
234
+ const branding = roleObj?.branding;
235
+ const roleBrandId = _.isObject(branding) ? String(branding.id ?? '') : String(branding ?? '');
236
+ return roleBrandId === brandId;
237
+ });
238
+ }
239
+ async getLinkedSecondaryUserIds(brandId) {
240
+ if (typeof UserLink === 'undefined') {
241
+ return new Set();
242
+ }
243
+ const activeLinks = await UserLink.find({ brandId, status: 'active' });
244
+ return new Set(_.map(activeLinks, (link) => String(link.secondaryUserId ?? '')).filter((id) => id !== ''));
245
+ }
246
+ sanitizeUserForNamedQuery(user) {
247
+ const sanitized = { ...user };
248
+ delete sanitized.password;
249
+ delete sanitized.token;
250
+ return sanitized;
251
+ }
252
+ getMongoQueryValue(mongoQuery, path) {
253
+ return Object.prototype.hasOwnProperty.call(mongoQuery, path) ? mongoQuery[path] : _.get(mongoQuery, path);
254
+ }
255
+ setMongoQueryValue(mongoQuery, path, value) {
256
+ if (path.includes('.')) {
257
+ mongoQuery[path] = value;
258
+ }
259
+ else {
260
+ _.set(mongoQuery, path, value);
261
+ }
262
+ }
263
+ unsetMongoQueryValue(mongoQuery, path) {
264
+ if (Object.prototype.hasOwnProperty.call(mongoQuery, path)) {
265
+ delete mongoQuery[path];
266
+ }
267
+ else {
268
+ _.unset(mongoQuery, path);
269
+ }
270
+ }
271
+ isQueryOperatorObject(value) {
272
+ return Object.keys(value).some((key) => key.startsWith('$') || [
273
+ 'contains',
274
+ 'startsWith',
275
+ 'endsWith',
276
+ 'like',
277
+ '>',
278
+ '>=',
279
+ '<',
280
+ '<=',
281
+ '!=',
282
+ 'in',
283
+ 'nin',
284
+ ].includes(key));
285
+ }
286
+ flattenDeepTargetCriteria(criteria, prefix = '') {
287
+ const flattened = {};
288
+ for (const [key, value] of Object.entries(criteria)) {
289
+ const path = prefix ? `${prefix}.${key}` : key;
290
+ if (_.isPlainObject(value) && !this.isQueryOperatorObject(value)) {
291
+ Object.assign(flattened, this.flattenDeepTargetCriteria(value, path));
292
+ }
293
+ else {
294
+ flattened[path] = value;
295
+ }
296
+ }
297
+ return flattened;
298
+ }
299
+ toNativeMongoCriteria(criteria) {
300
+ const mongoCriteria = {};
301
+ const operatorMap = {
302
+ '>': '$gt',
303
+ '>=': '$gte',
304
+ '<': '$lt',
305
+ '<=': '$lte',
306
+ '!=': '$ne',
307
+ in: '$in',
308
+ nin: '$nin',
309
+ };
310
+ for (const [key, value] of Object.entries(criteria)) {
311
+ if (_.isPlainObject(value)) {
312
+ const mappedValue = {};
313
+ for (const [operator, operatorValue] of Object.entries(value)) {
314
+ if (operator === 'contains') {
315
+ mappedValue.$regex = _.escapeRegExp(String(operatorValue ?? ''));
316
+ mappedValue.$options = 'i';
317
+ }
318
+ else {
319
+ mappedValue[operatorMap[operator] ?? operator] = operatorValue;
320
+ }
113
321
  }
322
+ mongoCriteria[key] = mappedValue;
114
323
  }
115
324
  else {
116
- return;
325
+ mongoCriteria[key] = value;
117
326
  }
118
327
  }
119
- sails.log.verbose("Bootstrapping named query definitions... ");
120
- await this.createNamedQueriesForBrand(defBrand);
328
+ return mongoCriteria;
121
329
  }
122
- async createNamedQueriesForBrand(defBrand) {
123
- for (const [namedQuery, config] of Object.entries(sails.config.namedQuery)) {
124
- const namedQueryConfig = config;
125
- await (0, rxjs_1.firstValueFrom)(this.create(defBrand, namedQuery, namedQueryConfig));
330
+ toNativeMongoSort(sort) {
331
+ const mongoSort = {};
332
+ for (const sortEntry of sort ?? []) {
333
+ for (const [field, direction] of Object.entries(sortEntry)) {
334
+ mongoSort[field] = direction === 'DESC' ? -1 : 1;
335
+ }
126
336
  }
337
+ return mongoSort;
127
338
  }
128
- create(brand, name, config) {
129
- return super.getObservable(NamedQuery.create({
339
+ async getNativeRecordCollection(model) {
340
+ const native = model.native;
341
+ if (typeof native !== 'function') {
342
+ throw new Error("Model record does not expose native collection access");
343
+ }
344
+ return new Promise((resolve, reject) => {
345
+ const nativeFn = native;
346
+ nativeFn((error, collection) => {
347
+ if (error) {
348
+ reject(error);
349
+ }
350
+ else {
351
+ resolve(collection);
352
+ }
353
+ });
354
+ });
355
+ }
356
+ async create(brand, name, config) {
357
+ const key = `${brand.id}_${name}`;
358
+ const existing = await NamedQuery.findOne({ key });
359
+ if (existing) {
360
+ throw new Error(`Named query '${name}' already exists`);
361
+ }
362
+ const brandScope = this.resolveBrandScope(config.collectionName);
363
+ return (0, rxjs_1.firstValueFrom)(super.getObservable(NamedQuery.create({
130
364
  name: name,
131
365
  branding: brand.id,
132
366
  mongoQuery: JSON.stringify(config.mongoQuery),
133
367
  queryParams: JSON.stringify(config.queryParams),
134
368
  collectionName: config.collectionName,
135
369
  resultObjectMapping: JSON.stringify(config.resultObjectMapping),
136
- brandIdFieldPath: config.brandIdFieldPath,
370
+ brandIdFieldPath: brandScope.fieldPath,
137
371
  sort: (config.sort !== undefined && Array.isArray(config.sort) && config.sort.length > 0) ? JSON.stringify(config.sort) : "",
138
372
  expandRelations: config.expandRelations === true,
139
373
  relatedRecordFilters: (config.relatedRecordFilters !== undefined && Array.isArray(config.relatedRecordFilters) && config.relatedRecordFilters.length > 0)
140
374
  ? JSON.stringify(config.relatedRecordFilters)
141
375
  : "",
376
+ })));
377
+ }
378
+ async list(brand) {
379
+ const records = (await NamedQuery.find({
380
+ branding: brand.id
381
+ }));
382
+ return records.map((r) => ({
383
+ name: r.name,
384
+ collectionName: r.collectionName,
385
+ mongoQuery: parseSerializedValue(r.mongoQuery, {}),
386
+ queryParams: parseSerializedValue(r.queryParams, {}),
387
+ resultObjectMapping: parseSerializedValue(r.resultObjectMapping, {}),
388
+ brandIdFieldPath: r.brandIdFieldPath || undefined,
389
+ sort: r.sort ? parseSerializedValue(r.sort, []) : undefined,
390
+ expandRelations: r.expandRelations || false,
391
+ relatedRecordFilters: r.relatedRecordFilters ? parseSerializedValue(r.relatedRecordFilters, []) : undefined,
142
392
  }));
143
393
  }
394
+ async update(brand, name, config) {
395
+ const key = `${brand.id}_${name}`;
396
+ const existing = await NamedQuery.findOne({ key });
397
+ if (!existing) {
398
+ throw new Error(`Named query '${name}' not found`);
399
+ }
400
+ const brandScope = this.resolveBrandScope(config.collectionName);
401
+ const updated = await (0, rxjs_1.firstValueFrom)(super.getObservable(NamedQuery.updateOne({ key }).set({
402
+ name: name,
403
+ branding: brand.id,
404
+ mongoQuery: JSON.stringify(config.mongoQuery),
405
+ queryParams: JSON.stringify(config.queryParams),
406
+ collectionName: config.collectionName,
407
+ resultObjectMapping: JSON.stringify(config.resultObjectMapping),
408
+ brandIdFieldPath: brandScope.fieldPath,
409
+ sort: (config.sort !== undefined && Array.isArray(config.sort) && config.sort.length > 0) ? JSON.stringify(config.sort) : "",
410
+ expandRelations: config.expandRelations === true,
411
+ relatedRecordFilters: (config.relatedRecordFilters !== undefined && Array.isArray(config.relatedRecordFilters) && config.relatedRecordFilters.length > 0)
412
+ ? JSON.stringify(config.relatedRecordFilters)
413
+ : "",
414
+ })));
415
+ if (!updated) {
416
+ throw new Error(`Named query '${name}' not found`);
417
+ }
418
+ return updated;
419
+ }
420
+ async delete(brand, name) {
421
+ const key = `${brand.id}_${name}`;
422
+ const existing = await NamedQuery.findOne({ key });
423
+ if (!existing) {
424
+ throw new Error(`Named query '${name}' not found`);
425
+ }
426
+ return (0, rxjs_1.firstValueFrom)(super.getObservable(NamedQuery.destroyOne({ key })));
427
+ }
144
428
  async getNamedQueryConfig(brand, namedQuery) {
145
429
  const nQDBEntry = await NamedQuery.findOne({
146
430
  key: brand.id + "_" + namedQuery
@@ -148,25 +432,13 @@ var Services;
148
432
  if (nQDBEntry) {
149
433
  return new NamedQueryConfig(nQDBEntry);
150
434
  }
151
- const configuredNamedQuery = _.get(sails.config, ['namedQuery', namedQuery]);
152
- if (!configuredNamedQuery || typeof configuredNamedQuery !== 'object') {
153
- return null;
154
- }
155
- const configFromSource = configuredNamedQuery;
156
- return new NamedQueryConfig({
157
- name: namedQuery,
158
- branding: String(brand.id),
159
- collectionName: configFromSource.collectionName,
160
- brandIdFieldPath: configFromSource.brandIdFieldPath,
161
- mongoQuery: _.cloneDeep(configFromSource.mongoQuery),
162
- queryParams: _.cloneDeep(configFromSource.queryParams),
163
- resultObjectMapping: _.cloneDeep(configFromSource.resultObjectMapping),
164
- sort: _.cloneDeep(configFromSource.sort),
165
- expandRelations: configFromSource.expandRelations,
166
- relatedRecordFilters: _.cloneDeep(configFromSource.relatedRecordFilters),
167
- });
435
+ return null;
436
+ }
437
+ getSupportedCollections() {
438
+ const collections = _.get(sails.config, ['namedQuery', 'supportedCollections'], []);
439
+ return Array.isArray(collections) ? collections.filter((c) => typeof c === 'string') : [];
168
440
  }
169
- async performNamedQuery(brandIdFieldPath, resultObjectMapping, collectionName, mongoQuery, queryParams, paramMap, brand, start, rows, _user = undefined, sort = undefined, expandRelations = false, relatedRecordFilters = []) {
441
+ async performNamedQuery(_brandIdFieldPath, resultObjectMapping, collectionName, mongoQuery, queryParams, paramMap, brand, start, rows, _user = undefined, sort = undefined, expandRelations = false, relatedRecordFilters = []) {
170
442
  const criteriaMeta = { enableExperimentalDeepTargets: true };
171
443
  this.setParamsInQuery(mongoQuery, queryParams, paramMap);
172
444
  if (relatedRecordFilters && relatedRecordFilters.length > 0) {
@@ -181,34 +453,57 @@ var Services;
181
453
  this.setParamsInQuery(filterMongoQuery, filterQueryParams, paramMap);
182
454
  const relatedRecords = await filterModel.find({ where: filterMongoQuery, select: [filter.foreignField] }).meta(criteriaMeta);
183
455
  const relatedIds = _.uniq(relatedRecords.map((relatedRecord) => _.get(relatedRecord, filter.foreignField)).filter((id) => id != null && id !== ''));
184
- const existingLocalFieldFilter = _.get(mongoQuery, filter.localField);
456
+ const existingLocalFieldFilter = this.getMongoQueryValue(mongoQuery, filter.localField);
185
457
  const existingRelatedIds = _.isPlainObject(existingLocalFieldFilter) ? _.get(existingLocalFieldFilter, '$in') : undefined;
186
458
  if (Array.isArray(existingRelatedIds)) {
187
- _.set(mongoQuery, filter.localField, {
459
+ this.setMongoQueryValue(mongoQuery, filter.localField, {
188
460
  $in: _.intersection(existingRelatedIds, relatedIds)
189
461
  });
190
462
  }
191
463
  else {
192
- _.set(mongoQuery, filter.localField, { $in: relatedIds });
464
+ this.setMongoQueryValue(mongoQuery, filter.localField, { $in: relatedIds });
193
465
  }
194
466
  }
195
467
  }
468
+ const brandScope = this.resolveBrandScope(collectionName);
196
469
  const that = this;
197
- // Add branding
198
- if (brandIdFieldPath != '') {
199
- mongoQuery[brandIdFieldPath] = brand.id;
470
+ if (brandScope.type === 'userRoles') {
471
+ return this.performUserNamedQuery(resultObjectMapping, mongoQuery, brand, start, rows, sort);
200
472
  }
201
- sails.log.debug("Mongo query to be executed", mongoQuery);
473
+ this.setMongoQueryValue(mongoQuery, brandScope.fieldPath, brand.id);
474
+ const waterlineQuery = this.flattenDeepTargetCriteria(mongoQuery);
475
+ sails.log.debug("Mongo query to be executed", waterlineQuery);
202
476
  // Get the total count of matching records
203
477
  let totalItems = 0;
204
- const model = sails.models[collectionName];
478
+ const model = this.getModel(collectionName);
205
479
  if (!model) {
206
480
  throw new Error(`Model ${collectionName} not found`);
207
481
  }
208
- totalItems = await model.count(mongoQuery).meta(criteriaMeta);
482
+ let results = [];
483
+ if (collectionName === 'record') {
484
+ const nativeCollection = await this.getNativeRecordCollection(model);
485
+ const nativeCriteria = this.toNativeMongoCriteria(waterlineQuery);
486
+ totalItems = await nativeCollection.countDocuments(nativeCriteria);
487
+ if (totalItems > 0) {
488
+ let nativeQuery = nativeCollection.find(nativeCriteria);
489
+ const nativeSort = this.toNativeMongoSort(sort);
490
+ if (!_.isEmpty(nativeSort)) {
491
+ nativeQuery = nativeQuery.sort(nativeSort);
492
+ }
493
+ results = await nativeQuery.skip(start).limit(rows).toArray();
494
+ }
495
+ }
496
+ else {
497
+ const count = model.count;
498
+ if (typeof count !== 'function') {
499
+ throw new Error(`Model ${collectionName} does not expose count`);
500
+ }
501
+ const countFn = count;
502
+ totalItems = await countFn(waterlineQuery).meta(criteriaMeta);
503
+ }
209
504
  // Build query criteria
210
505
  const criteria = {
211
- where: mongoQuery,
506
+ where: waterlineQuery,
212
507
  skip: start,
213
508
  limit: rows,
214
509
  };
@@ -219,9 +514,13 @@ var Services;
219
514
  }
220
515
  // Run query
221
516
  sails.log.debug("Mongo query criteria", criteria);
222
- let results = [];
223
- if (totalItems > 0) {
224
- results = await model.find(criteria).meta(criteriaMeta);
517
+ if (collectionName !== 'record' && totalItems > 0) {
518
+ const find = model.find;
519
+ if (typeof find !== 'function') {
520
+ throw new Error(`Model ${collectionName} does not expose find`);
521
+ }
522
+ const findFn = find;
523
+ results = await findFn(criteria).meta(criteriaMeta);
225
524
  }
226
525
  const responseRecords = [];
227
526
  const recordsService = sails.services.recordsservice;
@@ -229,70 +528,41 @@ var Services;
229
528
  if (expandRelations === true && collectionName !== 'record') {
230
529
  sails.log.debug(`expandRelations is only supported for the 'record' collection; ignoring for '${collectionName}'`);
231
530
  }
531
+ // 'user' collections are scoped and rendered separately via performUserNamedQuery,
532
+ // so anything reaching this loop is a record-like (record or scoped dynamic) model.
232
533
  for (const record of results) {
233
- if (collectionName == 'user') {
234
- const userRecord = record;
235
- let defaultMetadata = {};
236
- const variables = { record: userRecord };
237
- if (!_.isEmpty(resultObjectMapping)) {
238
- const resultMetadata = _.cloneDeep(resultObjectMapping);
239
- _.forOwn(resultObjectMapping, function (value, key) {
240
- _.set(resultMetadata, key, that.runTemplate(value, variables));
241
- });
242
- defaultMetadata = resultMetadata;
534
+ const recordItem = record;
535
+ if (expandRelationsActual && recordsService && recordItem.redboxOid) {
536
+ try {
537
+ const relationships = await recordsService.getRelatedRecords(recordItem.redboxOid, brand);
538
+ recordItem.relationships = relationships;
243
539
  }
244
- else {
245
- defaultMetadata = {
246
- type: that.runTemplate('record.type', variables),
247
- name: that.runTemplate('record.name', variables),
248
- email: that.runTemplate('record.email', variables),
249
- username: that.runTemplate('record.username', variables),
250
- lastLogin: that.runTemplate('record.lastLogin', variables)
251
- };
540
+ catch (err) {
541
+ sails.log.warn(`Failed to fetch relationships for record ${recordItem.redboxOid}`, err);
252
542
  }
253
- const responseRecord = new NamedQueryResponseRecord({
254
- oid: '',
255
- title: '',
256
- metadata: defaultMetadata,
257
- lastSaveDate: userRecord.updatedAt ?? null,
258
- dateCreated: userRecord.createdAt ?? null
543
+ }
544
+ let defaultMetadata = {};
545
+ const variables = { record: recordItem };
546
+ if (!_.isEmpty(resultObjectMapping)) {
547
+ const resultMetadata = _.cloneDeep(resultObjectMapping);
548
+ _.forOwn(resultObjectMapping, function (value, key) {
549
+ _.set(resultMetadata, key, that.runTemplate(value, variables));
259
550
  });
260
- responseRecords.push(responseRecord);
551
+ defaultMetadata = resultMetadata;
261
552
  }
262
553
  else {
263
- const recordItem = record;
264
- if (expandRelationsActual && recordsService && recordItem.redboxOid) {
265
- try {
266
- const relationships = await recordsService.getRelatedRecords(recordItem.redboxOid, brand);
267
- recordItem.relationships = relationships;
268
- }
269
- catch (err) {
270
- sails.log.warn(`Failed to fetch relationships for record ${recordItem.redboxOid}`, err);
271
- }
272
- }
273
- let defaultMetadata = {};
274
- const variables = { record: recordItem };
275
- if (!_.isEmpty(resultObjectMapping)) {
276
- const resultMetadata = _.cloneDeep(resultObjectMapping);
277
- _.forOwn(resultObjectMapping, function (value, key) {
278
- _.set(resultMetadata, key, that.runTemplate(value, variables));
279
- });
280
- defaultMetadata = resultMetadata;
281
- }
282
- else {
283
- defaultMetadata = collectionName === 'record'
284
- ? that.runTemplate('record.metadata', variables)
285
- : recordItem;
286
- }
287
- const responseRecord = new NamedQueryResponseRecord({
288
- oid: recordItem.redboxOid ?? getIdentifierProperty(recordItem, 'id') ?? '',
289
- title: getStringProperty(recordItem.metadata, 'title') ?? getStringProperty(recordItem, 'name') ?? getStringProperty(recordItem, 'title') ?? '',
290
- metadata: defaultMetadata,
291
- lastSaveDate: recordItem.lastSaveDate ?? null,
292
- dateCreated: recordItem.dateCreated ?? null
293
- });
294
- responseRecords.push(responseRecord);
554
+ defaultMetadata = collectionName === 'record'
555
+ ? that.runTemplate('record.metadata', variables)
556
+ : recordItem;
295
557
  }
558
+ const responseRecord = new NamedQueryResponseRecord({
559
+ oid: recordItem.redboxOid ?? getIdentifierProperty(recordItem, 'id') ?? '',
560
+ title: getStringProperty(recordItem.metadata, 'title') ?? getStringProperty(recordItem, 'name') ?? getStringProperty(recordItem, 'title') ?? '',
561
+ metadata: defaultMetadata,
562
+ lastSaveDate: recordItem.lastSaveDate ?? null,
563
+ dateCreated: recordItem.dateCreated ?? null
564
+ });
565
+ responseRecords.push(responseRecord);
296
566
  }
297
567
  const response = new ListAPIResponse_1.ListAPIResponse();
298
568
  const startIndex = start;
@@ -304,6 +574,65 @@ var Services;
304
574
  response.summary.numFound = totalItems;
305
575
  return response;
306
576
  }
577
+ async performUserNamedQuery(resultObjectMapping, mongoQuery, brand, start, rows, sort = undefined) {
578
+ const criteriaMeta = { enableExperimentalDeepTargets: true };
579
+ const model = this.getModel('user');
580
+ if (!model) {
581
+ throw new Error(`Invalid collectionName 'user': model not found`);
582
+ }
583
+ const userModel = model;
584
+ const criteria = { where: mongoQuery };
585
+ if (sort !== undefined && Array.isArray(sort) && (sort?.length ?? 0) > 0) {
586
+ criteria.sort = sort;
587
+ }
588
+ let query = userModel.find(criteria);
589
+ if (query && typeof query.populate === 'function') {
590
+ query = query.populate('roles');
591
+ }
592
+ const allUsers = query && typeof query.meta === 'function'
593
+ ? await query.meta(criteriaMeta)
594
+ : await query;
595
+ const brandId = String(brand.id);
596
+ const linkedSecondaryUserIds = await this.getLinkedSecondaryUserIds(brandId);
597
+ const scopedUsers = allUsers
598
+ .filter((user) => this.hasRoleInBrand(user, brandId) || linkedSecondaryUserIds.has(String(user.id ?? '')))
599
+ .map((user) => this.sanitizeUserForNamedQuery(user));
600
+ const pagedUsers = scopedUsers.slice(start, start + rows);
601
+ const responseRecords = [];
602
+ for (const userRecord of pagedUsers) {
603
+ let defaultMetadata = {};
604
+ const variables = { record: userRecord };
605
+ if (!_.isEmpty(resultObjectMapping)) {
606
+ const resultMetadata = _.cloneDeep(resultObjectMapping);
607
+ _.forOwn(resultObjectMapping, (value, key) => {
608
+ _.set(resultMetadata, key, this.runTemplate(value, variables));
609
+ });
610
+ defaultMetadata = resultMetadata;
611
+ }
612
+ else {
613
+ defaultMetadata = {
614
+ type: this.runTemplate('record.type', variables),
615
+ name: this.runTemplate('record.name', variables),
616
+ email: this.runTemplate('record.email', variables),
617
+ username: this.runTemplate('record.username', variables),
618
+ lastLogin: this.runTemplate('record.lastLogin', variables)
619
+ };
620
+ }
621
+ responseRecords.push(new NamedQueryResponseRecord({
622
+ oid: '',
623
+ title: '',
624
+ metadata: defaultMetadata,
625
+ lastSaveDate: userRecord.updatedAt ?? null,
626
+ dateCreated: userRecord.createdAt ?? null
627
+ }));
628
+ }
629
+ const response = new ListAPIResponse_1.ListAPIResponse();
630
+ response.records = responseRecords;
631
+ response.summary.start = start;
632
+ response.summary.page = Math.floor((start / rows) + 1);
633
+ response.summary.numFound = scopedUsers.length;
634
+ return response;
635
+ }
307
636
  setParamsInQuery(mongoQuery, queryParams, paramMap) {
308
637
  for (const queryParamKey in queryParams) {
309
638
  let value = paramMap[queryParamKey];
@@ -314,7 +643,7 @@ var Services;
314
643
  }
315
644
  if (_.isUndefined(value)) {
316
645
  if (queryParam.whenUndefined == NamedQueryWhenUndefinedOptions.ignore) {
317
- _.unset(mongoQuery, queryParam.path);
646
+ this.unsetMongoQueryValue(mongoQuery, queryParam.path);
318
647
  continue;
319
648
  }
320
649
  if (queryParam.whenUndefined == NamedQueryWhenUndefinedOptions.defaultValue) {
@@ -393,14 +722,14 @@ var Services;
393
722
  }
394
723
  }
395
724
  if (value == undefined && queryParam.whenUndefined == NamedQueryWhenUndefinedOptions.ignore) {
396
- _.unset(mongoQuery, queryParam.path);
725
+ this.unsetMongoQueryValue(mongoQuery, queryParam.path);
397
726
  }
398
727
  else {
399
- const existingValue = _.get(mongoQuery, queryParam.path);
728
+ const existingValue = this.getMongoQueryValue(mongoQuery, queryParam.path);
400
729
  if (_.isPlainObject(existingValue) && _.isPlainObject(value)) {
401
730
  _.merge(value, existingValue);
402
731
  }
403
- _.set(mongoQuery, queryParam.path, value);
732
+ this.setMongoQueryValue(mongoQuery, queryParam.path, value);
404
733
  }
405
734
  }
406
735
  return mongoQuery;
@@ -431,13 +760,12 @@ var Services;
431
760
  });
432
761
  const collectionName = _.get(config, 'collectionName', '') ?? '';
433
762
  const resultObjectMapping = _.get(config, 'resultObjectMapping', {}) ?? {};
434
- const brandIdFieldPath = _.get(config, 'brandIdFieldPath', '') ?? '';
435
763
  const mongoQuery = _.cloneDeep(_.get(config, 'mongoQuery', {}) ?? {});
436
764
  const queryParams = (_.get(config, 'queryParams', {}) ?? {});
437
765
  const sort = _.cloneDeep(_.get(config, 'sort', []) ?? []);
438
766
  const expandRelations = _.get(config, 'expandRelations', false);
439
767
  const relatedRecordFilters = _.cloneDeep(_.get(config, 'relatedRecordFilters', []) ?? []);
440
- return await this.performNamedQuery(brandIdFieldPath, resultObjectMapping, collectionName, mongoQuery, queryParams, paramMap, brand, start, rows, user, sort, expandRelations, relatedRecordFilters);
768
+ return await this.performNamedQuery('', resultObjectMapping, collectionName, mongoQuery, queryParams, paramMap, brand, start, rows, user, sort, expandRelations, relatedRecordFilters);
441
769
  }
442
770
  async performNamedQueryFromConfigResults(config, paramMap, brand, queryName, start = 0, rows = 30, maxRecords = 100, user = undefined) {
443
771
  const records = [];
@@ -465,9 +793,10 @@ var Services;
465
793
  }
466
794
  // update the start point
467
795
  start = currentRetrievedCount;
468
- // Check the number of records and fail if it is more than maxRecords.
796
+ // Check the number of records and stop if it exceeds maxRecords.
469
797
  if (records.length > maxRecords) {
470
798
  sails.log.warn(`All named query results: returning early before finished with ${records.length} results for '${queryName}' from ${requestCount} requests because the number of records is more than max records ${maxRecords}`);
799
+ break;
471
800
  }
472
801
  // continue the while loop
473
802
  }
@@ -561,4 +890,4 @@ class NamedQueryResponseRecord {
561
890
  }
562
891
  }
563
892
  exports.NamedQueryResponseRecord = NamedQueryResponseRecord;
564
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTmFtZWRRdWVyeVNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvTmFtZWRRdWVyeVNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLDBGQUEwRjtBQUMxRixFQUFFO0FBQ0YsNkJBQTZCO0FBQzdCLDBCQUEwQjtBQUMxQixFQUFFO0FBQ0YsdUVBQXVFO0FBQ3ZFLHVFQUF1RTtBQUN2RSxvRUFBb0U7QUFDcEUsc0NBQXNDO0FBQ3RDLEVBQUU7QUFDRixrRUFBa0U7QUFDbEUsaUVBQWlFO0FBQ2pFLGdFQUFnRTtBQUNoRSwrQ0FBK0M7QUFDL0MsRUFBRTtBQUNGLDBFQUEwRTtBQUMxRSwwRUFBMEU7QUFDMUUsOERBQThEOzs7Ozs7QUFFOUQsZ0RBQXNEO0FBRXRELGlDQUFpQztBQUNqQyw0REFBb0M7QUFDcEMsc0VBQW1GO0FBRW5GLDhEQUEyRDtBQUMzRCwrQkFBc0M7QUFXdEMsTUFBTSxhQUFhLEdBQUcsQ0FBQyxLQUFjLEVBQXNCLEVBQUUsQ0FBQyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxLQUFLLElBQUksQ0FBQztBQUUxRyxNQUFNLGlCQUFpQixHQUFHLENBQUMsS0FBYyxFQUFFLFlBQW9CLEVBQXNCLEVBQUU7SUFDckYsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQzFCLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRCxNQUFNLGFBQWEsR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDMUMsT0FBTyxPQUFPLGFBQWEsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQ3ZFLENBQUMsQ0FBQztBQUVGLE1BQU0scUJBQXFCLEdBQUcsQ0FBQyxLQUFjLEVBQUUsWUFBb0IsRUFBc0IsRUFBRTtJQUN6RixJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxFQUFFLENB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
893
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTmFtZWRRdWVyeVNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvTmFtZWRRdWVyeVNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLDBGQUEwRjtBQUMxRixFQUFFO0FBQ0YsNkJBQTZCO0FBQzdCLDBCQUEwQjtBQUMxQixFQUFFO0FBQ0YsdUVBQXVFO0FBQ3ZFLHVFQUF1RTtBQUN2RSxvRUFBb0U7QUFDcEUsc0NBQXNDO0FBQ3RDLEVBQUU7QUFDRixrRUFBa0U7QUFDbEUsaUVBQWlFO0FBQ2pFLGdFQUFnRTtBQUNoRSwrQ0FBK0M7QUFDL0MsRUFBRTtBQUNGLDBFQUEwRTtBQUMxRSwwRUFBMEU7QUFDMUUsOERBQThEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFOUQsZ0RBQXNEO0FBRXRELHFEQUF1QztBQUN2QyxnREFBa0M7QUFDbEMsaUNBQWlDO0FBQ2pDLDREQUFvQztBQUNwQyxzRUFBbUY7QUFFbkYsOERBQTJEO0FBQzNELCtCQUFzQztBQTZCdEMsTUFBTSxhQUFhLEdBQUcsQ0FBQyxLQUFjLEVBQXNCLEVBQUUsQ0FBQyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxLQUFLLElBQUksQ0FBQztBQUUxRyxNQUFNLGlCQUFpQixHQUFHLENBQUMsS0FBYyxFQUFFLFlBQW9CLEVBQXNCLEVBQUU7SUFDckYsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQzFCLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRCxNQUFNLGFBQWEsR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDMUMsT0FBTyxPQUFPLGFBQWEsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQ3ZFLENBQUMsQ0FBQztBQUVGLE1BQU0scUJBQXFCLEdBQUcsQ0FBQyxLQUFjLEVBQUUs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