diff --git a/app/api/server/lib/rooms.js b/app/api/server/lib/rooms.js index 4a8737cb9ee35..64daf330ecf0c 100644 --- a/app/api/server/lib/rooms.js +++ b/app/api/server/lib/rooms.js @@ -32,6 +32,7 @@ export async function findAdminRooms({ uid, filter, types = [], pagination: { of const name = filter && filter.trim(); const discussion = types && types.includes('discussions'); const includeTeams = types && types.includes('teams'); + const showOnlyTeams = types.length === 1 && types.includes('teams'); const typesToRemove = ['discussions', 'teams']; const showTypes = Array.isArray(types) ? types.filter((type) => !typesToRemove.includes(type)) : []; const options = { @@ -42,13 +43,12 @@ export async function findAdminRooms({ uid, filter, types = [], pagination: { of }; let cursor; - if (name && showTypes.length) { - cursor = Rooms.findByNameContainingAndTypes(name, showTypes, discussion, includeTeams, options); + cursor = Rooms.findByNameContainingAndTypes(name, showTypes, discussion, includeTeams, showOnlyTeams, options); } else if (showTypes.length) { - cursor = Rooms.findByTypes(showTypes, discussion, includeTeams, options); + cursor = Rooms.findByTypes(showTypes, discussion, includeTeams, showOnlyTeams, options); } else { - cursor = Rooms.findByNameContaining(name, discussion, includeTeams, options); + cursor = Rooms.findByNameContaining(name, discussion, includeTeams, showOnlyTeams, options); } const total = await cursor.count(); diff --git a/app/models/server/raw/Rooms.js b/app/models/server/raw/Rooms.js index 4fbff1c276bbd..06d1db18fb29a 100644 --- a/app/models/server/raw/Rooms.js +++ b/app/models/server/raw/Rooms.js @@ -42,9 +42,11 @@ export class RoomsRaw extends BaseRaw { return statistic; } - findByNameContainingAndTypes(name, types, discussion = false, teams = false, options = {}) { + findByNameContainingAndTypes(name, types, discussion = false, teams = false, showOnlyTeams = false, options = {}) { const nameRegex = new RegExp(escapeRegExp(name).trim(), 'i'); + const onlyTeamsQuery = showOnlyTeams ? { teamMain: { $exists: true } } : {}; + const teamCondition = teams ? {} : { teamMain: { $exists: false, @@ -64,28 +66,32 @@ export class RoomsRaw extends BaseRaw { }, ], ...teamCondition, + ...onlyTeamsQuery, }; return this.find(query, options); } - findByTypes(types, discussion = false, teams = false, options = {}) { + findByTypes(types, discussion = false, teams = false, onlyTeams = false, options = {}) { const teamCondition = teams ? {} : { teamMain: { $exists: false, }, }; + const onlyTeamsCondition = onlyTeams ? { teamMain: { $exists: true } } : {}; + const query = { t: { $in: types, }, prid: { $exists: discussion }, ...teamCondition, + ...onlyTeamsCondition, }; return this.find(query, options); } - findByNameContaining(name, discussion = false, teams = false, options = {}) { + findByNameContaining(name, discussion = false, teams = false, onlyTeams = false, options = {}) { const nameRegex = new RegExp(escapeRegExp(name).trim(), 'i'); const teamCondition = teams ? {} : { @@ -94,6 +100,8 @@ export class RoomsRaw extends BaseRaw { }, }; + const onlyTeamsCondition = onlyTeams ? { $and: [{ teamMain: { $exists: true } }, { teamMain: true }] } : {}; + const query = { prid: { $exists: discussion }, $or: [ @@ -104,6 +112,7 @@ export class RoomsRaw extends BaseRaw { }, ], ...teamCondition, + ...onlyTeamsCondition, }; return this.find(query, options);