Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion app/livechat/client/index.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import '../lib/messageTypes';
import '../lib/LivechatExternalMessage';
import './roomType';
import './route';
import './ui';
Expand Down
15 changes: 9 additions & 6 deletions app/livechat/client/views/app/tabbar/externalSearch.html
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,16 @@
<div class="title">
<h2>{{_ "Knowledge_Base"}}</h2>
</div>
<div class="external-messages">
<div class="external-messages list-view">
{{#each messages}}
<div class="external-message">
<button class="pick-message"><i class="icon-edit"></i></button>
{{msg}}
</div>
<div class="external-message">
<button class="pick-message"><i class="icon-edit"></i></button>
{{msg}}
</div>
{{/each}}
{{#if hasMore}}
<button class="rc-button rc-button--secondary show-more-users load-more-livechat-external-messages {{#if loadingMore}}loading{{/if}}">{{_ "Show_more"}}</button>
{{/if}}
</div>
</div>
</template>
</template>
44 changes: 37 additions & 7 deletions app/livechat/client/views/app/tabbar/externalSearch.js
Original file line number Diff line number Diff line change
@@ -1,27 +1,57 @@
import { Template } from 'meteor/templating';
import { ReactiveVar } from 'meteor/reactive-var';

import { LivechatExternalMessage } from '../../../../lib/LivechatExternalMessage';
import './externalSearch.html';
import { APIClient } from '../../../../../utils/client';

const MESSAGES_COUNT = 50;

Template.externalSearch.helpers({
messages() {
return LivechatExternalMessage.findByRoomId(this.rid, { ts: 1 });
return Template.instance().externalMessages.get();
},
hasMore() {
const instance = Template.instance();
const externalMessages = instance.externalMessages.get();
return instance.total.get() > externalMessages.length;
},
});

Template.externalSearch.events({
'click button.pick-message'(event, instance) {
event.preventDefault();

$(`#chat-window-${ instance.roomId } .input-message`).val(this.msg).focus();
$(`#chat-window-${ instance.roomId } .js-input-message`).val(this.msg).focus();
},
'click .load-more'(e, t) {
e.preventDefault();
e.stopPropagation();
t.offset.set(t.offset.get() + MESSAGES_COUNT);
},
'click .load-more-livechat-external-messages'(event, instance) {
return instance.offset.set(instance.offset.get() + MESSAGES_COUNT);
},
});

Template.externalSearch.onCreated(function() {
this.roomId = null;
// console.log('externalSearch.this ->',this);
this.autorun(() => {
this.externalMessages = new ReactiveVar([]);
this.offset = new ReactiveVar(0);
this.ready = new ReactiveVar(true);
this.total = new ReactiveVar(0);

this.autorun(async () => {
this.ready.set(false);
const offset = this.offset.get();
this.roomId = Template.currentData().rid;
this.subscribe('livechat:externalMessages', Template.currentData().rid);
if (this.roomId) {
const { messages, total } = await APIClient.v1.get(`livechat/messages.external/${ this.roomId }?count=${ MESSAGES_COUNT }&offset=${ offset }`);
this.total.set(total);
if (offset === 0) {
this.externalMessages.set(messages);
} else {
this.externalMessages.set(this.externalMessages.get().concat(messages));
}
}
this.ready.set(true);
});
});
26 changes: 26 additions & 0 deletions app/livechat/imports/server/rest/messages.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@

import { check } from 'meteor/check';

import { API } from '../../../../api';
import { findExternalMessages } from '../../../server/api/lib/messages';

API.v1.addRoute('livechat/messages.external/:roomId', { authRequired: true }, {
get() {
check(this.urlParams, {
roomId: String,
});
const { offset, count } = this.getPaginationItems();
const { sort } = this.parseJsonQuery();

const departments = Promise.await(findExternalMessages({
roomId: this.urlParams.roomId,
pagination: {
offset,
count,
sort,
},
}));

return API.v1.success(departments);
},
});
22 changes: 0 additions & 22 deletions app/livechat/lib/LivechatExternalMessage.js

This file was deleted.

1 change: 1 addition & 0 deletions app/livechat/server/api.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,5 @@ import '../imports/server/rest/rooms.js';
import '../imports/server/rest/appearance.js';
import '../imports/server/rest/triggers.js';
import '../imports/server/rest/integrations.js';
import '../imports/server/rest/messages.js';
import '../imports/server/rest/visitors.js';
20 changes: 20 additions & 0 deletions app/livechat/server/api/lib/messages.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import { LivechatExternalMessage } from '../../../../models/server/raw';

export async function findExternalMessages({ roomId, pagination: { offset, count, sort } }) {
const cursor = await LivechatExternalMessage.findByRoomId(roomId, {
sort: sort || { ts: -1 },
skip: offset,
limit: count,
});

const total = await cursor.count();

const messages = await cursor.toArray();

return {
messages,
count: messages.length,
offset,
total,
};
}
2 changes: 1 addition & 1 deletion app/livechat/server/hooks/externalMessage.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import _ from 'underscore';
import { settings } from '../../../settings';
import { callbacks } from '../../../callbacks';
import { SystemLogger } from '../../../logger';
import { LivechatExternalMessage } from '../../lib/LivechatExternalMessage';
import { LivechatExternalMessage } from '../../../models/server';
import { normalizeMessageFileUpload } from '../../../utils/server/functions/normalizeMessageFileUpload';

let knowledgeEnabled = false;
Expand Down
1 change: 0 additions & 1 deletion app/livechat/server/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,6 @@ import './methods/saveOfficeHours';
import './methods/sendTranscript';
import './methods/getFirstRoomMessage';
import './methods/getTagsList';
import '../lib/LivechatExternalMessage';
import '../lib/LivechatInquiry';
import './lib/Analytics';
import './lib/QueueManager';
Expand Down
3 changes: 2 additions & 1 deletion app/livechat/server/publications/externalMessages.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import { Meteor } from 'meteor/meteor';

import { LivechatExternalMessage } from '../../lib/LivechatExternalMessage';
import { LivechatExternalMessage } from '../../../models/server';

Meteor.publish('livechat:externalMessages', function(roomId) {
console.warn('The publication "livechat:externalMessages" is deprecated and will be removed after version v3.0.0');
return LivechatExternalMessage.findByRoomId(roomId);
});
2 changes: 2 additions & 0 deletions app/models/server/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ import LivechatTrigger from './models/LivechatTrigger';
import LivechatVisitors from './models/LivechatVisitors';
import LivechatAgentActivity from './models/LivechatAgentActivity';
import ReadReceipts from './models/ReadReceipts';
import LivechatExternalMessage from './models/LivechatExternalMessages';

export { AppsLogsModel } from './models/apps-logs-model';
export { AppsPersistenceModel } from './models/apps-persistence-model';
Expand Down Expand Up @@ -80,4 +81,5 @@ export {
LivechatVisitors,
LivechatAgentActivity,
ReadReceipts,
LivechatExternalMessage,
};
18 changes: 18 additions & 0 deletions app/models/server/models/LivechatExternalMessages.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import { Base } from './_Base';

export class LivechatExternalMessage extends Base {
constructor() {
super('livechat_external_message');

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What about creating an index for the rid field?
It would provide more performance when finding records.


this.tryEnsureIndex({ rid: 1 });
}

// FIND
findByRoomId(roomId, sort = { ts: -1 }) {
const query = { rid: roomId };

return this.find(query, { sort });
}
}

export default new LivechatExternalMessage();
9 changes: 9 additions & 0 deletions app/models/server/raw/LivechatExternalMessages.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import { BaseRaw } from './BaseRaw';

export class LivechatExternalMessageRaw extends BaseRaw {
findByRoomId(roomId, options) {
const query = { rid: roomId };

return this.find(query, options);
}
}
3 changes: 3 additions & 0 deletions app/models/server/raw/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ import LivechatRoomsModel from '../models/LivechatRooms';
import { LivechatRoomsRaw } from './LivechatRooms';
import MessagesModel from '../models/Messages';
import { MessagesRaw } from './Messages';
import LivechatExternalMessagesModel from '../models/LivechatExternalMessages';
import { LivechatExternalMessageRaw } from './LivechatExternalMessages';
import LivechatVisitorsModel from '../models/LivechatVisitors';
import { LivechatVisitorsRaw } from './LivechatVisitors';

Expand All @@ -34,4 +36,5 @@ export const LivechatDepartment = new LivechatDepartmentRaw(LivechatDepartmentMo
export const LivechatDepartmentAgents = new LivechatDepartmentAgentsRaw(LivechatDepartmentAgentsModel.model.rawCollection());
export const LivechatRooms = new LivechatRoomsRaw(LivechatRoomsModel.model.rawCollection());
export const Messages = new MessagesRaw(MessagesModel.model.rawCollection());
export const LivechatExternalMessage = new LivechatExternalMessageRaw(LivechatExternalMessagesModel.model.rawCollection());
export const LivechatVisitors = new LivechatVisitorsRaw(LivechatVisitorsModel.model.rawCollection());
29 changes: 29 additions & 0 deletions tests/end-to-end/api/livechat/messages.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import { getCredentials, api, request, credentials } from '../../../data/api-data.js';
import { updateSetting } from '../../../data/permissions.helper';

describe('LIVECHAT - messages', function() {
this.retries(0);

before((done) => getCredentials(done));

before((done) => {
updateSetting('Livechat_enabled', true).then(done);
});

describe('livechat/messages.external', () => {
it('should return an array of messages', (done) => {
request.get(api('livechat/messages.external/roomId'))
.set(credentials)
.expect('Content-Type', 'application/json')
.expect(200)
.expect((res) => {
expect(res.body).to.have.property('success', true);
expect(res.body.messages).to.be.an('array');
expect(res.body).to.have.property('offset');
expect(res.body).to.have.property('total');
expect(res.body).to.have.property('count');
})
.end(done);
});
});
});