feat(maker): admin oper can create maker group for user now, in user manager page

This commit is contained in:
OldHawk
2017-10-19 18:44:22 +08:00
parent 7eb4a45522
commit 18f3af75cb
25 changed files with 541 additions and 35 deletions

View File

@@ -255,6 +255,7 @@ module.exports = {
AdminTorrentSetSaleType: {name: 'AdminTorrentSetSaleType', enable: true},
AdminTorrentSetRecommendLevel: {name: 'AdminTorrentSetRecommendLevel', enable: true},
AdminTorrentSetReviewedStatus: {name: 'AdminTorrentSetReviewedStatus', enable: true},
OperCreateMakerGroup: {name: 'OperCreateMakerGroup', enable: true},
userInvitationExchange: {name: 'userInvitationExchange', enable: true},
adminRemoveHnrWarning: {name: 'adminRemoveHnrWarning', enable: true},

View File

@@ -47,4 +47,37 @@
right: -20px;
opacity: 0.5;
}
}
}
.maker-side-overlay {
top: 50px !important;
@media (min-width: @screen-sm-min) {
width: 450px;
}
@media (max-width: @screen-xs-max) {
min-width: ~"calc(100% - 50px)";
}
padding: 30px 15px;
.maker-form {
margin-top: 20px;
input {
width: 100%;
}
textarea {
margin-top: 20px;
width: 100%;
height: 150px;
}
}
.bottom-control {
background-color: #fdfdfd;
border-top: solid 1px #e6e6e6;
width: 100%;
height: 50px;
position: absolute;
left: 0;
bottom: 0;
padding: 8px 10px;
}
}

View File

@@ -0,0 +1,35 @@
(function () {
'use strict';
angular
.module('about.services')
.factory('MakerGroupService', MakerGroupService);
MakerGroupService.$inject = ['$resource'];
function MakerGroupService($resource) {
return $resource('/api/makers/:makerId', {
forumId: '@_id'
}, {
update: {
method: 'PUT'
},
save: {
method: 'POST',
url: '/api/makers/create/:userId',
params: {
userId: '@userId'
}
}
//,
//addModerator: {
// method: 'PUT',
// url: '/api/admin/forums/:forumId/addModerator/:username',
// params: {
// forumId: '@_id',
// username: '@_username'
// }
//}
});
}
}());

View File

@@ -0,0 +1,14 @@
'use strict';
/**
* Module dependencies
*/
var path = require('path'),
config = require(path.resolve('./config/config'));
/**
* Module init function.
*/
module.exports = function (app, db) {
};

View File

@@ -0,0 +1,154 @@
'use strict';
/**
* Module dependencies
*/
var path = require('path'),
config = require(path.resolve('./config/config')),
mongoose = require('mongoose'),
Maker = mongoose.model('Maker'),
errorHandler = require(path.resolve('./modules/core/server/controllers/errors.server.controller')),
traceLogCreate = require(path.resolve('./config/lib/tracelog')).create;
var traceConfig = config.meanTorrentConfig.trace;
var mtDebug = require(path.resolve('./config/lib/debug'));
/**
* Create an maker
*/
exports.create = function (req, res) {
if (req.user.isOper) {
var user = req.model;
var maker = new Maker(req.body);
maker.user = user._id;
maker.members.push(user._id);
mtDebug.debugRed(maker);
maker.save(function (err) {
if (err) {
return res.status(422).send({
message: errorHandler.getErrorMessage(err)
});
} else {
//save user`s maker
user.makers.push(maker);
user.save(function (err) {
if (err) {
return res.status(422).send({
message: errorHandler.getErrorMessage(err)
});
} else {
res.json(user);
}
});
//create trace log
traceLogCreate(req, traceConfig.action.OperCreateMakerGroup, {
user: user._id,
name: maker.name
});
}
});
} else {
return res.status(403).json({
message: 'ERROR: User is not authorized'
});
}
};
/**
* Show the current maker
*/
exports.read = function (req, res) {
// convert mongoose document to JSON
var maker = req.maker ? req.maker.toJSON() : {};
maker.isCurrentUserOwner = !!(req.user && maker.user && maker.user._id.toString() === req.user._id.toString());
res.json(maker);
};
/**
* Update an maker
*/
exports.update = function (req, res) {
var maker = req.maker;
maker.name = req.body.name;
maker.desc = req.body.desc;
maker.save(function (err) {
if (err) {
return res.status(422).send({
message: errorHandler.getErrorMessage(err)
});
} else {
res.json(maker);
}
});
};
/**
* Delete an maker
*/
exports.delete = function (req, res) {
var maker = req.maker;
maker.remove(function (err) {
if (err) {
return res.status(422).send({
message: errorHandler.getErrorMessage(err)
});
} else {
res.json(maker);
}
});
};
/**
* List of makers
*/
exports.list = function (req, res) {
Maker.find()
.sort('-created')
.populate('user', 'username displayName profileImageURL isVip')
.populate('members', 'username displayName profileImageURL isVip')
.exec(function (err, makers) {
if (err) {
return res.status(422).send({
message: errorHandler.getErrorMessage(err)
});
} else {
res.json(makers);
}
});
};
/**
* Maker middleware
*/
exports.makerByID = function (req, res, next, id) {
if (!mongoose.Types.ObjectId.isValid(id)) {
return res.status(400).send({
message: 'Maker is invalid'
});
}
Maker.findById(id)
.populate('user', 'username displayName profileImageURL isVip')
.populate('members', 'username displayName profileImageURL isVip')
.exec(function (err, maker) {
if (err) {
return next(err);
} else if (!maker) {
return res.status(404).send({
message: 'No maker with that identifier has been found'
});
}
req.maker = maker;
next();
});
};

View File

@@ -10,14 +10,14 @@ var mongoose = require('mongoose'),
* Maker Schema
*/
var MakerSchema = new Schema({
founder: {
user: {
type: Schema.Types.ObjectId,
ref: 'User'
},
name: {
type: String,
unique: 'GROUP_NAME_ALREADY_EXISTS',
required: 'PLEASE_ENTER_GROUP_NAME',
uppercase: true,
trim: true,
default: ''
},
@@ -30,6 +30,10 @@ var MakerSchema = new Schema({
type: Schema.Types.ObjectId,
ref: 'User'
}],
torrent_count: {
type: Number,
default: 0
},
vote_average: {
type: Number,
default: 0

View File

@@ -0,0 +1,58 @@
'use strict';
/**
* Module dependencies
*/
var acl = require('acl');
// Using the memory backend
acl = new acl(new acl.memoryBackend());
/**
* Invoke Articles Permissions
*/
exports.invokeRolesPolicies = function () {
acl.allow([{
roles: ['oper', 'admin'],
allows: [
{resources: '/api/makers', permissions: '*'},
{resources: '/api/makers/create/:userId', permissions: '*'},
{resources: '/api/makers/:makerId', permissions: '*'}
]
}, {
roles: ['user'],
allows: [
{resources: '/api/makers', permissions: ['get']},
{resources: '/api/makers/:makerId', permissions: ['get']}
]
}]);
};
/**
* Check If Articles Policy Allows
*/
exports.isAllowed = function (req, res, next) {
var roles = (req.user) ? req.user.roles : ['guest'];
// If an article is being processed and the current user created it then allow any manipulation
if (req.maker && req.user && req.maker.user && req.maker.user.id === req.user.id) {
return next();
}
// Check for user roles
acl.areAnyRolesAllowed(roles, req.route.path, req.method.toLowerCase(), function (err, isAllowed) {
if (err) {
// An authorization error occurred
return res.status(500).send('Unexpected authorization error');
} else {
if (isAllowed) {
// Access granted! Invoke next middleware
return next();
} else {
return res.status(403).json({
message: 'User is not authorized'
});
}
}
});
};

View File

@@ -0,0 +1,22 @@
'use strict';
/**
* Module dependencies
*/
var aboutPolicy = require('../policies/about.server.policy'),
maker = require('../controllers/makers.server.controller');
module.exports = function (app) {
app.route('/api/makers').all(aboutPolicy.isAllowed)
.get(maker.list);
app.route('/api/makers/create/:userId').all(aboutPolicy.isAllowed)
.post(maker.create);
app.route('/api/makers/:makerId').all(aboutPolicy.isAllowed)
.get(maker.read)
.put(maker.update)
.delete(maker.delete);
app.param('makerId', maker.makerByID);
};

View File

@@ -0,0 +1,14 @@
'use strict';
/**
* Module dependencies
*/
var path = require('path'),
config = require(path.resolve('./config/config'));
/**
* Module init function.
*/
module.exports = function (app, db) {
};

View File

@@ -379,7 +379,9 @@
SELECT_SE: '4.1. Please select number of seasons and input number of episodes',
SELECT_TAGS: '5. Please select any tags for the resources',
ENTER_VIDEO_NFO: '6. Please enter video and audio NFO',
TORRENTS_SUBMIT_UPLOAD: '7. Agree the rules and submit your resources',
SELECT_MAKER_GROUP: '7. Please select torrent maker group upload from',
MAKER_NULL: 'NULL',
TORRENTS_SUBMIT_UPLOAD: '8. Agree the rules and submit your resources',
SUBMIT_BUTTON: 'OK, SUBMIT NOW',
CANCEL_BUTTON: 'NO, CANCEL IT',
AGREE_RULES: 'I agree and already read all the rules, <a href="/about/rules">read here</a>',
@@ -463,7 +465,12 @@
ABOUT: {
CLIENT_BLACK_LIST: 'Client Black List',
MAKER_GROUP: 'Torrents Maker Group',
BLACK_TOOLTIP: '<h4>Note:</h4>All the clients in the list was forbidden by server and can not announce or get any torrent data, For more help, please contact our <strong><a href="mailto:{{admin}}">administrator</a></strong>.'
BLACK_TOOLTIP: '<h4>Note:</h4>All the clients in the list was forbidden by server and can not announce or get any torrent data, For more help, please contact our <strong><a href="mailto:{{admin}}">administrator</a></strong>.',
FORM_MAKER_NAME: 'Maker Group Name',
FORM_MAKER_DESC: 'Maker Group Description',
FORM_MAKER_FOR: 'Create maker group for - {{name}}',
MAKER_CREATE_SUCCESSFULLY: 'Create maker group successfully',
MAKER_CREATE_FAILED: 'Create maker group failed'
},
//collections views
@@ -525,9 +532,11 @@
STATUS: 'Status',
NORMAL: 'normal',
BANNED: 'banned',
BTN_BAN: 'ban',
BTN_UNBAN: 'unban',
BTN_BAN: 'Ban',
BTN_UNBAN: 'Unban',
BTN_CREATE_MAKER: 'Create Maker',
SEALED: 'sealed',
MAKER: 'Maker Group',
VIP_START_AT: 'Vip start at',
VIP_END_AT: 'Vip end at',
UPLOADED: 'Total uploaded',

View File

@@ -379,7 +379,9 @@
SELECT_SE: '4.1. 请选择电视剧季数并输入本资源为本剧第几集',
SELECT_TAGS: '5. 请为资源选择合适的标签',
ENTER_VIDEO_NFO: '6. 请输入视频和音频的NFO信息',
TORRENTS_SUBMIT_UPLOAD: '7. 同意上传协议,并提交',
SELECT_MAKER_GROUP: '7. 请选择你上传时使用的资源压制小组',
MAKER_NULL: '无',
TORRENTS_SUBMIT_UPLOAD: '8. 同意上传协议,并提交',
SUBMIT_BUTTON: '已备妥,现在提交',
CANCEL_BUTTON: '算了,以后再说',
AGREE_RULES: '我已阅读并同意站内所有协议条款,<a href="/about/rules">协议条款</a>',
@@ -463,7 +465,12 @@
ABOUT: {
CLIENT_BLACK_LIST: '禁止客户端列表',
MAKER_GROUP: '资源压制小组',
BLACK_TOOLTIP: '<h4>提示:</h4>下面列出的所有客户端都已被服务器禁止,使用它们将不能下载到任何数据, 如需其它帮助,请与我们的 <strong><a href="mailto:{{admin}}">系统管理员</a> </strong>联系.'
BLACK_TOOLTIP: '<h4>提示:</h4>下面列出的所有客户端都已被服务器禁止,使用它们将不能下载到任何数据, 如需其它帮助,请与我们的 <strong><a href="mailto:{{admin}}">系统管理员</a> </strong>联系.',
FORM_MAKER_NAME: '资源压制小组名称',
FORM_MAKER_DESC: '资源压制小组简介',
FORM_MAKER_FOR: '创建资源压制小组 - {{name}}',
MAKER_CREATE_SUCCESSFULLY: '资源压制小组创建成功',
MAKER_CREATE_FAILED: '资源压制小组创建失败'
},
//collections views
@@ -527,7 +534,9 @@
BANNED: '被禁止',
BTN_BAN: '禁止',
BTN_UNBAN: '解禁',
BTN_CREATE_MAKER: '创建小组',
SEALED: '冻结',
MAKER: '资源压制小组',
VIP_START_AT: 'Vip 资格开始于',
VIP_END_AT: 'Vip 资格结束于',
UPLOADED: '总上传量',

View File

@@ -1434,6 +1434,15 @@ body {
}
}
.maker-list {
&:not(:first-child) {
&::before {
content: " | ";
font-weight: bold;
}
}
}
.set-score-popover {
max-width: 250px;
max-height: 150px;

View File

@@ -21,6 +21,7 @@
vm.progress = 0;
vm.torrentInfo = null;
vm.tags = [];
vm.maker = 'NULL';
vm.videoNfo = '';
vm.customTorrent = {};
@@ -351,6 +352,7 @@
var torrent = new TorrentsService({
info_hash: vm.torrentInfo.info_hash,
maker: vm.maker === 'NULL' ? undefined : vm.maker,
torrent_filename: vm.torrentInfo.filename,
torrent_type: 'movie',
torrent_tags: t,
@@ -390,6 +392,7 @@
var torrent = new TorrentsService({
info_hash: vm.torrentInfo.info_hash,
maker: vm.maker === 'NULL' ? undefined : vm.maker,
torrent_filename: vm.torrentInfo.filename,
torrent_type: 'tvserial',
torrent_seasons: vm.selectedSeasons,
@@ -450,6 +453,7 @@
var torrent = new TorrentsService({
info_hash: vm.torrentInfo.info_hash,
maker: vm.maker === 'NULL' ? undefined : vm.maker,
torrent_filename: vm.torrentInfo.filename,
torrent_type: vm.selectedType,
torrent_tags: t,

View File

@@ -55,7 +55,23 @@
<div ng-show="vm.selectedType" ng-include="vm.getIncludeUploadTemplateID(vm.selectedType);"></div>
<div class="row margin-bottom-40 margin-top-50" ng-show="vm.showAgreeAndSubmit || vm.customTorrent.detail">
<div class="col-md-12 col-sm-12 col-xs-12">
<div class="col-xs-12">
<legend class="small-legend" translate="SELECT_MAKER_GROUP"></legend>
<div class="col-xs-12 col-sm-6 col-md-4">
<label class="radio-inline">
<input type="radio" name="maker_NULL" ng-model="vm.maker"
id="maker_NULL"
value="NULL"> {{'MAKER_NULL' | translate}}
</label>
<label class="radio-inline" ng-repeat="m in vm.user.makers">
<input type="radio" name="maker_{{m.name}}" ng-model="vm.maker"
id="maker_{{m.name}}"
value="{{m._id}}"> {{m.name}}
</label>
</div>
</div>
<div class="col-md-12 col-sm-12 col-xs-12 margin-top-50">
<legend class="small-legend" translate="TORRENTS_SUBMIT_UPLOAD"></legend>
<div class="col-sm-6 col-sm-offset-3 text-center">
<label class="checkbox text-uppercase">

View File

@@ -10,6 +10,7 @@ var path = require('path'),
multer = require('multer'),
moment = require('moment'),
User = mongoose.model('User'),
Maker = mongoose.model('Maker'),
Peer = mongoose.model('Peer'),
Subtitle = mongoose.model('Subtitle'),
Thumb = mongoose.model('Thumb'),
@@ -565,6 +566,12 @@ exports.create = function (req, res) {
req.user.update({
$inc: {uptotal: 1}
}).exec();
//update maker torrent count
if (torrent.maker) {
Maker.update({_id: torrent.maker}, {
$inc: {torrent_count: 1}
}).exec();
}
//scrape torrent status info in public cms mode
if (!config.meanTorrentConfig.announce.privateTorrentCmsMode && config.meanTorrentConfig.scrapeTorrentStatus.onTorrentUpload) {
@@ -1041,6 +1048,10 @@ exports.delete = function (req, res) {
Subtitle.remove({
torrent: torrent._id
});
//update maker torrent count
torrent.maker.update({
$inc: {torrent_count: -1}
}).exec();
//update user uptotal fields
torrent.user.update({
@@ -1202,6 +1213,7 @@ exports.list = function (req, res) {
Torrent.find(condition)
.sort(sort)
.populate('user', 'username displayName isVip')
.populate('maker', 'name')
.skip(skip)
.limit(limit)
.exec(function (err, torrents) {
@@ -1350,6 +1362,7 @@ exports.torrentByID = function (req, res, next, id) {
var findTorrents = function (callback) {
Torrent.findById(id)
.populate('user', 'username displayName profileImageURL isVip')
.populate('maker', 'name')
.populate('_thumbs.user', 'username displayName profileImageURL isVip uploaded downloaded')
.populate('_ratings.user', 'username displayName profileImageURL isVip uploaded downloaded')
.populate({
@@ -1395,11 +1408,12 @@ exports.torrentByID = function (req, res, next, id) {
mtDebug.debugGreen(condition);
var fields = 'user torrent_filename torrent_tags torrent_seeds torrent_leechers torrent_finished torrent_seasons torrent_episodes torrent_size torrent_sale_status torrent_type torrent_hnr torrent_vip torrent_sale_expires createdat';
var fields = 'user maker torrent_filename torrent_tags torrent_seeds torrent_leechers torrent_finished torrent_seasons torrent_episodes torrent_size torrent_sale_status torrent_type torrent_hnr torrent_vip torrent_sale_expires createdat';
Torrent.find(condition, fields)
.sort('-createdat')
.populate('user', 'username displayName isVip')
.populate('maker', 'name')
.exec(function (err, torrents) {
if (err) {
callback(err);

View File

@@ -79,6 +79,10 @@ var TorrentSchema = new Schema({
type: Schema.Types.ObjectId,
ref: 'User'
},
maker: {
type: Schema.Types.ObjectId,
ref: 'Maker'
},
info_hash: {
type: String,
default: '',

View File

@@ -6,10 +6,10 @@
.controller('UserController', UserController);
UserController.$inject = ['$scope', '$state', '$window', 'Authentication', 'userResolve', 'Notification', 'NotifycationService', 'MeanTorrentConfig',
'AdminService', 'ScoreLevelService', 'DebugConsoleService', 'TorrentGetInfoServices'];
'AdminService', 'ScoreLevelService', 'DebugConsoleService', 'TorrentGetInfoServices', 'SideOverlay', 'MakerGroupService'];
function UserController($scope, $state, $window, Authentication, user, Notification, NotifycationService, MeanTorrentConfig,
AdminService, ScoreLevelService, mtDebug, TorrentGetInfoServices) {
AdminService, ScoreLevelService, mtDebug, TorrentGetInfoServices, SideOverlay, MakerGroupService) {
var vm = this;
vm.TGI = TorrentGetInfoServices;
vm.authentication = Authentication;
@@ -26,6 +26,7 @@
vm.scoreLevelData = ScoreLevelService.getScoreLevelJson(vm.user.score);
vm.searchTags = [];
vm.maker = {};
vm.setUserScorePopover = {
title: 'SCORE_TITLE',
@@ -45,6 +46,7 @@
isOpen: false
};
mtDebug.info(vm.user);
/**
* remove
* @param user
@@ -151,6 +153,51 @@
}
};
/**
* showMakerGroup
* @param evt
*/
vm.showMakerGroup = function (evt) {
vm.maker = {};
SideOverlay.open(evt, 'makerSlide');
};
/**
* hideTagsPopup
*/
vm.hideMakerPopup = function () {
SideOverlay.close(null, 'makerSlide');
};
/**
* createMakerGroup
*/
vm.createMakerGroup = function () {
vm.maker.userId = vm.user._id;
var maker = new MakerGroupService(vm.maker);
mtDebug.info(maker);
maker.$save(function (response) {
successCallback(response);
}, function (errorResponse) {
errorCallback(errorResponse);
});
function successCallback(res) {
vm.maker = {};
vm.user = res;
NotifycationService.showSuccessNotify('ABOUT.MAKER_CREATE_SUCCESSFULLY');
SideOverlay.close(null, 'makerSlide');
}
function errorCallback(res) {
vm.maker = {};
NotifycationService.showErrorNotify(res.data.message, 'ABOUT.MAKER_CREATE_FAILED');
}
};
/**
* onUserRoleChanged
* admin set user`s role

View File

@@ -72,13 +72,26 @@
<dd class="h-line">
<mark>{{ vm.user.roles[0] }}</mark>
<div class="pull-right" ng-if="vm.authentication.user.username != vm.user.username && vm.authentication.user.isAdmin">
<select ng-model="vm.selectedRole" ng-change="vm.onUserRoleChanged();">
<select class="width-100" ng-model="vm.selectedRole" ng-change="vm.onUserRoleChanged();">
<option ng-repeat="r in vm.userRolesConfig" value="{{r}}">{{ r }}
</option>
</select>
</div>
</dd>
<dt class="h-line">{{ 'STATUS_FIELD.MAKER' | translate}}</dt>
<dd class="h-line">
<span ng-class="maker-list" ng-repeat="m in vm.user.makers">{{m.name}}</span>
<span ng-if="vm.user.makers.length==0">-</span>
<div class="pull-right"
ng-if="vm.authentication.user.isOper && vm.user.makers.length==0">
<button class="btn btn-default btn-xs btn-width-100" ng-click="vm.showMakerGroup($event);">
{{'STATUS_FIELD.BTN_CREATE_MAKER' | translate}}
</button>
</div>
</dd>
<dt class="h-line">{{ 'STATUS_FIELD.STATUS' | translate}}</dt>
<dd class="h-line">
<span ng-class="{'span-banned': vm.user.status == 'banned'}">{{ 'STATUS_FIELD.' + vm.user.status.toUpperCase() | translate }}</span>
@@ -233,6 +246,25 @@
</div>
</div>
<div id="makerSlide" side-overlay="right" side-class="maker-side-overlay" side-close-on-esc side-modal>
<h4 translate="ABOUT.FORM_MAKER_FOR" translate-values="{name: vm.user.displayName}"></h4>
<div class="maker-form">
<input type="text" class="form-control" id="name" placeholder="{{'ABOUT.FORM_MAKER_NAME' | translate}}"
ng-model="vm.maker.name" autofocus>
<textarea class="form-control" id="desc" placeholder="{{'ABOUT.FORM_MAKER_DESC' | translate}}"
ng-model="vm.maker.desc"></textarea>
</div>
<div class="bottom-control">
<button class="btn btn-success btn-width-100"
ng-disabled="!vm.maker.name || !vm.maker.desc"
ng-click="vm.createMakerGroup();">{{ 'BUTTON_SAVE' | translate }}
</button>
<button class="btn btn-default btn-width-100" ng-click="vm.hideMakerPopup();">{{ 'BUTTON_CANCEL' | translate }}</button>
</div>
</div>
<script type="text/ng-template" id="set-user-score.html">
<form class="form-inline set-score-popover-form text-center">
<div class="form-group">

View File

@@ -56,6 +56,12 @@
<mark>{{ vm.user.roles[0] }}</mark>
</dd>
<dt class="h-line">{{ 'STATUS_FIELD.MAKER' | translate}}</dt>
<dd class="h-line">
<span ng-class="maker-list" ng-repeat="m in vm.user.makers">{{m.name}}</span>
<span ng-if="vm.user.makers.length==0">-</span>
</dd>
<dt class="h-line">{{ 'STATUS_FIELD.SCORE' | translate}}</dt>
<dd class="h-line">
<span class="text-score">{{ vm.user.score }}</span> <span score-level="vm.scoreLevelData.currLevel"></span> <a

View File

@@ -54,6 +54,12 @@
<mark>{{ vm.user.roles[0] }}</mark>
</dd>
<dt class="h-line">{{ 'STATUS_FIELD.MAKER' | translate}}</dt>
<dd class="h-line">
<span ng-class="maker-list" ng-repeat="m in vm.user.makers">{{m.name}}</span>
<span ng-if="vm.user.makers.length==0">-</span>
</dd>
<dt class="h-line">{{ 'STATUS_FIELD.STATUS' | translate}}</dt>
<dd class="h-line">
<span ng-class="{'span-banned': vm.user.status == 'banned'}">{{ 'STATUS_FIELD.' + vm.user.status.toUpperCase() | translate }}</span>

View File

@@ -22,6 +22,7 @@ module.exports = function () {
email: usernameOrEmail.toLowerCase()
}]
}).populate('invited_by', 'username displayName profileImageURL')
.populate('makers', 'name')
.exec(function (err, user) {
console.log(user);
if (err) {

View File

@@ -22,9 +22,11 @@ module.exports = function (app) {
passport.deserializeUser(function (id, done) {
User.findOne({
_id: id
}, '-salt -password').populate('invited_by', 'username displayName profileImageURL').exec(function (err, user) {
done(err, user);
});
}, '-salt -password')
.populate('invited_by', 'username displayName profileImageURL')
.populate('makers', 'name').exec(function (err, user) {
done(err, user);
});
});
// Initialize strategies

View File

@@ -155,6 +155,7 @@ exports.list = function (req, res) {
User.find(condition, '-salt -password -providerData')
.sort('-created')
.populate('invited_by', 'username displayName profileImageURL isVip uploaded downloaded')
.populate('makers', 'name')
.skip(skip)
.limit(limit)
.exec(function (err, users) {
@@ -508,14 +509,17 @@ exports.userByID = function (req, res, next, id) {
});
}
User.findById(id, '-salt -password -providerData').populate('invited_by', 'username displayName profileImageURL').exec(function (err, user) {
if (err) {
return next(err);
} else if (!user) {
return next(new Error('Failed to load user ' + id));
}
User.findById(id, '-salt -password -providerData')
.populate('invited_by', 'username displayName profileImageURL')
.populate('makers', 'name')
.exec(function (err, user) {
if (err) {
return next(err);
} else if (!user) {
return next(new Error('Failed to load user ' + id));
}
req.model = user;
next();
});
req.model = user;
next();
});
};

View File

@@ -19,14 +19,17 @@ exports.userByID = function (req, res, next, id) {
User.findOne({
_id: id
}).populate('invited_by', 'username displayName profileImageURL').exec(function (err, user) {
if (err) {
return next(err);
} else if (!user) {
return next(new Error('Failed to load User ' + id));
}
})
.populate('invited_by', 'username displayName profileImageURL')
.populate('makers', 'name')
.exec(function (err, user) {
if (err) {
return next(err);
} else if (!user) {
return next(new Error('Failed to load User ' + id));
}
req.profile = user;
next();
});
req.profile = user;
next();
});
};

View File

@@ -200,6 +200,11 @@ var UserSchema = new Schema({
type: Schema.Types.ObjectId,
ref: 'User'
},
makers: [{
type: Schema.Types.ObjectId,
ref: 'Maker'
}],
created: {
type: Date,
default: Date.now