Created
November 16, 2016 20:46
-
-
Save yoadsn/3d4b432580075ee656a9b92283eed2e0 to your computer and use it in GitHub Desktop.
Resolve both Global and MongoDB ids - attempt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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