diff --git a/app/channel-settings/server/functions/saveRoomName.js b/app/channel-settings/server/functions/saveRoomName.js index 954715a9143a6..5d3197d133b35 100644 --- a/app/channel-settings/server/functions/saveRoomName.js +++ b/app/channel-settings/server/functions/saveRoomName.js @@ -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) => { @@ -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); diff --git a/app/channel-settings/server/functions/saveRoomType.js b/app/channel-settings/server/functions/saveRoomType.js index 58d94aa4682af..e7dd8ebb733e1 100644 --- a/app/channel-settings/server/functions/saveRoomType.js +++ b/app/channel-settings/server/functions/saveRoomType.js @@ -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)) { @@ -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', { diff --git a/app/channel-settings/server/methods/saveRoomSettings.js b/app/channel-settings/server/methods/saveRoomSettings.js index e524637e8b969..811c492fb70d4 100644 --- a/app/channel-settings/server/methods/saveRoomSettings.js +++ b/app/channel-settings/server/methods/saveRoomSettings.js @@ -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']; @@ -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) { @@ -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 }) { diff --git a/app/models/server/raw/Team.ts b/app/models/server/raw/Team.ts index f762b9cd959b7..f7aca9abfe0b1 100644 --- a/app/models/server/raw/Team.ts +++ b/app/models/server/raw/Team.ts @@ -88,7 +88,7 @@ export class TeamRaw extends BaseRaw { Object.assign(update.$set, { name: nameAndType.name }); } - if (nameAndType.type) { + if (typeof nameAndType.type !== 'undefined') { Object.assign(update.$set, { type: nameAndType.type }); } diff --git a/server/sdk/types/ITeamService.ts b/server/sdk/types/ITeamService.ts index 6e3edb05ac151..03a2d535425db 100644 --- a/server/sdk/types/ITeamService.ts +++ b/server/sdk/types/ITeamService.ts @@ -49,6 +49,7 @@ export interface IListRoomsFilter { export interface ITeamUpdateData { name: string; type: TEAM_TYPE; + updateRoom?: boolean; // default is true } export interface ITeamService { diff --git a/server/services/team/service.ts b/server/services/team/service.ts index b238c84d599e0..71a720ec3385e 100644 --- a/server/services/team/service.ts +++ b/server/services/team/service.ts @@ -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); diff --git a/server/startup/migrations/index.js b/server/startup/migrations/index.js index d8b57eda432da..e8c70341810a4 100644 --- a/server/startup/migrations/index.js +++ b/server/startup/migrations/index.js @@ -217,4 +217,5 @@ import './v217'; import './v218'; import './v219'; import './v220'; +import './v221'; import './xrun'; diff --git a/server/startup/migrations/v221.js b/server/startup/migrations/v221.js new file mode 100644 index 0000000000000..1621511c0fe4c --- /dev/null +++ b/server/startup/migrations/v221.js @@ -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(); + }, +});