mirror of
https://github.com/taobataoma/meanTorrent.git
synced 2026-05-07 08:47:47 +02:00
feat(maker): admin oper can create maker group for user now, in user manager page
This commit is contained in:
1
config/env/torrents.js
vendored
1
config/env/torrents.js
vendored
@@ -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},
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
35
modules/about/client/services/makers.client.service.js
Normal file
35
modules/about/client/services/makers.client.service.js
Normal 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'
|
||||
// }
|
||||
//}
|
||||
});
|
||||
}
|
||||
}());
|
||||
14
modules/about/server/config/about.server.config.js
Normal file
14
modules/about/server/config/about.server.config.js
Normal 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) {
|
||||
|
||||
};
|
||||
154
modules/about/server/controllers/makers.server.controller.js
Normal file
154
modules/about/server/controllers/makers.server.controller.js
Normal 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();
|
||||
});
|
||||
};
|
||||
@@ -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
|
||||
|
||||
58
modules/about/server/policies/about.server.policy.js
Normal file
58
modules/about/server/policies/about.server.policy.js
Normal 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'
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
};
|
||||
22
modules/about/server/routes/about.server.routes.js
Normal file
22
modules/about/server/routes/about.server.routes.js
Normal 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);
|
||||
};
|
||||
@@ -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) {
|
||||
|
||||
};
|
||||
@@ -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',
|
||||
|
||||
@@ -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: '总上传量',
|
||||
|
||||
@@ -1434,6 +1434,15 @@ body {
|
||||
}
|
||||
}
|
||||
|
||||
.maker-list {
|
||||
&:not(:first-child) {
|
||||
&::before {
|
||||
content: " | ";
|
||||
font-weight: bold;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.set-score-popover {
|
||||
max-width: 250px;
|
||||
max-height: 150px;
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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: '',
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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();
|
||||
});
|
||||
};
|
||||
|
||||
@@ -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();
|
||||
});
|
||||
};
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user