diff --git a/backend/src/graphql/resolver/ContributionResolver.ts b/backend/src/graphql/resolver/ContributionResolver.ts index 2e36eba3f..def01ceb0 100644 --- a/backend/src/graphql/resolver/ContributionResolver.ts +++ b/backend/src/graphql/resolver/ContributionResolver.ts @@ -138,7 +138,7 @@ export class ContributionResolver { currentPage, pageSize, withDeleted: true, - relations: ['messages'], + relations: { messages: true }, userId: user.id, statusFilter, }) @@ -160,7 +160,7 @@ export class ContributionResolver { order, currentPage, pageSize, - relations: ['user'], + relations: { user: true }, statusFilter, }) @@ -372,6 +372,8 @@ export class ContributionResolver { statusFilter?: ContributionStatus[] | null, @Arg('userId', () => Int, { nullable: true }) userId?: number | null, + @Arg('query', () => String, { nullable: true }) + query?: string | null, ): Promise { const [dbContributions, count] = await findContributions({ order, @@ -379,8 +381,14 @@ export class ContributionResolver { pageSize, withDeleted: true, userId, - relations: ['user', 'messages'], + relations: { + user: { + emailContact: true, + }, + messages: true, + }, statusFilter, + query, }) return new ContributionListResult( diff --git a/backend/src/graphql/resolver/util/findContributions.ts b/backend/src/graphql/resolver/util/findContributions.ts index 28984d5b1..b717abf55 100644 --- a/backend/src/graphql/resolver/util/findContributions.ts +++ b/backend/src/graphql/resolver/util/findContributions.ts @@ -1,38 +1,73 @@ -import { In } from '@dbTools/typeorm' +import { In, Like } from '@dbTools/typeorm' import { Contribution as DbContribution } from '@entity/Contribution' import { ContributionStatus } from '@enum/ContributionStatus' import { Order } from '@enum/Order' +interface Relations { + [key: string]: boolean | Relations +} + interface FindContributionsOptions { order: Order currentPage: number pageSize: number withDeleted?: boolean - relations?: string[] + relations?: Relations | undefined userId?: number | null statusFilter?: ContributionStatus[] | null + query?: string | null } export const findContributions = async ( options: FindContributionsOptions, ): Promise<[DbContribution[], number]> => { - const { order, currentPage, pageSize, withDeleted, relations, userId, statusFilter } = { + const { order, currentPage, pageSize, withDeleted, relations, userId, statusFilter, query } = { withDeleted: false, - relations: [], + relations: undefined, + query: '', ...options, } + + const requiredWhere = { + ...(statusFilter?.length && { contributionStatus: In(statusFilter) }), + ...(userId && { userId }), + } + + const where = + query && relations && relations.user + ? [ + { + ...requiredWhere, + user: { + firstName: Like(`%${query}%`), + }, + }, + { + ...requiredWhere, + user: { + lastName: Like(`%${query}%`), + }, + }, + { + ...requiredWhere, + user: { + emailContact: { + email: Like(`%${query}%`), + }, + }, + }, + ] + : requiredWhere + return DbContribution.findAndCount({ - where: { - ...(statusFilter?.length && { contributionStatus: In(statusFilter) }), - ...(userId && { userId }), - }, + relations, + where, withDeleted, order: { createdAt: order, id: order, }, - relations, skip: (currentPage - 1) * pageSize, take: pageSize, }) diff --git a/backend/src/seeds/graphql/queries.ts b/backend/src/seeds/graphql/queries.ts index a964cdb3a..6353fe1cd 100644 --- a/backend/src/seeds/graphql/queries.ts +++ b/backend/src/seeds/graphql/queries.ts @@ -235,6 +235,7 @@ export const adminListContributions = gql` $order: Order = DESC $statusFilter: [ContributionStatus!] $userId: Int + $query: String ) { adminListContributions( currentPage: $currentPage @@ -242,6 +243,7 @@ export const adminListContributions = gql` order: $order statusFilter: $statusFilter userId: $userId + query: $query ) { contributionCount contributionList {