Skip to content

Commit 276c270

Browse files
chore: Adds deprecation warning on livechat:removeAllClosedRooms with new endpoint replacing it (RocketChat#36921)
1 parent ab7d810 commit 276c270

6 files changed

Lines changed: 103 additions & 8 deletions

File tree

.changeset/ninety-rocks-hope.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
"@rocket.chat/meteor": patch
3+
"@rocket.chat/rest-typings": patch
4+
---
5+
6+
Adds deprecation warning on `livechat:removeAllClosedRooms` with new endpoint replacing it; `livechat/rooms.removeAllClosedRooms`

apps/meteor/app/livechat/server/api/v1/room.ts

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
11
import { Omnichannel } from '@rocket.chat/core-services';
2-
import type { ILivechatAgent, IOmnichannelInquiryExtraData, IUser, SelectedAgent, TransferByData } from '@rocket.chat/core-typings';
2+
import type {
3+
ILivechatAgent,
4+
IOmnichannelInquiryExtraData,
5+
IOmnichannelRoom,
6+
IUser,
7+
SelectedAgent,
8+
TransferByData,
9+
} from '@rocket.chat/core-typings';
310
import { isOmnichannelRoom, OmnichannelSourceType } from '@rocket.chat/core-typings';
411
import { LivechatVisitors, Users, LivechatRooms, Messages } from '@rocket.chat/models';
512
import {
@@ -10,12 +17,15 @@ import {
1017
isLiveChatRoomJoinProps,
1118
isLiveChatRoomSaveInfoProps,
1219
isPOSTLivechatRoomCloseByUserParams,
20+
isPOSTLivechatRoomsCloseAll,
21+
isPOSTLivechatRoomsCloseAllSuccessResponse,
1322
} from '@rocket.chat/rest-typings';
1423
import { check } from 'meteor/check';
1524

1625
import { callbacks } from '../../../../../lib/callbacks';
1726
import { i18n } from '../../../../../server/lib/i18n';
1827
import { API } from '../../../../api/server';
28+
import type { ExtractRoutesFromAPI } from '../../../../api/server/ApiClass';
1929
import { isWidget } from '../../../../api/server/helpers/isWidget';
2030
import { canAccessRoomAsync } from '../../../../authorization/server';
2131
import { hasPermissionAsync } from '../../../../authorization/server/functions/hasPermission';
@@ -27,7 +37,7 @@ import { closeRoom } from '../../lib/closeRoom';
2737
import { saveGuest } from '../../lib/guests';
2838
import type { CloseRoomParams } from '../../lib/localTypes';
2939
import { livechatLogger } from '../../lib/logger';
30-
import { createRoom, saveRoomInfo } from '../../lib/rooms';
40+
import { createRoom, removeOmnichannelRoom, saveRoomInfo } from '../../lib/rooms';
3141
import { transfer } from '../../lib/transfer';
3242
import { findGuest, findRoom, settings, findAgent, onCheckRoomParams } from '../lib/livechat';
3343

@@ -427,3 +437,37 @@ API.v1.addRoute(
427437
},
428438
},
429439
);
440+
441+
const livechatRoomsEndpoints = API.v1.post(
442+
'livechat/rooms.removeAllClosedRooms',
443+
{
444+
response: {
445+
200: isPOSTLivechatRoomsCloseAllSuccessResponse,
446+
},
447+
authRequired: true,
448+
permissionsRequired: ['remove-closed-livechat-rooms'],
449+
body: isPOSTLivechatRoomsCloseAll,
450+
},
451+
async function action() {
452+
livechatLogger.info(`User ${this.userId} is removing all closed rooms`);
453+
454+
const params = this.bodyParams;
455+
456+
const extraQuery = await callbacks.run('livechat.applyRoomRestrictions', {}, { userId: this.userId });
457+
const promises: Promise<void>[] = [];
458+
await LivechatRooms.findClosedRooms(params?.departmentIds, {}, extraQuery).forEach(({ _id }: IOmnichannelRoom) => {
459+
promises.push(removeOmnichannelRoom(_id));
460+
});
461+
await Promise.all(promises);
462+
463+
livechatLogger.info(`User ${this.userId} removed ${promises.length} closed rooms`);
464+
return API.v1.success({ removedRooms: promises.length });
465+
},
466+
);
467+
468+
type LivechatRoomsEndpoints = ExtractRoutesFromAPI<typeof livechatRoomsEndpoints>;
469+
470+
declare module '@rocket.chat/rest-typings' {
471+
// eslint-disable-next-line @typescript-eslint/naming-convention, @typescript-eslint/no-empty-interface
472+
interface Endpoints extends LivechatRoomsEndpoints {}
473+
}

apps/meteor/app/livechat/server/methods/removeAllClosedRooms.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { Meteor } from 'meteor/meteor';
66

77
import { callbacks } from '../../../../lib/callbacks';
88
import { hasPermissionAsync } from '../../../authorization/server/functions/hasPermission';
9+
import { methodDeprecationLogger } from '../../../lib/server/lib/deprecationWarningLogger';
910
import { removeOmnichannelRoom } from '../lib/rooms';
1011

1112
declare module '@rocket.chat/ddp-client' {
@@ -17,6 +18,7 @@ declare module '@rocket.chat/ddp-client' {
1718

1819
Meteor.methods<ServerMethods>({
1920
async 'livechat:removeAllClosedRooms'(departmentIds) {
21+
methodDeprecationLogger.method('livechat:removeAllClosedRooms', '8.0.0', '/v1/livechat/rooms.removeAllClosedRooms');
2022
const logger = new Logger('livechat:removeAllClosedRooms');
2123
const user = Meteor.userId();
2224

apps/meteor/client/views/omnichannel/currentChats/FilterByText.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { TextInput, Box, Select, InputBox } from '@rocket.chat/fuselage';
22
import { useEffectEvent, useLocalStorage } from '@rocket.chat/fuselage-hooks';
33
import { GenericModal } from '@rocket.chat/ui-client';
4-
import { useSetModal, useToastMessageDispatch, useMethod } from '@rocket.chat/ui-contexts';
4+
import { useSetModal, useToastMessageDispatch, useEndpoint } from '@rocket.chat/ui-contexts';
55
import moment from 'moment';
66
import type { Dispatch, FormEvent, Key, SetStateAction } from 'react';
77
import { useEffect } from 'react';
@@ -81,12 +81,12 @@ const FilterByText = ({ setFilter, reload, customFields, setCustomFields, hasCus
8181
reset();
8282
});
8383

84-
const removeClosedChats = useMethod('livechat:removeAllClosedRooms');
84+
const removeClosedRooms = useEndpoint('POST', '/v1/livechat/rooms.removeAllClosedRooms');
8585

8686
const handleRemoveClosed = useEffectEvent(async () => {
8787
const onDeleteAll = async (): Promise<void> => {
8888
try {
89-
await removeClosedChats();
89+
await removeClosedRooms();
9090
reload?.();
9191
dispatchToastMessage({ type: 'success', message: t('Chat_removed') });
9292
} catch (error) {

apps/meteor/client/views/omnichannel/directory/chats/ChatsTable/ChatsTableFilter.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { Box, Button, Chip } from '@rocket.chat/fuselage';
22
import { useEffectEvent } from '@rocket.chat/fuselage-hooks';
33
import { GenericMenu, GenericModal } from '@rocket.chat/ui-client';
4-
import { useMethod, useRoute, useSetModal, useToastMessageDispatch } from '@rocket.chat/ui-contexts';
4+
import { useEndpoint, useRoute, useSetModal, useToastMessageDispatch } from '@rocket.chat/ui-contexts';
55
import { useQueryClient } from '@tanstack/react-query';
66
import { useTranslation } from 'react-i18next';
77

@@ -13,15 +13,15 @@ const ChatsTableFilter = () => {
1313
const setModal = useSetModal();
1414
const dispatchToastMessage = useToastMessageDispatch();
1515
const directoryRoute = useRoute('omnichannel-directory');
16-
const removeClosedChats = useMethod('livechat:removeAllClosedRooms');
1716
const queryClient = useQueryClient();
17+
const removeClosedRooms = useEndpoint('POST', '/v1/livechat/rooms.removeAllClosedRooms');
1818

1919
const { filtersQuery, displayFilters, setFiltersQuery, removeFilter, textInputRef } = useChatsContext();
2020

2121
const handleRemoveAllClosed = useEffectEvent(async () => {
2222
const onDeleteAll = async () => {
2323
try {
24-
await removeClosedChats();
24+
await removeClosedRooms();
2525
queryClient.invalidateQueries({ queryKey: ['current-chats'] });
2626
dispatchToastMessage({ type: 'success', message: t('Chat_removed') });
2727
} catch (error) {

packages/rest-typings/src/v1/omnichannel.ts

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3946,6 +3946,49 @@ const LivechatTriggerWebhookCallParamsSchema = {
39463946

39473947
export const isLivechatTriggerWebhookCallParams = ajv.compile<LivechatTriggerWebhookCallParams>(LivechatTriggerWebhookCallParamsSchema);
39483948

3949+
type POSTLivechatRoomsCloseAll =
3950+
| {
3951+
departmentIds?: string[];
3952+
}
3953+
| undefined;
3954+
3955+
const POSTLivechatRoomsCloseAllSchema = {
3956+
type: 'object',
3957+
properties: {
3958+
departmentIds: {
3959+
type: 'array',
3960+
items: {
3961+
type: 'string',
3962+
},
3963+
nullable: true,
3964+
},
3965+
},
3966+
required: [],
3967+
nullable: true,
3968+
additionalProperties: false,
3969+
};
3970+
3971+
export const isPOSTLivechatRoomsCloseAll = ajv.compile<POSTLivechatRoomsCloseAll>(POSTLivechatRoomsCloseAllSchema);
3972+
3973+
const POSTLivechatRoomsCloseAllSuccessResponseSchema = {
3974+
type: 'object',
3975+
properties: {
3976+
removedRooms: {
3977+
type: 'number',
3978+
},
3979+
success: {
3980+
type: 'boolean',
3981+
enum: [true],
3982+
},
3983+
},
3984+
required: ['removedRooms'],
3985+
additionalProperties: false,
3986+
};
3987+
3988+
export const isPOSTLivechatRoomsCloseAllSuccessResponse = ajv.compile<{ removedRooms: number }>(
3989+
POSTLivechatRoomsCloseAllSuccessResponseSchema,
3990+
);
3991+
39493992
export type ILivechatContactWithManagerData = Omit<ILivechatContact, 'contactManager'> & {
39503993
contactManager?: Pick<IUser, '_id' | 'name' | 'username'>;
39513994
};

0 commit comments

Comments
 (0)