mirror of
https://github.com/NodeBB/NodeBB.git
synced 2025-10-26 16:46:12 +01:00
refator(socket.io): deprecate socketGroups.getChatGroups in favour of api.admin.listGroups
This commit is contained in:
@@ -218,14 +218,16 @@ paths:
|
|||||||
$ref: 'write/admin/analytics.yaml'
|
$ref: 'write/admin/analytics.yaml'
|
||||||
/admin/analytics/{set}:
|
/admin/analytics/{set}:
|
||||||
$ref: 'write/admin/analytics/set.yaml'
|
$ref: 'write/admin/analytics/set.yaml'
|
||||||
/admin/chats/{roomId}:
|
|
||||||
$ref: 'write/admin/chats/roomId.yaml'
|
|
||||||
/admin/tokens:
|
/admin/tokens:
|
||||||
$ref: 'write/admin/tokens.yaml'
|
$ref: 'write/admin/tokens.yaml'
|
||||||
/admin/tokens/{token}:
|
/admin/tokens/{token}:
|
||||||
$ref: 'write/admin/tokens/token.yaml'
|
$ref: 'write/admin/tokens/token.yaml'
|
||||||
/admin/tokens/{token}/roll:
|
/admin/tokens/{token}/roll:
|
||||||
$ref: 'write/admin/tokens/token/roll.yaml'
|
$ref: 'write/admin/tokens/token/roll.yaml'
|
||||||
|
/admin/chats/{roomId}:
|
||||||
|
$ref: 'write/admin/chats/roomId.yaml'
|
||||||
|
/admin/groups:
|
||||||
|
$ref: 'write/admin/groups.yaml'
|
||||||
/files/:
|
/files/:
|
||||||
$ref: 'write/files.yaml'
|
$ref: 'write/files.yaml'
|
||||||
/files/folder:
|
/files/folder:
|
||||||
|
|||||||
22
public/openapi/write/admin/groups.yaml
Normal file
22
public/openapi/write/admin/groups.yaml
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
get:
|
||||||
|
tags:
|
||||||
|
- admin
|
||||||
|
summary: list all groups
|
||||||
|
description: This operation returns a full list of user groups, including hidden groups.
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: user groups successfully listed
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
status:
|
||||||
|
$ref: ../../components/schemas/Status.yaml#/Status
|
||||||
|
response:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
groups:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
$ref: ../../components/schemas/GroupObject.yaml#/GroupDataObject
|
||||||
@@ -12,11 +12,15 @@ define('forum/chats/create', [
|
|||||||
async function handleCreate() {
|
async function handleCreate() {
|
||||||
let groups = [];
|
let groups = [];
|
||||||
if (app.user.isAdmin) {
|
if (app.user.isAdmin) {
|
||||||
groups = await socket.emit('groups.getChatGroups', {});
|
({ groups } = await api.get('/admin/groups'));
|
||||||
|
groups.sort((a, b) => b.system - a.system).map((g) => {
|
||||||
|
const { name, displayName } = g;
|
||||||
|
return { name, displayName };
|
||||||
|
});
|
||||||
}
|
}
|
||||||
const html = await app.parseAndTranslate('modals/create-room', {
|
const html = await app.parseAndTranslate('modals/create-room', {
|
||||||
user: app.user,
|
user: app.user,
|
||||||
groups: groups,
|
groups,
|
||||||
});
|
});
|
||||||
|
|
||||||
const modal = bootbox.dialog({
|
const modal = bootbox.dialog({
|
||||||
|
|||||||
@@ -12,7 +12,12 @@ define('forum/chats/manage', [
|
|||||||
buttonEl.on('click', async function () {
|
buttonEl.on('click', async function () {
|
||||||
let groups = [];
|
let groups = [];
|
||||||
if (app.user.isAdmin) {
|
if (app.user.isAdmin) {
|
||||||
groups = await socket.emit('groups.getChatGroups', {});
|
({ groups } = await api.get('/admin/groups'));
|
||||||
|
groups.sort((a, b) => b.system - a.system).map((g) => {
|
||||||
|
const { name, displayName } = g;
|
||||||
|
return { name, displayName };
|
||||||
|
});
|
||||||
|
|
||||||
if (Array.isArray(ajaxify.data.groups)) {
|
if (Array.isArray(ajaxify.data.groups)) {
|
||||||
groups.forEach((g) => {
|
groups.forEach((g) => {
|
||||||
g.selected = ajaxify.data.groups.includes(g.name);
|
g.selected = ajaxify.data.groups.includes(g.name);
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
const meta = require('../meta');
|
const meta = require('../meta');
|
||||||
const analytics = require('../analytics');
|
const analytics = require('../analytics');
|
||||||
const privileges = require('../privileges');
|
const privileges = require('../privileges');
|
||||||
|
const groups = require('../groups');
|
||||||
|
|
||||||
const adminApi = module.exports;
|
const adminApi = module.exports;
|
||||||
|
|
||||||
@@ -34,3 +35,11 @@ adminApi.getAnalyticsData = async (caller, { set, until, amount, units }) => {
|
|||||||
const getStats = units === 'days' ? analytics.getDailyStatsForSet : analytics.getHourlyStatsForSet;
|
const getStats = units === 'days' ? analytics.getDailyStatsForSet : analytics.getHourlyStatsForSet;
|
||||||
return await getStats(`analytics:${set}`, parseInt(until, 10) || Date.now(), amount);
|
return await getStats(`analytics:${set}`, parseInt(until, 10) || Date.now(), amount);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
adminApi.listGroups = async () => {
|
||||||
|
// N.B. Returns all groups, even hidden. Beware of leakage.
|
||||||
|
// Access control handled at controller level
|
||||||
|
|
||||||
|
const payload = await groups.getNonPrivilegeGroups('groups:createtime', 0, -1, { ephemeral: false });
|
||||||
|
return { groups: payload };
|
||||||
|
};
|
||||||
|
|||||||
@@ -78,3 +78,7 @@ Admin.chats.deleteRoom = async (req, res) => {
|
|||||||
});
|
});
|
||||||
helpers.formatApiResponse(200, res);
|
helpers.formatApiResponse(200, res);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Admin.listGroups = async (req, res) => {
|
||||||
|
helpers.formatApiResponse(200, res, await api.admin.listGroups());
|
||||||
|
};
|
||||||
|
|||||||
@@ -84,9 +84,19 @@ Groups.getGroupsBySort = async function (sort, start, stop) {
|
|||||||
return await Groups.getGroupsFromSet(set, start, stop);
|
return await Groups.getGroupsFromSet(set, start, stop);
|
||||||
};
|
};
|
||||||
|
|
||||||
Groups.getNonPrivilegeGroups = async function (set, start, stop) {
|
Groups.getNonPrivilegeGroups = async function (set, start, stop, flags) {
|
||||||
|
if (!flags) {
|
||||||
|
flags = {
|
||||||
|
ephemeral: true,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
let groupNames = await db.getSortedSetRevRange(set, start, stop);
|
let groupNames = await db.getSortedSetRevRange(set, start, stop);
|
||||||
groupNames = groupNames.concat(Groups.ephemeralGroups).filter(groupName => !Groups.isPrivilegeGroup(groupName));
|
groupNames = groupNames.filter(groupName => !Groups.isPrivilegeGroup(groupName));
|
||||||
|
if (flags.ephemeral) {
|
||||||
|
groupNames = groupNames.concat(Groups.ephemeralGroups);
|
||||||
|
}
|
||||||
|
|
||||||
const groupsData = await Groups.getGroupsData(groupNames);
|
const groupsData = await Groups.getGroupsData(groupNames);
|
||||||
return groupsData.filter(Boolean);
|
return groupsData.filter(Boolean);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -23,5 +23,7 @@ module.exports = function () {
|
|||||||
|
|
||||||
setupApiRoute(router, 'delete', '/chats/:roomId', [...middlewares, middleware.assert.room], controllers.write.admin.chats.deleteRoom);
|
setupApiRoute(router, 'delete', '/chats/:roomId', [...middlewares, middleware.assert.room], controllers.write.admin.chats.deleteRoom);
|
||||||
|
|
||||||
|
setupApiRoute(router, 'get', '/groups', [...middlewares], controllers.write.admin.listGroups);
|
||||||
|
|
||||||
return router;
|
return router;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -65,14 +65,18 @@ SocketGroups.loadMoreMembers = async (socket, data) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
SocketGroups.getChatGroups = async (socket) => {
|
SocketGroups.getChatGroups = async (socket) => {
|
||||||
|
sockets.warnDeprecated(socket, 'GET /api/v3/admin/groups');
|
||||||
|
|
||||||
const isAdmin = await user.isAdministrator(socket.uid);
|
const isAdmin = await user.isAdministrator(socket.uid);
|
||||||
if (!isAdmin) {
|
if (!isAdmin) {
|
||||||
throw new Error('[[error:no-privileges]]');
|
throw new Error('[[error:no-privileges]]');
|
||||||
}
|
}
|
||||||
const allGroups = await groups.getNonPrivilegeGroups('groups:createtime', 0, -1);
|
|
||||||
const groupsList = allGroups.filter(g => !groups.ephemeralGroups.includes(g.name));
|
const { groups } = await api.admin.listGroups(socket);
|
||||||
groupsList.sort((a, b) => b.system - a.system);
|
|
||||||
return groupsList.map(g => ({ name: g.name, displayName: g.displayName }));
|
// Float system groups to top and return only name/displayName
|
||||||
|
groups.sort((a, b) => b.system - a.system);
|
||||||
|
return groups.map(g => ({ name: g.name, displayName: g.displayName }));
|
||||||
};
|
};
|
||||||
|
|
||||||
SocketGroups.cover = {};
|
SocketGroups.cover = {};
|
||||||
|
|||||||
Reference in New Issue
Block a user