mirror of
https://github.com/IT4Change/gradido.git
synced 2025-12-13 07:45:54 +00:00
transaction link repository, use raw query to get sum of hold available amount
This commit is contained in:
parent
9143990535
commit
3436253bbe
@ -15,9 +15,9 @@ export class TransactionLink {
|
||||
this.createdAt = transactionLink.createdAt
|
||||
this.validUntil = transactionLink.validUntil
|
||||
this.showEmail = transactionLink.showEmail
|
||||
this.deletedAt = transactionLink.deletedAt
|
||||
this.redeemedAt = transactionLink.redeemedAt
|
||||
this.redeemedBy = transactionLink.redeemedBy
|
||||
this.deletedAt = null // transactionLink.deletedAt
|
||||
this.redeemedAt = null // transactionLink.redeemedAt
|
||||
this.redeemedBy = null // transactionLink.redeemedBy
|
||||
}
|
||||
|
||||
@Field(() => Number)
|
||||
|
||||
@ -19,13 +19,14 @@ import { Order } from '@enum/Order'
|
||||
|
||||
import { UserRepository } from '@repository/User'
|
||||
import { TransactionRepository } from '@repository/Transaction'
|
||||
import { TransactionLinkRepository } from '@repository/TransactionLink'
|
||||
|
||||
import { User as dbUser } from '@entity/User'
|
||||
import { Transaction as dbTransaction } from '@entity/Transaction'
|
||||
|
||||
import { apiPost } from '@/apis/HttpRequest'
|
||||
import { TransactionTypeId } from '@enum/TransactionTypeId'
|
||||
import { calculateBalance, isHexPublicKey, holdAvailable } from '@/util/validate'
|
||||
import { calculateBalance, isHexPublicKey } from '@/util/validate'
|
||||
import { RIGHTS } from '@/auth/RIGHTS'
|
||||
import { User } from '@model/User'
|
||||
import { communityUser } from '@/util/communityUser'
|
||||
@ -127,7 +128,8 @@ export class TransactionResolver {
|
||||
transactions.push(new Transaction(userTransaction, self, linkedUser))
|
||||
})
|
||||
|
||||
const toHoldAvailable = await holdAvailable(user.id, now)
|
||||
const transactionLinkRepository = getCustomRepository(TransactionLinkRepository)
|
||||
const toHoldAvailable = await transactionLinkRepository.sumAmountToHoldAvailable(user.id, now)
|
||||
|
||||
// Construct Result
|
||||
return new TransactionList(
|
||||
|
||||
16
backend/src/typeorm/repository/TransactionLink.ts
Normal file
16
backend/src/typeorm/repository/TransactionLink.ts
Normal file
@ -0,0 +1,16 @@
|
||||
import { Repository, EntityRepository } from '@dbTools/typeorm'
|
||||
import { TransactionLink as dbTransactionLink } from '@entity/TransactionLink'
|
||||
import Decimal from 'decimal.js-light'
|
||||
|
||||
@EntityRepository(dbTransactionLink)
|
||||
export class TransactionLinkRepository extends Repository<dbTransactionLink> {
|
||||
async sumAmountToHoldAvailable(userId: number, date: Date): Promise<Decimal> {
|
||||
const { sum } = await this.createQueryBuilder('transactionLinks')
|
||||
.select('SUM(transactionLinks.holdAvailableAmount)', 'sum')
|
||||
.where('transactionLinks.userId = :userId', { userId })
|
||||
.andWhere('transactionLinks.redeemedAt is NULL')
|
||||
.andWhere('transactionLinks.validUntil > :date', { date })
|
||||
.getRawOne()
|
||||
return sum ? new Decimal(sum) : new Decimal(0)
|
||||
}
|
||||
}
|
||||
@ -2,8 +2,8 @@ import { calculateDecay } from './decay'
|
||||
import Decimal from 'decimal.js-light'
|
||||
import { Transaction } from '@entity/Transaction'
|
||||
import { Decay } from '@model/Decay'
|
||||
import { TransactionLink as dbTransactionLink } from '@entity/TransactionLink'
|
||||
import { MoreThan } from '@dbTools/typeorm'
|
||||
import { getCustomRepository } from '@dbTools/typeorm'
|
||||
import { TransactionLinkRepository } from '@repository/TransactionLink'
|
||||
|
||||
function isStringBoolean(value: string): boolean {
|
||||
const lowerValue = value.toLowerCase()
|
||||
@ -29,23 +29,13 @@ async function calculateBalance(
|
||||
|
||||
// TODO why we have to use toString() here?
|
||||
const balance = decay.balance.add(amount.toString())
|
||||
const toHoldAvailable = await holdAvailable(userId, time)
|
||||
const transactionLinkRepository = getCustomRepository(TransactionLinkRepository)
|
||||
const toHoldAvailable = await transactionLinkRepository.sumAmountToHoldAvailable(userId, time)
|
||||
|
||||
if (balance.minus(toHoldAvailable.toString()).lessThan(0)) {
|
||||
return null
|
||||
}
|
||||
return { balance, lastTransactionId: lastTransaction.id, decay }
|
||||
}
|
||||
|
||||
async function holdAvailable(userId: number, date: Date): Promise<Decimal> {
|
||||
const openTransactionLinks = await dbTransactionLink.find({
|
||||
select: ['holdAvailableAmount'],
|
||||
where: { userId, redeemedAt: null, validUntil: MoreThan(date) },
|
||||
})
|
||||
|
||||
return openTransactionLinks.reduce(
|
||||
(previousValue, currentValue) => previousValue.add(currentValue.holdAvailableAmount.toString()),
|
||||
new Decimal(0),
|
||||
)
|
||||
}
|
||||
|
||||
export { isHexPublicKey, calculateBalance, isStringBoolean, holdAvailable }
|
||||
export { isHexPublicKey, calculateBalance, isStringBoolean }
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user