rewrite & api: use mongoose populate to replace group.members array with
popualte member objects. this puts a load on the front-end, we'll need to optimize! also added some duplicates sanitization.
This commit is contained in:
+20
-26
@@ -18,34 +18,23 @@ var api = module.exports;
|
||||
|
||||
api.getGroups = function(req, res, next) {
|
||||
var user = res.locals.user;
|
||||
/*TODO should we support non-authenticated users? just for viewing public groups?*/
|
||||
var usernameFields = 'auth.local.username auth.facebook.first_name auth.facebook.last_name auth.facebook.name auth.facebook.username';
|
||||
|
||||
return async.parallel({
|
||||
// First get all groups
|
||||
async.parallel({
|
||||
party: function(cb) {
|
||||
async.waterfall([
|
||||
function(cb2) {
|
||||
Group.findOne({type: 'party', members: {'$in': [user._id]}}, cb2);
|
||||
}, function(party, cb2) {
|
||||
var fields, query;
|
||||
party = party.toJSON();
|
||||
query = {_id: {
|
||||
'$in': party.members,
|
||||
'$nin': [user._id]
|
||||
}
|
||||
};
|
||||
fields = 'profile preferences items stats achievements party backer auth.local.username auth.facebook.first_name auth.facebook.last_name auth.facebook.name auth.facebook.username'.split(' ');
|
||||
fields = _.reduce(fields, (function(m, k, v) {m[k] = 1;return m;}), {});
|
||||
User.find(query, fields, function(err, members) {
|
||||
party.members = members;
|
||||
cb2(err, party);
|
||||
});
|
||||
}
|
||||
], function(err, members) {
|
||||
cb(err, members);
|
||||
});
|
||||
Group
|
||||
.findOne({type: 'party', members: {'$in': [user._id]}})
|
||||
.populate({
|
||||
path: 'members',
|
||||
//match: {_id: {$ne: user._id}}, //fixme this causes it to hang??
|
||||
select: 'profile preferences items stats achievements party backer ' + usernameFields
|
||||
})
|
||||
.exec(cb);
|
||||
},
|
||||
guilds: function(cb) {
|
||||
Group.find({type: 'guild', members: {'$in': [user._id]}}, cb);
|
||||
Group.find({type: 'guild', members: {'$in': [user._id]}}).populate('members', usernameFields).exec(cb);
|
||||
// Group.find({type: 'guild', members: {'$in': [user._id]}}, cb);
|
||||
},
|
||||
tavern: function(cb) {
|
||||
Group.findOne({_id: 'habitrpg'}, cb);
|
||||
@@ -59,8 +48,13 @@ api.getGroups = function(req, res, next) {
|
||||
members: 1
|
||||
}, cb);
|
||||
}
|
||||
}, function(err, results) {
|
||||
}, function(err, results){
|
||||
if (err) return res.json(500, {err: err});
|
||||
|
||||
// Remove self from party (see above failing `match` directive in `populate`
|
||||
var i = _.findIndex(results.party.members, {_id:user._id});
|
||||
if (~i) results.party.members.splice(i,1);
|
||||
|
||||
res.json(results);
|
||||
});
|
||||
})
|
||||
};
|
||||
+43
-18
@@ -1,18 +1,10 @@
|
||||
var GroupSchema, Schema, helpers, mongoose, _;
|
||||
var mongoose = require("mongoose");
|
||||
var Schema = mongoose.Schema;
|
||||
var helpers = require('habitrpg-shared/script/helpers');
|
||||
var _ = require('lodash');
|
||||
|
||||
mongoose = require("mongoose");
|
||||
|
||||
Schema = mongoose.Schema;
|
||||
|
||||
helpers = require('habitrpg-shared/script/helpers');
|
||||
|
||||
_ = require('lodash');
|
||||
|
||||
GroupSchema = new Schema({
|
||||
_id: {
|
||||
type: String,
|
||||
'default': helpers.uuid
|
||||
},
|
||||
var GroupSchema = new Schema({
|
||||
_id: {type: String, 'default': helpers.uuid},
|
||||
name: String,
|
||||
description: String,
|
||||
leader: {
|
||||
@@ -43,7 +35,9 @@ GroupSchema = new Schema({
|
||||
Number: Number,
|
||||
'default': 0
|
||||
},
|
||||
websites: Array,
|
||||
chat: Array,
|
||||
|
||||
/*
|
||||
# [{
|
||||
# timestamp: Date
|
||||
@@ -58,10 +52,41 @@ GroupSchema = new Schema({
|
||||
balance: Number,
|
||||
logo: String,
|
||||
leaderMessage: String
|
||||
}, {
|
||||
strict: 'throw'
|
||||
});
|
||||
}, {strict: 'throw'});
|
||||
|
||||
|
||||
/**
|
||||
* Derby duplicated stuff. This is a temporary solution, once we're completely off derby we'll run an mongo migration
|
||||
* to remove duplicates, then take these fucntions out
|
||||
*/
|
||||
function removeDuplicates(doc){
|
||||
// Remove duplicate members
|
||||
if (doc.members) {
|
||||
var uniqMembers = _.uniq(doc.members);
|
||||
if (uniqMembers.length != doc.members.length) {
|
||||
doc.members = uniqMembers;
|
||||
}
|
||||
}
|
||||
|
||||
if (doc.websites) {
|
||||
var uniqWebsites = _.uniq(doc.websites);
|
||||
if (uniqWebsites.length != doc.websites.length) {
|
||||
doc.websites = uniqWebsites;
|
||||
}
|
||||
console.log(doc.websites);
|
||||
}
|
||||
}
|
||||
|
||||
GroupSchema.pre('save', function(next){
|
||||
removeDuplicates(this);
|
||||
next();
|
||||
})
|
||||
|
||||
GroupSchema.methods.toJSON = function(){
|
||||
var doc = this.toObject();
|
||||
removeDuplicates(doc);
|
||||
return doc;
|
||||
}
|
||||
|
||||
module.exports.schema = GroupSchema;
|
||||
|
||||
module.exports.model = mongoose.model("Group", GroupSchema);
|
||||
+13
-26
@@ -1,14 +1,9 @@
|
||||
var Schema, UserSchema, helpers, mongoose, _;
|
||||
var mongoose = require("mongoose");
|
||||
var Schema = mongoose.Schema;
|
||||
var helpers = require('habitrpg-shared/script/helpers');
|
||||
var _ = require('lodash');
|
||||
|
||||
mongoose = require("mongoose");
|
||||
|
||||
Schema = mongoose.Schema;
|
||||
|
||||
helpers = require('habitrpg-shared/script/helpers');
|
||||
|
||||
_ = require('lodash');
|
||||
|
||||
UserSchema = new Schema({
|
||||
var UserSchema = new Schema({
|
||||
_id: {
|
||||
type: String,
|
||||
'default': helpers.uuid
|
||||
@@ -274,20 +269,16 @@ UserSchema.post('init', function(doc) {
|
||||
|
||||
|
||||
UserSchema.methods.toJSON = function() {
|
||||
var doc;
|
||||
doc = this.toObject();
|
||||
var doc = this.toObject();
|
||||
doc.id = doc._id;
|
||||
_.each(['habit', 'daily', 'todo', 'reward'], function(type) {
|
||||
/* we use _.transform instead of a simple _.where in order to maintain sort-order*/
|
||||
|
||||
return doc["" + type + "s"] = _.transform(doc["" + type + "Ids"], function(result, tid) {
|
||||
return result.push(doc.tasks[tid]);
|
||||
// we use _.transform instead of a simple _.where in order to maintain sort-order
|
||||
doc["" + type + "s"] = _.transform(doc["" + type + "Ids"], function(result, tid) {
|
||||
result.push(doc.tasks[tid]);
|
||||
});
|
||||
/*delete doc["#{type}Ids"]*/
|
||||
|
||||
//delete doc["#{type}Ids"]
|
||||
});
|
||||
/*delete doc.tasks*/
|
||||
|
||||
//delete doc.tasks
|
||||
doc.filters = {};
|
||||
return doc;
|
||||
};
|
||||
@@ -296,16 +287,12 @@ UserSchema.methods.toJSON = function() {
|
||||
# FIXME - since we're using special @post('init') above, we need to flag when the original path was modified.
|
||||
# Custom setter/getter virtuals?
|
||||
*/
|
||||
|
||||
|
||||
UserSchema.pre('save', function(next) {
|
||||
this.markModified('tasks');
|
||||
/*our own version incrementer*/
|
||||
|
||||
//our own version incrementer
|
||||
this._v++;
|
||||
return next();
|
||||
next();
|
||||
});
|
||||
|
||||
module.exports.schema = UserSchema;
|
||||
|
||||
module.exports.model = mongoose.model("User", UserSchema);
|
||||
Reference in New Issue
Block a user