Files
meanTorrent/modules/collections/server/controllers/collections.server.controller.js

338 lines
7.1 KiB
JavaScript

'use strict';
/**
* Module dependencies
*/
var path = require('path'),
config = require(path.resolve('./config/config')),
mongoose = require('mongoose'),
errorHandler = require(path.resolve('./modules/core/server/controllers/errors.server.controller')),
moment = require('moment'),
User = mongoose.model('User'),
Maker = mongoose.model('Maker'),
Torrent = mongoose.model('Torrent'),
Collection = mongoose.model('Collection'),
async = require('async'),
tmdb = require('moviedb')(config.meanTorrentConfig.tmdbConfig.key),
traceLogCreate = require(path.resolve('./config/lib/tracelog')).create,
scoreUpdate = require(path.resolve('./config/lib/score')).update;
var traceConfig = config.meanTorrentConfig.trace;
var mtDebug = require(path.resolve('./config/lib/debug'));
/**
* searchcollection
* @param req
* @param res
*/
exports.searchcollection = function (req, res) {
mtDebug.debugGreen('------- API: searchCollection --------------------');
mtDebug.debugGreen(req.params);
tmdb.searchCollection({
language: req.params.language,
query: req.query.query
}, function (err, info) {
if (err) {
res.status(900).send(err);
} else {
res.json(info);
}
});
};
/**
* collectioninfo
* @param req
* @param res
*/
exports.collectioninfo = function (req, res) {
mtDebug.debugGreen('------- API: collectioninfo --------------------');
mtDebug.debugGreen(req.params);
tmdb.collectionInfo({
id: req.params.id,
language: req.params.language
}, function (err, info) {
if (err) {
res.status(900).send(err);
} else {
res.json(info);
}
});
};
/**
* Create an collection
*/
exports.create = function (req, res) {
if (req.user.isOper) {
var user = req.user;
var coll = new Collection(req.body);
coll.user = user._id;
mtDebug.debugRed(coll);
coll.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.OperCreateCollection, {
name: coll.name
});
}
});
} else {
return res.status(403).json({
message: 'ERROR: User is not authorized'
});
}
};
/**
* Show the current collection
*/
exports.read = function (req, res) {
// convert mongoose document to JSON
var coll = req.collection ? req.collection.toJSON() : {};
coll.isCurrentUserOwner = !!(req.user && coll.user && coll.user._id.toString() === req.user._id.toString());
res.json(coll);
};
/**
* Update an collection
*/
exports.update = function (req, res) {
var coll = req.collection;
coll.name = req.body.name;
coll.overview = req.body.overview;
coll.save(function (err) {
if (err) {
return res.status(422).send({
message: errorHandler.getErrorMessage(err)
});
} else {
res.json(coll);
}
});
};
/**
* insertIntoCollection
* @param req
* @param res
*/
exports.insertIntoCollection = function (req, res) {
var coll = req.collection;
var torrent = req.torrent;
coll.torrents.push(torrent);
coll.save(function (err) {
if (err) {
return res.status(422).send({
message: errorHandler.getErrorMessage(err)
});
} else {
res.json(coll);
}
});
};
/**
* removeFromCollection
* @param req
* @param res
*/
exports.removeFromCollection = function (req, res) {
var coll = req.collection;
var torrent = req.torrent;
coll.torrents.pull(torrent);
coll.save(function (err) {
if (err) {
return res.status(422).send({
message: errorHandler.getErrorMessage(err)
});
} else {
res.json(coll);
}
});
};
/**
* setRecommendLevel
* @param req
* @param res
*/
exports.setRecommendLevel = function (req, res) {
var coll = req.collection;
if (req.params.rlevel) {
coll.recommend_level = req.params.rlevel;
coll.ordered_at = Date.now();
coll.save(function (err) {
if (err) {
return res.status(422).send({
message: errorHandler.getErrorMessage(err)
});
} else {
res.json(coll);
//create trace log
traceLogCreate(req, traceConfig.action.AdminCollectionSetRecommendLevel, {
coll: coll._id,
recommended: req.params.rlevel
});
}
});
} else {
return res.status(422).send({
message: 'PARAMS_RLEVEL_ERROR'
});
}
};
/**
* Delete an collection
*/
exports.delete = function (req, res) {
var coll = req.collection;
coll.remove(function (err) {
if (err) {
return res.status(422).send({
message: errorHandler.getErrorMessage(err)
});
} else {
res.json(coll);
}
});
};
/**
* List of collections
*/
exports.list = function (req, res) {
var skip = 0;
var limit = 0;
var tmdb_id = 0;
var keysA = [];
var condition = {};
if (req.query.skip !== undefined) {
skip = parseInt(req.query.skip, 10);
}
if (req.query.limit !== undefined) {
limit = parseInt(req.query.limit, 10);
}
if (req.query.tmdb_id !== undefined) {
tmdb_id = parseInt(req.query.tmdb_id, 10);
}
if (req.query.keys && req.query.keys.length > 0) {
var keysS = req.query.keys + '';
var keysT = keysS.split(' ');
keysT.forEach(function (it) {
var ti = new RegExp(it, 'i');
keysA.push(ti);
});
}
if (tmdb_id !== 0) {
condition.tmdb_id = tmdb_id;
}
if (keysA.length > 0) {
condition.$or = [
{name: {'$all': keysA}},
{overview: {'$all': keysA}}
];
}
var countQuery = function (callback) {
Collection.count(condition, function (err, count) {
if (err) {
callback(err, null);
} else {
callback(null, count);
}
});
};
var findQuery = function (callback) {
Collection.find(condition)
.sort('recommend_level -ordered_at -created_at')
.populate('user', 'username displayName profileImageURL isVip')
.populate('torrents')
.skip(skip)
.limit(limit)
.exec(function (err, colls) {
if (err) {
callback(err, null);
} else {
callback(null, colls);
}
});
};
async.parallel([countQuery, findQuery], function (err, results) {
if (err) {
return res.status(422).send(err);
} else {
res.json({rows: results[1], total: results[0]});
}
});
};
/**
* Collection middleware
*/
exports.collectionByID = function (req, res, next, id) {
if (!mongoose.Types.ObjectId.isValid(id)) {
return res.status(400).send({
message: 'COLLECTION_ID_INVALID'
});
}
Collection.findById(id)
.populate('user', 'username displayName profileImageURL isVip')
.populate({
path: 'torrents',
populate: [{
path: 'user',
select: 'username displayName profileImageURL isVip'
}, {
path: 'maker',
select: 'name'
}]
})
.exec(function (err, coll) {
if (err) {
return next(err);
} else if (!coll) {
return res.status(404).send({
message: 'No collection with that identifier has been found'
});
}
req.collection = coll;
next();
});
};