diff --git a/backend/src/middleware/permissionsMiddleware.js b/backend/src/middleware/permissionsMiddleware.js index f4f8c654b..734931df2 100644 --- a/backend/src/middleware/permissionsMiddleware.js +++ b/backend/src/middleware/permissionsMiddleware.js @@ -149,6 +149,7 @@ export default shield( pinPost: isAdmin, unpinPost: isAdmin, UpdateDonations: isAdmin, + switchUserRole: isAdmin, }, User: { email: or(isMyOwn, isAdmin), diff --git a/backend/src/schema/resolvers/users.js b/backend/src/schema/resolvers/users.js index e276968e5..789ca2a37 100644 --- a/backend/src/schema/resolvers/users.js +++ b/backend/src/schema/resolvers/users.js @@ -244,6 +244,30 @@ export default { session.close() } }, + switchUserRole: async (object, args, context, resolveInfo) => { + const { role, id } = args + + const session = context.driver.session() + const writeTxResultPromise = session.writeTransaction(async (transaction) => { + const switchUserRoleResponse = await transaction.run( + ` + MATCH (user:User {id: $id}) + SET user.role = $role + SET user.updatedAt = toString(datetime()) + RETURN user {.*} + `, + { id, role }, + ) + const [user] = switchUserRoleResponse.records.map((record) => record.get('user')) + return user + }) + try { + const user = await writeTxResultPromise + return user + } finally { + session.close() + } + }, }, User: { email: async (parent, params, context, resolveInfo) => { diff --git a/backend/src/schema/types/type/User.gql b/backend/src/schema/types/type/User.gql index e6e7191c5..17115c5ab 100644 --- a/backend/src/schema/types/type/User.gql +++ b/backend/src/schema/types/type/User.gql @@ -212,4 +212,6 @@ type Mutation { unmuteUser(id: ID!): User blockUser(id: ID!): User unblockUser(id: ID!): User + + switchUserRole(role: UserGroup!, id: ID!): User }