mirror of
https://github.com/NodeBB/NodeBB.git
synced 2025-11-01 19:46:01 +01:00
feat(writeapi): added DELETE /groups/:slug/membership/:uid route
This commit is contained in:
@@ -63,16 +63,13 @@ define('admin/manage/admins-mods', ['translator', 'benchpress', 'autocomplete',
|
|||||||
|
|
||||||
bootbox.confirm('[[admin/manage/users:alerts.confirm-remove-global-mod]]', function (confirm) {
|
bootbox.confirm('[[admin/manage/users:alerts.confirm-remove-global-mod]]', function (confirm) {
|
||||||
if (confirm) {
|
if (confirm) {
|
||||||
socket.emit('admin.groups.leave', { uid: uid, groupName: 'Global Moderators' }, function (err) {
|
api.del('/groups/global-moderators/membership/' + uid, undefined, () => {
|
||||||
if (err) {
|
|
||||||
return app.alertError(err.message);
|
|
||||||
}
|
|
||||||
app.alertSuccess('[[admin/manage/users:alerts.remove-global-mod-success]]');
|
app.alertSuccess('[[admin/manage/users:alerts.remove-global-mod-success]]');
|
||||||
userCard.remove();
|
userCard.remove();
|
||||||
if (!$('.global-moderator-area').children().length) {
|
if (!$('.global-moderator-area').children().length) {
|
||||||
$('#no-global-mods-warning').removeClass('hidden');
|
$('#no-global-mods-warning').removeClass('hidden');
|
||||||
}
|
}
|
||||||
});
|
}, err => app.alertError(err.status.message));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
|
|
||||||
define('admin/manage/group', [
|
define('admin/manage/group', [
|
||||||
'forum/groups/memberlist',
|
'forum/groups/memberlist',
|
||||||
'iconSelect',
|
'iconSelect',
|
||||||
@@ -8,7 +7,8 @@ define('admin/manage/group', [
|
|||||||
'translator',
|
'translator',
|
||||||
'categorySelector',
|
'categorySelector',
|
||||||
'groupSearch',
|
'groupSearch',
|
||||||
], function (memberList, iconSelect, colorpicker, translator, categorySelector, groupSearch) {
|
'api',
|
||||||
|
], function (memberList, iconSelect, colorpicker, translator, categorySelector, groupSearch, api) {
|
||||||
var Groups = {};
|
var Groups = {};
|
||||||
|
|
||||||
Groups.init = function () {
|
Groups.init = function () {
|
||||||
@@ -137,15 +137,9 @@ define('admin/manage/group', [
|
|||||||
if (!confirm) {
|
if (!confirm) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
socket.emit('admin.groups.leave', {
|
api.del('/groups/' + ajaxify.data.group.slug + '/membership/' + uid, undefined, () => {
|
||||||
uid: uid,
|
|
||||||
groupName: groupName,
|
|
||||||
}, function (err) {
|
|
||||||
if (err) {
|
|
||||||
return app.alertError(err.message);
|
|
||||||
}
|
|
||||||
userRow.slideUp().remove();
|
userRow.slideUp().remove();
|
||||||
});
|
}, err => app.alertError(err.status.message));
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
|||||||
@@ -108,12 +108,9 @@ define('admin/manage/users', ['translator', 'benchpress', 'autocomplete', 'api']
|
|||||||
var groupCard = $(this).parents('[data-group-name]');
|
var groupCard = $(this).parents('[data-group-name]');
|
||||||
var groupName = groupCard.attr('data-group-name');
|
var groupName = groupCard.attr('data-group-name');
|
||||||
var uid = $(this).parents('[data-uid]').attr('data-uid');
|
var uid = $(this).parents('[data-uid]').attr('data-uid');
|
||||||
socket.emit('admin.groups.leave', { uid: uid, groupName: groupName }, function (err) {
|
api.del('/groups/' + utils.slugify(groupName) + '/membership/' + uid, undefined, () => {
|
||||||
if (err) {
|
|
||||||
return app.alertError(err);
|
|
||||||
}
|
|
||||||
groupCard.remove();
|
groupCard.remove();
|
||||||
});
|
}, err => app.alertError(err.status.message));
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -109,8 +109,11 @@ define('forum/groups/details', [
|
|||||||
api.put('/groups/' + ajaxify.data.group.slug + '/membership/' + (uid || app.user.uid), undefined, () => ajaxify.refresh(), err => app.alertError(err.status.message));
|
api.put('/groups/' + ajaxify.data.group.slug + '/membership/' + (uid || app.user.uid), undefined, () => ajaxify.refresh(), err => app.alertError(err.status.message));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'leave': // intentional fall-throughs!
|
case 'leave':
|
||||||
case 'accept':
|
api.del('/groups/' + ajaxify.data.group.slug + '/membership/' + (uid || app.user.uid), undefined, () => ajaxify.refresh(), err => app.alertError(err.status.message));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'accept': // intentional fall-throughs!
|
||||||
case 'reject':
|
case 'reject':
|
||||||
case 'issueInvite':
|
case 'issueInvite':
|
||||||
case 'rescindInvite':
|
case 'rescindInvite':
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
|
define('forum/groups/memberlist', ['api'], function (api) {
|
||||||
define('forum/groups/memberlist', function () {
|
|
||||||
var MemberList = {};
|
var MemberList = {};
|
||||||
var searchInterval;
|
var searchInterval;
|
||||||
var groupName;
|
var groupName;
|
||||||
@@ -83,7 +82,13 @@ define('forum/groups/memberlist', function () {
|
|||||||
if (groupName === 'administrators') {
|
if (groupName === 'administrators') {
|
||||||
socket.emit('admin.user.makeAdmins', uids, done);
|
socket.emit('admin.user.makeAdmins', uids, done);
|
||||||
} else {
|
} else {
|
||||||
socket.emit('groups.addMember', { groupName: groupName, uid: uids }, done);
|
var requests = uids.map(function (uid) {
|
||||||
|
return api.put('/groups/' + ajaxify.data.group.slug + '/membership/' + uid);
|
||||||
|
});
|
||||||
|
|
||||||
|
$.when(requests)
|
||||||
|
.done(done)
|
||||||
|
.fail(err => app.alertError(err.status.message));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,13 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
|
const validator = require('validator');
|
||||||
|
|
||||||
const user = require('../../user');
|
const user = require('../../user');
|
||||||
const groups = require('../../groups');
|
const groups = require('../../groups');
|
||||||
const events = require('../../events');
|
const events = require('../../events');
|
||||||
const meta = require('../../meta');
|
const meta = require('../../meta');
|
||||||
|
const utils = require('../../utils');
|
||||||
|
const notifications = require('../../notifications');
|
||||||
|
|
||||||
const helpers = require('../helpers');
|
const helpers = require('../helpers');
|
||||||
|
|
||||||
@@ -85,6 +89,42 @@ Groups.join = async (req, res) => {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Groups.leave = async (req, res) => {
|
||||||
|
const [group, userExists] = await Promise.all([
|
||||||
|
groups.getByGroupslug(req.params.slug, {
|
||||||
|
uid: req.params.uid,
|
||||||
|
}),
|
||||||
|
user.exists(req.params.uid),
|
||||||
|
]);
|
||||||
|
|
||||||
|
if (!userExists) {
|
||||||
|
throw new Error('[[error:invalid-uid]]');
|
||||||
|
} else if (group.disableLeave) {
|
||||||
|
throw new Error('[[error:group-leave-disabled]]');
|
||||||
|
} else if (!group.isMember) {
|
||||||
|
// No change
|
||||||
|
return helpers.formatApiResponse(200, res);
|
||||||
|
}
|
||||||
|
|
||||||
|
await groups.leave(group.name, req.params.uid);
|
||||||
|
|
||||||
|
// Notify owners of user having left
|
||||||
|
const username = await user.getUserField(req.params.uid, 'username');
|
||||||
|
const notification = await notifications.create({
|
||||||
|
type: 'group-leave',
|
||||||
|
bodyShort: '[[groups:membership.leave.notification-title, ' + username + ', ' + group.name + ']]',
|
||||||
|
nid: 'group:' + validator.escape(group.name) + ':uid:' + req.params.uid + ':group-leave',
|
||||||
|
path: '/groups/' + utils.slugify(group.name),
|
||||||
|
});
|
||||||
|
const uids = await groups.getOwners(group.name);
|
||||||
|
await notifications.push(notification, uids);
|
||||||
|
|
||||||
|
helpers.formatApiResponse(200, res);
|
||||||
|
logGroupEvent(req, 'group-leave', {
|
||||||
|
groupName: group.name,
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
function logGroupEvent(req, event, additional) {
|
function logGroupEvent(req, event, additional) {
|
||||||
events.log({
|
events.log({
|
||||||
type: event,
|
type: event,
|
||||||
|
|||||||
@@ -13,36 +13,7 @@ module.exports = function () {
|
|||||||
setupApiRoute(router, '/', middleware, [...middlewares, middleware.checkRequired.bind(null, ['name']), middleware.exposePrivilegeSet], 'post', controllers.write.groups.create);
|
setupApiRoute(router, '/', middleware, [...middlewares, middleware.checkRequired.bind(null, ['name']), middleware.exposePrivilegeSet], 'post', controllers.write.groups.create);
|
||||||
setupApiRoute(router, '/:slug', middleware, [...middlewares, middleware.assertGroup, middleware.exposePrivileges], 'delete', controllers.write.groups.delete);
|
setupApiRoute(router, '/:slug', middleware, [...middlewares, middleware.assertGroup, middleware.exposePrivileges], 'delete', controllers.write.groups.delete);
|
||||||
setupApiRoute(router, '/:slug/membership/:uid', middleware, [...middlewares, middleware.assertGroup, middleware.exposePrivileges], 'put', controllers.write.groups.join);
|
setupApiRoute(router, '/:slug/membership/:uid', middleware, [...middlewares, middleware.assertGroup, middleware.exposePrivileges], 'put', controllers.write.groups.join);
|
||||||
|
setupApiRoute(router, '/:slug/membership/:uid', middleware, [...middlewares, middleware.assertGroup, middleware.exposePrivileges], 'delete', controllers.write.groups.leave);
|
||||||
// app.put('/:slug/membership/:uid', middleware.exposeGroupName, apiMiddleware.validateGroup, apiMiddleware.requireUser, apiMiddleware.requireAdmin, function(req, res) {
|
|
||||||
// Groups.join(res.locals.groupName, req.params.uid, function(err) {
|
|
||||||
// errorHandler.handle(err, res);
|
|
||||||
// });
|
|
||||||
// });
|
|
||||||
|
|
||||||
// app.delete('/:slug/membership', apiMiddleware.requireUser, middleware.exposeGroupName, apiMiddleware.validateGroup, function(req, res) {
|
|
||||||
// Groups.isMember(req.user.uid, res.locals.groupName, function(err, isMember) {
|
|
||||||
// if (isMember) {
|
|
||||||
// Groups.leave(res.locals.groupName, req.user.uid, function(err) {
|
|
||||||
// errorHandler.handle(err, res);
|
|
||||||
// });
|
|
||||||
// } else {
|
|
||||||
// errorHandler.respond(400, res);
|
|
||||||
// }
|
|
||||||
// });
|
|
||||||
// });
|
|
||||||
|
|
||||||
// app.delete('/:slug/membership/:uid', middleware.exposeGroupName, apiMiddleware.validateGroup, apiMiddleware.requireUser, apiMiddleware.requireAdmin, function(req, res) {
|
|
||||||
// Groups.isMember(req.params.uid, res.locals.groupName, function(err, isMember) {
|
|
||||||
// if (isMember) {
|
|
||||||
// Groups.leave(res.locals.groupName, req.params.uid, function(err) {
|
|
||||||
// errorHandler.handle(err, res);
|
|
||||||
// });
|
|
||||||
// } else {
|
|
||||||
// errorHandler.respond(400, res);
|
|
||||||
// }
|
|
||||||
// });
|
|
||||||
// });
|
|
||||||
|
|
||||||
return router;
|
return router;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -39,6 +39,8 @@ Groups.join = async (socket, data) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
Groups.leave = async function (socket, data) {
|
Groups.leave = async function (socket, data) {
|
||||||
|
sockets.warnDeprecated(socket, 'DELETE /api/v1/groups/:slug/membership/:uid');
|
||||||
|
|
||||||
if (!data) {
|
if (!data) {
|
||||||
throw new Error('[[error:invalid-data]]');
|
throw new Error('[[error:invalid-data]]');
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -69,6 +69,8 @@ SocketGroups.join = async (socket, data) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
SocketGroups.leave = async (socket, data) => {
|
SocketGroups.leave = async (socket, data) => {
|
||||||
|
sockets.warnDeprecated(socket, 'DELETE /api/v1/groups/:slug/membership/:uid');
|
||||||
|
|
||||||
if (socket.uid <= 0) {
|
if (socket.uid <= 0) {
|
||||||
throw new Error('[[error:invalid-uid]]');
|
throw new Error('[[error:invalid-uid]]');
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user