@pallad/graphql-command-bus
Version:
58 lines (57 loc) • 2.23 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.Mapper = void 0;
const monet_1 = require("monet");
const is = require("predicates");
const EntityHelper_1 = require("./EntityHelper");
class Mapper {
constructor(commandBusHandler, dataLoaderManager) {
this.commandBusHandler = commandBusHandler;
this.dataLoaderManager = dataLoaderManager;
}
async handleCommand(command, executionContext, resultHandler) {
const result = (await monet_1.Either.fromPromise(this.commandBusHandler(command, executionContext))).toValidation();
const finalResult = resultHandler ? await resultHandler(result, executionContext) : result;
if (finalResult.isFail()) {
throw finalResult.fail();
}
return finalResult.success();
}
createResolver(options) {
const func = async (source, args, context) => {
const data = { source, args, context };
const command = await options.commandFactory(data);
const executionContext = {
contextOptions: options.context,
gqlContext: context
};
return this.handleCommand(command, executionContext, options.resultHandler);
};
func.rp = (rp) => {
return func(rp.source, rp.args, rp.context);
};
return func;
}
createDataLoaderResolver(dataLoaderName, argKeyName) {
return (rp) => {
if (!argKeyName && Object.keys(rp.args).length >= 2) {
throw new Error(`Could not find key for dataloader: ${dataLoaderName}. No argKeyName provided and args have more than one values`);
}
const key = argKeyName ? rp.args[argKeyName] : rp.args[Object.keys(rp.args)[0]];
if (is.empty(key)) {
return;
}
return rp.context.dataLoaders.getDataLoader(dataLoaderName).load(key);
};
}
createEntityHelper(entityType) {
return new EntityHelper_1.EntityHelper(entityType, this, this.dataLoaderManager);
}
}
exports.Mapper = Mapper;
const mapper = new Mapper({}, {});
mapper.createResolver({
commandFactory() {
return {};
}
});