From 2a7dfff88a95491b879a9557e4a72057a6f241a4 Mon Sep 17 00:00:00 2001 From: Keith Holliday Date: Sun, 12 Aug 2018 12:09:12 -0500 Subject: [PATCH] Added mute end date (#10566) * Added mute end date * Added indefinite mute for users using slurs * Fixed user reload. Added no longer muted message. Added format for date * Fixed lint --- .../api/v3/integration/chat/POST-chat.test.js | 46 +++++++++++++++---- website/client/components/hall/heroes.vue | 28 +++++++++-- website/server/controllers/api-v3/chat.js | 5 +- website/server/controllers/api-v3/hall.js | 4 +- website/server/libs/chat/mute.js | 19 ++++++++ website/server/models/user/schema.js | 1 + 6 files changed, 90 insertions(+), 13 deletions(-) create mode 100644 website/server/libs/chat/mute.js diff --git a/test/api/v3/integration/chat/POST-chat.test.js b/test/api/v3/integration/chat/POST-chat.test.js index d607c045f1..01c4af48d1 100644 --- a/test/api/v3/integration/chat/POST-chat.test.js +++ b/test/api/v3/integration/chat/POST-chat.test.js @@ -1,3 +1,6 @@ +import { IncomingWebhook } from '@slack/client'; +import nconf from 'nconf'; +import moment from 'moment'; import { createAndPopulateGroup, generateUser, @@ -15,8 +18,6 @@ import { getMatchesByWordArray } from '../../../../../website/server/libs/string import bannedWords from '../../../../../website/server/libs/bannedWords'; import guildsAllowingBannedWords from '../../../../../website/server/libs/guildsAllowingBannedWords'; import * as email from '../../../../../website/server/libs/email'; -import { IncomingWebhook } from '@slack/client'; -import nconf from 'nconf'; const BASE_URL = nconf.get('BASE_URL'); @@ -80,12 +81,40 @@ describe('POST /chat', () => { }); }); - it('returns an error when chat privileges are revoked when sending a message to a public guild', async () => { - let userWithChatRevoked = await member.update({'flags.chatRevoked': true}); - await expect(userWithChatRevoked.post(`/groups/${groupWithChat._id}/chat`, { message: testMessage})).to.eventually.be.rejected.and.eql({ - code: 401, - error: 'NotAuthorized', - message: t('chatPrivilegesRevoked'), + describe('mute user', () => { + it('returns an error when chat privileges are revoked when sending a message to a public guild', async () => { + const userWithChatRevoked = await member.update({'flags.chatRevoked': true}); + await expect(userWithChatRevoked.post(`/groups/${groupWithChat._id}/chat`, { message: testMessage})).to.eventually.be.rejected.and.eql({ + code: 401, + error: 'NotAuthorized', + message: t('chatPrivilegesRevoked'), + }); + }); + + it('returns an error when user is muted with date', async () => { + const userWithChatRevoked = await member.update({ + 'flags.chatRevoked': true, + 'flags.chatRevokedEndDate': moment().add(1, 'days').toDate(), + }); + + await expect(userWithChatRevoked.post(`/groups/${groupWithChat._id}/chat`, { message: testMessage})).to.eventually.be.rejected.and.eql({ + code: 401, + error: 'NotAuthorized', + message: t('chatPrivilegesRevoked'), + }); + }); + + it('allows a user to chat after revoked time has passed', async () => { + const userWithChatRevoked = await member.update({ + 'flags.chatRevoked': true, + 'flags.chatRevokedEndDate': moment().subtract(1, 'days').toDate(), + }); + + const newMessage = await userWithChatRevoked.post(`/groups/${groupWithChat._id}/chat`, { message: testMessage}); + const groupMessages = await userWithChatRevoked.get(`/groups/${groupWithChat._id}/chat`); + + expect(newMessage.message.id).to.exist; + expect(groupMessages[0].id).to.exist; }); }); @@ -273,6 +302,7 @@ describe('POST /chat', () => { message: t('chatPrivilegesRevoked'), }); + // @TODO: The next test should not depend on this. We should reset the user test in a beforeEach // Restore chat privileges to continue testing user.flags.chatRevoked = false; await user.update({'flags.chatRevoked': false}); diff --git a/website/client/components/hall/heroes.vue b/website/client/components/hall/heroes.vue index 010ed7ec65..ef04f27338 100644 --- a/website/client/components/hall/heroes.vue +++ b/website/client/components/hall/heroes.vue @@ -55,10 +55,21 @@ div(v-if="expandAuth") pre {{hero.auth}} .form-group + h5 User Mute Settings .checkbox label input(type='checkbox', v-if='hero.flags', v-model='hero.flags.chatRevoked') - | Chat Privileges Revoked + strong Chat Privileges Revoked + div(v-if='hero.flags.chatRevoked && hero.flags.chatRevokedEndDate') + strong User is currently muted until + br + div {{ userRevokedEndDate(hero) }} + div(v-else-if='hero.flags.chatRevoked') + strong User is currently muted indefinitely + div + strong For how many days from today do you want to mute this user? Leave as 0 for indefinite. + br + input(type='number', v-model='numberOfDaysToMute') .form-group .checkbox label @@ -103,7 +114,7 @@