diff --git a/nodejs/graphql/resolvers/merge.js b/nodejs/graphql/resolvers/merge.js index e4b481d..73052f0 100644 --- a/nodejs/graphql/resolvers/merge.js +++ b/nodejs/graphql/resolvers/merge.js @@ -1,26 +1,35 @@ +const DataLoader = require('dataloader'); + const Event = require('../../models/event'); const User = require('../../models/user'); const { dateToString } = require('../../util/date'); +const eventsLoader = new DataLoader(async ids => { + console.log('events', { ids }); + const events = await Event.find({ _id: { $in: ids } }); + return events.map(transformEvent); +}); + +const userLoader = new DataLoader(ids => { + console.log('user', { ids }); + return User.find({ _id: { $in: ids } }).exec(); +}); + const findUserById = async id => { - const user = await User.findById(id); + const user = await userLoader.load(id.toString()); return { ...user._doc, - createdEvents: () => findEventsByIds(user.createdEvents), + createdEvents: () => eventsLoader.loadMany(user.createdEvents.map(id => id.toString())), }; }; -const findEventById = async id => { - const event = await Event.findById(id); - return transformEvent(event); -} - -const findEventsByIds = async ids => { - const events = await Event.find({ _id: { $in: ids } }); - return events.map(transformEvent); -} +const findEventById = id => eventsLoader.load(id.toString()); +/** + * + * @param {*} event + */ const transformEvent = event => { return { ...event._doc, @@ -29,6 +38,10 @@ const transformEvent = event => { }; } +/** + * + * @param {*} booking + */ const transformBooking = booking => { return { ...booking._doc, @@ -40,9 +53,6 @@ const transformBooking = booking => { } module.exports = { - findUserById, - findEventById, - findEventsByIds, transformEvent, transformBooking, } diff --git a/nodejs/package-lock.json b/nodejs/package-lock.json index 85c4d3e..551d1a9 100644 --- a/nodejs/package-lock.json +++ b/nodejs/package-lock.json @@ -532,6 +532,11 @@ "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", "dev": true }, + "dataloader": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/dataloader/-/dataloader-1.4.0.tgz", + "integrity": "sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw==" + }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", diff --git a/nodejs/package.json b/nodejs/package.json index 9a0f7ac..de9eca1 100644 --- a/nodejs/package.json +++ b/nodejs/package.json @@ -23,6 +23,7 @@ "dependencies": { "bcrypt": "^3.0.6", "cors": "^2.8.5", + "dataloader": "^1.4.0", "express": "^4.17.1", "express-graphql": "^0.9.0", "graphql": "^14.4.2",