mirror of
https://github.com/IT4Change/gradido.git
synced 2026-02-06 09:56:05 +00:00
rewrite findContributions using QueryBuilder
This commit is contained in:
parent
e00719714e
commit
69f400a930
@ -20,6 +20,7 @@ module.exports = {
|
|||||||
'@model/(.*)': '<rootDir>/src/graphql/model/$1',
|
'@model/(.*)': '<rootDir>/src/graphql/model/$1',
|
||||||
'@union/(.*)': '<rootDir>/src/graphql/union/$1',
|
'@union/(.*)': '<rootDir>/src/graphql/union/$1',
|
||||||
'@repository/(.*)': '<rootDir>/src/typeorm/repository/$1',
|
'@repository/(.*)': '<rootDir>/src/typeorm/repository/$1',
|
||||||
|
'@typeorm/(.*)': '<rootDir>/src/typeorm/$1',
|
||||||
'@test/(.*)': '<rootDir>/test/$1',
|
'@test/(.*)': '<rootDir>/test/$1',
|
||||||
'@entity/(.*)':
|
'@entity/(.*)':
|
||||||
// eslint-disable-next-line n/no-process-env
|
// eslint-disable-next-line n/no-process-env
|
||||||
|
|||||||
@ -1,4 +1,5 @@
|
|||||||
import { In, Like, Not } from '@dbTools/typeorm'
|
/* eslint-disable security/detect-object-injection */
|
||||||
|
import { Brackets, In, Like, Not, SelectQueryBuilder } from '@dbTools/typeorm'
|
||||||
import { Contribution as DbContribution } from '@entity/Contribution'
|
import { Contribution as DbContribution } from '@entity/Contribution'
|
||||||
|
|
||||||
import { Paginated } from '@arg/Paginated'
|
import { Paginated } from '@arg/Paginated'
|
||||||
@ -11,6 +12,21 @@ interface Relations {
|
|||||||
[key: string]: boolean | Relations
|
[key: string]: boolean | Relations
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function joinRelationsRecursive(
|
||||||
|
relations: Relations,
|
||||||
|
queryBuilder: SelectQueryBuilder<DbContribution>,
|
||||||
|
currentPath: string,
|
||||||
|
): void {
|
||||||
|
for (const key in relations) {
|
||||||
|
// console.log('leftJoin: %s, %s', `${currentPath}.${key}`, key)
|
||||||
|
queryBuilder.leftJoinAndSelect(`${currentPath}.${key}`, key)
|
||||||
|
if (typeof relations[key] === 'object') {
|
||||||
|
// If it's a nested relation
|
||||||
|
joinRelationsRecursive(relations[key] as Relations, queryBuilder, key)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export const findContributions = async (
|
export const findContributions = async (
|
||||||
paginate: Paginated,
|
paginate: Paginated,
|
||||||
filter: SearchContributionsFilterArgs,
|
filter: SearchContributionsFilterArgs,
|
||||||
@ -21,61 +37,33 @@ export const findContributions = async (
|
|||||||
if (!connection) {
|
if (!connection) {
|
||||||
throw new LogError('Cannot connect to db')
|
throw new LogError('Cannot connect to db')
|
||||||
}
|
}
|
||||||
const requiredWhere = {
|
const queryBuilder = connection.getRepository(DbContribution).createQueryBuilder('Contribution')
|
||||||
|
if (relations) joinRelationsRecursive(relations, queryBuilder, 'Contribution')
|
||||||
|
if (withDeleted) queryBuilder.withDeleted()
|
||||||
|
queryBuilder.where({
|
||||||
...(filter.statusFilter?.length && { contributionStatus: In(filter.statusFilter) }),
|
...(filter.statusFilter?.length && { contributionStatus: In(filter.statusFilter) }),
|
||||||
...(filter.userId && { userId: filter.userId }),
|
...(filter.userId && { userId: filter.userId }),
|
||||||
...(filter.noHashtag && { memo: Not(Like(`%#%`)) }),
|
...(filter.noHashtag && { memo: Not(Like(`%#%`)) }),
|
||||||
}
|
|
||||||
const queryBuilder = connection.getRepository(DbContribution).createQueryBuilder('Contribution')
|
|
||||||
queryBuilder.where(requiredWhere)
|
|
||||||
return queryBuilder.getManyAndCount()
|
|
||||||
/*
|
|
||||||
|
|
||||||
|
|
||||||
let where =
|
|
||||||
filter.query && relations?.user
|
|
||||||
? [
|
|
||||||
{
|
|
||||||
...requiredWhere, // And
|
|
||||||
user: {
|
|
||||||
firstName: Like(`%${filter.query}%`),
|
|
||||||
},
|
|
||||||
}, // Or
|
|
||||||
{
|
|
||||||
...requiredWhere,
|
|
||||||
user: {
|
|
||||||
lastName: Like(`%${filter.query}%`),
|
|
||||||
},
|
|
||||||
}, // Or
|
|
||||||
{
|
|
||||||
...requiredWhere, // And
|
|
||||||
user: {
|
|
||||||
emailContact: {
|
|
||||||
email: Like(`%${filter.query}%`),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}, // Or
|
|
||||||
{
|
|
||||||
...requiredWhere, // And
|
|
||||||
memo: Like(`%${filter.query}%`),
|
|
||||||
},
|
|
||||||
]
|
|
||||||
: requiredWhere
|
|
||||||
|
|
||||||
if (!relations?.user && filter.query) {
|
|
||||||
where = [{ ...requiredWhere, memo: Like(`%${filter.query}%`) }]
|
|
||||||
}
|
|
||||||
|
|
||||||
return DbContribution.findAndCount({
|
|
||||||
relations,
|
|
||||||
where,
|
|
||||||
withDeleted,
|
|
||||||
order: {
|
|
||||||
createdAt: paginate.order,
|
|
||||||
id: paginate.order,
|
|
||||||
},
|
|
||||||
skip: (paginate.currentPage - 1) * paginate.pageSize,
|
|
||||||
take: paginate.pageSize,
|
|
||||||
})
|
})
|
||||||
*/
|
queryBuilder.printSql()
|
||||||
|
if (filter.query) {
|
||||||
|
const queryString = '%' + filter.query + '%'
|
||||||
|
queryBuilder.andWhere(
|
||||||
|
new Brackets((qb) => {
|
||||||
|
qb.where({ memo: Like(queryString) })
|
||||||
|
if (relations?.user) {
|
||||||
|
qb.orWhere('user.first_name LIKE :firstName', { firstName: queryString })
|
||||||
|
.orWhere('user.last_name LIKE :lastName', { lastName: queryString })
|
||||||
|
.orWhere('emailContact.email LIKE :emailContact', { emailContact: queryString })
|
||||||
|
.orWhere({ memo: Like(queryString) })
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
return queryBuilder
|
||||||
|
.orderBy('Contribution.createdAt', paginate.order)
|
||||||
|
.addOrderBy('Contribution.id', paginate.order)
|
||||||
|
.skip((paginate.currentPage - 1) * paginate.pageSize)
|
||||||
|
.take(paginate.pageSize)
|
||||||
|
.getManyAndCount()
|
||||||
}
|
}
|
||||||
|
|||||||
@ -136,6 +136,14 @@ export const creations: CreationInterface[] = [
|
|||||||
confirmed: true,
|
confirmed: true,
|
||||||
moveCreationDate: 12,
|
moveCreationDate: 12,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
email: 'bibi@bloxberg.de',
|
||||||
|
amount: 1000,
|
||||||
|
memo: '#Hexen',
|
||||||
|
creationDate: nMonthsBefore(new Date()),
|
||||||
|
confirmed: true,
|
||||||
|
moveCreationDate: 12,
|
||||||
|
},
|
||||||
...bobsTransactions,
|
...bobsTransactions,
|
||||||
{
|
{
|
||||||
email: 'raeuber@hotzenplotz.de',
|
email: 'raeuber@hotzenplotz.de',
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user