From d96cb32f11957e42dd1499d0122e15602e254025 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Fri, 30 Jan 2026 04:56:03 +0100 Subject: [PATCH] refactor(backend): properly model group-membership (#9124) --- .../graphql/queries/ChangeGroupMemberRole.ts | 12 +- backend/src/graphql/queries/GroupMembers.ts | 12 +- backend/src/graphql/queries/JoinGroup.ts | 12 +- backend/src/graphql/queries/LeaveGroup.ts | 12 +- .../graphql/queries/RemoveUserFromGroup.ts | 12 +- backend/src/graphql/resolvers/groups.spec.ts | 360 +++++++++++++----- backend/src/graphql/resolvers/groups.ts | 31 +- .../src/graphql/resolvers/inviteCodes.spec.ts | 24 +- backend/src/graphql/types/type/Group.gql | 15 +- .../{MEMBER_OF.gql.unused => MEMBER_OF.gql} | 0 backend/src/graphql/types/type/User.gql | 2 - .../CallToAction/CtaJoinLeaveGroup.spec.js | 24 +- webapp/components/Group/GroupMember.spec.js | 38 +- webapp/components/Group/GroupMember.vue | 24 +- webapp/graphql/groups.js | 64 ++-- webapp/pages/groups/_id/_slug.spec.js | 84 +++- webapp/pages/groups/_id/_slug.vue | 2 +- 17 files changed, 521 insertions(+), 207 deletions(-) rename backend/src/graphql/types/type/{MEMBER_OF.gql.unused => MEMBER_OF.gql} (100%) diff --git a/backend/src/graphql/queries/ChangeGroupMemberRole.ts b/backend/src/graphql/queries/ChangeGroupMemberRole.ts index 7c54be38f..691853589 100644 --- a/backend/src/graphql/queries/ChangeGroupMemberRole.ts +++ b/backend/src/graphql/queries/ChangeGroupMemberRole.ts @@ -3,10 +3,14 @@ import gql from 'graphql-tag' export const ChangeGroupMemberRole = gql` mutation ($groupId: ID!, $userId: ID!, $roleInGroup: GroupMemberRole!) { ChangeGroupMemberRole(groupId: $groupId, userId: $userId, roleInGroup: $roleInGroup) { - id - name - slug - myRoleInGroup + user { + id + name + slug + } + membership { + role + } } } ` diff --git a/backend/src/graphql/queries/GroupMembers.ts b/backend/src/graphql/queries/GroupMembers.ts index 5950952cb..74a78686a 100644 --- a/backend/src/graphql/queries/GroupMembers.ts +++ b/backend/src/graphql/queries/GroupMembers.ts @@ -3,10 +3,14 @@ import gql from 'graphql-tag' export const GroupMembers = gql` query GroupMembers($id: ID!) { GroupMembers(id: $id) { - id - name - slug - myRoleInGroup + user { + id + name + slug + } + membership { + role + } } } ` diff --git a/backend/src/graphql/queries/JoinGroup.ts b/backend/src/graphql/queries/JoinGroup.ts index d7bcdc6c3..7297423bb 100644 --- a/backend/src/graphql/queries/JoinGroup.ts +++ b/backend/src/graphql/queries/JoinGroup.ts @@ -3,10 +3,14 @@ import gql from 'graphql-tag' export const JoinGroup = gql` mutation ($groupId: ID!, $userId: ID!) { JoinGroup(groupId: $groupId, userId: $userId) { - id - name - slug - myRoleInGroup + user { + id + name + slug + } + membership { + role + } } } ` diff --git a/backend/src/graphql/queries/LeaveGroup.ts b/backend/src/graphql/queries/LeaveGroup.ts index ce0973e6d..d7e17a040 100644 --- a/backend/src/graphql/queries/LeaveGroup.ts +++ b/backend/src/graphql/queries/LeaveGroup.ts @@ -3,10 +3,14 @@ import gql from 'graphql-tag' export const LeaveGroup = gql` mutation ($groupId: ID!, $userId: ID!) { LeaveGroup(groupId: $groupId, userId: $userId) { - id - name - slug - myRoleInGroup + user { + id + name + slug + } + membership { + role + } } } ` diff --git a/backend/src/graphql/queries/RemoveUserFromGroup.ts b/backend/src/graphql/queries/RemoveUserFromGroup.ts index e827807df..0864d1e4f 100644 --- a/backend/src/graphql/queries/RemoveUserFromGroup.ts +++ b/backend/src/graphql/queries/RemoveUserFromGroup.ts @@ -3,10 +3,14 @@ import gql from 'graphql-tag' export const RemoveUserFromGroup = gql` mutation ($groupId: ID!, $userId: ID!) { RemoveUserFromGroup(groupId: $groupId, userId: $userId) { - id - name - slug - myRoleInGroup + user { + id + name + slug + } + membership { + role + } } } ` diff --git a/backend/src/graphql/resolvers/groups.spec.ts b/backend/src/graphql/resolvers/groups.spec.ts index aaf9eeae9..2dd41d406 100644 --- a/backend/src/graphql/resolvers/groups.spec.ts +++ b/backend/src/graphql/resolvers/groups.spec.ts @@ -891,8 +891,12 @@ describe('in mode', () => { ).resolves.toMatchObject({ data: { JoinGroup: { - id: 'owner-of-closed-group', - myRoleInGroup: 'usual', + user: { + id: 'owner-of-closed-group', + }, + membership: { + role: 'usual', + }, }, }, errors: undefined, @@ -914,8 +918,12 @@ describe('in mode', () => { ).resolves.toMatchObject({ data: { JoinGroup: { - id: 'current-user', - myRoleInGroup: 'owner', + user: { + id: 'current-user', + }, + membership: { + role: 'owner', + }, }, }, errors: undefined, @@ -939,8 +947,12 @@ describe('in mode', () => { ).resolves.toMatchObject({ data: { JoinGroup: { - id: 'current-user', - myRoleInGroup: 'pending', + user: { + id: 'current-user', + }, + membership: { + role: 'pending', + }, }, }, errors: undefined, @@ -962,8 +974,12 @@ describe('in mode', () => { ).resolves.toMatchObject({ data: { JoinGroup: { - id: 'owner-of-closed-group', - myRoleInGroup: 'owner', + user: { + id: 'owner-of-closed-group', + }, + membership: { + role: 'owner', + }, }, }, errors: undefined, @@ -1001,8 +1017,12 @@ describe('in mode', () => { ).resolves.toMatchObject({ data: { JoinGroup: { - id: 'owner-of-hidden-group', - myRoleInGroup: 'owner', + user: { + id: 'owner-of-hidden-group', + }, + membership: { + role: 'owner', + }, }, }, errors: undefined, @@ -1208,16 +1228,28 @@ describe('in mode', () => { data: { GroupMembers: expect.arrayContaining([ expect.objectContaining({ - id: 'current-user', - myRoleInGroup: 'owner', + user: expect.objectContaining({ + id: 'current-user', + }), + membership: expect.objectContaining({ + role: 'owner', + }), }), expect.objectContaining({ - id: 'owner-of-closed-group', - myRoleInGroup: 'usual', + user: expect.objectContaining({ + id: 'owner-of-closed-group', + }), + membership: expect.objectContaining({ + role: 'usual', + }), }), expect.objectContaining({ - id: 'owner-of-hidden-group', - myRoleInGroup: 'usual', + user: expect.objectContaining({ + id: 'owner-of-hidden-group', + }), + membership: expect.objectContaining({ + role: 'usual', + }), }), ]), }, @@ -1241,16 +1273,28 @@ describe('in mode', () => { data: { GroupMembers: expect.arrayContaining([ expect.objectContaining({ - id: 'current-user', - myRoleInGroup: 'owner', + user: expect.objectContaining({ + id: 'current-user', + }), + membership: expect.objectContaining({ + role: 'owner', + }), }), expect.objectContaining({ - id: 'owner-of-closed-group', - myRoleInGroup: 'usual', + user: expect.objectContaining({ + id: 'owner-of-closed-group', + }), + membership: expect.objectContaining({ + role: 'usual', + }), }), expect.objectContaining({ - id: 'owner-of-hidden-group', - myRoleInGroup: 'usual', + user: expect.objectContaining({ + id: 'owner-of-hidden-group', + }), + membership: expect.objectContaining({ + role: 'usual', + }), }), ]), }, @@ -1274,16 +1318,28 @@ describe('in mode', () => { data: { GroupMembers: expect.arrayContaining([ expect.objectContaining({ - id: 'current-user', - myRoleInGroup: 'owner', + user: expect.objectContaining({ + id: 'current-user', + }), + membership: expect.objectContaining({ + role: 'owner', + }), }), expect.objectContaining({ - id: 'owner-of-closed-group', - myRoleInGroup: 'usual', + user: expect.objectContaining({ + id: 'owner-of-closed-group', + }), + membership: expect.objectContaining({ + role: 'usual', + }), }), expect.objectContaining({ - id: 'owner-of-hidden-group', - myRoleInGroup: 'usual', + user: expect.objectContaining({ + id: 'owner-of-hidden-group', + }), + membership: expect.objectContaining({ + role: 'usual', + }), }), ]), }, @@ -1317,16 +1373,28 @@ describe('in mode', () => { data: { GroupMembers: expect.arrayContaining([ expect.objectContaining({ - id: 'current-user', - myRoleInGroup: 'pending', + user: expect.objectContaining({ + id: 'current-user', + }), + membership: expect.objectContaining({ + role: 'pending', + }), }), expect.objectContaining({ - id: 'owner-of-closed-group', - myRoleInGroup: 'owner', + user: expect.objectContaining({ + id: 'owner-of-closed-group', + }), + membership: expect.objectContaining({ + role: 'owner', + }), }), expect.objectContaining({ - id: 'owner-of-hidden-group', - myRoleInGroup: 'usual', + user: expect.objectContaining({ + id: 'owner-of-hidden-group', + }), + membership: expect.objectContaining({ + role: 'usual', + }), }), ]), }, @@ -1350,16 +1418,28 @@ describe('in mode', () => { data: { GroupMembers: expect.arrayContaining([ expect.objectContaining({ - id: 'current-user', - myRoleInGroup: 'pending', + user: expect.objectContaining({ + id: 'current-user', + }), + membership: expect.objectContaining({ + role: 'pending', + }), }), expect.objectContaining({ - id: 'owner-of-closed-group', - myRoleInGroup: 'owner', + user: expect.objectContaining({ + id: 'owner-of-closed-group', + }), + membership: expect.objectContaining({ + role: 'owner', + }), }), expect.objectContaining({ - id: 'owner-of-hidden-group', - myRoleInGroup: 'usual', + user: expect.objectContaining({ + id: 'owner-of-hidden-group', + }), + membership: expect.objectContaining({ + role: 'usual', + }), }), ]), }, @@ -1415,20 +1495,36 @@ describe('in mode', () => { data: { GroupMembers: expect.arrayContaining([ expect.objectContaining({ - id: 'pending-user', - myRoleInGroup: 'pending', + user: expect.objectContaining({ + id: 'pending-user', + }), + membership: expect.objectContaining({ + role: 'pending', + }), }), expect.objectContaining({ - id: 'current-user', - myRoleInGroup: 'usual', + user: expect.objectContaining({ + id: 'current-user', + }), + membership: expect.objectContaining({ + role: 'usual', + }), }), expect.objectContaining({ - id: 'owner-of-closed-group', - myRoleInGroup: 'admin', + user: expect.objectContaining({ + id: 'owner-of-closed-group', + }), + membership: expect.objectContaining({ + role: 'admin', + }), }), expect.objectContaining({ - id: 'owner-of-hidden-group', - myRoleInGroup: 'owner', + user: expect.objectContaining({ + id: 'owner-of-hidden-group', + }), + membership: expect.objectContaining({ + role: 'owner', + }), }), ]), }, @@ -1452,20 +1548,36 @@ describe('in mode', () => { data: { GroupMembers: expect.arrayContaining([ expect.objectContaining({ - id: 'pending-user', - myRoleInGroup: 'pending', + user: expect.objectContaining({ + id: 'pending-user', + }), + membership: expect.objectContaining({ + role: 'pending', + }), }), expect.objectContaining({ - id: 'current-user', - myRoleInGroup: 'usual', + user: expect.objectContaining({ + id: 'current-user', + }), + membership: expect.objectContaining({ + role: 'usual', + }), }), expect.objectContaining({ - id: 'owner-of-closed-group', - myRoleInGroup: 'admin', + user: expect.objectContaining({ + id: 'owner-of-closed-group', + }), + membership: expect.objectContaining({ + role: 'admin', + }), }), expect.objectContaining({ - id: 'owner-of-hidden-group', - myRoleInGroup: 'owner', + user: expect.objectContaining({ + id: 'owner-of-hidden-group', + }), + membership: expect.objectContaining({ + role: 'owner', + }), }), ]), }, @@ -1489,20 +1601,36 @@ describe('in mode', () => { data: { GroupMembers: expect.arrayContaining([ expect.objectContaining({ - id: 'pending-user', - myRoleInGroup: 'pending', + user: expect.objectContaining({ + id: 'pending-user', + }), + membership: expect.objectContaining({ + role: 'pending', + }), }), expect.objectContaining({ - id: 'current-user', - myRoleInGroup: 'usual', + user: expect.objectContaining({ + id: 'current-user', + }), + membership: expect.objectContaining({ + role: 'usual', + }), }), expect.objectContaining({ - id: 'owner-of-closed-group', - myRoleInGroup: 'admin', + user: expect.objectContaining({ + id: 'owner-of-closed-group', + }), + membership: expect.objectContaining({ + role: 'admin', + }), }), expect.objectContaining({ - id: 'owner-of-hidden-group', - myRoleInGroup: 'owner', + user: expect.objectContaining({ + id: 'owner-of-hidden-group', + }), + membership: expect.objectContaining({ + role: 'owner', + }), }), ]), }, @@ -1600,8 +1728,12 @@ describe('in mode', () => { ).resolves.toMatchObject({ data: { ChangeGroupMemberRole: { - id: 'usual-member-user', - myRoleInGroup: 'usual', + user: { + id: 'usual-member-user', + }, + membership: { + role: 'usual', + }, }, }, errors: undefined, @@ -1638,8 +1770,12 @@ describe('in mode', () => { ).resolves.toMatchObject({ data: { ChangeGroupMemberRole: { - id: 'admin-member-user', - myRoleInGroup: 'admin', + user: { + id: 'admin-member-user', + }, + membership: { + role: 'admin', + }, }, }, errors: undefined, @@ -1673,8 +1809,12 @@ describe('in mode', () => { ).resolves.toMatchObject({ data: { ChangeGroupMemberRole: { - id: 'second-owner-member-user', - myRoleInGroup: 'owner', + user: { + id: 'second-owner-member-user', + }, + membership: { + role: 'owner', + }, }, }, errors: undefined, @@ -1759,8 +1899,12 @@ describe('in mode', () => { ).resolves.toMatchObject({ data: { ChangeGroupMemberRole: { - id: 'owner-member-user', - myRoleInGroup: 'owner', + user: { + id: 'owner-member-user', + }, + membership: { + role: 'owner', + }, }, }, errors: undefined, @@ -1869,8 +2013,12 @@ describe('in mode', () => { ).resolves.toMatchObject({ data: { ChangeGroupMemberRole: { - id: 'admin-member-user', - myRoleInGroup: 'owner', + user: { + id: 'admin-member-user', + }, + membership: { + role: 'owner', + }, }, }, errors: undefined, @@ -2047,8 +2195,12 @@ describe('in mode', () => { ).resolves.toMatchObject({ data: { ChangeGroupMemberRole: { - id: 'usual-member-user', - myRoleInGroup: 'admin', + user: { + id: 'usual-member-user', + }, + membership: { + role: 'admin', + }, }, }, errors: undefined, @@ -2073,8 +2225,12 @@ describe('in mode', () => { ).resolves.toMatchObject({ data: { ChangeGroupMemberRole: { - id: 'usual-member-user', - myRoleInGroup: 'usual', + user: { + id: 'usual-member-user', + }, + membership: { + role: 'usual', + }, }, }, errors: undefined, @@ -2234,8 +2390,12 @@ describe('in mode', () => { ).resolves.toMatchObject({ data: { ChangeGroupMemberRole: { - id: 'pending-member-user', - myRoleInGroup: 'usual', + user: { + id: 'pending-member-user', + }, + membership: { + role: 'usual', + }, }, }, errors: undefined, @@ -2260,8 +2420,12 @@ describe('in mode', () => { ).resolves.toMatchObject({ data: { ChangeGroupMemberRole: { - id: 'pending-member-user', - myRoleInGroup: 'pending', + user: { + id: 'pending-member-user', + }, + membership: { + role: 'pending', + }, }, }, errors: undefined, @@ -2413,7 +2577,7 @@ describe('in mode', () => { }, }) return result.data?.GroupMembers - ? !!result.data.GroupMembers.find((member) => member.id === userId) + ? !!result.data.GroupMembers.find((member) => member.user.id === userId) : null } @@ -2440,8 +2604,10 @@ describe('in mode', () => { ).resolves.toMatchObject({ data: { LeaveGroup: { - id: 'pending-member-user', - myRoleInGroup: null, + user: { + id: 'pending-member-user', + }, + membership: null, }, }, errors: undefined, @@ -2467,8 +2633,10 @@ describe('in mode', () => { ).resolves.toMatchObject({ data: { LeaveGroup: { - id: 'usual-member-user', - myRoleInGroup: null, + user: { + id: 'usual-member-user', + }, + membership: null, }, }, errors: undefined, @@ -2494,8 +2662,10 @@ describe('in mode', () => { ).resolves.toMatchObject({ data: { LeaveGroup: { - id: 'admin-member-user', - myRoleInGroup: null, + user: { + id: 'admin-member-user', + }, + membership: null, }, }, errors: undefined, @@ -3021,8 +3191,10 @@ describe('in mode', () => { ).resolves.toMatchObject({ data: { RemoveUserFromGroup: expect.objectContaining({ - id: 'usual-member-user', - myRoleInGroup: null, + user: expect.objectContaining({ + id: 'usual-member-user', + }), + membership: null, }), }, errors: undefined, @@ -3093,8 +3265,10 @@ describe('in mode', () => { ).resolves.toMatchObject({ data: { RemoveUserFromGroup: expect.objectContaining({ - id: 'usual-member-user', - myRoleInGroup: null, + user: { + id: 'usual-member-user', + }, + membership: null, }), }, errors: undefined, diff --git a/backend/src/graphql/resolvers/groups.ts b/backend/src/graphql/resolvers/groups.ts index be493062a..351143009 100644 --- a/backend/src/graphql/resolvers/groups.ts +++ b/backend/src/graphql/resolvers/groups.ts @@ -63,7 +63,7 @@ export default { const readTxResultPromise = session.readTransaction(async (txc) => { const groupMemberCypher = ` MATCH (user:User)-[membership:MEMBER_OF]->(:Group {id: $groupId}) - RETURN user {.*, myRoleInGroup: membership.role} + RETURN user {.*}, membership {.*} SKIP toInteger($offset) LIMIT toInteger($first) ` const transactionResponse = await txc.run(groupMemberCypher, { @@ -71,7 +71,9 @@ export default { first, offset, }) - return transactionResponse.records.map((record) => record.get('user')) + return transactionResponse.records.map((record) => { + return { user: record.get('user'), membership: record.get('membership') } + }) }) try { return await readTxResultPromise @@ -273,8 +275,8 @@ export default { const session = context.driver.session() const writeTxResultPromise = session.writeTransaction(async (transaction) => { const joinGroupCypher = ` - MATCH (member:User {id: $userId}), (group:Group {id: $groupId}) - MERGE (member)-[membership:MEMBER_OF]->(group) + MATCH (user:User {id: $userId}), (group:Group {id: $groupId}) + MERGE (user)-[membership:MEMBER_OF]->(group) ON CREATE SET membership.createdAt = toString(datetime()), membership.updatedAt = null, @@ -283,14 +285,15 @@ export default { THEN 'usual' ELSE 'pending' END - RETURN member {.*, myRoleInGroup: membership.role} + RETURN user {.*}, membership {.*} ` const transactionResponse = await transaction.run(joinGroupCypher, { groupId, userId }) - const [member] = transactionResponse.records.map((record) => record.get('member')) - return member + return transactionResponse.records.map((record) => { + return { user: record.get('user'), membership: record.get('membership') } + }) }) try { - return await writeTxResultPromise + return (await writeTxResultPromise)[0] } catch (error) { throw new Error(error) } finally { @@ -337,7 +340,7 @@ export default { membership.updatedAt = toString(datetime()), membership.role = $roleInGroup ${postRestrictionCypher} - RETURN member {.*, myRoleInGroup: membership.role} + RETURN member {.*} as user, membership {.*} ` const transactionResponse = await transaction.run(joinGroupCypher, { @@ -345,7 +348,9 @@ export default { userId, roleInGroup, }) - const [member] = transactionResponse.records.map((record) => record.get('member')) + const [member] = transactionResponse.records.map((record) => { + return { user: record.get('user'), membership: record.get('membership') } + }) return member }) try { @@ -528,14 +533,16 @@ const removeUserFromGroupWriteTxResultPromise = async (session, groupId, userId) WITH user, collect(p) AS posts FOREACH (post IN posts | MERGE (user)-[:CANNOT_SEE]->(post)) - RETURN user {.*, myRoleInGroup: NULL} + RETURN user {.*}, NULL as membership ` const transactionResponse = await transaction.run(removeUserFromGroupCypher, { groupId, userId, }) - const [user] = await transactionResponse.records.map((record) => record.get('user')) + const [user] = await transactionResponse.records.map((record) => { + return { user: record.get('user'), membership: record.get('membership') } + }) return user }) } diff --git a/backend/src/graphql/resolvers/inviteCodes.spec.ts b/backend/src/graphql/resolvers/inviteCodes.spec.ts index f40fd1b27..d74694759 100644 --- a/backend/src/graphql/resolvers/inviteCodes.spec.ts +++ b/backend/src/graphql/resolvers/inviteCodes.spec.ts @@ -1089,16 +1089,24 @@ describe('redeemInviteCode', () => { data: { GroupMembers: expect.arrayContaining([ { - id: 'inviting-user', - myRoleInGroup: 'owner', - name: 'Inviting User', - slug: 'inviting-user', + user: { + id: 'inviting-user', + name: 'Inviting User', + slug: 'inviting-user', + }, + membership: { + role: 'owner', + }, }, { - id: 'other-user', - myRoleInGroup: 'pending', - name: 'Other User', - slug: 'other-user', + user: { + id: 'other-user', + name: 'Other User', + slug: 'other-user', + }, + membership: { + role: 'pending', + }, }, ]), }, diff --git a/backend/src/graphql/types/type/Group.gql b/backend/src/graphql/types/type/Group.gql index 4b9ec614e..5037c83a0 100644 --- a/backend/src/graphql/types/type/Group.gql +++ b/backend/src/graphql/types/type/Group.gql @@ -55,6 +55,11 @@ type Group { currentlyPinnedPostsCount: Int! @neo4j_ignore } +type GroupMember { + user: User + membership: MEMBER_OF +} + input _GroupFilter { AND: [_GroupFilter!] OR: [_GroupFilter!] @@ -82,7 +87,7 @@ type Query { # orderBy: [_GroupOrdering] # not implemented yet # filter: _GroupFilter # not implemented yet - GroupMembers(id: ID!, first: Int, offset: Int): [User] + GroupMembers(id: ID!, first: Int, offset: Int): [GroupMember] # orderBy: [_UserOrdering] # not implemented yet # filter: _UserFilter # not implemented yet @@ -128,13 +133,13 @@ type Mutation { # DeleteGroup(id: ID!): Group - JoinGroup(groupId: ID!, userId: ID!): User + JoinGroup(groupId: ID!, userId: ID!): GroupMember - LeaveGroup(groupId: ID!, userId: ID!): User + LeaveGroup(groupId: ID!, userId: ID!): GroupMember - ChangeGroupMemberRole(groupId: ID!, userId: ID!, roleInGroup: GroupMemberRole!): User + ChangeGroupMemberRole(groupId: ID!, userId: ID!, roleInGroup: GroupMemberRole!): GroupMember - RemoveUserFromGroup(groupId: ID!, userId: ID!): User + RemoveUserFromGroup(groupId: ID!, userId: ID!): GroupMember muteGroup(groupId: ID!): Group unmuteGroup(groupId: ID!): Group diff --git a/backend/src/graphql/types/type/MEMBER_OF.gql.unused b/backend/src/graphql/types/type/MEMBER_OF.gql similarity index 100% rename from backend/src/graphql/types/type/MEMBER_OF.gql.unused rename to backend/src/graphql/types/type/MEMBER_OF.gql diff --git a/backend/src/graphql/types/type/User.gql b/backend/src/graphql/types/type/User.gql index 51ef78388..ae02ce454 100644 --- a/backend/src/graphql/types/type/User.gql +++ b/backend/src/graphql/types/type/User.gql @@ -153,8 +153,6 @@ type User { emotions: [EMOTED] activeCategories: [String] @neo4j_ignore - - myRoleInGroup: GroupMemberRole } input _UserFilter { diff --git a/webapp/components/Empty/CallToAction/CtaJoinLeaveGroup.spec.js b/webapp/components/Empty/CallToAction/CtaJoinLeaveGroup.spec.js index f0a1026a5..49b3b2386 100755 --- a/webapp/components/Empty/CallToAction/CtaJoinLeaveGroup.spec.js +++ b/webapp/components/Empty/CallToAction/CtaJoinLeaveGroup.spec.js @@ -52,10 +52,14 @@ describe('CtaJoinLeaveGroup.vue', () => { mocks.$apollo.mutate = jest.fn().mockResolvedValue({ data: { JoinGroup: { - id: 'g-123', - slug: 'group-123', - name: 'Group 123', - myRoleInGroup: 'usual', + user: { + id: 'g-123', + slug: 'group-123', + name: 'Group 123', + }, + membership: { + role: 'usual', + }, }, }, }) @@ -66,10 +70,14 @@ describe('CtaJoinLeaveGroup.vue', () => { expect(wrapper.emitted().update).toEqual([ [ { - id: 'g-123', - slug: 'group-123', - name: 'Group 123', - myRoleInGroup: 'usual', + user: { + id: 'g-123', + slug: 'group-123', + name: 'Group 123', + }, + membership: { + role: 'usual', + }, }, ], ]) diff --git a/webapp/components/Group/GroupMember.spec.js b/webapp/components/Group/GroupMember.spec.js index 8efc754ad..e6c3ea38f 100644 --- a/webapp/components/Group/GroupMember.spec.js +++ b/webapp/components/Group/GroupMember.spec.js @@ -8,14 +8,22 @@ const propsData = { groupId: 'group-id', groupMembers: [ { - slug: 'owner', - id: 'owner', - myRoleInGroup: 'owner', + user: { + slug: 'owner', + id: 'owner', + }, + membership: { + role: 'owner', + }, }, { - slug: 'user', - id: 'user', - myRoleInGroup: 'usual', + user: { + slug: 'user', + id: 'user', + }, + membership: { + role: 'usual', + }, }, ], } @@ -30,9 +38,13 @@ const apolloMock = jest .mockResolvedValue({ data: { ChangeGroupMemberRole: { - slug: 'user', - id: 'user', - myRoleInGroup: 'admin', + user: { + slug: 'user', + id: 'user', + }, + membership: { + role: 'admin', + }, }, }, }) @@ -117,9 +129,11 @@ describe('GroupMember', () => { apolloMock.mockRejectedValueOnce({ message: 'Oh no!!' }).mockResolvedValue({ data: { RemoveUserFromGroup: { - slug: 'user', - id: 'user', - myRoleInGroup: null, + user: { + slug: 'user', + id: 'user', + }, + membership: null, }, }, }) diff --git a/webapp/components/Group/GroupMember.vue b/webapp/components/Group/GroupMember.vue index 62a2bf187..40b321134 100644 --- a/webapp/components/Group/GroupMember.vue +++ b/webapp/components/Group/GroupMember.vue @@ -7,21 +7,21 @@ - + @@ -29,37 +29,37 @@ - {{ `@${scope.row.slug}` | truncate(20) }} + {{ `@${scope.row.user.slug}` | truncate(20) }}