Skip to content
Merged
26 changes: 26 additions & 0 deletions app/api/server/lib/rooms.js
Original file line number Diff line number Diff line change
Expand Up @@ -120,3 +120,29 @@ export async function findChannelAndPrivateAutocomplete({ uid, selector }) {
items: rooms,
};
}

export async function findRoomsAvailableForTeams({ uid, name }) {
const options = {
fields: {
_id: 1,
fname: 1,
name: 1,
t: 1,
avatarETag: 1,
},
limit: 10,
sort: {
name: 1,
},
};

const userRooms = Subscriptions.findByUserIdAndType(uid, 'p', { fields: { rid: 1 } })
.fetch()
.map((item) => item.rid);

const rooms = await Rooms.findChannelAndGroupListWithoutTeamsByNameStarting(name, userRooms, options).toArray();

return {
items: rooms,
};
}
17 changes: 16 additions & 1 deletion app/api/server/v1/rooms.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import Busboy from 'busboy';
import { FileUpload } from '../../../file-upload';
import { Rooms, Messages } from '../../../models';
import { API } from '../api';
import { findAdminRooms, findChannelAndPrivateAutocomplete, findAdminRoom } from '../lib/rooms';
import { findAdminRooms, findChannelAndPrivateAutocomplete, findAdminRoom, findRoomsAvailableForTeams } from '../lib/rooms';
import { sendFile, sendViaEmail } from '../../../../server/lib/channelExport';
import { canAccessRoom, hasPermission } from '../../../authorization/server';

Expand Down Expand Up @@ -337,6 +337,21 @@ API.v1.addRoute('rooms.autocomplete.channelAndPrivate', { authRequired: true },
},
});

API.v1.addRoute('rooms.autocomplete.availableForTeams', { authRequired: true }, {
get() {
const { name } = this.queryParams;

if (name && typeof name !== 'string') {
return API.v1.failure('The \'name\' param is invalid');
}

return API.v1.success(Promise.await(findRoomsAvailableForTeams({
uid: this.userId,
name,
})));
},
});

API.v1.addRoute('rooms.saveRoomSettings', { authRequired: true }, {
post() {
const { rid, ...params } = this.bodyParams;
Expand Down
27 changes: 27 additions & 0 deletions app/models/server/raw/Rooms.js
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,33 @@ export class RoomsRaw extends BaseRaw {
return this.find(query, options);
}

findChannelAndGroupListWithoutTeamsByNameStarting(name, groupsToAccept, options) {
const nameRegex = new RegExp(`^${ escapeRegExp(name).trim() }`, 'i');

const query = {
teamId: {
$exists: false,
},
prid: {
$exists: false,
},
$or: [
{
t: 'c',
},
{
t: 'p',
_id: {
$in: groupsToAccept,
},
},
],
name: nameRegex,
};

return this.find(query, options);
}

unsetTeamId(teamId, options = {}) {
const query = { teamId };
const update = {
Expand Down
2 changes: 2 additions & 0 deletions client/contexts/ServerContext/endpoints.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { GetMessageEndpoint as ChatGetMessageEndpoint } from './endpoints/v1/cha
import { UnfollowMessageEndpoint as ChatUnfollowMessageEndpoint } from './endpoints/v1/chat/unfollowMessage';
import { AutocompleteEndpoint as UsersAutocompleteEndpoint } from './endpoints/v1/users/autocomplete';
import { AutocompleteChannelAndPrivateEndpoint as RoomsAutocompleteEndpoint } from './endpoints/v1/rooms/autocompleteChannelAndPrivate';
import { AutocompleteAvailableForTeamsEndpoint as RoomsAutocompleteTeamsEndpoint } from './endpoints/v1/rooms/autocompleteAvailableForTeams';
import { AppearanceEndpoint as LivechatAppearanceEndpoint } from './endpoints/v1/livechat/appearance';
import { ListEndpoint as CustomUserStatusListEndpoint } from './endpoints/v1/custom-user-status/list';
import { ExternalComponentsEndpoint as AppsExternalComponentsEndpoint } from './endpoints/apps/externalComponents';
Expand Down Expand Up @@ -34,6 +35,7 @@ export type ServerEndpoints = {
'custom-user-status.list': CustomUserStatusListEndpoint;
'/apps/externalComponents': AppsExternalComponentsEndpoint;
'rooms.autocomplete.channelAndPrivate': RoomsAutocompleteEndpoint;
'rooms.autocomplete.availableForTeams': RoomsAutocompleteTeamsEndpoint;
'teams.listRooms': ListRoomsEndpoint;
'teams.addRooms': TeamsAddRoomsEndpoint;
'livechat/visitors.info': LivechatVisitorInfoEndpoint;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import { IRoom } from '../../../../../../definition/IRoom';

export type AutocompleteAvailableForTeamsEndpoint = {
GET: (params: { name: string }) => { items: IRoom[] };
};
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,9 @@ const useRoomsAutoComplete = (name: string): {
options: AutoCompleteProps['options'];
} => {
const params = useMemo(() => ({
selector: JSON.stringify({ name }),
name,
}), [name]);
const { value: data } = useEndpointData('rooms.autocomplete.channelAndPrivate', params);
const { value: data } = useEndpointData('rooms.autocomplete.availableForTeams', params);

const options = useMemo<AutoCompleteProps['options']>(() => {
if (!data) {
Expand Down
24 changes: 24 additions & 0 deletions tests/end-to-end/api/09-rooms.js
Original file line number Diff line number Diff line change
Expand Up @@ -907,6 +907,30 @@ describe('[Rooms]', function() {
.end(done);
});
});
describe('[/rooms.autocomplete.availableForTeams]', () => {
it('should return the rooms to fill auto complete', (done) => {
request.get(api('rooms.autocomplete.availableForTeams'))
.set(credentials)
.expect('Content-Type', 'application/json')
.expect(200)
.expect((res) => {
expect(res.body).to.have.property('success', true);
expect(res.body).to.have.property('items').and.to.be.an('array');
})
.end(done);
});
it('should return the filtered rooms to fill auto complete', (done) => {
request.get(api('rooms.autocomplete.availableForTeams?name=group'))
.set(credentials)
.expect('Content-Type', 'application/json')
.expect(200)
.expect((res) => {
expect(res.body).to.have.property('success', true);
expect(res.body).to.have.property('items').and.to.be.an('array');
})
.end(done);
});
});
describe('/rooms.adminRooms', () => {
it('should throw an error when the user tries to gets a list of discussion and he cannot access the room', (done) => {
updatePermission('view-room-administration', []).then(() => {
Expand Down