Skip to content

Instantly share code, notes, and snippets.

@yoadsn
Created November 16, 2016 20:46
Show Gist options
  • Save yoadsn/3d4b432580075ee656a9b92283eed2e0 to your computer and use it in GitHub Desktop.
Save yoadsn/3d4b432580075ee656a9b92283eed2e0 to your computer and use it in GitHub Desktop.
Resolve both Global and MongoDB ids - attempt
import composeWithMongoose from 'graphql-compose-mongoose';
import { composeWithRelay, fromGlobalId } from 'graphql-compose-relay';
import { MyModel } from './dbSchema.js'; // mongoose models..
const mongoOrGlobalIdToMongoId = (_id) => {
let resultId = _id;
if (isString(_id) && !/^[a-fA-F0-9]{24}$/.test(_id)) {
const { type, id } = fromGlobalId(_id);
if (type && /^[a-zA-Z]*$/.test(type)) {
resultId = id;
}
}
return resultId;
}
const globalIdArgResolveWrapper = (fn) => (resolveParams) => {
resolveParams.args._id = mongoOrGlobalIdToMongoId(resolveParams.args.id);
return fn(resolveParams);
}
const globalIdsArgResolveWrapper = (fn) => (resolveParams) => {
resolveParams.args._ids = resolveParams.args.ids.map(mongoOrGlobalIdToMongoId);
return fn(resolveParams);
}
const adaptIdArgs = (oldArgName, newArgName, prevArgs) => {
let oldIdArg = prevArgs[oldArgName];
delete prevArgs[oldArgName];
prevArgs[newArgName] = oldIdArg;
return prevArgs;
}
const globalizeIdInputFieldForResolver = (tc, resolverName) => {
let resolver = tc.get(`$${resolverName}`);
if (resolver) {
let argsAdaptationStrategy = (args) => args;
let resolveWrapper = (fn) => fn;
if (resolver.getArg('_id')) {
argsAdaptationStrategy = adaptIdArgs.bind(null, '_id', 'id');
resolveWrapper = globalIdArgResolveWrapper;
} else if (resolver.getArg('_ids')) { // Assuming not both would exist - bad assumption..
argsAdaptationStrategy = adaptIdArgs.bind(null, '_ids', 'ids');
resolveWrapper = globalIdsArgResolveWrapper;
}
let wrappedResolver = resolver.wrapArgs(argsAdaptationStrategy);
wrappedResolver = wrappedResolver.wrapResolve(resolveWrapper);
tc.setResolver(resolverName, wrappedResolver);
}
}
const globalizeIdInputFields = (tc) => {
globalizeIdInputFieldForResolver(tc, 'findById');
globalizeIdInputFieldForResolver(tc, 'findByIds');
//... Need to also do the same for mutations, and maybe other resolvers..
return tc;
}
// Usage
let myTC = globalizeIdInputFields(composeWithRelay(composeWithMongoose(MyModel)));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment