diff --git a/backend/src/graphql/resolver/UserResolver.test.ts b/backend/src/graphql/resolver/UserResolver.test.ts index 8def5daeb..6117d96cd 100644 --- a/backend/src/graphql/resolver/UserResolver.test.ts +++ b/backend/src/graphql/resolver/UserResolver.test.ts @@ -434,15 +434,13 @@ describe('UserResolver', () => { beforeAll(async () => { await userFactory(testEnv, peterLustig) await userFactory(testEnv, bobBaumeister) - const loginResult = await mutate({ mutation: login, variables: bobData }) - console.log('login result=', loginResult) + await mutate({ mutation: login, variables: bobData }) // create contribution as user bob contribution = await mutate({ mutation: createContribution, variables: { amount: 1000, memo: 'testing', creationDate: new Date().toISOString() }, }) - console.log('createContribution contribution=', contribution) // login as admin await mutate({ mutation: login, variables: peterData }) @@ -452,7 +450,6 @@ describe('UserResolver', () => { mutation: confirmContribution, variables: { id: contribution.data.createContribution.id }, }) - console.log('confirmContribution contribution=', contribution) // login as user bob bob = await mutate({ mutation: login, variables: bobData }) @@ -477,7 +474,6 @@ describe('UserResolver', () => { redeemCode: transactionLink.code, }, }) - console.log('newUser=', newUser) }) it('sets the referrer id to bob baumeister id', async () => { @@ -1411,7 +1407,7 @@ describe('UserResolver', () => { }) }) - it.only('finds peter@lustig.de', async () => { + it('finds peter@lustig.de', async () => { await expect(mutate({ mutation: searchAdminUsers })).resolves.toEqual( expect.objectContaining({ data: { @@ -1625,14 +1621,14 @@ describe('UserResolver', () => { }) it('stores the ADMIN_USER_ROLE_SET event in the database', async () => { - const userContact = await UserContact.findOneOrFail( - { email: 'bibi@bloxberg.de' }, - { relations: ['user'] }, - ) - const adminContact = await UserContact.findOneOrFail( - { email: 'peter@lustig.de' }, - { relations: ['user'] }, - ) + const userContact = await UserContact.findOneOrFail({ + where: { email: 'bibi@bloxberg.de' }, + relations: ['user'], + }) + const adminContact = await UserContact.findOneOrFail({ + where: { email: 'peter@lustig.de' }, + relations: ['user'], + }) await expect(DbEvent.find()).resolves.toContainEqual( expect.objectContaining({ type: EventType.ADMIN_USER_ROLE_SET, diff --git a/backend/src/graphql/resolver/UserResolver.ts b/backend/src/graphql/resolver/UserResolver.ts index faa3a37b2..17fde6775 100644 --- a/backend/src/graphql/resolver/UserResolver.ts +++ b/backend/src/graphql/resolver/UserResolver.ts @@ -717,8 +717,8 @@ export class UserResolver { async setUserRole( @Arg('userId', () => Int) userId: number, - @Arg('role', () => String) - role: string, + @Arg('role', () => String, { nullable: true }) + role: string | null, @Ctx() context: Context, ): Promise { @@ -735,7 +735,6 @@ export class UserResolver { where: { id: userId }, relations: ['userRoles'], }) - console.log('setUserRole user=', user) // user exists ? if (!user) { throw new LogError('Could not find user with given ID', userId) @@ -745,33 +744,29 @@ export class UserResolver { if (moderator.id === userId) { throw new LogError('Administrator can not change his own role') } - if (isUserInRole(user, role)) { + // if user role(s) should be deleted by role=null as parameter + if (role === null && user.userRoles && user.userRoles.length > 0) { + await UserRole.delete({ userId: user.id }) + user.userRoles = undefined + } else if (isUserInRole(user, role)) { throw new LogError('User already has role=', role) } - // if user role should be deleted by role=null as parameter - if (role === null && user.userRoles) { - for (const usrRole of user.userRoles) { - await UserRole.delete(usrRole) + if (role) { + if (user.userRoles === undefined) { + user.userRoles = [] as UserRole[] } - user.userRoles = undefined - } else { - if (!isUserInRole(user, role)) { - if (user.userRoles === undefined) { - user.userRoles = [] as UserRole[] - user.userRoles[0] = UserRole.create() - } - user.userRoles[0].createdAt = new Date() - user.userRoles[0].role = role - user.userRoles[0].userId = user.id - } else { - throw new LogError('User already is in role=', role) + if (user.userRoles.length < 1) { + user.userRoles.push(UserRole.create()) } + user.userRoles[0].createdAt = new Date() + user.userRoles[0].role = role + user.userRoles[0].userId = user.id + await UserRole.save(user.userRoles[0]) } - console.log('setUserRole before save user=', user) - await user.save() + // await user.save() await EVENT_ADMIN_USER_ROLE_SET(user, moderator) - const newUser = await DbUser.findOne({ id: userId }, { relations: ['userRoles'] }) - console.log('setUserRole newUser=', user) + const newUser = await DbUser.findOne({ where: { id: userId }, relations: ['userRoles'] }) + console.log('setUserRole newUser=', newUser) return newUser?.userRoles ? newUser.userRoles[0].role : null } @@ -865,7 +860,7 @@ export async function findUserByEmail(email: string): Promise { }) const dbUser = dbUserContact.user dbUser.emailContact = dbUserContact - dbUser.userRoles = await UserRole.find({ userId: dbUser.id }) + dbUser.userRoles = await UserRole.find({ where: { userId: dbUser.id } }) return dbUser } @@ -894,7 +889,7 @@ const canEmailResend = (updatedAt: Date): boolean => { return !isTimeExpired(updatedAt, CONFIG.EMAIL_CODE_REQUEST_TIME) } -export function isUserInRole(user: DbUser, role: string): boolean { +export function isUserInRole(user: DbUser, role: string | null): boolean { if (user?.userRoles) { for (const usrRole of user.userRoles) { if (usrRole.role === role) { diff --git a/backend/src/seeds/graphql/mutations.ts b/backend/src/seeds/graphql/mutations.ts index 2f1af8772..296e7c890 100644 --- a/backend/src/seeds/graphql/mutations.ts +++ b/backend/src/seeds/graphql/mutations.ts @@ -119,7 +119,7 @@ export const confirmContribution = gql` ` export const setUserRole = gql` - mutation ($userId: Int!, $role: String!) { + mutation ($userId: Int!, $role: String) { setUserRole(userId: $userId, role: $role) } `