From 84329e5fade90698c9bce55dab8e52da7a6798e3 Mon Sep 17 00:00:00 2001 From: Matteo Pagliazzi Date: Thu, 30 Aug 2018 21:50:03 +0200 Subject: [PATCH] New inbox client (#10644) * new inbox client * add tests for sendPrivateMessage returning the message * update DELETE user message tests * port v3 GET-inbox_messages * use v4 delete message route * sendPrivateMessage: return sent message * fix --- .../inbox/GET-inbox_messages.test.js | 23 ++- .../members/POST-send_private_message.test.js | 5 +- .../user/DELETE-user_messages.test.js | 38 +++-- .../DELETE-inbox_messages_messageId.test.js | 62 ++++++++ website/client/components/chat/chatCard.vue | 3 +- .../client/components/chat/chatMessages.vue | 5 + website/client/components/groups/group.vue | 5 - website/client/components/userMenu/inbox.vue | 135 +++++++++++------- website/common/errors/apiErrorMessages.js | 2 + website/server/controllers/api-v3/inbox.js | 29 ++++ website/server/controllers/api-v4/inbox.js | 59 +++++--- website/server/libs/inbox/index.js | 11 ++ website/server/libs/routes.js | 2 +- website/server/models/user/methods.js | 7 +- 14 files changed, 287 insertions(+), 99 deletions(-) rename test/api/{v4 => v3/integration}/inbox/GET-inbox_messages.test.js (59%) create mode 100644 test/api/v4/inbox/DELETE-inbox_messages_messageId.test.js create mode 100644 website/server/controllers/api-v3/inbox.js create mode 100644 website/server/libs/inbox/index.js diff --git a/test/api/v4/inbox/GET-inbox_messages.test.js b/test/api/v3/integration/inbox/GET-inbox_messages.test.js similarity index 59% rename from test/api/v4/inbox/GET-inbox_messages.test.js rename to test/api/v3/integration/inbox/GET-inbox_messages.test.js index efb2f68ffb..5066958c63 100644 --- a/test/api/v4/inbox/GET-inbox_messages.test.js +++ b/test/api/v3/integration/inbox/GET-inbox_messages.test.js @@ -1,6 +1,6 @@ import { generateUser, -} from '../../../helpers/api-integration/v4'; +} from '../../../../helpers/api-integration/v3'; describe('GET /inbox/messages', () => { let user; @@ -22,17 +22,26 @@ describe('GET /inbox/messages', () => { message: 'third', }); + // message to yourself + await user.post('/members/send-private-message', { + toUserId: user.id, + message: 'fourth', + }); + await user.sync(); }); 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(3); - expect(messages.length).to.equal(Object.keys(user.inbox.messages).length); + expect(messages.length).to.equal(4); - expect(messages[0].text).to.equal('third'); - expect(messages[1].text).to.equal('second'); - expect(messages[2].text).to.equal('first'); + // message to yourself + expect(messages[0].text).to.equal('fourth'); + expect(messages[0].uuid).to.equal(user._id); + + expect(messages[1].text).to.equal('third'); + expect(messages[2].text).to.equal('second'); + expect(messages[3].text).to.equal('first'); }); -}); \ No newline at end of file +}); diff --git a/test/api/v3/integration/members/POST-send_private_message.test.js b/test/api/v3/integration/members/POST-send_private_message.test.js index 7e9c22f925..0012e6ce37 100644 --- a/test/api/v3/integration/members/POST-send_private_message.test.js +++ b/test/api/v3/integration/members/POST-send_private_message.test.js @@ -100,7 +100,7 @@ describe('POST /members/send-private-message', () => { let receiver = await generateUser(); // const initialNotifications = receiver.notifications.length; - await userToSendMessage.post('/members/send-private-message', { + const response = await userToSendMessage.post('/members/send-private-message', { message: messageToSend, toUserId: receiver._id, }); @@ -116,6 +116,9 @@ describe('POST /members/send-private-message', () => { return message.uuid === receiver._id && message.text === messageToSend; }); + expect(response.message.text).to.deep.equal(sendersMessageInSendersInbox.text); + expect(response.message.uuid).to.deep.equal(sendersMessageInSendersInbox.uuid); + // @TODO waiting for mobile support // expect(updatedReceiver.notifications.length).to.equal(initialNotifications + 1); // const notification = updatedReceiver.notifications[updatedReceiver.notifications.length - 1]; diff --git a/test/api/v3/integration/user/DELETE-user_messages.test.js b/test/api/v3/integration/user/DELETE-user_messages.test.js index 98df8e0209..3b5686c03b 100644 --- a/test/api/v3/integration/user/DELETE-user_messages.test.js +++ b/test/api/v3/integration/user/DELETE-user_messages.test.js @@ -3,25 +3,41 @@ import { } from '../../../../helpers/api-integration/v3'; describe('DELETE user message', () => { - let user; + let user, messagesId, otherUser; - beforeEach(async () => { - user = await generateUser({ inbox: { messages: { first: 'message', second: 'message' } } }); - expect(user.inbox.messages.first).to.eql('message'); - expect(user.inbox.messages.second).to.eql('message'); + before(async () => { + [user, otherUser] = await Promise.all([generateUser(), generateUser()]); + await user.post('/members/send-private-message', { + toUserId: otherUser.id, + message: 'first', + }); + await user.post('/members/send-private-message', { + toUserId: otherUser.id, + message: 'second', + }); + + let userRes = await user.get('/user'); + + messagesId = Object.keys(userRes.inbox.messages); + expect(messagesId.length).to.eql(2); + expect(userRes.inbox.messages[messagesId[0]].text).to.eql('first'); + expect(userRes.inbox.messages[messagesId[1]].text).to.eql('second'); }); it('one message', async () => { - let result = await user.del('/user/messages/first'); - await user.sync(); - expect(result).to.eql({ second: 'message' }); - expect(user.inbox.messages).to.eql({ second: 'message' }); + let result = await user.del(`/user/messages/${messagesId[0]}`); + messagesId = Object.keys(result); + expect(messagesId.length).to.eql(1); + + let userRes = await user.get('/user'); + expect(Object.keys(userRes.inbox.messages).length).to.eql(1); + expect(userRes.inbox.messages[messagesId[0]].text).to.eql('second'); }); it('clear all', async () => { let result = await user.del('/user/messages'); - await user.sync(); - expect(user.inbox.messages).to.eql({}); + let userRes = await user.get('/user'); + expect(userRes.inbox.messages).to.eql({}); expect(result).to.eql({}); }); }); diff --git a/test/api/v4/inbox/DELETE-inbox_messages_messageId.test.js b/test/api/v4/inbox/DELETE-inbox_messages_messageId.test.js new file mode 100644 index 0000000000..5f4e502147 --- /dev/null +++ b/test/api/v4/inbox/DELETE-inbox_messages_messageId.test.js @@ -0,0 +1,62 @@ +import { + generateUser, + translate as t, +} from '../../../helpers/api-integration/v4'; +import { v4 as generateUUID } from 'uuid'; + +describe('DELETE /inbox/messages/:messageId', () => { + let user; + let otherUser; + + before(async () => { + [user, otherUser] = await Promise.all([generateUser(), generateUser()]); + + await otherUser.post('/members/send-private-message', { + toUserId: user.id, + message: 'first', + }); + await user.post('/members/send-private-message', { + toUserId: otherUser.id, + message: 'second', + }); + await otherUser.post('/members/send-private-message', { + toUserId: user.id, + message: 'third', + }); + }); + + it('returns an error if the messageId parameter is not an UUID', async () => { + await expect(user.del('/inbox/messages/123')) + .to.eventually.be.rejected.and.eql({ + code: 400, + error: 'BadRequest', + message: 'Invalid request parameters.', + }); + }); + + it('returns an error if the message does not exist', async () => { + await expect(user.del(`/inbox/messages/${generateUUID()}`)) + .to.eventually.be.rejected.and.eql({ + code: 404, + error: 'NotFound', + message: t('messageGroupChatNotFound'), + }); + }); + + it('deletes one message', async () => { + const messages = await user.get('/inbox/messages'); + + expect(messages.length).to.equal(3); + + expect(messages[0].text).to.equal('third'); + expect(messages[1].text).to.equal('second'); + expect(messages[2].text).to.equal('first'); + + await user.del(`/inbox/messages/${messages[1]._id}`); + const updatedMessages = await user.get('/inbox/messages'); + expect(updatedMessages.length).to.equal(2); + + expect(updatedMessages[0].text).to.equal('third'); + expect(updatedMessages[1].text).to.equal('first'); + }); +}); \ No newline at end of file diff --git a/website/client/components/chat/chatCard.vue b/website/client/components/chat/chatCard.vue index dd5a7cb2a1..fcf69d5e74 100644 --- a/website/client/components/chat/chatCard.vue +++ b/website/client/components/chat/chatCard.vue @@ -255,8 +255,7 @@ export default { this.$emit('message-removed', message); if (this.inbox) { - axios.delete(`/api/v4/user/messages/${message.id}`); - this.$delete(this.user.inbox.messages, message.id); + await axios.delete(`/api/v4/inbox/messages/${message.id}`); return; } diff --git a/website/client/components/chat/chatMessages.vue b/website/client/components/chat/chatMessages.vue index 97cfb7d3e7..22af3fdfd9 100644 --- a/website/client/components/chat/chatMessages.vue +++ b/website/client/components/chat/chatMessages.vue @@ -230,6 +230,11 @@ export default { this.chat.splice(chatIndex, 1, message); }, messageRemoved (message) { + if (this.inbox) { + this.$emit('message-removed', message); + return; + } + const chatIndex = findIndex(this.chat, chatMessage => { return chatMessage.id === message.id; }); diff --git a/website/client/components/groups/group.vue b/website/client/components/groups/group.vue index 6f63f305b7..7d7c765a37 100644 --- a/website/client/components/groups/group.vue +++ b/website/client/components/groups/group.vue @@ -478,11 +478,6 @@ export default { return n.type === 'NEW_CHAT_MESSAGE' && n.data.group.id === groupId; }); }, - deleteAllMessages () { - if (confirm(this.$t('confirmDeleteAllMessages'))) { - // User.clearPMs(); - } - }, checkForAchievements () { // Checks if user's party has reached 2 players for the first time. if (!this.user.achievements.partyUp && this.group.memberCount >= 2) { diff --git a/website/client/components/userMenu/inbox.vue b/website/client/components/userMenu/inbox.vue index 6989165363..9b605b4f60 100644 --- a/website/client/components/userMenu/inbox.vue +++ b/website/client/components/userMenu/inbox.vue @@ -1,5 +1,5 @@