nestjs-decorated-dataloaders
Version:
A module that helps you to create graphql dataloaders with decorators in Nest.js
63 lines • 2.71 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.DataloaderMapper = void 0;
const dataloader_types_1 = require("../../types/dataloader.types");
const resolve_paths_1 = require("../resolve-paths");
/**
* Class to map the entities to the keys used in the dataloader.
* Uses the metadata to know how to map the entities, like paths and relation type.
*/
class DataloaderMapper {
static map(metadata, keys, entities) {
if (!Array.isArray(entities)) {
throw new Error(`DataloaderMapper: 'entities' parameter must be an array but received ${entities === null ? "null" : typeof entities}`);
}
if (metadata.type === dataloader_types_1.RelationType.OneToOne) {
return DataloaderMapper.oneToOne(metadata, keys, entities);
}
return DataloaderMapper.oneToMany(metadata, keys, entities);
}
static oneToMany(metadata, keys, entities) {
const entitiesMappedByKey = new Map();
const path = metadata.parentKey;
for (const entity of entities) {
const joinKeyOrKeys = (0, resolve_paths_1.resolvePath)(entity, path);
const isArray = Array.isArray(joinKeyOrKeys);
if (isArray) {
for (const key of joinKeyOrKeys) {
if (!entitiesMappedByKey.has(key)) {
entitiesMappedByKey.set(key, []);
}
entitiesMappedByKey.get(key).push(entity);
}
continue;
}
if (!entitiesMappedByKey.has(joinKeyOrKeys)) {
entitiesMappedByKey.set(joinKeyOrKeys, []);
}
entitiesMappedByKey.get(joinKeyOrKeys).push(entity);
}
return keys.map((key) => entitiesMappedByKey.get(key) || []);
}
static oneToOne(metadata, keys, entities) {
const entitiesMappedByKey = new Map();
for (const entity of entities) {
const joinKeyOrKeys = (0, resolve_paths_1.resolvePath)(entity, metadata.parentKey);
const isArray = Array.isArray(joinKeyOrKeys);
if (isArray) {
for (const key of joinKeyOrKeys) {
if (!entitiesMappedByKey.has(key)) {
entitiesMappedByKey.set(key, entity);
}
}
continue;
}
if (!entitiesMappedByKey.has(joinKeyOrKeys)) {
entitiesMappedByKey.set(joinKeyOrKeys, entity);
}
}
return keys.map((key) => entitiesMappedByKey.get(key) || null);
}
}
exports.DataloaderMapper = DataloaderMapper;
//# sourceMappingURL=dataloader-mapper.js.map