Skip to content
7 changes: 4 additions & 3 deletions app/channel-settings/server/functions/saveRoomName.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { Meteor } from 'meteor/meteor';

import { Rooms, Messages, Subscriptions, Integrations } from '../../../models';
import { roomTypes, getValidRoomName } from '../../../utils';
import { callbacks } from '../../../callbacks';
import { Rooms, Messages, Subscriptions, Integrations } from '../../../models/server';
import { roomTypes, getValidRoomName } from '../../../utils/server';
import { callbacks } from '../../../callbacks/server';
import { checkUsernameAvailability } from '../../../lib/server/functions';

const updateRoomName = (rid, displayName, isDiscussion) => {
Expand Down Expand Up @@ -34,6 +34,7 @@ export const saveRoomName = function(rid, displayName, user, sendMessage = true)
if (!update) {
return;
}

Integrations.updateRoomName(room.name, displayName);
if (sendMessage) {
Messages.createRoomRenamedWithRoomIdRoomNameAndUser(rid, displayName, user);
Expand Down
12 changes: 8 additions & 4 deletions app/channel-settings/server/functions/saveRoomType.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@ import { Meteor } from 'meteor/meteor';
import { Match } from 'meteor/check';
import { TAPi18n } from 'meteor/rocketchat:tap-i18n';

import { Rooms, Subscriptions, Messages } from '../../../models';
import { settings } from '../../../settings';
import { roomTypes, RoomSettingsEnum } from '../../../utils';
import { Rooms, Subscriptions, Messages } from '../../../models/server';
import { settings } from '../../../settings/server';
import { roomTypes, RoomSettingsEnum } from '../../../utils/server';

export const saveRoomType = function(rid, roomType, user, sendMessage = true) {
if (!Match.test(rid, String)) {
Expand Down Expand Up @@ -33,7 +33,11 @@ export const saveRoomType = function(rid, roomType, user, sendMessage = true) {
}

const result = Rooms.setTypeById(rid, roomType) && Subscriptions.updateTypeByRoomId(rid, roomType);
if (result && sendMessage) {
if (!result) {
return result;
}

if (sendMessage) {
let message;
if (roomType === 'c') {
message = TAPi18n.__('Channel', {
Expand Down
25 changes: 21 additions & 4 deletions app/channel-settings/server/methods/saveRoomSettings.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ import { saveRoomTokenpass } from '../functions/saveRoomTokens';
import { saveRoomEncrypted } from '../functions/saveRoomEncrypted';
import { saveStreamingOptions } from '../functions/saveStreamingOptions';
import { RoomSettingsEnum, roomTypes } from '../../../utils';
import { Team } from '../../../../server/sdk';
import { TEAM_TYPE } from '../../../../definition/ITeam';

const fields = ['roomAvatar', 'featured', 'roomName', 'roomTopic', 'roomAnnouncement', 'roomCustomFields', 'roomDescription', 'roomType', 'readOnly', 'reactWhenReadOnly', 'systemMessages', 'default', 'joinCode', 'tokenpass', 'streamingOptions', 'retentionEnabled', 'retentionMaxAge', 'retentionExcludePinned', 'retentionFilesOnly', 'retentionIgnoreThreads', 'retentionOverrideGlobal', 'encrypted', 'favorite'];

Expand Down Expand Up @@ -125,8 +127,14 @@ const validators = {
};

const settingSavers = {
roomName({ value, rid, user }) {
saveRoomName(rid, value, user);
roomName({ value, rid, user, room }) {
if (!saveRoomName(rid, value, user)) {
return;
}

if (room.teamId && room.teamMain) {
Team.update(user._id, room.teamId, { name: value, updateRoom: false });
}
},
roomTopic({ value, room, rid, user }) {
if (value !== room.topic) {
Expand All @@ -149,8 +157,17 @@ const settingSavers = {
}
},
roomType({ value, room, rid, user }) {
if (value !== room.t) {
saveRoomType(rid, value, user);
if (value === room.t) {
return;
}

if (!saveRoomType(rid, value, user)) {
return;
}

if (room.teamId && room.teamMain) {
const type = value === 'c' ? TEAM_TYPE.PUBLIC : TEAM_TYPE.PRIVATE;
Team.update(user._id, room.teamId, { type, updateRoom: false });
}
},
tokenpass({ value, rid }) {
Expand Down
2 changes: 1 addition & 1 deletion app/models/server/raw/Team.ts
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ export class TeamRaw extends BaseRaw<T> {
Object.assign(update.$set, { name: nameAndType.name });
}

if (nameAndType.type) {
if (typeof nameAndType.type !== 'undefined') {
Object.assign(update.$set, { type: nameAndType.type });
}

Expand Down
1 change: 1 addition & 0 deletions server/sdk/types/ITeamService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ export interface IListRoomsFilter {
export interface ITeamUpdateData {
name: string;
type: TEAM_TYPE;
updateRoom?: boolean; // default is true
}

export interface ITeamService {
Expand Down
10 changes: 6 additions & 4 deletions server/services/team/service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -166,12 +166,14 @@ export class TeamService extends ServiceClass implements ITeamService {
return;
}

if (updateData.name) {
saveRoomName(team.roomId, updateData.name, user);
const { name, type, updateRoom = true } = updateData;

if (updateRoom && name) {
saveRoomName(team.roomId, name, user);
}

if (updateData.type) {
saveRoomType(team.roomId, updateData.type === TEAM_TYPE.PRIVATE ? 'p' : 'c', user);
if (updateRoom && typeof type !== 'undefined') {
saveRoomType(team.roomId, type === TEAM_TYPE.PRIVATE ? 'p' : 'c', user);
}

await this.TeamModel.updateNameAndType(teamId, updateData);
Expand Down
1 change: 1 addition & 0 deletions server/startup/migrations/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -217,4 +217,5 @@ import './v217';
import './v218';
import './v219';
import './v220';
import './v221';
import './xrun';
31 changes: 31 additions & 0 deletions server/startup/migrations/v221.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import { MongoInternals } from 'meteor/mongo';
import Future from 'fibers/future';

import { Migrations } from '../../../app/migrations';
import { Rooms } from '../../../app/models/server/raw';
import { TeamRaw } from '../../../app/models/server/raw/Team';
import { TEAM_TYPE } from '../../../definition/ITeam';

async function migrateTeamNames(fut) {
const { mongo } = MongoInternals.defaultRemoteCollectionDriver();
const Team = new TeamRaw(mongo.db.collection('rocketchat_team'));

const rooms = await Rooms.find({ teamMain: true }, { projection: { name: 1, fname: 1, teamId: 1, t: 1 } }).toArray();
await Promise.all(rooms.map(async ({ name, fname, t, teamId }) => {
const update = {
name: fname || name,
type: t === 'c' ? TEAM_TYPE.PUBLIC : TEAM_TYPE.PRIVATE,
};
Team.updateNameAndType(teamId, update);
}));
fut.return();
}

Migrations.add({
version: 221,
up() {
const fut = new Future();
migrateTeamNames(fut);
fut.wait();
},
});