mirror of
https://github.com/Ocelot-Social-Community/Ocelot-Social.git
synced 2025-12-13 07:46:06 +00:00
Implement 'LeaveGroup' resolver
This commit is contained in:
parent
13e7b1fb9c
commit
6a9c040722
@ -106,6 +106,17 @@ export const joinGroupMutation = gql`
|
|||||||
}
|
}
|
||||||
`
|
`
|
||||||
|
|
||||||
|
export const leaveGroupMutation = gql`
|
||||||
|
mutation ($groupId: ID!, $userId: ID!) {
|
||||||
|
LeaveGroup(groupId: $groupId, userId: $userId) {
|
||||||
|
id
|
||||||
|
name
|
||||||
|
slug
|
||||||
|
myRoleInGroup
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`
|
||||||
|
|
||||||
export const changeGroupMemberRoleMutation = gql`
|
export const changeGroupMemberRoleMutation = gql`
|
||||||
mutation ($groupId: ID!, $userId: ID!, $roleInGroup: GroupMemberRole!) {
|
mutation ($groupId: ID!, $userId: ID!, $roleInGroup: GroupMemberRole!) {
|
||||||
ChangeGroupMemberRole(groupId: $groupId, userId: $userId, roleInGroup: $roleInGroup) {
|
ChangeGroupMemberRole(groupId: $groupId, userId: $userId, roleInGroup: $roleInGroup) {
|
||||||
|
|||||||
@ -191,6 +191,36 @@ const isAllowedToJoinGroup = rule({
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
const isAllowedToLeaveGroup = rule({
|
||||||
|
cache: 'no_cache',
|
||||||
|
})(async (_parent, args, { user, driver }) => {
|
||||||
|
if (!(user && user.id)) return false
|
||||||
|
const { groupId, userId } = args
|
||||||
|
if (user.id !== userId) return false
|
||||||
|
const session = driver.session()
|
||||||
|
const readTxPromise = session.readTransaction(async (transaction) => {
|
||||||
|
const transactionResponse = await transaction.run(
|
||||||
|
`
|
||||||
|
MATCH (member:User {id: $userId})-[membership:MEMBER_OF]->(group:Group {id: $groupId})
|
||||||
|
RETURN group {.*}, member {.*, myRoleInGroup: membership.role}
|
||||||
|
`,
|
||||||
|
{ groupId, userId },
|
||||||
|
)
|
||||||
|
return {
|
||||||
|
group: transactionResponse.records.map((record) => record.get('group'))[0],
|
||||||
|
member: transactionResponse.records.map((record) => record.get('member'))[0],
|
||||||
|
}
|
||||||
|
})
|
||||||
|
try {
|
||||||
|
const { group, member } = await readTxPromise
|
||||||
|
return !!group && !!member && !!member.myRoleInGroup && member.myRoleInGroup !== 'owner'
|
||||||
|
} catch (error) {
|
||||||
|
throw new Error(error)
|
||||||
|
} finally {
|
||||||
|
session.close()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
const isAuthor = rule({
|
const isAuthor = rule({
|
||||||
cache: 'no_cache',
|
cache: 'no_cache',
|
||||||
})(async (_parent, args, { user, driver }) => {
|
})(async (_parent, args, { user, driver }) => {
|
||||||
@ -284,6 +314,7 @@ export default shield(
|
|||||||
CreateGroup: isAuthenticated,
|
CreateGroup: isAuthenticated,
|
||||||
UpdateGroup: isAllowedToChangeGroupSettings,
|
UpdateGroup: isAllowedToChangeGroupSettings,
|
||||||
JoinGroup: isAllowedToJoinGroup,
|
JoinGroup: isAllowedToJoinGroup,
|
||||||
|
LeaveGroup: isAllowedToLeaveGroup,
|
||||||
ChangeGroupMemberRole: isAllowedToChangeGroupMemberRole,
|
ChangeGroupMemberRole: isAllowedToChangeGroupMemberRole,
|
||||||
CreatePost: isAuthenticated,
|
CreatePost: isAuthenticated,
|
||||||
UpdatePost: isAuthor,
|
UpdatePost: isAuthor,
|
||||||
|
|||||||
@ -251,6 +251,27 @@ export default {
|
|||||||
session.close()
|
session.close()
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
LeaveGroup: async (_parent, params, context, _resolveInfo) => {
|
||||||
|
const { groupId, userId } = params
|
||||||
|
const session = context.driver.session()
|
||||||
|
const writeTxResultPromise = session.writeTransaction(async (transaction) => {
|
||||||
|
const leaveGroupCypher = `
|
||||||
|
MATCH (member:User {id: $userId})-[membership:MEMBER_OF]->(group:Group {id: $groupId})
|
||||||
|
DELETE membership
|
||||||
|
RETURN member {.*, myRoleInGroup: NULL}
|
||||||
|
`
|
||||||
|
const transactionResponse = await transaction.run(leaveGroupCypher, { groupId, userId })
|
||||||
|
const [member] = await transactionResponse.records.map((record) => record.get('member'))
|
||||||
|
return member
|
||||||
|
})
|
||||||
|
try {
|
||||||
|
return await writeTxResultPromise
|
||||||
|
} catch (error) {
|
||||||
|
throw new Error(error)
|
||||||
|
} finally {
|
||||||
|
session.close()
|
||||||
|
}
|
||||||
|
},
|
||||||
ChangeGroupMemberRole: async (_parent, params, context, _resolveInfo) => {
|
ChangeGroupMemberRole: async (_parent, params, context, _resolveInfo) => {
|
||||||
const { groupId, userId, roleInGroup } = params
|
const { groupId, userId, roleInGroup } = params
|
||||||
const session = context.driver.session()
|
const session = context.driver.session()
|
||||||
|
|||||||
@ -117,6 +117,11 @@ type Mutation {
|
|||||||
userId: ID!
|
userId: ID!
|
||||||
): User
|
): User
|
||||||
|
|
||||||
|
LeaveGroup(
|
||||||
|
groupId: ID!
|
||||||
|
userId: ID!
|
||||||
|
): User
|
||||||
|
|
||||||
ChangeGroupMemberRole(
|
ChangeGroupMemberRole(
|
||||||
groupId: ID!
|
groupId: ID!
|
||||||
userId: ID!
|
userId: ID!
|
||||||
|
|||||||
@ -106,6 +106,17 @@ export const joinGroupMutation = gql`
|
|||||||
}
|
}
|
||||||
`
|
`
|
||||||
|
|
||||||
|
export const leaveGroupMutation = gql`
|
||||||
|
mutation ($groupId: ID!, $userId: ID!) {
|
||||||
|
LeaveGroup(groupId: $groupId, userId: $userId) {
|
||||||
|
id
|
||||||
|
name
|
||||||
|
slug
|
||||||
|
myRoleInGroup
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`
|
||||||
|
|
||||||
export const changeGroupMemberRoleMutation = gql`
|
export const changeGroupMemberRoleMutation = gql`
|
||||||
mutation ($groupId: ID!, $userId: ID!, $roleInGroup: GroupMemberRole!) {
|
mutation ($groupId: ID!, $userId: ID!, $roleInGroup: GroupMemberRole!) {
|
||||||
ChangeGroupMemberRole(groupId: $groupId, userId: $userId, roleInGroup: $roleInGroup) {
|
ChangeGroupMemberRole(groupId: $groupId, userId: $userId, roleInGroup: $roleInGroup) {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user