@elsikora/nestjs-crud-automator
Version:
A library for automating the creation of CRUD operations in NestJS.
75 lines (72 loc) • 3.58 kB
JavaScript
import { __decorate, __param, __metadata } from '../../../../../external/tslib/tslib.es6.js';
import { ApiAuthorizationIamDocumentCache } from './cache.class.js';
import { ApiAuthorizationIamDocumentValidator } from './validator.class.js';
import { AUTHORIZATION_POLICY_DOCUMENT_SOURCES_TOKEN } from '../../../../../constant/class/authorization/policy/document-sources-token.constant.js';
import { Injectable, Inject, Optional } from '@nestjs/common';
import { ErrorException } from '../../../../../utility/error/exception.utility.js';
import { LoggerUtility } from '../../../../../utility/logger.utility.js';
const iamDocumentResolverLogger = LoggerUtility.getLogger("ApiAuthorizationIamDocumentResolver");
let ApiAuthorizationIamDocumentResolver = class ApiAuthorizationIamDocumentResolver {
cache;
validator;
sources;
constructor(cache, validator, sources = []) {
this.cache = cache;
this.validator = validator;
this.sources = sources;
}
clear() {
this.cache.clear();
}
async resolve(ids) {
const normalizedIds = this.cache.normalizeIds(ids);
if (normalizedIds.length === 0) {
return [];
}
const cachedDocuments = this.cache.get(normalizedIds);
if (cachedDocuments) {
iamDocumentResolverLogger.verbose(`Using cached IAM policy documents for ${normalizedIds.length} requested ids.`);
return cachedDocuments;
}
const recordsById = new Map();
for (const source of this.sources) {
const records = await source.getDocumentsByIds(normalizedIds);
this.validator.validateMany(records);
for (const record of records) {
const existingRecord = recordsById.get(record.id);
if (existingRecord) {
iamDocumentResolverLogger.error(`Duplicate policy document id "${record.id}" resolved from multiple sources`);
throw ErrorException(`Duplicate policy document id "${record.id}" resolved from multiple sources`);
}
recordsById.set(record.id, record);
}
}
for (const id of normalizedIds) {
if (!recordsById.has(id)) {
iamDocumentResolverLogger.error(`Policy document "${id}" was requested but no document source returned it`);
throw ErrorException(`Policy document "${id}" was requested but no document source returned it`);
}
}
const result = [];
for (const id of normalizedIds) {
const record = recordsById.get(id);
if (!record) {
iamDocumentResolverLogger.error(`Policy document "${id}" was requested but no document source returned it`);
throw ErrorException(`Policy document "${id}" was requested but no document source returned it`);
}
result.push(record);
}
this.cache.set(normalizedIds, result);
iamDocumentResolverLogger.verbose(`Resolved ${result.length} IAM policy documents from ${this.sources.length} sources.`);
return result;
}
};
ApiAuthorizationIamDocumentResolver = __decorate([
Injectable(),
__param(2, Inject(AUTHORIZATION_POLICY_DOCUMENT_SOURCES_TOKEN)),
__param(2, Optional()),
__metadata("design:paramtypes", [ApiAuthorizationIamDocumentCache,
ApiAuthorizationIamDocumentValidator, Array])
], ApiAuthorizationIamDocumentResolver);
export { ApiAuthorizationIamDocumentResolver };
//# sourceMappingURL=resolver.class.js.map