Skip to content

Commit 8d2ad40

Browse files
chore: Adds deprecation warning on livechat:removeCustomField with new endpoint replacing it (RocketChat#36933)
1 parent 89c1a6a commit 8d2ad40

7 files changed

Lines changed: 86 additions & 32 deletions

File tree

.changeset/cool-pets-switch.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:removeCustomField` with new endpoint replacing it; `livechat/custom-fields.delete`

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

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,16 @@
1-
import { isLivechatCustomFieldsProps, isPOSTLivechatCustomFieldParams, isPOSTLivechatCustomFieldsParams } from '@rocket.chat/rest-typings';
1+
import { LivechatCustomField } from '@rocket.chat/models';
2+
import {
3+
isLivechatCustomFieldsProps,
4+
isPOSTLivechatCustomFieldParams,
5+
isPOSTLivechatCustomFieldsParams,
6+
isPOSTLivechatRemoveCustomFields,
7+
POSTLivechatRemoveCustomFieldSuccess,
8+
validateBadRequestErrorResponse,
9+
validateUnauthorizedErrorResponse,
10+
} from '@rocket.chat/rest-typings';
211

312
import { API } from '../../../../api/server';
13+
import type { ExtractRoutesFromAPI } from '../../../../api/server/ApiClass';
414
import { getPaginationItems } from '../../../../api/server/helpers/getPaginationItems';
515
import { setCustomFields, setMultipleCustomFields } from '../../lib/custom-fields';
616
import { findLivechatCustomFields, findCustomFieldById } from '../lib/customFields';
@@ -80,3 +90,34 @@ API.v1.addRoute(
8090
},
8191
},
8292
);
93+
94+
const livechatCustomFieldsEndpoints = API.v1.post(
95+
'livechat/custom-fields.delete',
96+
{
97+
response: {
98+
200: POSTLivechatRemoveCustomFieldSuccess,
99+
400: validateBadRequestErrorResponse,
100+
401: validateUnauthorizedErrorResponse,
101+
},
102+
authRequired: true,
103+
permissionsRequired: ['view-livechat-manager'], // is this permission appropriate for the targeted action?
104+
body: isPOSTLivechatRemoveCustomFields,
105+
},
106+
async function action() {
107+
const { customFieldId } = this.bodyParams;
108+
109+
const result = await LivechatCustomField.removeById(customFieldId);
110+
if (result.deletedCount === 0) {
111+
return API.v1.failure('Custom field not found');
112+
}
113+
114+
return API.v1.success();
115+
},
116+
);
117+
118+
type LivechatCustomFieldsEndpoints = ExtractRoutesFromAPI<typeof livechatCustomFieldsEndpoints>;
119+
120+
declare module '@rocket.chat/rest-typings' {
121+
// eslint-disable-next-line @typescript-eslint/naming-convention, @typescript-eslint/no-empty-interface
122+
interface Endpoints extends LivechatCustomFieldsEndpoints {}
123+
}

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

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

77
import { hasPermissionAsync } from '../../../authorization/server/functions/hasPermission';
8+
import { methodDeprecationLogger } from '../../../lib/server/lib/deprecationWarningLogger';
89

910
declare module '@rocket.chat/ddp-client' {
1011
// eslint-disable-next-line @typescript-eslint/naming-convention
@@ -15,6 +16,7 @@ declare module '@rocket.chat/ddp-client' {
1516

1617
Meteor.methods<ServerMethods>({
1718
async 'livechat:removeCustomField'(_id) {
19+
methodDeprecationLogger.method('livechat:removeCustomField', '8.0.0', '/v1/livechat/custom-fields.delete');
1820
const uid = Meteor.userId();
1921
if (!uid || !(await hasPermissionAsync(uid, 'view-livechat-manager'))) {
2022
throw new Meteor.Error('error-not-allowed', 'Not allowed', {

apps/meteor/client/views/omnichannel/customFields/useRemoveCustomField.tsx

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

77
export const useRemoveCustomField = () => {
88
const { t } = useTranslation();
99
const setModal = useSetModal();
1010
const dispatchToastMessage = useToastMessageDispatch();
11-
const removeCustomField = useMethod('livechat:removeCustomField');
11+
const removeCustomField = useEndpoint('POST', '/v1/livechat/custom-fields.delete');
1212
const queryClient = useQueryClient();
1313

1414
const handleDelete = useEffectEvent((id: string) => {
1515
const onDeleteAgent = async () => {
1616
try {
17-
await removeCustomField(id);
17+
await removeCustomField({ customFieldId: id });
1818
dispatchToastMessage({ type: 'success', message: t('Custom_Field_Removed') });
1919
queryClient.invalidateQueries({
2020
queryKey: ['livechat-customFields'],

apps/meteor/tests/data/livechat/custom-fields.ts

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -42,16 +42,11 @@ export const createCustomField = (customField: ExtendedCustomField): Promise<Ext
4242
export const deleteCustomField = (customFieldID: string) =>
4343
new Promise((resolve, reject) => {
4444
void request
45-
.post(methodCall('livechat:removeCustomField'))
45+
.post(api('livechat/custom-fields.delete'))
46+
.set(credentials)
4647
.send({
47-
message: JSON.stringify({
48-
method: 'livechat:removeCustomField',
49-
params: [customFieldID],
50-
id: 'id',
51-
msg: 'method',
52-
}),
48+
customFieldId: customFieldID,
5349
})
54-
.set(credentials)
5550
.end((err: Error, res: Response): void => {
5651
if (err) {
5752
return reject(err);

apps/meteor/tests/e2e/omnichannel/omnichannel-contact-center.spec.ts

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import { faker } from '@faker-js/faker';
22

33
import { createToken } from '../../../client/lib/utils/createToken';
4-
import { IS_EE } from '../config/constants';
54
import { Users } from '../fixtures/userStates';
65
import { OmnichannelContacts } from '../page-objects/omnichannel-contacts-list';
76
import { OmnichannelSection } from '../page-objects/omnichannel-section';
@@ -32,17 +31,6 @@ const DELETE_CONTACT = {
3231
phones: [faker.phone.number('+############')],
3332
};
3433

35-
const NEW_CUSTOM_FIELD = {
36-
searchable: true,
37-
field: 'hiddenCustomField',
38-
label: 'hiddenCustomField',
39-
defaultValue: 'test_contact_center_hidden_customField',
40-
scope: 'visitor',
41-
visibility: 'hidden',
42-
required: true,
43-
regexp: '',
44-
};
45-
4634
const URL = {
4735
contactCenter: '/omnichannel-directory/contacts',
4836
newContact: '/omnichannel-directory/contacts/new',
@@ -72,19 +60,11 @@ test.describe('Omnichannel Contact Center', () => {
7260
test.beforeAll(async ({ api }) => {
7361
// Add contacts
7462
await Promise.all([api.post('/omnichannel/contacts', EXISTING_CONTACT), api.post('/omnichannel/contacts', DELETE_CONTACT)]);
75-
76-
if (IS_EE) {
77-
await api.post('/livechat/custom.field', NEW_CUSTOM_FIELD);
78-
}
7963
});
8064

8165
test.afterAll(async ({ api }) => {
8266
// Remove added contacts
8367
await Promise.all([api.delete(`/livechat/visitor/${NEW_CONTACT.token}`), api.delete(`/livechat/visitor/${EXISTING_CONTACT.token}`)]);
84-
85-
if (IS_EE) {
86-
await api.post('method.call/livechat:removeCustomField', { message: NEW_CUSTOM_FIELD.field });
87-
}
8868
});
8969

9070
test.beforeEach(async ({ page }) => {

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

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3989,6 +3989,36 @@ export const isPOSTLivechatRoomsCloseAllSuccessResponse = ajv.compile<{ removedR
39893989
POSTLivechatRoomsCloseAllSuccessResponseSchema,
39903990
);
39913991

3992+
type POSTLivechatRemoveCustomFields = {
3993+
customFieldId: string;
3994+
};
3995+
3996+
const POSTLivechatRemoveCustomFieldsSchema = {
3997+
type: 'object',
3998+
properties: {
3999+
customFieldId: {
4000+
type: 'string',
4001+
},
4002+
},
4003+
required: ['customFieldId'],
4004+
additionalProperties: false,
4005+
};
4006+
4007+
export const isPOSTLivechatRemoveCustomFields = ajv.compile<POSTLivechatRemoveCustomFields>(POSTLivechatRemoveCustomFieldsSchema);
4008+
4009+
const POSTLivechatRemoveCustomFieldSuccessSchema = {
4010+
type: 'object',
4011+
properties: {
4012+
success: {
4013+
type: 'boolean',
4014+
enum: [true],
4015+
},
4016+
},
4017+
additionalProperties: false,
4018+
};
4019+
4020+
export const POSTLivechatRemoveCustomFieldSuccess = ajv.compile<void>(POSTLivechatRemoveCustomFieldSuccessSchema);
4021+
39924022
export type ILivechatContactWithManagerData = Omit<ILivechatContact, 'contactManager'> & {
39934023
contactManager?: Pick<IUser, '_id' | 'name' | 'username'>;
39944024
};

0 commit comments

Comments
 (0)