From 44dedacce5d8caaaa38d8fb589102be4867e56bf Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Wed, 28 Jun 2023 12:16:38 +0200 Subject: [PATCH] transaction link summary as function, seeds are working again --- .../src/graphql/resolver/BalanceResolver.ts | 6 +-- .../resolver/TransactionLinkResolver.ts | 7 --- .../graphql/resolver/TransactionResolver.ts | 6 +-- .../resolver/util/transactionLinkSummary.ts | 49 +++++++++++++++++++ backend/src/seeds/factory/transactionLink.ts | 5 +- backend/src/seeds/index.ts | 1 - backend/src/server/createServer.ts | 1 - .../src/typeorm/repository/TransactionLink.ts | 42 ---------------- backend/src/util/validate.ts | 7 +-- 9 files changed, 58 insertions(+), 66 deletions(-) create mode 100644 backend/src/graphql/resolver/util/transactionLinkSummary.ts delete mode 100644 backend/src/typeorm/repository/TransactionLink.ts diff --git a/backend/src/graphql/resolver/BalanceResolver.ts b/backend/src/graphql/resolver/BalanceResolver.ts index 9a11093b8..87de0e0f7 100644 --- a/backend/src/graphql/resolver/BalanceResolver.ts +++ b/backend/src/graphql/resolver/BalanceResolver.ts @@ -1,12 +1,11 @@ /* eslint-disable @typescript-eslint/restrict-template-expressions */ -import { getCustomRepository, IsNull } from '@dbTools/typeorm' +import { IsNull } from '@dbTools/typeorm' import { Transaction as dbTransaction } from '@entity/Transaction' import { TransactionLink as dbTransactionLink } from '@entity/TransactionLink' import { Decimal } from 'decimal.js-light' import { Resolver, Query, Ctx, Authorized } from 'type-graphql' import { Balance } from '@model/Balance' -import { transactionLinkRepository } from '@repository/TransactionLink' import { RIGHTS } from '@/auth/RIGHTS' import { Context, getUser } from '@/server/context' @@ -15,6 +14,7 @@ import { calculateDecay } from '@/util/decay' import { GdtResolver } from './GdtResolver' import { getLastTransaction } from './util/getLastTransaction' +import { transactionLinkSummary } from './util/transactionLinkSummary' @Resolver() export class BalanceResolver { @@ -79,7 +79,7 @@ export class BalanceResolver { // The final balance is reduced by the link amount withheld const { sumHoldAvailableAmount } = context.sumHoldAvailableAmount ? { sumHoldAvailableAmount: context.sumHoldAvailableAmount } - : await transactionLinkRepository.summary(user.id, now) + : await transactionLinkSummary(user.id, now) logger.debug(`context.sumHoldAvailableAmount=${context.sumHoldAvailableAmount}`) logger.debug(`sumHoldAvailableAmount=${sumHoldAvailableAmount}`) diff --git a/backend/src/graphql/resolver/TransactionLinkResolver.ts b/backend/src/graphql/resolver/TransactionLinkResolver.ts index b198a2335..c987dc0a0 100644 --- a/backend/src/graphql/resolver/TransactionLinkResolver.ts +++ b/backend/src/graphql/resolver/TransactionLinkResolver.ts @@ -76,22 +76,15 @@ export class TransactionLinkResolver { throw new LogError('Amount must be a positive number', amount) } - console.log('Hallo') - const holdAvailableAmount = amount.minus(calculateDecay(amount, createdDate, validUntil).decay) - console.log(holdAvailableAmount) - // validate amount const sendBalance = await calculateBalance(user.id, holdAvailableAmount.mul(-1), createdDate) - console.log('sendBalance', sendBalance) if (!sendBalance) { throw new LogError('User has not enough GDD', user.id) } - console.log(sendBalance) - const transactionLink = DbTransactionLink.create() transactionLink.userId = user.id transactionLink.amount = amount diff --git a/backend/src/graphql/resolver/TransactionResolver.ts b/backend/src/graphql/resolver/TransactionResolver.ts index 8a1097b99..5f42fb36e 100644 --- a/backend/src/graphql/resolver/TransactionResolver.ts +++ b/backend/src/graphql/resolver/TransactionResolver.ts @@ -2,7 +2,7 @@ /* eslint-disable new-cap */ /* eslint-disable @typescript-eslint/no-non-null-assertion */ -import { getCustomRepository, getConnection, In } from '@dbTools/typeorm' +import { getConnection, In } from '@dbTools/typeorm' import { Transaction as dbTransaction } from '@entity/Transaction' import { TransactionLink as dbTransactionLink } from '@entity/TransactionLink' import { User as dbUser } from '@entity/User' @@ -16,7 +16,6 @@ import { TransactionTypeId } from '@enum/TransactionTypeId' import { Transaction } from '@model/Transaction' import { TransactionList } from '@model/TransactionList' import { User } from '@model/User' -import { transactionLinkRepository } from '@repository/TransactionLink' import { RIGHTS } from '@/auth/RIGHTS' import { @@ -38,6 +37,7 @@ import { MEMO_MAX_CHARS, MEMO_MIN_CHARS } from './const/const' import { findUserByIdentifier } from './util/findUserByIdentifier' import { getLastTransaction } from './util/getLastTransaction' import { getTransactionList } from './util/getTransactionList' +import { transactionLinkSummary } from './util/transactionLinkSummary' export const executeTransaction = async ( amount: Decimal, @@ -246,7 +246,7 @@ export class TransactionResolver { const transactions: Transaction[] = [] const { sumHoldAvailableAmount, sumAmount, lastDate, firstDate, transactionLinkcount } = - await transactionLinkRepository.summary(user.id, now) + await transactionLinkSummary(user.id, now) context.linkCount = transactionLinkcount logger.debug(`transactionLinkcount=${transactionLinkcount}`) context.sumHoldAvailableAmount = sumHoldAvailableAmount diff --git a/backend/src/graphql/resolver/util/transactionLinkSummary.ts b/backend/src/graphql/resolver/util/transactionLinkSummary.ts new file mode 100644 index 000000000..8f5f41f15 --- /dev/null +++ b/backend/src/graphql/resolver/util/transactionLinkSummary.ts @@ -0,0 +1,49 @@ +/* eslint-disable @typescript-eslint/no-unsafe-assignment */ +/* eslint-disable @typescript-eslint/no-unsafe-argument */ +import { getConnection } from '@dbTools/typeorm' +import { TransactionLink as DbTransactionLink } from '@entity/TransactionLink' +import { Decimal } from 'decimal.js-light' + +import { LogError } from '@/server/LogError' + +export const transactionLinkSummary = async ( + userId: number, + date: Date, +): Promise<{ + sumHoldAvailableAmount: Decimal + sumAmount: Decimal + lastDate: Date | null + firstDate: Date | null + transactionLinkcount: number +}> => { + const queryRunner = getConnection().createQueryRunner() + try { + await queryRunner.connect() + const { sumHoldAvailableAmount, sumAmount, lastDate, firstDate, count } = + await queryRunner.manager + .createQueryBuilder(DbTransactionLink, 'transactionLink') + .select('SUM(transactionLink.holdAvailableAmount)', 'sumHoldAvailableAmount') + .addSelect('SUM(transactionLink.amount)', 'sumAmount') + .addSelect('MAX(transactionLink.validUntil)', 'lastDate') + .addSelect('MIN(transactionLink.createdAt)', 'firstDate') + .addSelect('COUNT(*)', 'count') + .where('transactionLink.userId = :userId', { userId }) + .andWhere('transactionLink.redeemedAt is NULL') + .andWhere('transactionLink.validUntil > :date', { date }) + .orderBy('transactionLink.createdAt', 'DESC') + .getRawOne() + return { + sumHoldAvailableAmount: sumHoldAvailableAmount + ? new Decimal(sumHoldAvailableAmount) + : new Decimal(0), + sumAmount: sumAmount ? new Decimal(sumAmount) : new Decimal(0), + lastDate: lastDate || null, + firstDate: firstDate || null, + transactionLinkcount: count || 0, + } + } catch (err) { + throw new LogError('Unable to get transaction link summary', err) + } finally { + await queryRunner.release() + } +} diff --git a/backend/src/seeds/factory/transactionLink.ts b/backend/src/seeds/factory/transactionLink.ts index 8bbdb64c4..b44fe349c 100644 --- a/backend/src/seeds/factory/transactionLink.ts +++ b/backend/src/seeds/factory/transactionLink.ts @@ -24,15 +24,12 @@ export const transactionLinkFactory = async ( memo: transactionLink.memo, } - const result = await mutate({ mutation: createTransactionLink, variables }) - console.log(result) - // get the transaction links's id const { data: { createTransactionLink: { id }, }, - } = result + } = await mutate({ mutation: createTransactionLink, variables }) if (transactionLink.createdAt || transactionLink.deletedAt) { const dbTransactionLink = await TransactionLink.findOneOrFail({ where: { id } }) diff --git a/backend/src/seeds/index.ts b/backend/src/seeds/index.ts index 2560aa883..bc7950f26 100644 --- a/backend/src/seeds/index.ts +++ b/backend/src/seeds/index.ts @@ -52,7 +52,6 @@ const resetEntity = async (entity: any) => { const run = async () => { const server = await createServer(context) - console.log(server) const seedClient = createTestClient(server.apollo) const { con } = server await cleanDB() diff --git a/backend/src/server/createServer.ts b/backend/src/server/createServer.ts index 36a5bd5e0..c162d9f6f 100644 --- a/backend/src/server/createServer.ts +++ b/backend/src/server/createServer.ts @@ -37,7 +37,6 @@ export const createServer = async ( logger.debug('createServer...') // open mysql connection - console.log('Connection.getInstance') const con = await Connection.getInstance() if (!con?.isConnected) { logger.fatal(`Couldn't open connection to database!`) diff --git a/backend/src/typeorm/repository/TransactionLink.ts b/backend/src/typeorm/repository/TransactionLink.ts deleted file mode 100644 index 45586c538..000000000 --- a/backend/src/typeorm/repository/TransactionLink.ts +++ /dev/null @@ -1,42 +0,0 @@ -/* eslint-disable @typescript-eslint/no-unsafe-assignment */ -/* eslint-disable @typescript-eslint/no-unsafe-argument */ -import { getConnection } from '@dbTools/typeorm' -import { TransactionLink as dbTransactionLink } from '@entity/TransactionLink' -import { Decimal } from 'decimal.js-light' - -export const transactionLinkRepository = getConnection() - .getRepository(dbTransactionLink) - .extend({ - async summary( - userId: number, - date: Date, - ): Promise<{ - sumHoldAvailableAmount: Decimal - sumAmount: Decimal - lastDate: Date | null - firstDate: Date | null - transactionLinkcount: number - }> { - const { sumHoldAvailableAmount, sumAmount, lastDate, firstDate, count } = - await this.createQueryBuilder('transactionLinks') - .select('SUM(transactionLinks.holdAvailableAmount)', 'sumHoldAvailableAmount') - .addSelect('SUM(transactionLinks.amount)', 'sumAmount') - .addSelect('MAX(transactionLinks.validUntil)', 'lastDate') - .addSelect('MIN(transactionLinks.createdAt)', 'firstDate') - .addSelect('COUNT(*)', 'count') - .where('transactionLinks.userId = :userId', { userId }) - .andWhere('transactionLinks.redeemedAt is NULL') - .andWhere('transactionLinks.validUntil > :date', { date }) - .orderBy('transactionLinks.createdAt', 'DESC') - .getRawOne() - return { - sumHoldAvailableAmount: sumHoldAvailableAmount - ? new Decimal(sumHoldAvailableAmount) - : new Decimal(0), - sumAmount: sumAmount ? new Decimal(sumAmount) : new Decimal(0), - lastDate: lastDate || null, - firstDate: firstDate || null, - transactionLinkcount: count || 0, - } - }, - }) diff --git a/backend/src/util/validate.ts b/backend/src/util/validate.ts index 8c84b06b2..4780c94e8 100644 --- a/backend/src/util/validate.ts +++ b/backend/src/util/validate.ts @@ -1,11 +1,10 @@ -import { getCustomRepository } from '@dbTools/typeorm' import { TransactionLink as dbTransactionLink } from '@entity/TransactionLink' import { Decimal } from 'decimal.js-light' import { Decay } from '@model/Decay' -import { transactionLinkRepository } from '@repository/TransactionLink' import { getLastTransaction } from '@/graphql/resolver/util/getLastTransaction' +import { transactionLinkSummary } from '@/graphql/resolver/util/transactionLinkSummary' import { calculateDecay } from './decay' @@ -26,12 +25,10 @@ async function calculateBalance( const lastTransaction = await getLastTransaction(userId) if (!lastTransaction) return null - console.log(lastTransaction) - const decay = calculateDecay(lastTransaction.balance, lastTransaction.balanceDate, time) const balance = decay.balance.add(amount.toString()) - const { sumHoldAvailableAmount } = await transactionLinkRepository.summary(userId, time) + const { sumHoldAvailableAmount } = await transactionLinkSummary(userId, time) // If we want to redeem a link we need to make sure that the link amount is not considered as blocked // else we cannot redeem links which are more or equal to half of what an account actually owns