diff --git a/backend/src/middleware/permissionsMiddleware.js b/backend/src/middleware/permissionsMiddleware.js index 5ddbf0eb9..2578bcf1f 100644 --- a/backend/src/middleware/permissionsMiddleware.js +++ b/backend/src/middleware/permissionsMiddleware.js @@ -99,7 +99,7 @@ export default shield( Badge: allow, PostsEmotionsCountByEmotion: allow, PostsEmotionsByCurrentUser: isAuthenticated, - blacklistedUsers: isAuthenticated, + mutedUsers: isAuthenticated, notifications: isAuthenticated, Donations: isAuthenticated, }, @@ -135,8 +135,8 @@ export default shield( resetPassword: allow, AddPostEmotions: isAuthenticated, RemovePostEmotions: isAuthenticated, - blacklistUserContent: isAuthenticated, - whitelistUserContent: isAuthenticated, + muteUser: isAuthenticated, + unmuteUser: isAuthenticated, markAsRead: isAuthenticated, AddEmailAddress: isAuthenticated, VerifyEmailAddress: isAuthenticated, diff --git a/backend/src/models/User.js b/backend/src/models/User.js index bfb0959bb..4d1581691 100644 --- a/backend/src/models/User.js +++ b/backend/src/models/User.js @@ -78,9 +78,9 @@ module.exports = { target: 'User', direction: 'out', }, - blacklisted: { + muted: { type: 'relationship', - relationship: 'BLACKLISTED', + relationship: 'MUTED', target: 'User', direction: 'out', }, diff --git a/backend/src/schema/resolvers/posts.js b/backend/src/schema/resolvers/posts.js index 9a6ec0256..6e895b24f 100644 --- a/backend/src/schema/resolvers/posts.js +++ b/backend/src/schema/resolvers/posts.js @@ -1,21 +1,21 @@ import uuid from 'uuid/v4' import { neo4jgraphql } from 'neo4j-graphql-js' import fileUpload from './fileUpload' -import { getBlacklistedUsers } from './users.js' +import { getMutedUsers } from './users.js' import { mergeWith, isArray, isEmpty } from 'lodash' import { UserInputError } from 'apollo-server' import Resolver from './helpers/Resolver' -const filterForBlacklistedUsers = async (params, context) => { +const filterForMutedUsers = async (params, context) => { if (!context.user) return params - const [blacklistedUsers] = await Promise.all([getBlacklistedUsers(context)]) - const blacklistedUsersIds = [...blacklistedUsers.map(user => user.id)] - if (!blacklistedUsersIds.length) return params + const [mutedUsers] = await Promise.all([getMutedUsers(context)]) + const mutedUsersIds = [...mutedUsers.map(user => user.id)] + if (!mutedUsersIds.length) return params params.filter = mergeWith( params.filter, { - author_not: { id_in: blacklistedUsersIds }, + author_not: { id_in: mutedUsersIds }, }, (objValue, srcValue) => { if (isArray(objValue)) { @@ -39,16 +39,16 @@ const maintainPinnedPosts = params => { export default { Query: { Post: async (object, params, context, resolveInfo) => { - params = await filterForBlacklistedUsers(params, context) + params = await filterForMutedUsers(params, context) params = await maintainPinnedPosts(params) return neo4jgraphql(object, params, context, resolveInfo) }, findPosts: async (object, params, context, resolveInfo) => { - params = await filterForBlacklistedUsers(params, context) + params = await filterForMutedUsers(params, context) return neo4jgraphql(object, params, context, resolveInfo) }, profilePagePosts: async (object, params, context, resolveInfo) => { - params = await filterForBlacklistedUsers(params, context) + params = await filterForMutedUsers(params, context) return neo4jgraphql(object, params, context, resolveInfo) }, PostsEmotionsCountByEmotion: async (object, params, context, resolveInfo) => { diff --git a/backend/src/schema/resolvers/users.js b/backend/src/schema/resolvers/users.js index 75013c68d..a680f5e41 100644 --- a/backend/src/schema/resolvers/users.js +++ b/backend/src/schema/resolvers/users.js @@ -8,26 +8,26 @@ import createOrUpdateLocations from './users/location' const neode = getNeode() -export const getBlacklistedUsers = async context => { +export const getMutedUsers = async context => { const { neode } = context const userModel = neode.model('User') - let blacklistedUsers = neode + let mutedUsers = neode .query() .match('user', userModel) .where('user.id', context.user.id) - .relationship(userModel.relationships().get('blacklisted')) - .to('blacklisted', userModel) - .return('blacklisted') - blacklistedUsers = await blacklistedUsers.execute() - blacklistedUsers = blacklistedUsers.records.map(r => r.get('blacklisted').properties) - return blacklistedUsers + .relationship(userModel.relationships().get('muted')) + .to('muted', userModel) + .return('muted') + mutedUsers = await mutedUsers.execute() + mutedUsers = mutedUsers.records.map(r => r.get('muted').properties) + return mutedUsers } export default { Query: { - blacklistedUsers: async (object, args, context, resolveInfo) => { + mutedUsers: async (object, args, context, resolveInfo) => { try { - return getBlacklistedUsers(context) + return getMutedUsers(context) } catch (e) { throw new UserInputError(e.message) } @@ -56,7 +56,7 @@ export default { }, }, Mutation: { - blacklistUserContent: async (_parent, params, context, _resolveInfo) => { + muteUser: async (_parent, params, context, _resolveInfo) => { const { user: currentUser } = context if (currentUser.id === params.id) return null await neode.cypher( @@ -66,25 +66,25 @@ export default { `, { currentUser, params }, ) - const [user, blacklistedUser] = await Promise.all([ + const [user, mutedUser] = await Promise.all([ neode.find('User', currentUser.id), neode.find('User', params.id), ]) - await user.relateTo(blacklistedUser, 'blacklisted') - return blacklistedUser.toJson() + await user.relateTo(mutedUser, 'muted') + return mutedUser.toJson() }, - whitelistUserContent: async (_parent, params, context, _resolveInfo) => { + unmuteUser: async (_parent, params, context, _resolveInfo) => { const { user: currentUser } = context if (currentUser.id === params.id) return null await neode.cypher( ` - MATCH(u:User {id: $currentUser.id})-[previousRelationship:BLACKLISTED]->(b:User {id: $params.id}) + MATCH(u:User {id: $currentUser.id})-[previousRelationship:MUTED]->(b:User {id: $params.id}) DELETE previousRelationship `, { currentUser, params }, ) - const whitelistedUser = await neode.find('User', params.id) - return whitelistedUser.toJson() + const unmutedUser = await neode.find('User', params.id) + return unmutedUser.toJson() }, block: async (object, args, context, resolveInfo) => { const { user: currentUser } = context @@ -231,8 +231,8 @@ export default { 'MATCH (this)<-[:FOLLOWS]-(u:User {id: $cypherParams.currentUserId}) RETURN COUNT(u) >= 1', isBlocked: 'MATCH (this)<-[:BLOCKED]-(u:User {id: $cypherParams.currentUserId}) RETURN COUNT(u) >= 1', - isBlacklisted: - 'MATCH (this)<-[:BLACKLISTED]-(u:User {id: $cypherParams.currentUserId}) RETURN COUNT(u) >= 1', + isMuted: + 'MATCH (this)<-[:MUTED]-(u:User {id: $cypherParams.currentUserId}) RETURN COUNT(u) >= 1', }, count: { contributionsCount: diff --git a/backend/src/schema/resolvers/users/blacklistedUsers.spec.js b/backend/src/schema/resolvers/users/mutedUsers.spec.js similarity index 60% rename from backend/src/schema/resolvers/users/blacklistedUsers.spec.js rename to backend/src/schema/resolvers/users/mutedUsers.spec.js index fea3551ea..3dab70278 100644 --- a/backend/src/schema/resolvers/users/blacklistedUsers.spec.js +++ b/backend/src/schema/resolvers/users/mutedUsers.spec.js @@ -9,7 +9,7 @@ const factory = Factory() const neode = getNeode() let currentUser -let blacklistedUser +let mutedUser let authenticatedUser let server @@ -33,15 +33,15 @@ afterEach(async () => { await factory.cleanDatabase() }) -describe('blacklistedUsers', () => { - let blacklistedUserQuery +describe('mutedUsers', () => { + let mutedUserQuery beforeEach(() => { - blacklistedUserQuery = gql` + mutedUserQuery = gql` query { - blacklistedUsers { + mutedUsers { id name - isBlacklisted + isMuted } } ` @@ -49,34 +49,34 @@ describe('blacklistedUsers', () => { it('throws permission error', async () => { const { query } = createTestClient(server) - const result = await query({ query: blacklistedUserQuery }) + const result = await query({ query: mutedUserQuery }) expect(result.errors[0]).toHaveProperty('message', 'Not Authorised!') }) - describe('authenticated and given a blacklisted user', () => { + describe('authenticated and given a muted user', () => { beforeEach(async () => { currentUser = await neode.create('User', { name: 'Current User', id: 'u1', }) - blacklistedUser = await neode.create('User', { - name: 'Blacklisted User', + mutedUser = await neode.create('User', { + name: 'Muted User', id: 'u2', }) - await currentUser.relateTo(blacklistedUser, 'blacklisted') + await currentUser.relateTo(mutedUser, 'muted') authenticatedUser = await currentUser.toJson() }) - it('returns a list of blacklisted users', async () => { + it('returns a list of muted users', async () => { const { query } = createTestClient(server) - await expect(query({ query: blacklistedUserQuery })).resolves.toEqual( + await expect(query({ query: mutedUserQuery })).resolves.toEqual( expect.objectContaining({ data: { - blacklistedUsers: [ + mutedUsers: [ { - name: 'Blacklisted User', + name: 'Muted User', id: 'u2', - isBlacklisted: true, + isMuted: true, }, ], }, @@ -86,28 +86,28 @@ describe('blacklistedUsers', () => { }) }) -describe('blacklistUserContent', () => { - let blacklistAction +describe('muteUser', () => { + let muteAction beforeEach(() => { currentUser = undefined - blacklistAction = variables => { + muteAction = variables => { const { mutate } = createTestClient(server) - const blacklistUserContentMutation = gql` + const muteUserMutation = gql` mutation($id: ID!) { - blacklistUserContent(id: $id) { + muteUser(id: $id) { id name - isBlacklisted + isMuted } } ` - return mutate({ mutation: blacklistUserContentMutation, variables }) + return mutate({ mutation: muteUserMutation, variables }) } }) it('throws permission error', async () => { - const result = await blacklistAction({ id: 'u2' }) + const result = await muteAction({ id: 'u2' }) expect(result.errors[0]).toHaveProperty('message', 'Not Authorised!') }) @@ -120,47 +120,47 @@ describe('blacklistUserContent', () => { authenticatedUser = await currentUser.toJson() }) - describe('blacklist yourself', () => { + describe('mute yourself', () => { it('returns null', async () => { - await expect(blacklistAction({ id: 'u1' })).resolves.toEqual( - expect.objectContaining({ data: { blacklistUserContent: null } }), + await expect(muteAction({ id: 'u1' })).resolves.toEqual( + expect.objectContaining({ data: { muteUser: null } }), ) }) }) - describe('blacklist not existing user', () => { + describe('mute not existing user', () => { it('returns null', async () => { - await expect(blacklistAction({ id: 'u2' })).resolves.toEqual( - expect.objectContaining({ data: { blacklistUserContent: null } }), + await expect(muteAction({ id: 'u2' })).resolves.toEqual( + expect.objectContaining({ data: { muteUser: null } }), ) }) }) - describe('given a to-be-blacklisted user', () => { + describe('given a to-be-muted user', () => { beforeEach(async () => { - blacklistedUser = await neode.create('User', { - name: 'Blacklisted User', + mutedUser = await neode.create('User', { + name: 'Muted User', id: 'u2', }) }) - it('blacklists a user', async () => { - await expect(blacklistAction({ id: 'u2' })).resolves.toEqual( + it('mutes a user', async () => { + await expect(muteAction({ id: 'u2' })).resolves.toEqual( expect.objectContaining({ data: { - blacklistUserContent: { id: 'u2', name: 'Blacklisted User', isBlacklisted: true }, + muteUser: { id: 'u2', name: 'Muted User', isMuted: true }, }, }), ) }) it('unfollows the user', async () => { - await currentUser.relateTo(blacklistedUser, 'following') + await currentUser.relateTo(mutedUser, 'following') const queryUser = gql` query { User(id: "u2") { id - isBlacklisted + isMuted followedByCurrentUser } } @@ -168,18 +168,18 @@ describe('blacklistUserContent', () => { const { query } = createTestClient(server) await expect(query({ query: queryUser })).resolves.toEqual( expect.objectContaining({ - data: { User: [{ id: 'u2', isBlacklisted: false, followedByCurrentUser: true }] }, + data: { User: [{ id: 'u2', isMuted: false, followedByCurrentUser: true }] }, }), ) - await blacklistAction({ id: 'u2' }) + await muteAction({ id: 'u2' }) await expect(query({ query: queryUser })).resolves.toEqual( expect.objectContaining({ - data: { User: [{ id: 'u2', isBlacklisted: true, followedByCurrentUser: false }] }, + data: { User: [{ id: 'u2', isMuted: true, followedByCurrentUser: false }] }, }), ) }) - describe('given both the current user and the to-be-blacklisted user write a post', () => { + describe('given both the current user and the to-be-muted user write a post', () => { let postQuery beforeEach(async () => { @@ -189,11 +189,11 @@ describe('blacklistUserContent', () => { }) const post2 = await neode.create('Post', { id: 'p23', - title: 'A post written by the blacklisted user', + title: 'A post written by the muted user', }) await Promise.all([ post1.relateTo(currentUser, 'author'), - post2.relateTo(blacklistedUser, 'author'), + post2.relateTo(mutedUser, 'author'), ]) postQuery = gql` query { @@ -225,9 +225,9 @@ describe('blacklistUserContent', () => { }, { id: 'p23', - title: 'A post written by the blacklisted user', + title: 'A post written by the muted user', author: { - name: 'Blacklisted User', + name: 'Muted User', id: 'u2', }, }, @@ -240,12 +240,12 @@ describe('blacklistUserContent', () => { describe('from the perspective of the current user', () => { it('both posts are in the newsfeed', bothPostsAreInTheNewsfeed) - describe('but if the current user blacklists the other user', () => { + describe('but if the current user mutes the other user', () => { beforeEach(async () => { - await currentUser.relateTo(blacklistedUser, 'blacklisted') + await currentUser.relateTo(mutedUser, 'muted') }) - it("the blacklisted user's post won't show up in the newsfeed of the current user", async () => { + it("the muted user's post won't show up in the newsfeed of the current user", async () => { const { query } = createTestClient(server) await expect(query({ query: postQuery })).resolves.toEqual( expect.objectContaining({ @@ -264,18 +264,18 @@ describe('blacklistUserContent', () => { }) }) - describe('from the perspective of the blacklisted user', () => { + describe('from the perspective of the muted user', () => { beforeEach(async () => { - authenticatedUser = await blacklistedUser.toJson() + authenticatedUser = await mutedUser.toJson() }) it('both posts are in the newsfeed', bothPostsAreInTheNewsfeed) - describe('but if the current user blacklists the other user', () => { + describe('but if the current user mutes the other user', () => { beforeEach(async () => { - await currentUser.relateTo(blacklistedUser, 'blacklisted') + await currentUser.relateTo(mutedUser, 'muted') }) - it("the current user's post will show up in the newsfeed of the blacklisted user", async () => { + it("the current user's post will show up in the newsfeed of the muted user", async () => { const { query } = createTestClient(server) await expect(query({ query: postQuery })).resolves.toEqual( expect.objectContaining({ @@ -283,8 +283,8 @@ describe('blacklistUserContent', () => { Post: expect.arrayContaining([ { id: 'p23', - title: 'A post written by the blacklisted user', - author: { name: 'Blacklisted User', id: 'u2' }, + title: 'A post written by the muted user', + author: { name: 'Muted User', id: 'u2' }, }, { id: 'p12', @@ -303,28 +303,28 @@ describe('blacklistUserContent', () => { }) }) -describe('whitelistUserContent', () => { - let whitelistAction +describe('unmuteUser', () => { + let unmuteAction beforeEach(() => { currentUser = undefined - whitelistAction = variables => { + unmuteAction = variables => { const { mutate } = createTestClient(server) - const whitelistUserContentMutation = gql` + const unmuteUserMutation = gql` mutation($id: ID!) { - whitelistUserContent(id: $id) { + unmuteUser(id: $id) { id name - isBlacklisted + isMuted } } ` - return mutate({ mutation: whitelistUserContentMutation, variables }) + return mutate({ mutation: unmuteUserMutation, variables }) } }) it('throws permission error', async () => { - const result = await whitelistAction({ id: 'u2' }) + const result = await unmuteAction({ id: 'u2' }) expect(result.errors[0]).toHaveProperty('message', 'Not Authorised!') }) @@ -337,67 +337,67 @@ describe('whitelistUserContent', () => { authenticatedUser = await currentUser.toJson() }) - describe('whitelist yourself', () => { + describe('unmute yourself', () => { it('returns null', async () => { - await expect(whitelistAction({ id: 'u1' })).resolves.toEqual( - expect.objectContaining({ data: { whitelistUserContent: null } }), + await expect(unmuteAction({ id: 'u1' })).resolves.toEqual( + expect.objectContaining({ data: { unmuteUser: null } }), ) }) }) - describe('whitelist not-existing user', () => { + describe('unmute not-existing user', () => { it('returns null', async () => { - await expect(whitelistAction({ id: 'lksjdflksfdj' })).resolves.toEqual( - expect.objectContaining({ data: { whitelistUserContent: null } }), + await expect(unmuteAction({ id: 'lksjdflksfdj' })).resolves.toEqual( + expect.objectContaining({ data: { unmuteUser: null } }), ) }) }) describe('given another user', () => { beforeEach(async () => { - blacklistedUser = await neode.create('User', { - name: 'Blacklisted User', + mutedUser = await neode.create('User', { + name: 'Muted User', id: 'u2', }) }) - describe('whitelisting a not yet blacklisted user', () => { + describe('unmuting a not yet muted user', () => { it('does not hurt', async () => { - await expect(whitelistAction({ id: 'u2' })).resolves.toEqual( + await expect(unmuteAction({ id: 'u2' })).resolves.toEqual( expect.objectContaining({ data: { - whitelistUserContent: { id: 'u2', name: 'Blacklisted User', isBlacklisted: false }, + unmuteUser: { id: 'u2', name: 'Muted User', isMuted: false }, }, }), ) }) }) - describe('given a blacklisted user', () => { + describe('given a muted user', () => { beforeEach(async () => { - await currentUser.relateTo(blacklistedUser, 'blacklisted') + await currentUser.relateTo(mutedUser, 'muted') }) - it('whitelists a user', async () => { - await expect(whitelistAction({ id: 'u2' })).resolves.toEqual( + it('unmutes a user', async () => { + await expect(unmuteAction({ id: 'u2' })).resolves.toEqual( expect.objectContaining({ data: { - whitelistUserContent: { id: 'u2', name: 'Blacklisted User', isBlacklisted: false }, + unmuteUser: { id: 'u2', name: 'Muted User', isMuted: false }, }, }), ) }) - describe('whitelisting twice', () => { + describe('unmuting twice', () => { it('has no effect', async () => { - await whitelistAction({ id: 'u2' }) - await expect(whitelistAction({ id: 'u2' })).resolves.toEqual( + await unmuteAction({ id: 'u2' }) + await expect(unmuteAction({ id: 'u2' })).resolves.toEqual( expect.objectContaining({ data: { - whitelistUserContent: { + unmuteUser: { id: 'u2', - name: 'Blacklisted User', - isBlacklisted: false, + name: 'Muted User', + isMuted: false, }, }, }), diff --git a/backend/src/schema/types/type/User.gql b/backend/src/schema/types/type/User.gql index 8af6509b1..93c3f3de9 100644 --- a/backend/src/schema/types/type/User.gql +++ b/backend/src/schema/types/type/User.gql @@ -75,9 +75,9 @@ type User { """ ) - isBlacklisted: Boolean! @cypher( + isMuted: Boolean! @cypher( statement: """ - MATCH (this)<-[: BLACKLISTED]-(u: User { id: $cypherParams.currentUserId}) + MATCH (this)<-[: MUTED]-(u: User { id: $cypherParams.currentUserId}) RETURN COUNT(u) >= 1 """ ) @@ -167,7 +167,7 @@ type Query { filter: _UserFilter ): [User] - blacklistedUsers: [User] + mutedUsers: [User] currentUser: User } @@ -192,8 +192,8 @@ type Mutation { DeleteUser(id: ID!, resource: [Deletable]): User - blacklistUserContent(id: ID!): User - whitelistUserContent(id: ID!): User + muteUser(id: ID!): User + unmuteUser(id: ID!): User block(id: ID!): User unblock(id: ID!): User } diff --git a/backend/src/seed/seed-db.js b/backend/src/seed/seed-db.js index 4442bdde1..d4ce431be 100644 --- a/backend/src/seed/seed-db.js +++ b/backend/src/seed/seed-db.js @@ -226,9 +226,9 @@ const languages = ['de', 'en', 'es', 'fr', 'it', 'pt', 'pl'] dewey.relateTo(huey, 'following'), louie.relateTo(jennyRostock, 'following'), - huey.relateTo(dagobert, 'blacklisted'), - dewey.relateTo(dagobert, 'blacklisted'), - louie.relateTo(dagobert, 'blacklisted'), + huey.relateTo(dagobert, 'muted'), + dewey.relateTo(dagobert, 'muted'), + louie.relateTo(dagobert, 'muted'), dagobert.relateTo(huey, 'blocked'), dagobert.relateTo(dewey, 'blocked'), diff --git a/cypress/integration/common/report.js b/cypress/integration/common/report.js index 7a4652ec3..273793c4e 100644 --- a/cypress/integration/common/report.js +++ b/cypress/integration/common/report.js @@ -7,7 +7,7 @@ import { gql } from '../../../backend/src/helpers/jest' let lastReportTitle let davidIrvingPostTitle = 'The Truth about the Holocaust' let davidIrvingPostSlug = 'the-truth-about-the-holocaust' -let annoyingUserWhoBlacklistedModeratorTitle = 'Fake news' +let annoyingUserWhoMutedModeratorTitle = 'Fake news' const savePostTitle = $post => { return $post @@ -147,9 +147,9 @@ Then('I see all the reported posts including the one from above', () => { }) }) -Then('I see all the reported posts including from the user who blacklisted me', () => { +Then('I see all the reported posts including from the user who muted me', () => { cy.get('table tbody').within(() => { - cy.contains('tr', annoyingUserWhoBlacklistedModeratorTitle) + cy.contains('tr', annoyingUserWhoMutedModeratorTitle) }) }) @@ -159,9 +159,9 @@ Then('each list item links to the post page', () => { }) Then('I can visit the post page', () => { - cy.contains(annoyingUserWhoBlacklistedModeratorTitle).click() + cy.contains(annoyingUserWhoMutedModeratorTitle).click() cy.location('pathname').should('contain', '/post') - .get('h3').should('contain', annoyingUserWhoBlacklistedModeratorTitle) + .get('h3').should('contain', annoyingUserWhoMutedModeratorTitle) }) When("they have a post someone has reported", () => { diff --git a/cypress/integration/common/steps.js b/cypress/integration/common/steps.js index dbbb96645..ba685a09a 100644 --- a/cypress/integration/common/steps.js +++ b/cypress/integration/common/steps.js @@ -39,7 +39,7 @@ Given("I am logged in", () => { cy.login(loginCredentials); }); -Given("I am logged in as the blacklisted user", () => { +Given("I am logged in as the muted user", () => { cy.login({ email: annoyingParams.email, password: '1234' }); }); @@ -424,17 +424,17 @@ Given("there is an annoying user called {string}", name => { }); }); -Given("there is an annoying user who has blacklisted me", () => { +Given("there is an annoying user who has muted me", () => { cy.neode() .first("User", { role: 'moderator' }) - .then(blacklisted => { + .then(mutedUser => { cy.neode() .first("User", { id: 'annoying-user' }) - .relateTo(blacklisted, "blacklisted"); + .relateTo(mutedUser, "muted"); }); }); @@ -518,17 +518,17 @@ Given("I wrote a post {string}", title => { }); }); -When("I blacklist the user {string}", name => { +When("I mute the user {string}", name => { cy.neode() .first("User", { name }) - .then(blacklistedUser => { + .then(mutedUser => { cy.neode() .first("User", { name: narratorParams.name }) - .relateTo(blacklistedUser, "blacklisted"); + .relateTo(mutedUser, "muted"); }); }); diff --git a/cypress/integration/moderation/ReportContent.feature b/cypress/integration/moderation/ReportContent.feature index 6466d3592..c87d41230 100644 --- a/cypress/integration/moderation/ReportContent.feature +++ b/cypress/integration/moderation/ReportContent.feature @@ -11,7 +11,7 @@ Feature: Report and Moderate Given we have the following user accounts: | id | name | | u67 | David Irving | - | annoying-user | I'm gonna blacklist Moderators and Admins HA HA HA | + | annoying-user | I'm gonna mute Moderators and Admins HA HA HA | Given we have the following posts in our database: | authorId | id | title | content | @@ -58,16 +58,16 @@ Feature: Report and Moderate Then I see all the reported posts including the one from above And each list item links to the post page - Scenario: Review reported posts of a user who's blacklisted a moderator + Scenario: Review reported posts of a user who's muted a moderator Given somebody reported the following posts: | submitterEmail | resourceId | reasonCategory | reasonDescription | | p2.submitter@example.org | p2 | other | Offensive content | And my user account has the role "moderator" - And there is an annoying user who has blacklisted me + And there is an annoying user who has muted me And I am logged in When I click on the avatar menu in the top right corner And I click on "Moderation" - Then I see all the reported posts including from the user who blacklisted me + Then I see all the reported posts including from the user who muted me And I can visit the post page Scenario: Normal user can't see the moderation page diff --git a/cypress/integration/user_profile/blacklist-users/Content.feature b/cypress/integration/user_profile/mute-users/Content.feature similarity index 83% rename from cypress/integration/user_profile/blacklist-users/Content.feature rename to cypress/integration/user_profile/mute-users/Content.feature index 7714026ce..ef26c6559 100644 --- a/cypress/integration/user_profile/blacklist-users/Content.feature +++ b/cypress/integration/user_profile/mute-users/Content.feature @@ -1,4 +1,4 @@ -Feature: Blacklist a User +Feature: Mute a User As a user I'd like to have a button to block another user To prevent him from seeing and interacting with my contributions and also to avoid seeing his/her posts @@ -7,10 +7,10 @@ Feature: Blacklist a User Given I have a user account And there is an annoying user called "Spammy Spammer" - Scenario Outline: Blacklisted users cannot see each others posts + Scenario Outline: Muted users cannot see each others posts Given "Spammy Spammer" wrote a post "Spam Spam Spam" And I wrote a post "I hate spammers" - And I I blacklist the user "Spammy Spammer" + And I mute the user "Spammy Spammer" When I log in with: | Email | Password | | | | diff --git a/cypress/integration/user_profile/blacklist-users/Blacklist.feature b/cypress/integration/user_profile/mute-users/Mute.feature similarity index 65% rename from cypress/integration/user_profile/blacklist-users/Blacklist.feature rename to cypress/integration/user_profile/mute-users/Mute.feature index 5548f68d5..b52faeeaa 100644 --- a/cypress/integration/user_profile/blacklist-users/Blacklist.feature +++ b/cypress/integration/user_profile/mute-users/Mute.feature @@ -1,6 +1,6 @@ -Feature: Blacklist a User +Feature: Mute a User As a user - I'd like to have a button to blacklist another user + I'd like to have a button to mute another user To prevent him from seeing and interacting with my contributions and also to avoid seeing his/her posts Background: @@ -8,45 +8,45 @@ Feature: Blacklist a User And there is an annoying user called "Spammy Spammer" And I am logged in - Scenario: Blacklist a user + Scenario: Mute a user Given I am on the profile page of the annoying user - When I click on "Blacklist user" from the content menu in the user info box - And I navigate to my "Blacklisted users" settings page + When I click on "Mute user" from the content menu in the user info box + And I navigate to my "Muted users" settings page Then I can see the following table: | Avatar | Name | | | Spammy Spammer | - Scenario: Blacklist a previously followed user + Scenario: Mute a previously followed user Given I follow the user "Spammy Spammer" And "Spammy Spammer" wrote a post "Spam Spam Spam" When I visit the profile page of the annoying user - And I click on "Blacklist user" from the content menu in the user info box + And I click on "Mute user" from the content menu in the user info box Then the list of posts of this user is empty And nobody is following the user profile anymore - Scenario: Posts of blacklisted users are filtered from search results + Scenario: Posts of muted users are filtered from search results Given we have the following posts in our database: | id | title | content | - | im-not-blacklisted | Post that should be seen | cause I'm not blacklisted | + | im-not-muted | Post that should be seen | cause I'm not muted | Given "Spammy Spammer" wrote a post "Spam Spam Spam" When I search for "Spam" Then I should see the following posts in the select dropdown: | title | | Spam Spam Spam | - When I blacklist the user "Spammy Spammer" + When I mute the user "Spammy Spammer" And I refresh the page And I search for "Spam" Then the search has no results - But I search for "not blacklisted" + But I search for "not muted" Then I should see the following posts in the select dropdown: | title | | Post that should be seen | - Scenario: Blacklisted users can still see my posts + Scenario: Muted users can still see my posts Given I previously created a post - And I blacklist the user "Spammy Spammer" + And I mute the user "Spammy Spammer" Given I log out - And I am logged in as the blacklisted user + And I am logged in as the muted user When I search for "previously created" Then I should see the following posts in the select dropdown: | title | diff --git a/package.json b/package.json index 201924ed1..026652688 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,7 @@ "cypress:backend": "cd backend && yarn run dev", "cypress:webapp": "cd webapp && yarn run dev", "cypress:setup": "run-p cypress:backend cypress:webapp", - "cypress:run": "cross-env cypress run --browser chromium", + "cypress:run": "cross-env cypress run", "cypress:open": "cross-env cypress open --browser chromium", "cucumber:setup": "cd backend && yarn run dev", "cucumber": "wait-on tcp:4000 && cucumber-js --require-module @babel/register --exit", diff --git a/webapp/components/ContentMenu/ContentMenu.spec.js b/webapp/components/ContentMenu/ContentMenu.spec.js index cc8022e72..6ca557a18 100644 --- a/webapp/components/ContentMenu/ContentMenu.spec.js +++ b/webapp/components/ContentMenu/ContentMenu.spec.js @@ -407,49 +407,49 @@ describe('ContentMenu.vue', () => { ).toBe('/settings') }) - it('can blacklist other users', () => { + it('can mute other users', () => { const wrapper = openContentMenu({ isOwner: false, resourceType: 'user', resource: { id: 'd23a4265-f5f7-4e17-9f86-85f714b4b9f8', - isBlacklisted: false, + isMuted: false, }, }) wrapper .findAll('.ds-menu-item') - .filter(item => item.text() === 'settings.blacklisted-users.blacklist') + .filter(item => item.text() === 'settings.muted-users.mute') .at(0) .trigger('click') - expect(wrapper.emitted('blacklist')).toEqual([ + expect(wrapper.emitted('mute')).toEqual([ [ { id: 'd23a4265-f5f7-4e17-9f86-85f714b4b9f8', - isBlacklisted: false, + isMuted: false, }, ], ]) }) - it('can whitelist blacklisted users', () => { + it('can unmute muted users', () => { const wrapper = openContentMenu({ isOwner: false, resourceType: 'user', resource: { id: 'd23a4265-f5f7-4e17-9f86-85f714b4b9f8', - isBlacklisted: true, + isMuted: true, }, }) wrapper .findAll('.ds-menu-item') - .filter(item => item.text() === 'settings.blacklisted-users.whitelist') + .filter(item => item.text() === 'settings.muted-users.unmute') .at(0) .trigger('click') - expect(wrapper.emitted('whitelist')).toEqual([ + expect(wrapper.emitted('unmute')).toEqual([ [ { id: 'd23a4265-f5f7-4e17-9f86-85f714b4b9f8', - isBlacklisted: true, + isMuted: true, }, ], ]) diff --git a/webapp/components/ContentMenu/ContentMenu.vue b/webapp/components/ContentMenu/ContentMenu.vue index e3d7c0969..ab1cc99f5 100644 --- a/webapp/components/ContentMenu/ContentMenu.vue +++ b/webapp/components/ContentMenu/ContentMenu.vue @@ -150,19 +150,19 @@ export default { icon: 'edit', }) } else { - if (this.resource.isBlacklisted) { + if (this.resource.isMuted) { routes.push({ - label: this.$t(`settings.blacklisted-users.whitelist`), + label: this.$t(`settings.muted-users.unmute`), callback: () => { - this.$emit('whitelist', this.resource) + this.$emit('unmute', this.resource) }, icon: 'user-plus', }) } else { routes.push({ - label: this.$t(`settings.blacklisted-users.blacklist`), + label: this.$t(`settings.muted-users.mute`), callback: () => { - this.$emit('blacklist', this.resource) + this.$emit('mute', this.resource) }, icon: 'user-times', }) diff --git a/webapp/components/User/User.story.js b/webapp/components/User/User.story.js index 36e9fefcc..25ccf5f88 100644 --- a/webapp/components/User/User.story.js +++ b/webapp/components/User/User.story.js @@ -48,7 +48,7 @@ export const user = { ], followedByCount: 0, followedByCurrentUser: false, - isBlacklisted: false, + isMuted: false, followedBy: [], socialMedia: [], } diff --git a/webapp/graphql/User.js b/webapp/graphql/User.js index 5b0beac2a..8962830dc 100644 --- a/webapp/graphql/User.js +++ b/webapp/graphql/User.js @@ -23,7 +23,7 @@ export default i18n => { locationName createdAt followedByCurrentUser - isBlacklisted + isMuted following(first: 7) { ...user ...userCounts diff --git a/webapp/graphql/settings/BlacklistedUsers.js b/webapp/graphql/settings/MutedUsers.js similarity index 59% rename from webapp/graphql/settings/BlacklistedUsers.js rename to webapp/graphql/settings/MutedUsers.js index f1518eb39..55ea34769 100644 --- a/webapp/graphql/settings/BlacklistedUsers.js +++ b/webapp/graphql/settings/MutedUsers.js @@ -1,9 +1,9 @@ import gql from 'graphql-tag' -export const blacklistedUsers = () => { +export const mutedUsers = () => { return gql` { - blacklistedUsers { + mutedUsers { id name slug @@ -16,26 +16,26 @@ export const blacklistedUsers = () => { ` } -export const blacklistUserContent = () => { +export const muteUser = () => { return gql` mutation($id: ID!) { - blacklistUserContent(id: $id) { + muteUser(id: $id) { id name - isBlacklisted + isMuted followedByCurrentUser } } ` } -export const whitelistUserContent = () => { +export const unmuteUser = () => { return gql` mutation($id: ID!) { - whitelistUserContent(id: $id) { + unmuteUser(id: $id) { id name - isBlacklisted + isMuted followedByCurrentUser } } diff --git a/webapp/locales/de.json b/webapp/locales/de.json index 767c66649..d526ce6c9 100644 --- a/webapp/locales/de.json +++ b/webapp/locales/de.json @@ -145,7 +145,7 @@ "successAdd": "Social-Media hinzugefügt. Profil aktualisiert!", "successDelete": "Social-Media gelöscht. Profil aktualisiert!" }, - "blacklisted-users": { + "muted-users": { "name": "Blockierte Benutzer", "explanation": { "intro": "Wenn ein anderer Benutzer von dir blockiert wurde, dann passiert folgendes:", @@ -158,12 +158,12 @@ "columns": { "name": "Name", "slug": "Alias", - "whitelist": "Entsperren" + "unmute": "Entsperren" }, "empty": "Bislang hast du niemanden blockiert.", "how-to": "Du kannst andere Benutzer auf deren Profilseite über das Inhaltsmenü blockieren.", - "blacklist": "Nutzer blockieren", - "whitelist": "Nutzer entblocken", + "mute": "Nutzer blockieren", + "unmute": "Nutzer entblocken", "unblocked": "{name} ist wieder entsperrt" }, "privacy": { diff --git a/webapp/locales/en.json b/webapp/locales/en.json index 2e0987e9c..f9ab1f3f5 100644 --- a/webapp/locales/en.json +++ b/webapp/locales/en.json @@ -309,26 +309,26 @@ "successAdd": "Added social media. Updated user profile!", "successDelete": "Deleted social media. Updated user profile!" }, - "blacklisted-users": { - "name": "Blacklisted users", + "muted-users": { + "name": "Muted users", "explanation": { - "intro": "If another user has been blacklisted by you, this is what happens:", - "your-perspective": "The blacklisted person's posts will no longer appear in your news feed.", - "their-perspective": "However: The blacklisted person will still be able to see your posts in their news feed.", - "search": "Posts of blacklisted people disappear from your search results.", - "notifications": "Blacklisted users will still receive notifications if they are mentioned in your posts.", - "closing": "This should be sufficient for filtering out content from blacklisted users." + "intro": "If another user has been muted by you, this is what happens:", + "your-perspective": "The muted person's posts will no longer appear in your news feed.", + "their-perspective": "However: The muted person will still be able to see your posts in their news feed.", + "search": "Posts of muted people disappear from your search results.", + "notifications": "Muted users will still receive notifications if they are mentioned in your posts.", + "closing": "This should be sufficient for filtering out content from muted users." }, "columns": { "name": "Name", "slug": "Slug", - "whitelist": "Whitelist" + "unmute": "Unmute" }, - "empty": "So far, you have not blacklisted anybody.", - "how-to": "You can blacklist other users on their profile page via the content menu.", - "blacklist": "Blacklist user", - "whitelist": "Whitelist user", - "whitelisted": "{name} is whitelisted again" + "empty": "So far, you have not muted anybody.", + "how-to": "You can mute other users on their profile page via the content menu.", + "mute": "Mute user", + "unmute": "Unmute user", + "unmuted": "{name} is unmuted again" } }, "admin": { diff --git a/webapp/locales/es.json b/webapp/locales/es.json index 92d121f10..a8928626c 100644 --- a/webapp/locales/es.json +++ b/webapp/locales/es.json @@ -145,7 +145,7 @@ "successAdd": "Social-Media agregó. Perfil actualizado!", "successDelete": "Social-Media borrado. Perfil actualizado!" }, - "blacklisted-users": { + "muted-users": { "name": "Usuarios bloqueados", "explanation": { "intro": "Si otro usuario ha sido bloqueado por usted, esto es lo que sucede:", @@ -158,12 +158,12 @@ "columns": { "name": "Nombre", "slug": "Alias", - "whitelist": "Desbloquear" + "unmute": "Desbloquear" }, "empty": "Hasta ahora, no ha bloqueado a nadie.", "how-to": "Puede bloquear a otros usuarios en la página de perfil de aquellos a través del menú de contenido.", - "blacklist": "Bloquear usuario", - "whitelist": "Desbloquear usuario", + "mute": "Bloquear usuario", + "unmute": "Desbloquear usuario", "unblocked": "{name} está desbloqueado nuevamente" }, "privacy": { diff --git a/webapp/locales/fr.json b/webapp/locales/fr.json index f0c9da1b4..2215c8b12 100644 --- a/webapp/locales/fr.json +++ b/webapp/locales/fr.json @@ -145,7 +145,7 @@ "successAdd": "Les médias sociaux ont été ajoutés. Profil mis à jour !", "successDelete": "Médias sociaux supprimé. Profil mis à jour !" }, - "blacklisted-users": { + "muted-users": { "name": "Utilisateurs bloqués", "explanation": { "intro": "Si vous avez bloqué un autre utilisateur, voici ce qui se passe:", @@ -158,13 +158,13 @@ "columns": { "name": "Nom", "slug": "Slug", - "whitelist": "" + "unmute": "" }, "empty": "Jusqu'à présent, vous n'avez bloqué personne.", "how-to": "Vous pouvez bloquer d'autres utilisateurs sur leur page de profil via le menu de contenu.", - "blacklist": "Bloquer l'utilisateur", - "whitelist": "Débloquer l'utilisateur", - "unblocked": "{name} est à nouveau débloqué" + "mute": "Bloquer l'utilisateur", + "unmute": "Débloquer l'utilisateur", + "unmuted": "{name} est à nouveau débloqué" }, "privacy": { "name": "", diff --git a/webapp/locales/it.json b/webapp/locales/it.json index 61f8faec7..337e2a960 100644 --- a/webapp/locales/it.json +++ b/webapp/locales/it.json @@ -145,7 +145,7 @@ "successAdd": "Social media aggiunti. \nProfilo utente aggiornato ", "successDelete": "Social media cancellati. Profilo utente aggiornato!" }, - "blacklisted-users": { + "muted-users": { "name": "", "explanation": { "intro": "", @@ -158,13 +158,13 @@ "columns": { "name": "", "slug": "", - "whitelist": "" + "unmute": "" }, "empty": "", "how-to": "", - "blacklist": "", - "whitelist": "", - "unblocked": "" + "mute": "", + "unmute": "", + "unmuted": "" }, "privacy": { "name": "", diff --git a/webapp/locales/pt.json b/webapp/locales/pt.json index 90ad2ca64..e6d381aba 100644 --- a/webapp/locales/pt.json +++ b/webapp/locales/pt.json @@ -145,7 +145,7 @@ "successAdd": "Mídias sociais adicionadas. Perfil de usuário atualizado!", "successDelete": "Mídias sociais removidas. Perfil de usuário atualizado!" }, - "blacklisted-users": { + "muted-users": { "name": "Usuários bloqueados", "explanation": { "intro": "Se outro usuário foi bloqueado por você, isto é o que acontece:", @@ -158,13 +158,13 @@ "columns": { "name": "Nome", "slug": "Slug", - "whitelist": "Desbloquear" + "unmute": "Desbloquear" }, "empty": "Até agora, você não bloqueou ninguém.", "how-to": "Você pode bloquear outros usuários em suas páginas de perfil através do menu de conteúdo.", - "blacklist": "Bloquear usuário", - "whitelist": "Desbloquear usuário", - "unblocked": "{name} está desbloqueado novamente" + "mute": "Bloquear usuário", + "unmute": "Desbloquear usuário", + "unmuted": "{name} está desbloqueado novamente" }, "privacy": { "name": "Privacidade", diff --git a/webapp/locales/ru.json b/webapp/locales/ru.json index 5bbd59715..bbf3211db 100644 --- a/webapp/locales/ru.json +++ b/webapp/locales/ru.json @@ -596,12 +596,12 @@ "placeholder": "Поиск" }, "settings": { - "blacklisted-users": { - "blacklist": "Блокировать", + "muted-users": { + "mute": "Блокировать", "columns": { "name": "Имя", "slug": "Псевдоним", - "whitelist": "Разблокировать" + "unmute": "Разблокировать" }, "empty": "Вы пока никого не блокировали.", "explanation": { @@ -614,8 +614,8 @@ }, "how-to": "Вы можете блокировать других пользователей на странице их профиля с помощью меню профиля.", "name": "Заблокированные пользователи", - "whitelist": "Разблокировать пользователей", - "unblocked": "{name} - снова разблокирован" + "unmute": "Разблокировать пользователей", + "unmuted": "{name} - снова разблокирован" }, "data": { "labelBio": "О себе", diff --git a/webapp/pages/profile/_id/_slug.vue b/webapp/pages/profile/_id/_slug.vue index 4b67acba7..a18b8d22e 100644 --- a/webapp/pages/profile/_id/_slug.vue +++ b/webapp/pages/profile/_id/_slug.vue @@ -22,8 +22,8 @@ :resource="user" :is-owner="myProfile" class="user-content-menu" - @blacklist="blacklistUserContent" - @whitelist="whitelistUserContent" + @mute="muteUser" + @unmute="unmuteUser" /> @@ -67,14 +67,14 @@ @@ -285,7 +285,7 @@ import MasonryGrid from '~/components/MasonryGrid/MasonryGrid.vue' import MasonryGridItem from '~/components/MasonryGrid/MasonryGridItem.vue' import { profilePagePosts } from '~/graphql/PostQuery' import UserQuery from '~/graphql/User' -import { blacklistUserContent, whitelistUserContent } from '~/graphql/settings/BlacklistedUsers' +import { muteUser, unmuteUser } from '~/graphql/settings/MutedUsers' import PostMutations from '~/graphql/PostMutations' import UpdateQuery from '~/components/utils/UpdateQuery' @@ -398,9 +398,9 @@ export default { this.posts = [] this.hasMore = true }, - async blacklistUserContent(user) { + async muteUser(user) { try { - await this.$apollo.mutate({ mutation: blacklistUserContent(), variables: { id: user.id } }) + await this.$apollo.mutate({ mutation: muteUser(), variables: { id: user.id } }) } catch (error) { this.$toast.error(error.message) } finally { @@ -409,9 +409,9 @@ export default { this.$apollo.queries.profilePagePosts.refetch() } }, - async whitelistUserContent(user) { + async unmuteUser(user) { try { - this.$apollo.mutate({ mutation: whitelistUserContent(), variables: { id: user.id } }) + this.$apollo.mutate({ mutation: unmuteUser(), variables: { id: user.id } }) } catch (error) { this.$toast.error(error.message) } finally { diff --git a/webapp/pages/settings.vue b/webapp/pages/settings.vue index c7d95ead9..5684da024 100644 --- a/webapp/pages/settings.vue +++ b/webapp/pages/settings.vue @@ -40,8 +40,8 @@ export default { path: `/settings/my-social-media`, }, { - name: this.$t('settings.blacklisted-users.name'), - path: `/settings/blacklisted-users`, + name: this.$t('settings.muted-users.name'), + path: `/settings/muted-users`, }, { name: this.$t('settings.embeds.name'), diff --git a/webapp/pages/settings/blacklisted-users.spec.js b/webapp/pages/settings/muted-users.spec.js similarity index 67% rename from webapp/pages/settings/blacklisted-users.spec.js rename to webapp/pages/settings/muted-users.spec.js index cf3daf8b0..7d536e45c 100644 --- a/webapp/pages/settings/blacklisted-users.spec.js +++ b/webapp/pages/settings/muted-users.spec.js @@ -1,8 +1,8 @@ import { config, mount, createLocalVue } from '@vue/test-utils' -import BlacklistedUsers from './blacklisted-users.vue' +import MutedUsers from './muted-users.vue' import Styleguide from '@human-connection/styleguide' import Filters from '~/plugins/vue-filters' -import { whitelistUserContent } from '~/graphql/settings/BlacklistedUsers' +import { unmuteUser } from '~/graphql/settings/MutedUsers' const localVue = createLocalVue() @@ -11,7 +11,7 @@ localVue.use(Filters) config.stubs['nuxt-link'] = '' -describe('blacklisted-users.vue', () => { +describe('muted-users.vue', () => { let wrapper let mocks @@ -21,7 +21,7 @@ describe('blacklisted-users.vue', () => { $apollo: { mutate: jest.fn(), queries: { - blacklistedUsers: { + mutedUsers: { refetch: jest.fn(), }, }, @@ -35,7 +35,7 @@ describe('blacklisted-users.vue', () => { describe('mount', () => { const Wrapper = () => { - return mount(BlacklistedUsers, { mocks, localVue }) + return mount(MutedUsers, { mocks, localVue }) } beforeEach(() => { @@ -48,18 +48,18 @@ describe('blacklisted-users.vue', () => { describe('given a list of blocked users', () => { beforeEach(() => { - const blacklistedUsers = [{ id: 'u1', name: 'John Doe', slug: 'john-doe', avatar: '' }] - wrapper.setData({ blacklistedUsers }) + const mutedUsers = [{ id: 'u1', name: 'John Doe', slug: 'john-doe', avatar: '' }] + wrapper.setData({ mutedUsers }) }) - describe('click unblock', () => { + describe('click unmute', () => { beforeEach(() => { wrapper.find('button').trigger('click') }) - it('calls unblock mutation with given user', () => { + it('calls unmute mutation with given user', () => { expect(mocks.$apollo.mutate).toHaveBeenCalledWith({ - mutation: whitelistUserContent(), + mutation: unmuteUser(), variables: { id: 'u1' }, }) }) diff --git a/webapp/pages/settings/blacklisted-users.vue b/webapp/pages/settings/muted-users.vue similarity index 58% rename from webapp/pages/settings/blacklisted-users.vue rename to webapp/pages/settings/muted-users.vue index 50aa27f21..f4eb43df7 100644 --- a/webapp/pages/settings/blacklisted-users.vue +++ b/webapp/pages/settings/muted-users.vue @@ -1,31 +1,31 @@