@elsikora/nestjs-crud-automator
Version:
A library for automating the creation of CRUD operations in NestJS.
75 lines (72 loc) • 3.65 kB
JavaScript
;
var tslib_es6 = require('../../../../../external/tslib/tslib.es6.js');
var cache_class = require('./cache.class.js');
var validator_class = require('./validator.class.js');
var documentSourcesToken_constant = require('../../../../../constant/class/authorization/policy/document-sources-token.constant.js');
var common = require('@nestjs/common');
var exception_utility = require('../../../../../utility/error/exception.utility.js');
var logger_utility = require('../../../../../utility/logger.utility.js');
const iamDocumentResolverLogger = logger_utility.LoggerUtility.getLogger("ApiAuthorizationIamDocumentResolver");
exports.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 exception_utility.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 exception_utility.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 exception_utility.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;
}
};
exports.ApiAuthorizationIamDocumentResolver = tslib_es6.__decorate([
common.Injectable(),
tslib_es6.__param(2, common.Inject(documentSourcesToken_constant.AUTHORIZATION_POLICY_DOCUMENT_SOURCES_TOKEN)),
tslib_es6.__param(2, common.Optional()),
tslib_es6.__metadata("design:paramtypes", [cache_class.ApiAuthorizationIamDocumentCache,
validator_class.ApiAuthorizationIamDocumentValidator, Array])
], exports.ApiAuthorizationIamDocumentResolver);
//# sourceMappingURL=resolver.class.js.map