From c44807dd506f0c3aa7240ddd59e1fe7cbcab475f Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Wed, 28 Jun 2023 13:04:41 +0200 Subject: [PATCH] get most tests working again --- .../resolver/ContributionLinkResolver.test.ts | 2 +- .../resolver/KlicktippResolver.test.ts | 16 +++--- .../resolver/TransactionLinkResolver.test.ts | 40 ++++++------- .../src/graphql/resolver/UserResolver.test.ts | 14 +++-- backend/src/graphql/resolver/UserResolver.ts | 11 ++-- .../src/graphql/resolver/util/findUsers.ts | 57 +++++++++++++++++++ .../resolver/util/validateAlias.test.ts | 2 +- 7 files changed, 99 insertions(+), 43 deletions(-) create mode 100644 backend/src/graphql/resolver/util/findUsers.ts diff --git a/backend/src/graphql/resolver/ContributionLinkResolver.test.ts b/backend/src/graphql/resolver/ContributionLinkResolver.test.ts index 801e4560b..9605378e2 100644 --- a/backend/src/graphql/resolver/ContributionLinkResolver.test.ts +++ b/backend/src/graphql/resolver/ContributionLinkResolver.test.ts @@ -542,7 +542,7 @@ describe('Contribution Links', () => { }) it('updated the DB record', async () => { - await expect(DbContributionLink.findOne(linkId)).resolves.toEqual( + await expect(DbContributionLink.findOne({ where: { id: linkId } })).resolves.toEqual( expect.objectContaining({ id: linkId, name: 'Dokumenta 2023', diff --git a/backend/src/graphql/resolver/KlicktippResolver.test.ts b/backend/src/graphql/resolver/KlicktippResolver.test.ts index 6a2250bc9..2c819f070 100644 --- a/backend/src/graphql/resolver/KlicktippResolver.test.ts +++ b/backend/src/graphql/resolver/KlicktippResolver.test.ts @@ -72,10 +72,10 @@ describe('KlicktippResolver', () => { }) it('stores the NEWSLETTER_SUBSCRIBE event in the database', async () => { - const userConatct = await UserContact.findOneOrFail( - { email: 'bibi@bloxberg.de' }, - { relations: ['user'] }, - ) + const userConatct = await UserContact.findOneOrFail({ + where: { email: 'bibi@bloxberg.de' }, + relations: ['user'], + }) await expect(DbEvent.find()).resolves.toContainEqual( expect.objectContaining({ type: EventType.NEWSLETTER_SUBSCRIBE, @@ -121,10 +121,10 @@ describe('KlicktippResolver', () => { }) it('stores the NEWSLETTER_UNSUBSCRIBE event in the database', async () => { - const userConatct = await UserContact.findOneOrFail( - { email: 'bibi@bloxberg.de' }, - { relations: ['user'] }, - ) + const userConatct = await UserContact.findOneOrFail({ + where: { email: 'bibi@bloxberg.de' }, + relations: ['user'], + }) await expect(DbEvent.find()).resolves.toContainEqual( expect.objectContaining({ type: EventType.NEWSLETTER_UNSUBSCRIBE, diff --git a/backend/src/graphql/resolver/TransactionLinkResolver.test.ts b/backend/src/graphql/resolver/TransactionLinkResolver.test.ts index 3c6ba31ab..ac76bdecf 100644 --- a/backend/src/graphql/resolver/TransactionLinkResolver.test.ts +++ b/backend/src/graphql/resolver/TransactionLinkResolver.test.ts @@ -456,10 +456,10 @@ describe('TransactionLinkResolver', () => { }) it('stores the CONTRIBUTION_LINK_REDEEM event in the database', async () => { - const userConatct = await UserContact.findOneOrFail( - { email: 'bibi@bloxberg.de' }, - { relations: ['user'] }, - ) + const userConatct = await UserContact.findOneOrFail({ + where: { email: 'bibi@bloxberg.de' }, + relations: ['user'], + }) await expect(DbEvent.find()).resolves.toContainEqual( expect.objectContaining({ type: EventType.CONTRIBUTION_LINK_REDEEM, @@ -611,10 +611,10 @@ describe('TransactionLinkResolver', () => { }) it('stores the TRANSACTION_LINK_CREATE event in the database', async () => { - const userConatct = await UserContact.findOneOrFail( - { email: 'bibi@bloxberg.de' }, - { relations: ['user'] }, - ) + const userConatct = await UserContact.findOneOrFail({ + where: { email: 'bibi@bloxberg.de' }, + relations: ['user'], + }) await expect(DbEvent.find()).resolves.toContainEqual( expect.objectContaining({ type: EventType.TRANSACTION_LINK_CREATE, @@ -664,10 +664,10 @@ describe('TransactionLinkResolver', () => { }) it('stores the TRANSACTION_LINK_DELETE event in the database', async () => { - const userConatct = await UserContact.findOneOrFail( - { email: 'bibi@bloxberg.de' }, - { relations: ['user'] }, - ) + const userConatct = await UserContact.findOneOrFail({ + where: { email: 'bibi@bloxberg.de' }, + relations: ['user'], + }) await expect(DbEvent.find()).resolves.toContainEqual( expect.objectContaining({ type: EventType.TRANSACTION_LINK_DELETE, @@ -719,14 +719,14 @@ describe('TransactionLinkResolver', () => { }) it('stores the TRANSACTION_LINK_REDEEM event in the database', async () => { - const creator = await UserContact.findOneOrFail( - { email: 'bibi@bloxberg.de' }, - { relations: ['user'] }, - ) - const redeemer = await UserContact.findOneOrFail( - { email: 'peter@lustig.de' }, - { relations: ['user'] }, - ) + const creator = await UserContact.findOneOrFail({ + where: { email: 'bibi@bloxberg.de' }, + relations: ['user'], + }) + const redeemer = await UserContact.findOneOrFail({ + where: { email: 'peter@lustig.de' }, + relations: ['user'], + }) await expect(DbEvent.find()).resolves.toContainEqual( expect.objectContaining({ type: EventType.TRANSACTION_LINK_REDEEM, diff --git a/backend/src/graphql/resolver/UserResolver.test.ts b/backend/src/graphql/resolver/UserResolver.test.ts index bebaa912c..0bd15d7dc 100644 --- a/backend/src/graphql/resolver/UserResolver.test.ts +++ b/backend/src/graphql/resolver/UserResolver.test.ts @@ -447,7 +447,7 @@ describe('UserResolver', () => { memo: `testing transaction link`, }) - transactionLink = await TransactionLink.findOneOrFail({}) + transactionLink = await TransactionLink.findOneOrFail({ where: { userId: bob.id } }) resetToken() @@ -1106,7 +1106,9 @@ describe('UserResolver', () => { errors: [ // keep Whitspace in error message! new GraphQLError(`Could not find any entity of type "UserContact" matching: { - "emailVerificationCode": "not-valid" + "where": { + "emailVerificationCode": "not-valid" + } }`), ], }), @@ -1181,13 +1183,13 @@ describe('UserResolver', () => { locale: 'en', }, }) - await expect(User.findOne({})).resolves.toEqual( + await expect(User.find()).resolves.toEqual([ expect.objectContaining({ firstName: 'Benjamin', lastName: 'Blümchen', language: 'en', }), - ) + ]) }) it('stores the USER_INFO_UPDATE event in the database', async () => { @@ -1218,11 +1220,11 @@ describe('UserResolver', () => { alias: 'bibi_Bloxberg', }, }) - await expect(User.findOne({})).resolves.toEqual( + await expect(User.find()).resolves.toEqual([ expect.objectContaining({ alias: 'bibi_Bloxberg', }), - ) + ]) }) }) }) diff --git a/backend/src/graphql/resolver/UserResolver.ts b/backend/src/graphql/resolver/UserResolver.ts index 214da858d..c3595071e 100644 --- a/backend/src/graphql/resolver/UserResolver.ts +++ b/backend/src/graphql/resolver/UserResolver.ts @@ -2,7 +2,7 @@ /* eslint-disable @typescript-eslint/no-unsafe-assignment */ /* eslint-disable @typescript-eslint/no-unsafe-member-access */ /* eslint-disable @typescript-eslint/restrict-template-expressions */ -import { getConnection, getCustomRepository, IsNull, Not } from '@dbTools/typeorm' +import { getConnection, IsNull, Not } from '@dbTools/typeorm' import { ContributionLink as DbContributionLink } from '@entity/ContributionLink' import { TransactionLink as DbTransactionLink } from '@entity/TransactionLink' import { User as DbUser } from '@entity/User' @@ -23,7 +23,6 @@ import { UserContactType } from '@enum/UserContactType' import { SearchAdminUsersResult } from '@model/AdminUser' import { User } from '@model/User' import { UserAdmin, SearchUsersResult } from '@model/UserAdmin' -import { UserRepository } from '@repository/User' import { subscribe } from '@/apis/KlicktippController' import { encode } from '@/auth/JWT' @@ -65,6 +64,7 @@ import { randombytes_random } from 'sodium-native' import { FULL_CREATION_AVAILABLE } from './const/const' import { getUserCreations } from './util/creations' import { findUserByIdentifier } from './util/findUserByIdentifier' +import { findUsers } from './util/findUsers' import { getKlicktippState } from './util/getKlicktippState' import { validateAlias } from './util/validateAlias' @@ -603,9 +603,7 @@ export class UserResolver { @Args() { currentPage = 1, pageSize = 25, order = Order.DESC }: Paginated, ): Promise { - const userRepository = getCustomRepository(UserRepository) - - const [users, count] = await userRepository.findAndCount({ + const [users, count] = await DbUser.findAndCount({ where: { isAdmin: Not(IsNull()), }, @@ -638,7 +636,6 @@ export class UserResolver { @Ctx() context: Context, ): Promise { const clientTimezoneOffset = getClientTimezoneOffset(context) - const userRepository = getCustomRepository(UserRepository) const userFields = [ 'id', 'firstName', @@ -648,7 +645,7 @@ export class UserResolver { 'deletedAt', 'isAdmin', ] - const [users, count] = await userRepository.findBySearchCriteriaPagedFiltered( + const [users, count] = await findUsers( userFields.map((fieldName) => { return 'user.' + fieldName }), diff --git a/backend/src/graphql/resolver/util/findUsers.ts b/backend/src/graphql/resolver/util/findUsers.ts new file mode 100644 index 000000000..d01afb904 --- /dev/null +++ b/backend/src/graphql/resolver/util/findUsers.ts @@ -0,0 +1,57 @@ +import { getConnection, Brackets, IsNull, Not } from '@dbTools/typeorm' +import { User as DbUser } from '@entity/User' + +import { SearchUsersFilters } from '@arg/SearchUsersFilters' +import { Order } from '@enum/Order' + +import { LogError } from '@/server/LogError' + +export const findUsers = async ( + select: string[], + searchCriteria: string, + filters: SearchUsersFilters | null, + currentPage: number, + pageSize: number, + order = Order.ASC, +): Promise<[DbUser[], number]> => { + const queryRunner = getConnection().createQueryRunner() + try { + await queryRunner.connect() + const query = queryRunner.manager + .createQueryBuilder(DbUser, 'user') + .select(select) + .withDeleted() + .leftJoinAndSelect('user.emailContact', 'emailContact') + .where( + new Brackets((qb) => { + qb.where( + 'user.firstName like :name or user.lastName like :lastName or emailContact.email like :email', + { + name: `%${searchCriteria}%`, + lastName: `%${searchCriteria}%`, + email: `%${searchCriteria}%`, + }, + ) + }), + ) + if (filters) { + if (filters.byActivated !== null) { + query.andWhere('emailContact.emailChecked = :value', { value: filters.byActivated }) + } + + if (filters.byDeleted !== null) { + query.andWhere({ deletedAt: filters.byDeleted ? Not(IsNull()) : IsNull() }) + } + } + + return await query + .orderBy({ 'user.id': order }) + .take(pageSize) + .skip((currentPage - 1) * pageSize) + .getManyAndCount() + } catch (err) { + throw new LogError('Unable to search users', err) + } finally { + await queryRunner.release() + } +} diff --git a/backend/src/graphql/resolver/util/validateAlias.test.ts b/backend/src/graphql/resolver/util/validateAlias.test.ts index 0cb790edb..5003f8975 100644 --- a/backend/src/graphql/resolver/util/validateAlias.test.ts +++ b/backend/src/graphql/resolver/util/validateAlias.test.ts @@ -95,7 +95,7 @@ describe('validate alias', () => { describe('test against existing alias in database', () => { beforeAll(async () => { const bibi = await userFactory(testEnv, bibiBloxberg) - const user = await User.findOne({ id: bibi.id }) + const user = await User.findOne({ where: { id: bibi.id } }) if (user) { user.alias = 'b-b' await user.save()