refactor transaction link sum query, add virtual transaction for transaction links to transaction list

This commit is contained in:
Moriz Wahl 2022-03-10 21:06:09 +01:00
parent 923b886baf
commit 3aa3ead86e
4 changed files with 51 additions and 11 deletions

View File

@ -6,6 +6,7 @@ export enum TransactionTypeId {
RECEIVE = 3,
// This is a virtual property, never occurring on the database
DECAY = 4,
TRANSACTION_LINK,
}
registerEnumType(TransactionTypeId, {

View File

@ -4,7 +4,7 @@
/* eslint-disable @typescript-eslint/no-non-null-assertion */
import { Resolver, Query, Args, Authorized, Ctx, Mutation } from 'type-graphql'
import { getCustomRepository, getConnection } from '@dbTools/typeorm'
import { getCustomRepository, getConnection, MoreThan } from '@dbTools/typeorm'
import CONFIG from '@/config'
import { sendTransactionReceivedEmail } from '@/mailer/sendTransactionReceivedEmail'
@ -23,6 +23,7 @@ import { TransactionLinkRepository } from '@repository/TransactionLink'
import { User as dbUser } from '@entity/User'
import { Transaction as dbTransaction } from '@entity/Transaction'
import { TransactionLink as dbTransactionLink } from '@entity/TransactionLink'
import { apiPost } from '@/apis/HttpRequest'
import { TransactionTypeId } from '@enum/TransactionTypeId'
@ -30,6 +31,7 @@ import { calculateBalance, isHexPublicKey } from '@/util/validate'
import { RIGHTS } from '@/auth/RIGHTS'
import { User } from '@model/User'
import { communityUser } from '@/util/communityUser'
import { virtualLinkTransaction } from '@/util/virtualLinkTransaction'
import { virtualDecayTransaction } from '@/util/virtualDecayTransaction'
import Decimal from 'decimal.js-light'
import { calculateDecay } from '@/util/decay'
@ -112,11 +114,41 @@ export class TransactionResolver {
const self = new User(user)
const transactions: Transaction[] = []
const transactionLinkRepository = getCustomRepository(TransactionLinkRepository)
const { sumHoldAvailableAmount, sumAmount } = await transactionLinkRepository.sumAmounts(
user.id,
now,
)
// decay transaction
if (!onlyCreations && currentPage === 1 && order === Order.DESC) {
transactions.push(
virtualDecayTransaction(lastTransaction.balance, lastTransaction.balanceDate, now, self),
)
// open transaction link sum transaction
if (sumHoldAvailableAmount.greaterThan(0)) {
const lastTransactionLink = await dbTransactionLink.find({
where: { userId: self.id, redeemedBy: null, validUntil: MoreThan(now) },
order: { createdAt: 'DESC' },
take: 1,
})
const firstTransactionLink = await dbTransactionLink.find({
where: { userId: self.id, redeemedBy: null, validUntil: MoreThan(now) },
order: { createdAt: 'ASC' },
take: 1,
})
transactions.push(
virtualLinkTransaction(
lastTransaction.balance,
sumAmount,
sumHoldAvailableAmount,
sumHoldAvailableAmount.minus(sumAmount.toString()),
firstTransactionLink[0].createdAt,
lastTransactionLink[0].validUntil,
self,
),
)
}
}
// transactions
@ -128,13 +160,10 @@ export class TransactionResolver {
transactions.push(new Transaction(userTransaction, self, linkedUser))
})
const transactionLinkRepository = getCustomRepository(TransactionLinkRepository)
const toHoldAvailable = await transactionLinkRepository.sumAmountToHoldAvailable(user.id, now)
// Construct Result
return new TransactionList(
calculateDecay(lastTransaction.balance, lastTransaction.balanceDate, now).balance.minus(
toHoldAvailable.toString(),
sumHoldAvailableAmount.toString(),
),
transactions,
userTransactionsCount,

View File

@ -4,13 +4,23 @@ 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')
async sumAmounts(
userId: number,
date: Date,
): Promise<{ sumHoldAvailableAmount: Decimal; sumAmount: Decimal }> {
const { sumHoldAvailableAmount, sumAmount } = await this.createQueryBuilder('transactionLinks')
.select('SUM(transactionLinks.holdAvailableAmount)', 'sumHoldAvailableAmount')
.addSelect('SUM(transactionLinks.amount)', 'sumAmount')
.where('transactionLinks.userId = :userId', { userId })
.andWhere('transactionLinks.redeemedAt is NULL')
.andWhere('transactionLinks.validUntil > :date', { date })
.orderBy('transactionLinks.createdAt', 'DESC')
.getRawOne()
return sum ? new Decimal(sum) : new Decimal(0)
return {
sumHoldAvailableAmount: sumHoldAvailableAmount
? new Decimal(sumHoldAvailableAmount)
: new Decimal(0),
sumAmount: sumAmount ? new Decimal(sumAmount) : new Decimal(0),
}
}
}

View File

@ -30,9 +30,9 @@ async function calculateBalance(
// TODO why we have to use toString() here?
const balance = decay.balance.add(amount.toString())
const transactionLinkRepository = getCustomRepository(TransactionLinkRepository)
const toHoldAvailable = await transactionLinkRepository.sumAmountToHoldAvailable(userId, time)
const { sumHoldAvailableAmount } = await transactionLinkRepository.sumAmounts(userId, time)
if (balance.minus(toHoldAvailable.toString()).lessThan(0)) {
if (balance.minus(sumHoldAvailableAmount.toString()).lessThan(0)) {
return null
}
return { balance, lastTransactionId: lastTransaction.id, decay }