[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 { Template } from 'meteor/templating'; |
||||||
|
import { ReactiveVar } from 'meteor/reactive-var'; |
||||||
|
|
||||||
import { LivechatExternalMessage } from '../../../../lib/LivechatExternalMessage'; |
|
||||||
import './externalSearch.html'; |
import './externalSearch.html'; |
||||||
|
import { APIClient } from '../../../../../utils/client'; |
||||||
|
|
||||||
|
const MESSAGES_COUNT = 50; |
||||||
|
|
||||||
Template.externalSearch.helpers({ |
Template.externalSearch.helpers({ |
||||||
messages() { |
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({ |
Template.externalSearch.events({ |
||||||
'click button.pick-message'(event, instance) { |
'click button.pick-message'(event, instance) { |
||||||
event.preventDefault(); |
event.preventDefault(); |
||||||
|
$(`#chat-window-${ instance.roomId } .js-input-message`).val(this.msg).focus(); |
||||||
$(`#chat-window-${ instance.roomId } .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() { |
Template.externalSearch.onCreated(function() { |
||||||
this.roomId = null; |
this.roomId = null; |
||||||
// console.log('externalSearch.this ->',this);
|
this.externalMessages = new ReactiveVar([]); |
||||||
this.autorun(() => { |
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.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 { Meteor } from 'meteor/meteor'; |
||||||
|
|
||||||
import { LivechatExternalMessage } from '../../lib/LivechatExternalMessage'; |
import { LivechatExternalMessage } from '../../../models/server'; |
||||||
|
|
||||||
Meteor.publish('livechat:externalMessages', function(roomId) { |
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); |
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