This commit is contained in:
Barış Soner Uşaklı
2018-01-16 18:20:57 -05:00
parent ea64a6060b
commit f3fda152bf
7 changed files with 165 additions and 34 deletions

View File

@@ -140,7 +140,7 @@ module.exports = function (Posts) {
db.setObject('topic:' + tid, results.topic, next);
},
function (next) {
topics.updateTags(tid, data.tags, next);
topics.updateTopicTags(tid, data.tags, next);
},
function (next) {
topics.getTopicTagsObjects(tid, next);

View File

@@ -13,11 +13,19 @@ Tags.create = function (socket, data, callback) {
};
Tags.update = function (socket, data, callback) {
if (!data) {
if (!Array.isArray(data)) {
return callback(new Error('[[error:invalid-data]]'));
}
topics.updateTag(data.tag, data, callback);
topics.updateTags(data, callback);
};
Tags.rename = function (socket, data, callback) {
if (!Array.isArray(data)) {
return callback(new Error('[[error:invalid-data]]'));
}
topics.renameTags(data, callback);
};
Tags.deleteTags = function (socket, data, callback) {

View File

@@ -9,7 +9,7 @@ var meta = require('../meta');
var _ = require('lodash');
var plugins = require('../plugins');
var utils = require('../utils');
var batch = require('../batch');
module.exports = function (Topics) {
Topics.createTags = function (tags, tid, timestamp, callback) {
@@ -96,13 +96,61 @@ module.exports = function (Topics) {
], callback);
};
Topics.updateTag = function (tag, data, callback) {
if (!tag) {
return setImmediate(callback, new Error('[[error:invalid-tag]]'));
}
db.setObject('tag:' + tag, data, callback);
Topics.updateTags = function (data, callback) {
async.eachSeries(data, function (tagData, next) {
db.setObject('tag:' + tagData.value, {
color: tagData.color,
bgColor: tagData.bgColor,
}, next);
}, callback);
};
Topics.renameTags = function (data, callback) {
async.eachSeries(data, function (tagData, next) {
renameTag(tagData.value, tagData.newName, next);
}, callback);
};
function renameTag(tag, newTagName, callback) {
if (!newTagName || tag === newTagName) {
return setImmediate(callback);
}
async.waterfall([
function (next) {
Topics.createEmptyTag(newTagName, next);
},
function (next) {
batch.processSortedSet('tag:' + tag + ':topics', function (tids, next) {
async.waterfall([
function (next) {
db.sortedSetScores('tag:' + tag + ':topics', tids, next);
},
function (scores, next) {
db.sortedSetAdd('tag:' + newTagName + ':topics', scores, tids, next);
},
function (next) {
var keys = tids.map(function (tid) {
return 'topic:' + tid + ':tags';
});
async.series([
async.apply(db.sortedSetRemove, 'tag:' + tag + ':topics', tids),
async.apply(db.setsRemove, keys, tag),
async.apply(db.setsAdd, keys, newTagName),
], next);
},
], next);
}, next);
},
function (next) {
Topics.deleteTag(tag, next);
},
function (next) {
updateTagCount(newTagName, next);
},
], callback);
}
function updateTagCount(tag, callback) {
callback = callback || function () {};
async.waterfall([
@@ -148,7 +196,9 @@ module.exports = function (Topics) {
return 'tag:' + tag;
}), next);
},
], callback);
], function (err) {
callback(err);
});
};
function removeTagsFromTopics(tags, callback) {
@@ -266,7 +316,7 @@ module.exports = function (Topics) {
], callback);
};
Topics.updateTags = function (tid, tags, callback) {
Topics.updateTopicTags = function (tid, tags, callback) {
callback = callback || function () {};
async.waterfall([
function (next) {

View File

@@ -41,6 +41,7 @@
<p>[[admin/manage/tags:description]]</p>
<button class="btn btn-primary btn-block" id="create">[[admin/manage/tags:create]]</button>
<button class="btn btn-primary btn-block" id="modify">[[admin/manage/tags:modify]]</button>
<button class="btn btn-primary btn-block" id="rename">[[admin/manage/tags:rename]]</button>
<button class="btn btn-warning btn-block" id="deleteSelected">[[admin/manage/tags:delete]]</button>
</div>
</div>
@@ -74,4 +75,11 @@
</div>
</div>
</div>
<div class="rename-modal hidden">
<div class="form-group">
<label for="value">[[admin/manage/tags:name]]</label>
<input id="value" data-name="value" value="{tags.value}" class="form-control" />
</div>
</div>
</div>