diff --git a/apps/meteor/app/livechat/server/api/lib/livechat.ts b/apps/meteor/app/livechat/server/api/lib/livechat.ts index 789455d6723f2..5228c2ca53bd9 100644 --- a/apps/meteor/app/livechat/server/api/lib/livechat.ts +++ b/apps/meteor/app/livechat/server/api/lib/livechat.ts @@ -209,7 +209,7 @@ export async function settings({ businessUnit = '' }: { businessUnit?: string } }; } -export async function getExtraConfigInfo(room: IOmnichannelRoom): Promise { +export async function getExtraConfigInfo(room?: IOmnichannelRoom): Promise { return callbacks.run('livechat.onLoadConfigApi', { room }); } diff --git a/apps/meteor/app/livechat/server/api/v1/config.ts b/apps/meteor/app/livechat/server/api/v1/config.ts index 13c6b0be8f725..9cba2db92368b 100644 --- a/apps/meteor/app/livechat/server/api/v1/config.ts +++ b/apps/meteor/app/livechat/server/api/v1/config.ts @@ -23,12 +23,12 @@ API.v1.addRoute( const config = await cachedSettings({ businessUnit }); const status = Livechat.online(department); - const guest = token && (await Livechat.findGuest(token)); + const guest = token ? await Livechat.findGuest(token) : null; - const room = guest && findOpenRoom(token); + const room = guest ? findOpenRoom(guest.token) : undefined; const agent = guest && room && room.servedBy && findAgent(room.servedBy._id); - const extra = room && (await getExtraConfigInfo(room)); + const extra = await getExtraConfigInfo(room); return API.v1.success({ config: { ...config, online: status, ...extra, ...(guest && { guest }), ...(room && { room }), ...(agent && { agent }) }, }); diff --git a/apps/meteor/tests/data/livechat/custom-fields.ts b/apps/meteor/tests/data/livechat/custom-fields.ts index 2bbb6c732881a..f41fcf41115f3 100644 --- a/apps/meteor/tests/data/livechat/custom-fields.ts +++ b/apps/meteor/tests/data/livechat/custom-fields.ts @@ -2,36 +2,37 @@ import type { Response } from 'supertest'; import type { ILivechatCustomField } from '@rocket.chat/core-typings'; import { credentials, request, methodCall, api } from './../api-data'; -export const createCustomField = (customField: ILivechatCustomField) => new Promise((resolve, reject) => { +type ExtendedCustomField = Omit & { field: string }; + +export const createCustomField = (customField: ExtendedCustomField): Promise => new Promise((resolve, reject) => { request - .get(api('livechat/custom-fields/'+customField.label)) + .get(api(`livechat/custom-fields/${customField.label}`)) .set(credentials) .send() - .end((err: Error, res:Response) => { + .end((err: Error, res: Response) => { if (err) { - reject(err); + return reject(err); + } + if (res.body.customField != null && res.body.customField != undefined) { + resolve(res.body.customField); } else { - if (res.body.customField != null && res.body.customField != undefined) { - resolve(res.body.customField); - }else{ - request - .post(methodCall('livechat:saveCustomField')) - .send({ - message: JSON.stringify({ - method: 'livechat:saveCustomField', - params: [null,customField], - id: 'id', - msg: 'method', - }), - }) - .set(credentials) - .end((err: Error, res: Response): void => { - if (err) { - return reject(err); - } - resolve(res.body); - }); - } + request + .post(methodCall('livechat:saveCustomField')) + .send({ + message: JSON.stringify({ + method: 'livechat:saveCustomField', + params: [null, customField], + id: 'id', + msg: 'method', + }), + }) + .set(credentials) + .end((err: Error, res: Response): void => { + if (err) { + return reject(err); + } + resolve(res.body); + }); } }); @@ -39,8 +40,15 @@ export const createCustomField = (customField: ILivechatCustomField) => new Prom export const deleteCustomField = (customFieldID: string) => new Promise((resolve, reject) => { request - .post(methodCall('livechat:saveCustomField')) - .send(customFieldID) + .post(methodCall('livechat:removeCustomField')) + .send({ + message: JSON.stringify({ + method: 'livechat:removeCustomField', + params: [customFieldID], + id: 'id', + msg: 'method', + }), + }) .set(credentials) .end((err: Error, res: Response): void => { if (err) { diff --git a/apps/meteor/tests/end-to-end/api/livechat/00-rooms.ts b/apps/meteor/tests/end-to-end/api/livechat/00-rooms.ts index fb511c3e64fed..138129384051b 100644 --- a/apps/meteor/tests/end-to-end/api/livechat/00-rooms.ts +++ b/apps/meteor/tests/end-to-end/api/livechat/00-rooms.ts @@ -4,14 +4,7 @@ import fs from 'fs'; import path from 'path'; import { expect } from 'chai'; -import type { - IOmnichannelRoom, - ILivechatVisitor, - IUser, - IOmnichannelSystemMessage, - ILivechatCustomField, - ILivechatPriority, -} from '@rocket.chat/core-typings'; +import type { IOmnichannelRoom, ILivechatVisitor, IUser, IOmnichannelSystemMessage, ILivechatPriority } from '@rocket.chat/core-typings'; import { LivechatPriorityWeight } from '@rocket.chat/core-typings'; import type { Response } from 'supertest'; import faker from '@faker-js/faker'; @@ -1359,7 +1352,7 @@ describe('LIVECHAT - rooms', function () { scope: 'room', visibility: 'visible', regexp: '', - } as unknown as ILivechatCustomField & { field: string }); + }); const newVisitor = await createVisitor(); const newRoom = await createLivechatRoom(newVisitor.token); diff --git a/apps/meteor/tests/end-to-end/api/livechat/03-custom-fields.ts b/apps/meteor/tests/end-to-end/api/livechat/03-custom-fields.ts index 8681d04d88ca6..6e81751538db6 100644 --- a/apps/meteor/tests/end-to-end/api/livechat/03-custom-fields.ts +++ b/apps/meteor/tests/end-to-end/api/livechat/03-custom-fields.ts @@ -1,6 +1,5 @@ /* eslint-env mocha */ -import type { ILivechatCustomField } from '@rocket.chat/core-typings'; import { expect } from 'chai'; import type { Response } from 'supertest'; @@ -117,7 +116,7 @@ describe('LIVECHAT - custom fields', function () { scope: 'visitor', visibility: 'public', regexp: '', - } as unknown as ILivechatCustomField & { field: string }); + }); const { body } = await request .post(api('livechat/custom.field')) @@ -176,7 +175,7 @@ describe('LIVECHAT - custom fields', function () { scope: 'visitor', visibility: 'public', regexp: '', - } as unknown as ILivechatCustomField & { field: string }); + }); const { body } = await request .post(api('livechat/custom.fields')) diff --git a/apps/meteor/tests/end-to-end/api/livechat/09-visitors.ts b/apps/meteor/tests/end-to-end/api/livechat/09-visitors.ts index cc32e2c3b7868..e91e9140d051a 100644 --- a/apps/meteor/tests/end-to-end/api/livechat/09-visitors.ts +++ b/apps/meteor/tests/end-to-end/api/livechat/09-visitors.ts @@ -1,7 +1,7 @@ /* eslint-env mocha */ import { expect } from 'chai'; -import type { ILivechatAgent, ILivechatCustomField, ILivechatVisitor, IOmnichannelRoom } from '@rocket.chat/core-typings'; +import type { ILivechatAgent, ILivechatVisitor, IOmnichannelRoom } from '@rocket.chat/core-typings'; import type { Response } from 'supertest'; import { getCredentials, api, request, credentials } from '../../../data/api-data'; @@ -69,7 +69,7 @@ describe('LIVECHAT - visitors', function () { scope: 'visitor', visibility: 'public', regexp: '', - } as unknown as ILivechatCustomField & { field: string }); + }); const { body } = await request.post(api('livechat/visitor')).send({ visitor: { token, @@ -693,7 +693,7 @@ describe('LIVECHAT - visitors', function () { scope: 'visitor', visibility: 'public', regexp: '', - } as unknown as ILivechatCustomField & { field: string }) + }) .then((cf) => { if (!cf) { throw new Error('Custom field not created'); diff --git a/apps/meteor/tests/end-to-end/api/livechat/11-livechat.ts b/apps/meteor/tests/end-to-end/api/livechat/11-livechat.ts index f6f059e5b42ec..73b42ba86b6d9 100644 --- a/apps/meteor/tests/end-to-end/api/livechat/11-livechat.ts +++ b/apps/meteor/tests/end-to-end/api/livechat/11-livechat.ts @@ -3,6 +3,7 @@ import { expect } from 'chai'; import { getCredentials, api, request, credentials } from '../../../data/api-data'; +import { createCustomField, deleteCustomField } from '../../../data/livechat/custom-fields'; import { createVisitor, createLivechatRoom } from '../../../data/livechat/rooms'; import { updateSetting } from '../../../data/permissions.helper'; @@ -75,6 +76,32 @@ describe('LIVECHAT - Utils', function () { expect(body.config).to.have.property('settings'); expect(body.config).to.have.property('departments').that.is.an('array'); }); + it('should have custom fields data', async () => { + const customFieldName = `new_custom_field_${Date.now()}`; + await createCustomField({ + searchable: true, + field: customFieldName, + label: customFieldName, + defaultValue: 'test_default_address', + scope: 'visitor', + visibility: 'visible', + regexp: '', + public: true, + required: false, + options: '', + }); + + const { body } = await request.get(api('livechat/config')).set(credentials); + + expect(body).to.have.property('config'); + expect(body.config).to.have.property('customFields').that.is.an('array'); + expect(body.config.customFields).to.have.length.greaterThan(0); + const customField = body.config.customFields.find((field: any) => field._id === customFieldName); + expect(customField).to.be.an('object'); + expect(customField).to.have.property('label', customFieldName); + + await deleteCustomField(customFieldName); + }); }); describe('livechat/page.visited', () => {