[IMPROVE] Add searchTerm support for livechat/rid/messages API (#27214)

pull/26957/head^2
Kevin Aleman 3 years ago committed by GitHub
parent 32a8751d49
commit eb1bd018bf
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 3
      apps/meteor/app/livechat/imports/server/rest/visitors.ts
  2. 3
      apps/meteor/server/models/raw/Messages.ts
  3. 57
      apps/meteor/tests/end-to-end/api/livechat/00-rooms.ts
  4. 2
      packages/model-typings/src/models/IMessagesModel.ts
  5. 6
      packages/rest-typings/src/v1/omnichannel.ts

@ -163,6 +163,7 @@ API.v1.addRoute(
async get() {
const { offset, count } = this.getPaginationItems();
const { sort } = this.parseJsonQuery();
const { searchTerm } = this.requestParams();
const room = LivechatRooms.findOneById(this.urlParams.rid);
@ -174,7 +175,7 @@ API.v1.addRoute(
throw new Error('not-allowed');
}
const { cursor, totalCount } = Messages.findLivechatClosedMessages(this.urlParams.rid, {
const { cursor, totalCount } = Messages.findLivechatClosedMessages(this.urlParams.rid, searchTerm, {
sort: sort || { ts: -1 },
skip: offset,
limit: count,

@ -221,11 +221,12 @@ export class MessagesRaw extends BaseRaw<IMessage> implements IMessagesModel {
return this.col.aggregate(params).toArray();
}
findLivechatClosedMessages(rid: IRoom['_id'], options: FindOptions<IMessage>): FindPaginated<FindCursor<IMessage>> {
findLivechatClosedMessages(rid: IRoom['_id'], searchTerm?: string, options?: FindOptions<IMessage>): FindPaginated<FindCursor<IMessage>> {
return this.findPaginated(
{
rid,
$or: [{ t: { $exists: false } }, { t: 'livechat-close' }],
...(searchTerm && { msg: new RegExp(escapeRegExp(searchTerm), 'ig') }),
},
options,
);

@ -687,6 +687,63 @@ describe('LIVECHAT - rooms', function () {
expect(body.total).to.be.an('number').equal(1);
expect(body.messages[0]).to.have.property('msg', 'Hello');
});
it('should return the messages of the room matching by searchTerm', async () => {
const visitor = await createVisitor();
const room = await createLivechatRoom(visitor.token);
await sendMessage(room._id, 'Hello', visitor.token);
await sendMessage(room._id, 'Random', visitor.token);
const { body } = await request
.get(api(`livechat/${room._id}/messages`))
.query({ searchTerm: 'Ran' })
.set(credentials)
.expect('Content-Type', 'application/json')
.expect(200);
expect(body).to.have.property('success', true);
expect(body).to.have.property('messages');
expect(body.messages).to.be.an('array');
expect(body.total).to.be.an('number').equal(1);
expect(body.messages[0]).to.have.property('msg', 'Random');
});
it('should return the messages of the room matching by partial searchTerm', async () => {
const visitor = await createVisitor();
const room = await createLivechatRoom(visitor.token);
await sendMessage(room._id, 'Hello', visitor.token);
await sendMessage(room._id, 'Random', visitor.token);
const { body } = await request
.get(api(`livechat/${room._id}/messages`))
.query({ searchTerm: 'ndo' })
.set(credentials)
.expect('Content-Type', 'application/json')
.expect(200);
expect(body).to.have.property('success', true);
expect(body).to.have.property('messages');
expect(body.messages).to.be.an('array');
expect(body.total).to.be.an('number').equal(1);
expect(body.messages[0]).to.have.property('msg', 'Random');
});
it('should return everything when searchTerm is ""', async () => {
const visitor = await createVisitor();
const room = await createLivechatRoom(visitor.token);
await sendMessage(room._id, 'Hello', visitor.token);
await sendMessage(room._id, 'Random', visitor.token);
const { body } = await request
.get(api(`livechat/${room._id}/messages`))
.query({ searchTerm: '' })
.set(credentials)
.expect('Content-Type', 'application/json')
.expect(200);
expect(body).to.have.property('success', true);
expect(body).to.have.property('messages');
expect(body.messages).to.be.an('array');
expect(body.messages).to.be.an('array').with.lengthOf.greaterThan(1);
expect(body.messages[0]).to.have.property('msg');
});
});
describe('[GET] livechat/message/:_id', () => {

@ -34,7 +34,7 @@ export interface IMessagesModel extends IBaseModel<IMessage> {
getTotalOfMessagesSentByDate(params: { start: Date; end: Date; options?: any }): Promise<any[]>;
findLivechatClosedMessages(rid: IRoom['_id'], options: FindOptions<IMessage>): FindPaginated<FindCursor<IMessage>>;
findLivechatClosedMessages(rid: IRoom['_id'], searchTerm?: string, options?: FindOptions<IMessage>): FindPaginated<FindCursor<IMessage>>;
countRoomsWithStarredMessages(options: AggregateOptions): Promise<number>;

@ -964,7 +964,7 @@ const LivechatRoomsSchema = {
export const isLivechatRoomsProps = ajv.compile<LivechatRoomsProps>(LivechatRoomsSchema);
type LivechatRidMessagesProps = PaginatedRequest;
type LivechatRidMessagesProps = PaginatedRequest<{ searchTerm?: string }>;
const LivechatRidMessagesSchema = {
type: 'object',
@ -981,6 +981,10 @@ const LivechatRidMessagesSchema = {
type: 'string',
nullable: true,
},
searchTerm: {
type: 'string',
nullable: true,
},
},
required: [],
additionalProperties: false,

Loading…
Cancel
Save