var postModel = require('../models/post').PostModel; var redisClient = require('../utility/redisClient'); var tool = require('../utility/tool'); /** * 为首页数据查询构建条件对象 * @param params 查询参数对象 * @returns {{}} */ function getPostsQuery(params) { var query = {}; query.IsActive = true; query.IsDraft = false; if (params.cateId) { query.CategoryId = params.cateId; } if (params.keyword) { switch (params.filterType) { case '1': query.Title = {"$regex": params.keyword, "$options": "gi"}; break; case '2': query.Labels = {"$regex": params.keyword, "$options": "gi"}; break; case '3': query.CreateTime = {"$regex": params.keyword, "$options": "gi"}; break; default: query.$or = [{ "Title": { "$regex": params.keyword, "$options": "gi" } }, { 'Labels': { "$regex": params.keyword, "$options": "gi" } }, { 'Summary': { "$regex": params.keyword, "$options": "gi" } }, { 'Content': { "$regex": params.keyword, "$options": "gi" } }]; } } return query; } /** * 获取首页的文章数据 * @param params 参数对象 * @param callback 回调函数 */ exports.getPosts = function (params, callback) { var cache_key = tool.generateKey('posts', params); redisClient.getItem(cache_key, function (err, posts) { if (err) { return callback(err); } if (posts) { return callback(null, posts); } var page = parseInt(params.pageIndex) || 1; page = page > 0 ? page : 1; var options = {}; options.skip = (page - 1) * params.pageSize; options.limit = params.pageSize; options.sort = params.sortBy === 'title' ? 'Title -CreateTime' : '-CreateTime'; var query = getPostsQuery(params); postModel.find(query, {}, options, function (err, posts) { if (err) { return callback(err); } if (posts) { redisClient.setItem(cache_key, posts, redisClient.defaultExpired, function (err) { if (err) { return callback(err); } }) } return callback(null, posts); }); }); }; /** * 获取首页的文章数 * @param params 参数对象 * @param callback 回调函数 */ exports.getPostsCount = function (params, callback) { var cache_key = tool.generateKey('posts_count', params); redisClient.getItem(cache_key, function (err, pageCount) { if (err) { return callback(err); } if (pageCount) { return callback(null, pageCount); } var query = getPostsQuery(params); postModel.count(query, function (err, count) { if (err) { return callback(err); } var pageCount = count % params.pageSize === 0 ? parseInt(count / params.pageSize) : parseInt(count / params.pageSize) + 1; redisClient.setItem(cache_key, pageCount, redisClient.defaultExpired, function (err) { if (err) { return callback(err); } }); return callback(null, pageCount); }); }); }; /** * 根据alias获取文章 * @param alias 文章alias * @param callback 回调函数 */ exports.getPostByAlias = function (alias, callback) { var cache_key = 'article_' + alias; //此处不需要等待MongoDB的响应,所以不想传一个回调函数,但如果不传回调函数,则必须在调用Query对象上的exec()方法! //postModel.update({"Alias": alias}, {"ViewCount": 1}, function () {}); postModel.update({"Alias": alias}, {"$inc": {"ViewCount": 1}}).exec(); redisClient.getItem(cache_key, function (err, article) { if (err) { return callback(err); } if (article) { return callback(null, article); } postModel.findOne({"Alias": alias}, function (err, article) { if (err) { return callback(err); } if (article) { redisClient.setItem(cache_key, article, redisClient.defaultExpired, function (err) { if (err) { return callback(err); } }); } return callback(null, article); }) }); }; /** * 为后台数据查询构建条件对象 * @param params * @returns {{}} */ function getArticlesQuery(params) { var query = {}; if (params.cateId) { query.CategoryId = params.cateId; } if (params.uniqueId) { query._id = params.uniqueId; } if (params.title) { query.Title = {"$regex": params.title, "$options": "gi"}; } if (params.searchText) { query.$or = [{ "Alias": { "$regex": params.searchText, "$options": "gi" } }, { "Title": { "$regex": params.searchText, "$options": "gi" } }, { "Summary": { "$regex": params.searchText, "$options": "gi" } }, { "Content": { "$regex": params.searchText, "$options": "gi" } }, { "Labels": { "$regex": params.searchText, "$options": "gi" } }, { "Url": { "$regex": params.searchText, "$options": "gi" } }] } return query; } /** * 获取管理页面的文章数据 * @param params 参数对象 * @param callback 回调函数 */ exports.getArticles = function (params, callback) { var page = parseInt(params.pageIndex) || 1; page = page > 0 ? page : 1; var options = {}; options.skip = (page - 1) * params.pageSize; options.limit = params.pageSize; switch (params.sortName) { case 'ModifyTime': options.sort = params.sortOrder === 'desc' ? '-ModifyTime -CreateTime' : 'ModifyTime CreateTime'; break; case 'ViewCount': options.sort = params.sortOrder === 'desc' ? '-ViewCount -CreateTime' : 'ViewCount CreateTime'; break; default: options.sort = params.sortOrder === 'desc' ? '-CreateTime' : 'CreateTime'; break; } var query = getArticlesQuery(params); postModel.find(query, {}, options, function (err, posts) { if (err) { return callback(err); } return callback(null, posts); }); }; /** * 获取管理页面的文章数 * @param params 参数对象 * @param callback 回调函数 */ exports.getArticlesCount = function (params, callback) { var query = getArticlesQuery(params); postModel.count(query, function (err, count) { if (err) { return callback(err); } return callback(null, count); }); }; /** * 判断文章Alias是否唯一 * @param alias 文章Alias * @param articleId 文章Id * @param callback 回调函数 */ exports.checkAlias = function (alias, articleId, callback) { postModel.findOne({"Alias": alias}, function (err, article) { if (err) { return callback(err); } if (!article) { return callback(null, true); } else { if (article._id === articleId) { return callback(null, true); } else { return callback(null, false); } } }) }; /** * 根据id获取文章 * @param id 文章id * @param callback 回调函数 */ exports.getById = function (id, callback) { postModel.findById(id, function (err, article) { if (err) { return callback(err); } return callback(null, article); }); }; /** * 新增或更新文章 * @param params 参数对象 * @param callback 回调函数 */ exports.save = function (params, callback) { var _id = params.UniqueId, entity = new postModel({ Title: params.Title, Alias: params.Alias, Summary: params.Summary, Source: params.Source, Content: params.Content, CategoryId: params.CategoryId, Labels: params.Labels, Url: params.Url, IsDraft: params.IsDraft === 'True', IsActive: true, ModifyTime: new Date() }); postModel.findById(_id, function (err, article) { if (err) { return callback(err); } if (!article) { //新增 entity._id = _id; entity.ViewCount = 0; entity.CreateTime = new Date(); entity.save(function (err) { if (err) { return callback(err); } return callback(null); }); } else { //更新 postModel.update({"_id": _id}, entity, function (err) { if (err) { return callback(err); } return callback(null); }); } }) }; /** * 软删除文章 * @param ids 文章id,多个id以逗号分隔 * @param callback 回调函数 */ exports.delete = function (ids, callback) { var idArray = ids.split(','), hasErr = false, index = 0; idArray.forEach(function (id) { postModel.update({'_id': id}, {'IsActive': false}, function (err) { index++; if (err) { hasErr = true; } if (index === idArray.length) { if (hasErr) { return callback(err); } return callback(null); } }); }); }; /** * 恢复删除的文章 * @param id 文章id * @param callback 回调函数 */ exports.undo = function (id, callback) { postModel.update({'_id': id}, {'IsActive': true}, function (err) { if (err) { return callback(err); } return callback(null); }); };