From 5630e8cc8e3a79139a76bcb35c8b427ba3fb58f3 Mon Sep 17 00:00:00 2001 From: negue Date: Thu, 13 Jun 2019 15:18:50 +0200 Subject: [PATCH] Performance: Inbox Paging / loading (#11157) * load messages per conversation * only sort ones in ui * add contributor to message * fix correct message layout/message * mugenScroll on chatMessages * fix lint, no mugen-scroll, use own scroll handler * fix height / margin of modal + use button to load more * fix tests * user data from inbox * style "load earlier messages" * move mapMessage to the inbox api result / extract sentMessage of members-api-controller * fix test back * fix test * keep last scroll position * just set the Id of the returned message instead of all other properties * fix add new messages (buttons were hidden) + load more * item-mounted debounce to trigger the re-scrolling --- .../inbox/GET-inbox_messages.test.js | 2 +- .../v4/inbox/GET-inbox-conversations.test.js | 49 ++++- .../members/POST-flag_private_message.test.js | 2 +- website/client/components/chat/chatCard.vue | 3 + .../client/components/chat/chatMessages.vue | 82 +++++++- website/client/components/userMenu/inbox.vue | 196 ++++++++++++------ website/common/locales/en/generic.json | 3 +- website/server/controllers/api-v3/members.js | 23 +- website/server/controllers/api-v4/inbox.js | 47 ++++- website/server/libs/inbox/index.js | 54 +++-- website/server/middlewares/appRoutes.js | 1 + website/server/models/message.js | 8 +- 12 files changed, 355 insertions(+), 115 deletions(-) diff --git a/test/api/v3/integration/inbox/GET-inbox_messages.test.js b/test/api/v3/integration/inbox/GET-inbox_messages.test.js index c0c86a8a00c..491b444cab5 100644 --- a/test/api/v3/integration/inbox/GET-inbox_messages.test.js +++ b/test/api/v3/integration/inbox/GET-inbox_messages.test.js @@ -6,7 +6,7 @@ describe('GET /inbox/messages', () => { let user; let otherUser; - before(async () => { + beforeEach(async () => { [user, otherUser] = await Promise.all([generateUser(), generateUser()]); await otherUser.post('/members/send-private-message', { diff --git a/test/api/v4/inbox/GET-inbox-conversations.test.js b/test/api/v4/inbox/GET-inbox-conversations.test.js index 33131b871ae..ccd999b274c 100644 --- a/test/api/v4/inbox/GET-inbox-conversations.test.js +++ b/test/api/v4/inbox/GET-inbox-conversations.test.js @@ -7,7 +7,7 @@ describe('GET /inbox/conversations', () => { let otherUser; let thirdUser; - before(async () => { + beforeEach(async () => { [user, otherUser, thirdUser] = await Promise.all([generateUser(), generateUser(), generateUser()]); await otherUser.post('/members/send-private-message', { @@ -41,4 +41,51 @@ describe('GET /inbox/conversations', () => { expect(result[0].user).to.be.equal(user.profile.name); expect(result[0].username).to.be.equal(user.auth.local.username); }); + + it('returns the user inbox messages as an array of ordered messages (from most to least recent)', async () => { + const messages = await user.get('/inbox/messages'); + + expect(messages.length).to.equal(5); + + // message to yourself + expect(messages[0].text).to.equal('fifth'); + expect(messages[0].sent).to.equal(false); + expect(messages[0].uuid).to.equal(user._id); + + expect(messages[1].text).to.equal('fourth'); + expect(messages[2].text).to.equal('third'); + expect(messages[3].text).to.equal('second'); + expect(messages[4].text).to.equal('first'); + }); + + it('returns four messages when using page-query ', async () => { + const promises = []; + + for (let i = 0; i < 10; i++) { + promises.push(user.post('/members/send-private-message', { + toUserId: user.id, + message: 'fourth', + })); + } + + await Promise.all(promises); + + const messages = await user.get('/inbox/messages?page=1'); + + expect(messages.length).to.equal(5); + }); + + it('returns only the messages of one conversation', async () => { + const messages = await user.get(`/inbox/messages?conversation=${otherUser.id}`); + + expect(messages.length).to.equal(3); + }); + + it('returns the correct message format', async () => { + const messages = await otherUser.get(`/inbox/messages?conversation=${user.id}`); + + expect(messages[0].toUUID).to.equal(user.id); // from user + expect(messages[1].toUUID).to.not.exist; // only filled if its from the chat partner + expect(messages[2].toUUID).to.equal(user.id); // from user + }); }); diff --git a/test/api/v4/members/POST-flag_private_message.test.js b/test/api/v4/members/POST-flag_private_message.test.js index dbeb9b5e18f..90c52fa0909 100644 --- a/test/api/v4/members/POST-flag_private_message.test.js +++ b/test/api/v4/members/POST-flag_private_message.test.js @@ -22,7 +22,7 @@ describe('POST /members/flag-private-message/:messageId', () => { let senderMessages = await userToSendMessage.get('/inbox/messages'); let sendersMessageInSendersInbox = _.find(senderMessages, (message) => { - return message.uuid === receiver._id && message.text === messageToSend; + return message.toUUID === receiver._id && message.text === messageToSend; }); expect(sendersMessageInSendersInbox).to.exist; diff --git a/website/client/components/chat/chatCard.vue b/website/client/components/chat/chatCard.vue index fac207d5c0f..220ec7d8915 100644 --- a/website/client/components/chat/chatCard.vue +++ b/website/client/components/chat/chatCard.vue @@ -273,5 +273,8 @@ export default { return habiticaMarkdown.render(String(text)); }, }, + mounted () { + this.$emit('item-mounted', this.msg.id); + }, }; diff --git a/website/client/components/chat/chatMessages.vue b/website/client/components/chat/chatMessages.vue index 6ee84b98d8b..48361d4297c 100644 --- a/website/client/components/chat/chatMessages.vue +++ b/website/client/components/chat/chatMessages.vue @@ -1,8 +1,14 @@