Skip to content

Instantly share code, notes, and snippets.

@AntonioVdlC
Created May 27, 2020 20:49
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save AntonioVdlC/7bef4bd80f92b7bed2f3e50a2d701d32 to your computer and use it in GitHub Desktop.
Save AntonioVdlC/7bef4bd80f92b7bed2f3e50a2d701d32 to your computer and use it in GitHub Desktop.
const errors = require("./errors");
const _fromRequest = f => async req => {
const ctx = {};
f.resolvers.forEach((resolver, i) => {
if (!resolver) {
throw new Error(`Incorrect resolver ${resolver} (index #${i} in resolvers array)`);
}
ctx[resolver.name] = resolver(req);
});
return f(ctx);
};
const _runHandler = (resolvers, func) => ctx => {
const validatedCtx = ctx;
return Promise.all(
resolvers.map(async resolver => {
try {
validatedCtx[resolver.name] = resolver.validate(ctx[resolver.name]);
} catch (err) {
throw new errors.ValidationError(resolver.name, err);
}
}),
).then(() => func(validatedCtx));
};
const resolver = (name, resolve, validate) => {
const f = req => {
try {
return resolve(req);
} catch (err) {
throw new errors.RequestContextError(resolver.name, err);
}
};
Object.defineProperty(f, "name", { value: name });
f.validate = validate || (identity => identity);
return f;
};
const handler = (resolvers, func) => {
let f = _runHandler(resolvers, func);
Object.defineProperty(f, "name", { value: func.name });
f.resolvers = resolvers;
f.fromRequest = _fromRequest(f);
return f;
};
module.exports = { handler, resolver };
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment