Regression: Error when trying to load name of dm rooms for avatars and notifications (#24583)

* Regression: Error when trying to load name of 'd' rooms for avatars and notifications

* Fix for multi-user DM name

* update voip room type

* load only necessary data

* optional argument

* Fields instead of projection

* removed redundant typings
pull/24590/head
Pierre Lehnen 4 years ago committed by GitHub
parent 7d823e2cff
commit ee292ddd1c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 2
      app/lib/server/functions/notifications/desktop.js
  2. 2
      app/lib/server/functions/notifications/mobile.js
  3. 23
      client/lib/rooms/roomTypes/direct.ts
  4. 31
      client/lib/rooms/roomTypes/livechat.ts
  5. 21
      client/lib/rooms/roomTypes/private.ts
  6. 23
      client/lib/rooms/roomTypes/public.ts
  7. 15
      client/lib/rooms/roomTypes/voip.ts
  8. 5
      definition/IRoomTypeConfig.ts
  9. 13
      server/lib/rooms/roomCoordinator.ts
  10. 43
      server/lib/rooms/roomTypes/direct.ts
  11. 19
      server/lib/rooms/roomTypes/livechat.ts
  12. 12
      server/lib/rooms/roomTypes/private.ts
  13. 17
      server/lib/rooms/roomTypes/public.ts
  14. 11
      server/lib/rooms/roomTypes/voip.ts
  15. 6
      server/routes/avatar/room.js

@ -13,7 +13,7 @@ import { roomCoordinator } from '../../../../../server/lib/rooms/roomCoordinator
* @param {string} notificationMessage The message text to send on notification body
*/
export function notifyDesktopUser({ userId, user, message, room, duration, notificationMessage }) {
const { title, text } = roomCoordinator.getRoomDirectives(room.t)?.getNotificationDetails(room, user, notificationMessage);
const { title, text } = roomCoordinator.getRoomDirectives(room.t)?.getNotificationDetails(room, user, notificationMessage, userId);
metrics.notificationsSent.inc({ notification_type: 'desktop' });
Notifications.notifyUser(userId, 'notification', {

@ -55,7 +55,7 @@ export async function getPushData({
},
roomName:
settings.get('Push_show_username_room') && roomCoordinator.getRoomDirectives(room.t)?.isGroupChat(room)
? `#${roomCoordinator.getRoomName(room.t, room)}`
? `#${roomCoordinator.getRoomName(room.t, room, userId)}`
: '',
username,
message: messageText,

@ -7,17 +7,16 @@ import { settings } from '../../../../app/settings/client';
import { getUserPreference } from '../../../../app/utils/client';
import { getAvatarURL } from '../../../../app/utils/lib/getAvatarURL';
import { getUserAvatarURL } from '../../../../app/utils/lib/getUserAvatarURL';
import type { IRoom } from '../../../../definition/IRoom';
import type { IRoomTypeClientDirectives } from '../../../../definition/IRoomTypeConfig';
import { RoomSettingsEnum, RoomMemberActions, UiTextContext } from '../../../../definition/IRoomTypeConfig';
import type { AtLeast, ValueOf } from '../../../../definition/utils';
import type { AtLeast } from '../../../../definition/utils';
import { getDirectMessageRoomType } from '../../../../lib/rooms/roomTypes/direct';
import { roomCoordinator } from '../roomCoordinator';
export const DirectMessageRoomType = getDirectMessageRoomType(roomCoordinator);
roomCoordinator.add(DirectMessageRoomType, {
allowRoomSettingChange(_room: Partial<IRoom>, setting: ValueOf<typeof RoomSettingsEnum>): boolean {
allowRoomSettingChange(_room, setting) {
switch (setting) {
case RoomSettingsEnum.TYPE:
case RoomSettingsEnum.NAME:
@ -35,7 +34,7 @@ roomCoordinator.add(DirectMessageRoomType, {
}
},
allowMemberAction(room: Partial<IRoom>, action: ValueOf<typeof RoomMemberActions>): boolean {
allowMemberAction(room, action) {
switch (action) {
case RoomMemberActions.BLOCK:
return !this.isGroupChat(room);
@ -44,7 +43,7 @@ roomCoordinator.add(DirectMessageRoomType, {
}
},
roomName(roomData): string | undefined {
roomName(roomData) {
const subscription = ((): { fname?: string; name?: string } | undefined => {
if (roomData.fname || roomData.name) {
return {
@ -71,11 +70,11 @@ roomCoordinator.add(DirectMessageRoomType, {
return subscription.name;
},
isGroupChat(room: Partial<IRoom>): boolean {
isGroupChat(room) {
return (room?.uids?.length || 0) > 2;
},
getUiText(context: ValueOf<typeof UiTextContext>): string {
getUiText(context) {
switch (context) {
case UiTextContext.HIDE_WARNING:
return 'Hide_Private_Warning';
@ -86,12 +85,12 @@ roomCoordinator.add(DirectMessageRoomType, {
}
},
condition(): boolean {
condition() {
const groupByType = getUserPreference(Meteor.userId(), 'sidebarGroupByType');
return groupByType && hasAtLeastOnePermission(['view-d-room', 'view-joined-room']);
},
getAvatarPath(room): string {
getAvatarPath(room) {
if (!room) {
return '';
}
@ -117,7 +116,7 @@ roomCoordinator.add(DirectMessageRoomType, {
return getUserAvatarURL(room.name || this.roomName(room));
},
getIcon(room: Partial<IRoom>): string | undefined {
getIcon(room) {
if (this.isGroupChat(room)) {
return 'balloon';
}
@ -125,7 +124,7 @@ roomCoordinator.add(DirectMessageRoomType, {
return DirectMessageRoomType.icon;
},
getUserStatus(roomId: string): string | undefined {
getUserStatus(roomId) {
const subscription = Subscriptions.findOne({ rid: roomId });
if (!subscription) {
return;
@ -134,7 +133,7 @@ roomCoordinator.add(DirectMessageRoomType, {
return Session.get(`user_${subscription.name}_status`);
},
findRoom(identifier: string): IRoom | undefined {
findRoom(identifier) {
if (!hasPermission('view-d-room')) {
return;
}

@ -5,7 +5,7 @@ import { LivechatInquiry } from '../../../../app/livechat/client/collections/Liv
import { ChatRoom, ChatSubscription } from '../../../../app/models/client';
import { settings } from '../../../../app/settings/client';
import { getAvatarURL } from '../../../../app/utils/lib/getAvatarURL';
import type { IRoom, IOmnichannelRoom } from '../../../../definition/IRoom';
import type { IOmnichannelRoom } from '../../../../definition/IRoom';
import type { IRoomTypeClientDirectives } from '../../../../definition/IRoomTypeConfig';
import { RoomSettingsEnum, RoomMemberActions, UiTextContext } from '../../../../definition/IRoomTypeConfig';
import type { AtLeast, ValueOf } from '../../../../definition/utils';
@ -15,7 +15,7 @@ import { roomCoordinator } from '../roomCoordinator';
export const LivechatRoomType = getLivechatRoomType(roomCoordinator);
roomCoordinator.add(LivechatRoomType, {
allowRoomSettingChange(_room: Partial<IRoom>, setting: ValueOf<typeof RoomSettingsEnum>): boolean {
allowRoomSettingChange(_room, setting) {
switch (setting) {
case RoomSettingsEnum.JOIN_CODE:
return false;
@ -24,16 +24,17 @@ roomCoordinator.add(LivechatRoomType, {
}
},
allowMemberAction(_room: Partial<IRoom>, action: ValueOf<typeof RoomMemberActions>): boolean {
allowMemberAction(_room, action) {
return ([RoomMemberActions.INVITE, RoomMemberActions.JOIN] as Array<ValueOf<typeof RoomMemberActions>>).includes(action);
},
roomName(room: any): string | undefined {
return room.name || room.fname || room.label;
roomName(room) {
return room.name || room.fname || (room as any).label;
},
openCustomProfileTab(instance: any, room: IOmnichannelRoom, username: string): boolean {
if (!room?.v || (room.v as any).username !== username) {
openCustomProfileTab(instance, room, username) {
const omniRoom = room as IOmnichannelRoom;
if (!omniRoom?.v || (omniRoom.v as any).username !== username) {
return false;
}
@ -41,7 +42,7 @@ roomCoordinator.add(LivechatRoomType, {
return true;
},
getUiText(context: ValueOf<typeof UiTextContext>): string {
getUiText(context) {
switch (context) {
case UiTextContext.HIDE_WARNING:
return 'Hide_Livechat_Warning';
@ -52,15 +53,15 @@ roomCoordinator.add(LivechatRoomType, {
}
},
condition(): boolean {
condition() {
return settings.get('Livechat_enabled') && hasPermission('view-l-room');
},
getAvatarPath(room): string {
getAvatarPath(room) {
return getAvatarURL({ username: `@${this.roomName(room)}` }) || '';
},
getUserStatus(rid: string): string | undefined {
getUserStatus(rid) {
const room = Session.get(`roomData${rid}`);
if (room) {
return room.v && room.v.status;
@ -69,20 +70,20 @@ roomCoordinator.add(LivechatRoomType, {
return inquiry?.v?.status;
},
findRoom(identifier: string): IRoom | undefined {
findRoom(identifier) {
return ChatRoom.findOne({ _id: identifier });
},
isLivechatRoom(): boolean {
isLivechatRoom() {
return true;
},
canSendMessage(rid: string): boolean {
canSendMessage(rid) {
const room = ChatRoom.findOne({ _id: rid }, { fields: { open: 1 } });
return Boolean(room?.open);
},
readOnly(rid: string, _user): boolean {
readOnly(rid, _user) {
const room = ChatRoom.findOne({ _id: rid }, { fields: { open: 1, servedBy: 1 } });
if (!room || !room.open) {
return true;

@ -5,17 +5,16 @@ import { ChatRoom } from '../../../../app/models/client';
import { settings } from '../../../../app/settings/client';
import { getUserPreference } from '../../../../app/utils/client';
import { getAvatarURL } from '../../../../app/utils/lib/getAvatarURL';
import type { IRoom } from '../../../../definition/IRoom';
import type { IRoomTypeClientDirectives } from '../../../../definition/IRoomTypeConfig';
import { RoomSettingsEnum, RoomMemberActions, UiTextContext } from '../../../../definition/IRoomTypeConfig';
import type { AtLeast, ValueOf } from '../../../../definition/utils';
import type { AtLeast } from '../../../../definition/utils';
import { getPrivateRoomType } from '../../../../lib/rooms/roomTypes/private';
import { roomCoordinator } from '../roomCoordinator';
export const PrivateRoomType = getPrivateRoomType(roomCoordinator);
roomCoordinator.add(PrivateRoomType, {
allowRoomSettingChange(room: Partial<IRoom>, setting: ValueOf<typeof RoomSettingsEnum>): boolean {
allowRoomSettingChange(room, setting) {
switch (setting) {
case RoomSettingsEnum.JOIN_CODE:
return false;
@ -33,7 +32,7 @@ roomCoordinator.add(PrivateRoomType, {
}
},
allowMemberAction(_room: Partial<IRoom>, action: ValueOf<typeof RoomMemberActions>): boolean {
allowMemberAction(_room, action) {
switch (action) {
case RoomMemberActions.BLOCK:
return false;
@ -42,7 +41,7 @@ roomCoordinator.add(PrivateRoomType, {
}
},
roomName(roomData: AtLeast<IRoom, '_id' | 'name' | 'fname' | 'prid'>): string | undefined {
roomName(roomData) {
if (roomData.prid) {
return roomData.fname;
}
@ -53,11 +52,11 @@ roomCoordinator.add(PrivateRoomType, {
return roomData.name;
},
isGroupChat(_room: Partial<IRoom>): boolean {
isGroupChat(_room) {
return true;
},
getUiText(context: ValueOf<typeof UiTextContext>): string {
getUiText(context) {
switch (context) {
case UiTextContext.HIDE_WARNING:
return 'Hide_Group_Warning';
@ -68,16 +67,16 @@ roomCoordinator.add(PrivateRoomType, {
}
},
condition(): boolean {
condition() {
const groupByType = getUserPreference(Meteor.userId(), 'sidebarGroupByType');
return groupByType && hasPermission('view-p-room');
},
getAvatarPath(room): string {
getAvatarPath(room) {
return getAvatarURL({ roomId: room._id, cache: room.avatarETag }) as string;
},
getIcon(room: Partial<IRoom>): string | undefined {
getIcon(room) {
if (room.prid) {
return 'discussion';
}
@ -88,7 +87,7 @@ roomCoordinator.add(PrivateRoomType, {
return PrivateRoomType.icon;
},
findRoom(identifier: string): IRoom | undefined {
findRoom(identifier) {
const query = {
t: 'p',
name: identifier,

@ -5,17 +5,16 @@ import { ChatRoom } from '../../../../app/models/client';
import { settings } from '../../../../app/settings/client';
import { getUserPreference } from '../../../../app/utils/client';
import { getAvatarURL } from '../../../../app/utils/lib/getAvatarURL';
import type { IRoom } from '../../../../definition/IRoom';
import type { IRoomTypeClientDirectives } from '../../../../definition/IRoomTypeConfig';
import { RoomSettingsEnum, RoomMemberActions, UiTextContext } from '../../../../definition/IRoomTypeConfig';
import type { AtLeast, ValueOf } from '../../../../definition/utils';
import type { AtLeast } from '../../../../definition/utils';
import { getPublicRoomType } from '../../../../lib/rooms/roomTypes/public';
import { roomCoordinator } from '../roomCoordinator';
export const PublicRoomType = getPublicRoomType(roomCoordinator);
roomCoordinator.add(PublicRoomType, {
allowRoomSettingChange(room: Partial<IRoom>, setting: ValueOf<typeof RoomSettingsEnum>): boolean {
allowRoomSettingChange(room, setting) {
switch (setting) {
case RoomSettingsEnum.BROADCAST:
return Boolean(room.broadcast);
@ -31,7 +30,7 @@ roomCoordinator.add(PublicRoomType, {
}
},
allowMemberAction(_room: Partial<IRoom>, action: ValueOf<typeof RoomMemberActions>): boolean {
allowMemberAction(_room, action) {
switch (action) {
case RoomMemberActions.BLOCK:
return false;
@ -40,7 +39,7 @@ roomCoordinator.add(PublicRoomType, {
}
},
roomName(roomData: AtLeast<IRoom, '_id' | 'name' | 'fname' | 'prid'>): string | undefined {
roomName(roomData) {
if (roomData.prid) {
return roomData.fname;
}
@ -50,11 +49,11 @@ roomCoordinator.add(PublicRoomType, {
return roomData.name;
},
isGroupChat(_room: Partial<IRoom>): boolean {
isGroupChat(_room) {
return true;
},
getUiText(context: ValueOf<typeof UiTextContext>): string {
getUiText(context) {
switch (context) {
case UiTextContext.HIDE_WARNING:
return 'Hide_Room_Warning';
@ -65,18 +64,18 @@ roomCoordinator.add(PublicRoomType, {
}
},
condition(): boolean {
condition() {
const groupByType = getUserPreference(Meteor.userId(), 'sidebarGroupByType');
return (
groupByType && (hasAtLeastOnePermission(['view-c-room', 'view-joined-room']) || settings.get('Accounts_AllowAnonymousRead') === true)
);
},
getAvatarPath(room): string {
getAvatarPath(room) {
return getAvatarURL({ roomId: room._id, cache: room.avatarETag }) as string;
},
getIcon(room: Partial<IRoom>): string | undefined {
getIcon(room) {
if (room.prid) {
return 'discussion';
}
@ -87,7 +86,7 @@ roomCoordinator.add(PublicRoomType, {
return PublicRoomType.icon;
},
findRoom(identifier: string): IRoom | undefined {
findRoom(identifier) {
const query = {
t: 'c',
name: identifier,
@ -96,7 +95,7 @@ roomCoordinator.add(PublicRoomType, {
return ChatRoom.findOne(query);
},
showJoinLink(roomId: string): boolean {
showJoinLink(roomId) {
return !!ChatRoom.findOne({ _id: roomId, t: 'c' });
},
} as AtLeast<IRoomTypeClientDirectives, 'isGroupChat' | 'roomName'>);

@ -2,7 +2,6 @@ import { hasPermission } from '../../../../app/authorization/client';
import { ChatRoom } from '../../../../app/models/client';
import { settings } from '../../../../app/settings/client';
import { getAvatarURL } from '../../../../app/utils/lib/getAvatarURL';
import type { IRoom } from '../../../../definition/IRoom';
import type { IRoomTypeClientDirectives } from '../../../../definition/IRoomTypeConfig';
import type { AtLeast } from '../../../../definition/utils';
import { getVoipRoomType } from '../../../../lib/rooms/roomTypes/voip';
@ -11,27 +10,27 @@ import { roomCoordinator } from '../roomCoordinator';
export const VoipRoomType = getVoipRoomType(roomCoordinator);
roomCoordinator.add(VoipRoomType, {
roomName(room: any): string | undefined {
return room.name || room.fname || room.label;
roomName(room) {
return room.name || room.fname || (room as any).label;
},
condition(): boolean {
condition() {
return settings.get('Livechat_enabled') && hasPermission('view-l-room');
},
getAvatarPath(room): string {
getAvatarPath(room) {
return getAvatarURL({ username: `@${this.roomName(room)}` }) || '';
},
findRoom(identifier: string): IRoom | undefined {
findRoom(identifier) {
return ChatRoom.findOne({ _id: identifier });
},
canSendMessage(_rid: string): boolean {
canSendMessage(_rid) {
return false;
},
readOnly(_rid: string, _user): boolean {
readOnly(_rid, _user) {
return true;
},
} as AtLeast<IRoomTypeClientDirectives, 'roomName'>);

@ -90,7 +90,7 @@ export interface IRoomTypeServerDirectives {
allowRoomSettingChange: (room: IRoom, setting: ValueOf<typeof RoomSettingsEnum>) => boolean;
allowMemberAction: (room: IRoom, action: ValueOf<typeof RoomMemberActions>) => boolean;
roomName: (room: IRoom) => string | undefined;
roomName: (room: IRoom, userId?: string) => string | undefined;
isGroupChat: (room: IRoom) => boolean;
canBeDeleted: (hasPermission: (permissionId: string, rid?: string) => boolean, room: IRoom) => boolean;
preventRenaming: () => boolean;
@ -98,8 +98,9 @@ export interface IRoomTypeServerDirectives {
canAccessUploadedFile: (params: { rc_uid: string; rc_rid: string; rc_token: string }) => boolean;
getNotificationDetails: (
room: IRoom,
user: AtLeast<IUser, '_id' | 'name' | 'username'>,
sender: AtLeast<IUser, '_id' | 'name' | 'username'>,
notificationMessage: string,
userId: string,
) => { title: string | undefined; text: string };
getMsgSender: (senderId: IRocketChatRecord['_id']) => IRocketChatRecord | undefined;
includeInRoomSearch: () => boolean;

@ -19,7 +19,7 @@ class RoomCoordinatorServer extends RoomCoordinator {
allowMemberAction(_room: IRoom, _action: ValueOf<typeof RoomMemberActions>): boolean {
return false;
},
roomName(_room: IRoom): string {
roomName(_room: IRoom, _userId?: string): string {
return '';
},
isGroupChat(_room: IRoom): boolean {
@ -42,11 +42,12 @@ class RoomCoordinatorServer extends RoomCoordinator {
},
getNotificationDetails(
room: IRoom,
user: AtLeast<IUser, '_id' | 'name' | 'username'>,
sender: AtLeast<IUser, '_id' | 'name' | 'username'>,
notificationMessage: string,
userId: string,
): { title: string | undefined; text: string } {
const title = `#${this.roomName(room)}`;
const name = settings.get<boolean>('UI_Use_Real_Name') ? user.name : user.username;
const title = `#${this.roomName(room, userId)}`;
const name = settings.get<boolean>('UI_Use_Real_Name') ? sender.name : sender.username;
const text = `${name}: ${notificationMessage}`;
@ -82,8 +83,8 @@ class RoomCoordinatorServer extends RoomCoordinator {
return Object.keys(this.roomTypes).filter((key) => (this.roomTypes[key].directives as IRoomTypeServerDirectives).includeInDashboard());
}
getRoomName(roomType: string, roomData: IRoom): string {
return this.getRoomDirectives(roomType)?.roomName(roomData) ?? '';
getRoomName(roomType: string, roomData: IRoom, userId?: string): string {
return this.getRoomDirectives(roomType)?.roomName(roomData, userId) ?? '';
}
setRoomFind(roomType: string, roomFind: Required<Pick<IRoomTypeServerDirectives, 'roomFind'>>['roomFind']): void {

@ -2,18 +2,25 @@ import { Meteor } from 'meteor/meteor';
import { settings } from '../../../../app/settings/server';
import type { IRoom } from '../../../../definition/IRoom';
import type { IUser } from '../../../../definition/IUser';
import type { IRoomTypeServerDirectives } from '../../../../definition/IRoomTypeConfig';
import { RoomSettingsEnum, RoomMemberActions } from '../../../../definition/IRoomTypeConfig';
import type { AtLeast, ValueOf } from '../../../../definition/utils';
import type { AtLeast } from '../../../../definition/utils';
import { getDirectMessageRoomType } from '../../../../lib/rooms/roomTypes/direct';
import { roomCoordinator } from '../roomCoordinator';
import { Subscriptions } from '../../../../app/models/server';
export const DirectMessageRoomType = getDirectMessageRoomType(roomCoordinator);
const getCurrentUserId = (): string | undefined => {
try {
return Meteor.userId() || undefined;
} catch (_e) {
//
}
};
roomCoordinator.add(DirectMessageRoomType, {
allowRoomSettingChange(_room: IRoom, setting: ValueOf<typeof RoomSettingsEnum>): boolean {
allowRoomSettingChange(_room, setting) {
switch (setting) {
case RoomSettingsEnum.TYPE:
case RoomSettingsEnum.NAME:
@ -31,7 +38,7 @@ roomCoordinator.add(DirectMessageRoomType, {
}
},
allowMemberAction(room: IRoom, action: ValueOf<typeof RoomMemberActions>): boolean {
allowMemberAction(room: IRoom, action) {
switch (action) {
case RoomMemberActions.BLOCK:
return !this.isGroupChat(room);
@ -40,7 +47,7 @@ roomCoordinator.add(DirectMessageRoomType, {
}
},
roomName(room: IRoom): string | undefined {
roomName(room, userId?) {
const subscription = ((): { fname?: string; name?: string } | undefined => {
if (room.fname || room.name) {
return {
@ -53,7 +60,13 @@ roomCoordinator.add(DirectMessageRoomType, {
return undefined;
}
return Subscriptions.findOneByRoomIdAndUserId(room._id, Meteor.userId());
const uid = userId || getCurrentUserId();
if (uid) {
return Subscriptions.findOneByRoomIdAndUserId(room._id, uid, { fields: { name: 1, fname: 1 } });
}
// If we don't know what user is requesting the roomName, then any subscription will do
return Subscriptions.findOne({ rid: room._id }, { fields: { name: 1, fname: 1 } });
})();
if (!subscription) {
@ -67,31 +80,27 @@ roomCoordinator.add(DirectMessageRoomType, {
return subscription.name;
},
isGroupChat(room: IRoom): boolean {
isGroupChat(room) {
return (room?.uids?.length || 0) > 2;
},
getNotificationDetails(
room: IRoom,
user: AtLeast<IUser, '_id' | 'name' | 'username'>,
notificationMessage: string,
): { title: string | undefined; text: string } {
getNotificationDetails(room, sender, notificationMessage, userId) {
const useRealName = settings.get<boolean>('UI_Use_Real_Name');
if (!this.isGroupChat(room)) {
if (this.isGroupChat(room)) {
return {
title: this.roomName(room),
text: `${(useRealName && user.name) || user.username}: ${notificationMessage}`,
title: this.roomName(room, userId),
text: `${(useRealName && sender.name) || sender.username}: ${notificationMessage}`,
};
}
return {
title: (useRealName && user.name) || user.username,
title: (useRealName && sender.name) || sender.username,
text: notificationMessage,
};
},
includeInDashboard(): boolean {
includeInDashboard() {
return true;
},
} as AtLeast<IRoomTypeServerDirectives, 'isGroupChat' | 'roomName'>);

@ -1,5 +1,4 @@
import { LivechatRooms, LivechatVisitors } from '../../../../app/models/server';
import type { IRoom } from '../../../../definition/IRoom';
import { RoomSettingsEnum, RoomMemberActions } from '../../../../definition/IRoomTypeConfig';
import type { IRoomTypeServerDirectives } from '../../../../definition/IRoomTypeConfig';
import type { AtLeast, ValueOf } from '../../../../definition/utils';
@ -9,7 +8,7 @@ import { roomCoordinator } from '../roomCoordinator';
export const LivechatRoomType = getLivechatRoomType(roomCoordinator);
roomCoordinator.add(LivechatRoomType, {
allowRoomSettingChange(_room, setting: ValueOf<typeof RoomSettingsEnum>): boolean {
allowRoomSettingChange(_room, setting) {
switch (setting) {
case RoomSettingsEnum.JOIN_CODE:
return false;
@ -18,20 +17,20 @@ roomCoordinator.add(LivechatRoomType, {
}
},
allowMemberAction(_room, action: ValueOf<typeof RoomMemberActions>): boolean {
allowMemberAction(_room, action) {
return ([RoomMemberActions.INVITE, RoomMemberActions.JOIN] as Array<ValueOf<typeof RoomMemberActions>>).includes(action);
},
roomName(room: any): string | undefined {
return room.name || room.fname || room.label;
roomName(room, _userId?) {
return room.name || room.fname || (room as any).label;
},
canAccessUploadedFile({ rc_token: token, rc_rid: rid }): boolean {
canAccessUploadedFile({ rc_token: token, rc_rid: rid }) {
return token && rid && LivechatRooms.findOneOpenByRoomIdAndVisitorToken(rid, token);
},
getNotificationDetails(room: IRoom, _user, notificationMessage: string) {
const title = `[Omnichannel] ${this.roomName(room)}`;
getNotificationDetails(room, _sender, notificationMessage, userId) {
const title = `[Omnichannel] ${this.roomName(room, userId)}`;
const text = notificationMessage;
return { title, text };
@ -41,8 +40,8 @@ roomCoordinator.add(LivechatRoomType, {
return LivechatVisitors.findOneById(senderId);
},
getReadReceiptsExtraData(message: any) {
const { token } = message;
getReadReceiptsExtraData(message) {
const { token } = message as any;
return { token };
},
} as AtLeast<IRoomTypeServerDirectives, 'roomName'>);

@ -1,14 +1,12 @@
import { settings } from '../../../../app/settings/server';
import type { IRoom } from '../../../../definition/IRoom';
import { RoomSettingsEnum, RoomMemberActions } from '../../../../definition/IRoomTypeConfig';
import type { ValueOf } from '../../../../definition/utils';
import { getPrivateRoomType } from '../../../../lib/rooms/roomTypes/private';
import { roomCoordinator } from '../roomCoordinator';
export const PrivateRoomType = getPrivateRoomType(roomCoordinator);
roomCoordinator.add(PrivateRoomType, {
allowRoomSettingChange(room: IRoom, setting: ValueOf<typeof RoomSettingsEnum>): boolean {
allowRoomSettingChange(room, setting) {
switch (setting) {
case RoomSettingsEnum.JOIN_CODE:
return false;
@ -26,7 +24,7 @@ roomCoordinator.add(PrivateRoomType, {
}
},
allowMemberAction(_room: IRoom, action: ValueOf<typeof RoomMemberActions>): boolean {
allowMemberAction(_room, action) {
switch (action) {
case RoomMemberActions.BLOCK:
return false;
@ -35,7 +33,7 @@ roomCoordinator.add(PrivateRoomType, {
}
},
roomName(room: IRoom): string | undefined {
roomName(room, _userId?) {
if (room.prid) {
return room.fname;
}
@ -46,11 +44,11 @@ roomCoordinator.add(PrivateRoomType, {
return room.name;
},
isGroupChat(_room: IRoom): boolean {
isGroupChat(_room) {
return true;
},
includeInDashboard(): boolean {
includeInDashboard() {
return true;
},
});

@ -1,15 +1,14 @@
import { settings } from '../../../../app/settings/server';
import type { IRoom, RoomType } from '../../../../definition/IRoom';
import type { IRoomTypeServerDirectives } from '../../../../definition/IRoomTypeConfig';
import { RoomSettingsEnum, RoomMemberActions } from '../../../../definition/IRoomTypeConfig';
import type { AtLeast, ValueOf } from '../../../../definition/utils';
import type { AtLeast } from '../../../../definition/utils';
import { getPublicRoomType } from '../../../../lib/rooms/roomTypes/public';
import { roomCoordinator } from '../roomCoordinator';
export const PublicRoomType = getPublicRoomType(roomCoordinator);
roomCoordinator.add(PublicRoomType, {
allowRoomSettingChange(room: IRoom, setting: ValueOf<typeof RoomSettingsEnum>): boolean {
allowRoomSettingChange(room, setting) {
switch (setting) {
case RoomSettingsEnum.BROADCAST:
return Boolean(room.broadcast);
@ -25,7 +24,7 @@ roomCoordinator.add(PublicRoomType, {
}
},
allowMemberAction(_room: IRoom, action: ValueOf<typeof RoomMemberActions>): boolean {
allowMemberAction(_room, action) {
switch (action) {
case RoomMemberActions.BLOCK:
return false;
@ -34,7 +33,7 @@ roomCoordinator.add(PublicRoomType, {
}
},
roomName(room: IRoom): string | undefined {
roomName(room, _userId?) {
if (room.prid) {
return room.fname;
}
@ -44,19 +43,19 @@ roomCoordinator.add(PublicRoomType, {
return room.name;
},
isGroupChat(_room: IRoom): boolean {
isGroupChat(_room) {
return true;
},
includeInDashboard(): boolean {
includeInDashboard() {
return true;
},
getDiscussionType(): RoomType {
getDiscussionType() {
return 'c';
},
includeInRoomSearch(): boolean {
includeInRoomSearch() {
return true;
},
} as AtLeast<IRoomTypeServerDirectives, 'isGroupChat' | 'roomName'>);

@ -1,6 +1,5 @@
import { Users } from '../../../../app/models/server';
import type { IRoomTypeServerDirectives } from '../../../../definition/IRoomTypeConfig';
import type { IUser } from '../../../../definition/IUser';
import type { AtLeast } from '../../../../definition/utils';
import { getVoipRoomType } from '../../../../lib/rooms/roomTypes/voip';
import { roomCoordinator } from '../roomCoordinator';
@ -8,18 +7,18 @@ import { roomCoordinator } from '../roomCoordinator';
export const VoipRoomType = getVoipRoomType(roomCoordinator);
roomCoordinator.add(VoipRoomType, {
roomName(room: any): string | undefined {
return room.name || room.fname || room.label;
roomName(room, _userId?) {
return room.name || room.fname || (room as any).label;
},
getNotificationDetails(room, _user, notificationMessage: string) {
const title = `[Omnichannel] ${this.roomName(room)}`;
getNotificationDetails(room, _sender, notificationMessage, userId) {
const title = `[Omnichannel] ${this.roomName(room, userId)}`;
const text = notificationMessage;
return { title, text };
},
getMsgSender(senderId: string): IUser {
getMsgSender(senderId) {
return Users.findOneById(senderId);
},
} as AtLeast<IRoomTypeServerDirectives, 'roomName'>);

@ -1,4 +1,5 @@
import { Meteor } from 'meteor/meteor';
import { Cookies } from 'meteor/ostrio:cookies';
import { renderSVGLetters, serveAvatar, wasFallbackModified, setCacheAndDispositionHeaders } from './utils';
import { FileUpload } from '../../../app/file-upload';
@ -6,6 +7,7 @@ import { Rooms } from '../../../app/models/server';
import { Avatars } from '../../../app/models/server/raw';
import { roomCoordinator } from '../../lib/rooms/roomCoordinator';
const cookie = new Cookies();
const getRoomAvatar = async (roomId) => {
const room = Rooms.findOneById(roomId, { fields: { t: 1, prid: 1, name: 1, fname: 1 } });
if (!room) {
@ -32,6 +34,8 @@ export const roomAvatar = Meteor.bindEnvironment(async function (req, res /* , n
return;
}
const uid = req.headers.cookie && cookie.get('rc_uid', req.headers.cookie);
const reqModifiedHeader = req.headers['if-modified-since'];
if (file) {
res.setHeader('Content-Security-Policy', "default-src 'none'");
@ -52,7 +56,7 @@ export const roomAvatar = Meteor.bindEnvironment(async function (req, res /* , n
return FileUpload.get(file, req, res);
}
const roomName = roomCoordinator.getRoomDirectives(room.t)?.roomName(room);
const roomName = roomCoordinator.getRoomName(room.t, room, uid);
setCacheAndDispositionHeaders(req, res);

Loading…
Cancel
Save