[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 collectionpull/15784/head^2
parent
d95f2e0dac
commit
b51d9f7728
@ -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(); |
||||
@ -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, |
||||
}; |
||||
} |
||||
@ -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); |
||||
}); |
||||
|
||||
@ -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); |
||||
} |
||||
} |
||||
@ -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…
Reference in new issue