Skip to content

Instantly share code, notes, and snippets.

@carlbennettnz
Last active November 27, 2017 22:51
Show Gist options
  • Save carlbennettnz/09bf826efde9e9221c0bbdfd5334a745 to your computer and use it in GitHub Desktop.
Save carlbennettnz/09bf826efde9e9221c0bbdfd5334a745 to your computer and use it in GitHub Desktop.
/*
A script that outputs a list of the top choices for each package
*/
const User = require('../models/schemas/user');
const Package = require('../models/schemas/package');
const Session = require('../models/schemas/session');
const User_Helpers = require('../controllers/users');
const Package_Helpers = require('../controllers/packages');
const Session_Helpers = require('../controllers/sessions');
// Weights for our matching algorithm
// Get all active users
// Get all the users that have taught that subject in the past
// Get all the users that have worked less than 3 hours that week
// Display top twenty
exports.findBestTutors = async (req, res, next) => {
const today = new Date(); //now
const nextWeek = new Date(); // seven days from now
nextWeek.setDate(today.getDate() + 7);
const users = await User.find({
isActive: true,
type: 'tutor'
});
const resultsPromise = users.map(async user => {
const packages = await Package.find({ tutorID: user._id });
const doesTeachSubject = packages.some(pkg => pkg.tag == req.params.subject);
const hours = await packages.reduce(async (totalPromise, package) => {
const sessionsPromise = Session.find({
packageID: package._id,
startDate: { $gte: today },
endDate: { $lte: nextWeek }
});
const [ sessions, runningTotal ] = await Promise.all([ sessionsPromise, totalPromise ]);
return runningTotal + sessions.reduce((total, session) => total + session.duration, 0);
}, Promise.resolve(0));
return [
user,
doesTeachSubject,
hours
];
});
const results = await Promise.all(resultsPromise);
res.json(results);
};
/*
exports.findBestTutors = (req, res, next) => {
User.find({
$and: [
{ isActive: true },
{ type: 'tutor' },
]
}, (err, users) => {
if (err) return next(err);
else {
console.log("Users are: ")
console.log(users);
var today = new Date() //now
var nextWeek = new Date() // seven days from now
nextWeek.setDate(today.getDate() + 7);
for (i=0; i<users.length; i++) {
users[i].hours = 0;
users[i].subject = false;
Package.find({tutorID: users[i]._id}, (err, packages) => {
if (err) return next(err);
else {
for (j=0; j<packages.length; j++) {
if (packages[j].tag == req.params.subject) {
users[i].subject = true; //does teach this subject!
console.log("User changed to:");
console.log(users[i].subject);
}
Session.find({
$and: [
{ packageID: packages[j]._id },
{ startDate: {$gte: today} },
{ endDate: {$lte: nextWeek} }
]
}, (err, sessions) => {
if (err) return next(err);
for (j=0; j<sessions.length; j++) {
users[i].hours += sessions[j].duration;
}
});
}
}
});
}
// time to sort now
users.sort(function(a, b) {
return (a.subject - b.subject) * 100 + (b.hours - a.hours);
});
res.json(users);
}
});
}
*/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment