[IMPROVE] Replace livechat:externalMessages publication by REST (#15643)

* Replace livechat:externalMessages publication by REST

* Fix lint

* Add pagination to livechat external messages

* Add index and remove obsolete collection
pull/15784/head^2
Marcos Spessatto Defendi 6 years ago committed by Renato Becker
parent d95f2e0dac
commit b51d9f7728
  1. 1
      app/livechat/client/index.js
  2. 15
      app/livechat/client/views/app/tabbar/externalSearch.html
  3. 44
      app/livechat/client/views/app/tabbar/externalSearch.js
  4. 26
      app/livechat/imports/server/rest/messages.js
  5. 22
      app/livechat/lib/LivechatExternalMessage.js
  6. 1
      app/livechat/server/api.js
  7. 20
      app/livechat/server/api/lib/messages.js
  8. 2
      app/livechat/server/hooks/externalMessage.js
  9. 1
      app/livechat/server/index.js
  10. 3
      app/livechat/server/publications/externalMessages.js
  11. 2
      app/models/server/index.js
  12. 18
      app/models/server/models/LivechatExternalMessages.js
  13. 9
      app/models/server/raw/LivechatExternalMessages.js
  14. 3
      app/models/server/raw/index.js
  15. 29
      tests/end-to-end/api/livechat/messages.js

@ -1,5 +1,4 @@
import '../lib/messageTypes';
import '../lib/LivechatExternalMessage';
import './roomType';
import './route';
import './ui';

@ -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>

@ -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);
});
});

@ -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);
},
});

@ -1,22 +0,0 @@
import { Meteor } from 'meteor/meteor';
import { Base } from '../../models';
class LivechatExternalMessageClass extends Base {
constructor() {
super('livechat_external_message');
if (Meteor.isClient) {
this._initModel('livechat_external_message');
}
}
// FIND
findByRoomId(roomId, sort = { ts: -1 }) {
const query = { rid: roomId };
return this.find(query, { sort });
}
}
export const LivechatExternalMessage = new LivechatExternalMessageClass();

@ -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';

@ -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,
};
}

@ -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;

@ -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';

@ -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);
});

@ -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';
@ -80,4 +81,5 @@ export {
LivechatVisitors,
LivechatAgentActivity,
ReadReceipts,
LivechatExternalMessage,
};

@ -0,0 +1,18 @@
import { Base } from './_Base';
export class LivechatExternalMessage extends Base {
constructor() {
super('livechat_external_message');
this.tryEnsureIndex({ rid: 1 });
}
// FIND
findByRoomId(roomId, sort = { ts: -1 }) {
const query = { rid: roomId };
return this.find(query, { sort });
}
}
export default new LivechatExternalMessage();

@ -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);
}
}

@ -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';
@ -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());

@ -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);
});
});
});
Loading…
Cancel
Save