From 1cd2689cf62f552468d2a6e02b38783de0dbfe13 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Mon, 21 Dec 2020 22:05:00 -0500 Subject: [PATCH] refactor(api): deprecated groups update socket in favour of API lib --- public/src/admin/manage/group.js | 40 ++++++++++++----------------- public/src/client/groups/details.js | 11 ++------ src/api/groups.js | 10 ++++++++ src/controllers/write/groups.js | 8 ++++++ src/groups/update.js | 7 +++++ src/routes/write/groups.js | 1 + src/socket.io/admin/groups.js | 5 +++- src/socket.io/groups.js | 6 ++++- 8 files changed, 54 insertions(+), 34 deletions(-) diff --git a/public/src/admin/manage/group.js b/public/src/admin/manage/group.js index 792560bf2b..e041164bbf 100644 --- a/public/src/admin/manage/group.js +++ b/public/src/admin/manage/group.js @@ -6,8 +6,9 @@ define('admin/manage/group', [ 'translator', 'categorySelector', 'groupSearch', + 'slugify', 'api', -], function (memberList, iconSelect, translator, categorySelector, groupSearch, api) { +], function (memberList, iconSelect, translator, categorySelector, groupSearch, slugify, api) { var Groups = {}; Groups.init = function () { @@ -68,27 +69,20 @@ define('admin/manage/group', [ }); $('#save').on('click', function () { - socket.emit('admin.groups.update', { - groupName: groupName, - values: { - name: $('#change-group-name').val(), - userTitle: changeGroupUserTitle.val(), - description: $('#change-group-desc').val(), - icon: groupIcon.attr('value'), - labelColor: changeGroupLabelColor.val(), - textColor: changeGroupTextColor.val(), - userTitleEnabled: $('#group-userTitleEnabled').is(':checked'), - private: $('#group-private').is(':checked'), - hidden: $('#group-hidden').is(':checked'), - memberPostCids: $('#memberPostCids').val(), - disableJoinRequests: $('#group-disableJoinRequests').is(':checked'), - disableLeave: $('#group-disableLeave').is(':checked'), - }, - }, function (err) { - if (err) { - return app.alertError(err.message); - } - + api.put(`/groups/${slugify(groupName)}`, { + name: $('#change-group-name').val(), + userTitle: changeGroupUserTitle.val(), + description: $('#change-group-desc').val(), + icon: groupIcon.attr('value'), + labelColor: changeGroupLabelColor.val(), + textColor: changeGroupTextColor.val(), + userTitleEnabled: $('#group-userTitleEnabled').is(':checked'), + private: $('#group-private').is(':checked'), + hidden: $('#group-hidden').is(':checked'), + memberPostCids: $('#memberPostCids').val(), + disableJoinRequests: $('#group-disableJoinRequests').is(':checked'), + disableLeave: $('#group-disableLeave').is(':checked'), + }).then(() => { var newName = $('#change-group-name').val(); // If the group name changed, change url @@ -97,7 +91,7 @@ define('admin/manage/group', [ } app.alertSuccess('[[admin/manage/groups:edit.save-success]]'); - }); + }).catch(app.alertError); return false; }); }; diff --git a/public/src/client/groups/details.js b/public/src/client/groups/details.js index 3e804bbc84..502af28949 100644 --- a/public/src/client/groups/details.js +++ b/public/src/client/groups/details.js @@ -203,14 +203,7 @@ define('forum/groups/details', [ } }); - socket.emit('groups.update', { - groupName: groupName, - values: settings, - }, function (err) { - if (err) { - return app.alertError(err.message); - } - + api.put(`/groups/${slugify(groupName)}`, settings).then(() => { if (settings.name) { var pathname = window.location.pathname; pathname = pathname.substr(1, pathname.lastIndexOf('/')); @@ -220,7 +213,7 @@ define('forum/groups/details', [ } app.alertSuccess('[[groups:event.updated]]'); - }); + }).catch(app.alertError); } }; diff --git a/src/api/groups.js b/src/api/groups.js index 426ec1dcde..1a0157e8e9 100644 --- a/src/api/groups.js +++ b/src/api/groups.js @@ -33,6 +33,16 @@ groupsAPI.create = async function (caller, data) { return groupData; }; +groupsAPI.update = async function (caller, data) { + const groupName = await groups.getGroupNameByGroupSlug(data.slug); + await isOwner(caller, groupName); + + delete data.slug; + await groups.update(groupName, data); + + return await groups.getGroupData(data.name || groupName); +}; + groupsAPI.delete = async function (caller, data) { const groupName = await groups.getGroupNameByGroupSlug(data.slug); await isOwner(caller, groupName); diff --git a/src/controllers/write/groups.js b/src/controllers/write/groups.js index 243d5b0cf7..0831e2ed43 100644 --- a/src/controllers/write/groups.js +++ b/src/controllers/write/groups.js @@ -15,6 +15,14 @@ Groups.create = async (req, res) => { helpers.formatApiResponse(200, res, groupObj); }; +Groups.update = async (req, res) => { + const groupObj = await api.groups.update(req, { + ...req.body, + slug: req.params.slug, + }); + helpers.formatApiResponse(200, res, groupObj); +}; + Groups.delete = async (req, res) => { await api.groups.delete(req, req.params); helpers.formatApiResponse(200, res); diff --git a/src/groups/update.js b/src/groups/update.js index 26d0cdad5c..0e34169660 100644 --- a/src/groups/update.js +++ b/src/groups/update.js @@ -24,6 +24,13 @@ module.exports = function (Groups) { values: values, })); + // Case some values as bool (if not boolean already) + ['userTitleEnabled', 'private', 'hidden', 'disableJoinRequests', 'disableLeave'].forEach((prop) => { + if (values.hasOwnProperty(prop) && typeof values[prop] !== 'boolean') { + values[prop] = !!parseInt(values[prop], 10); + } + }); + const payload = { description: values.description || '', icon: values.icon || '', diff --git a/src/routes/write/groups.js b/src/routes/write/groups.js index 64af35bf70..8a5014c6f0 100644 --- a/src/routes/write/groups.js +++ b/src/routes/write/groups.js @@ -12,6 +12,7 @@ module.exports = function () { setupApiRoute(router, 'post', '/', [...middlewares, middleware.checkRequired.bind(null, ['name'])], controllers.write.groups.create); setupApiRoute(router, 'head', '/:slug', [middleware.assert.group], controllers.write.groups.exists); + setupApiRoute(router, 'put', '/:slug', [...middlewares, middleware.assert.group], controllers.write.groups.update); setupApiRoute(router, 'delete', '/:slug', [...middlewares, middleware.assert.group], controllers.write.groups.delete); setupApiRoute(router, 'put', '/:slug/membership/:uid', [...middlewares, middleware.assert.group], controllers.write.groups.join); setupApiRoute(router, 'delete', '/:slug/membership/:uid', [...middlewares, middleware.assert.group], controllers.write.groups.leave); diff --git a/src/socket.io/admin/groups.js b/src/socket.io/admin/groups.js index ef3cb3f878..6aa609288e 100644 --- a/src/socket.io/admin/groups.js +++ b/src/socket.io/admin/groups.js @@ -43,9 +43,12 @@ Groups.leave = async function (socket, data) { }; Groups.update = async function (socket, data) { + sockets.warnDeprecated(socket, 'PUT /api/v3/groups/:slug'); if (!data) { throw new Error('[[error:invalid-data]]'); } - await groups.update(data.groupName, data.values); + const slug = await groups.getGroupField(data.groupName, 'slug'); + await api.groups.update(socket, { slug, ...data.values }); + // await groups.update(data.groupName, data.values); }; diff --git a/src/socket.io/groups.js b/src/socket.io/groups.js index 4e1152b514..73cae30dc6 100644 --- a/src/socket.io/groups.js +++ b/src/socket.io/groups.js @@ -186,8 +186,12 @@ SocketGroups.rejectInvite = async (socket, data) => { }; SocketGroups.update = async (socket, data) => { + sockets.warnDeprecated(socket, 'PUT /api/v3/groups/:slug'); await isOwner(socket, data); - await groups.update(data.groupName, data.values); + + const slug = await groups.getGroupField(data.groupName, 'slug'); + await api.groups.update(socket, { slug, ...data.values }); + // await groups.update(data.groupName, data.values); };