From 91fe38fe8f6675194ae99fc2530696d787d76b28 Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Thu, 10 Mar 2022 14:28:42 +0100 Subject: [PATCH 1/6] use db values instead of null --- backend/src/graphql/model/TransactionLink.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/backend/src/graphql/model/TransactionLink.ts b/backend/src/graphql/model/TransactionLink.ts index 25cf5ac36..97cded71a 100644 --- a/backend/src/graphql/model/TransactionLink.ts +++ b/backend/src/graphql/model/TransactionLink.ts @@ -15,9 +15,9 @@ export class TransactionLink { this.createdAt = transactionLink.createdAt this.validUntil = transactionLink.validUntil this.showEmail = transactionLink.showEmail - this.deletedAt = null - this.redeemedAt = null - this.redeemedBy = null + this.deletedAt = transactionLink.deletedAt + this.redeemedAt = transactionLink.redeemedAt + this.redeemedBy = transactionLink.redeemedBy } @Field(() => Number) From 9143990535f5cd85f6a065ccf3c95288360a8d62 Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Thu, 10 Mar 2022 15:05:32 +0100 Subject: [PATCH 2/6] turn of logger when NODE_ENV === '"development"' --- backend/src/server/plugins.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/backend/src/server/plugins.ts b/backend/src/server/plugins.ts index a407135ea..8d21178f3 100644 --- a/backend/src/server/plugins.ts +++ b/backend/src/server/plugins.ts @@ -40,6 +40,8 @@ const apolloLogPlugin = ApolloLogPlugin({ }) const plugins = - process.env.NODE_ENV === 'development' ? [setHeadersPlugin] : [setHeadersPlugin, apolloLogPlugin] + process.env.NODE_ENV === 'development' || process.env.NODE_ENV === '"development"' + ? [setHeadersPlugin] + : [setHeadersPlugin, apolloLogPlugin] export default plugins From 3436253bbef0ac945430985a3cae22afb0d2b2d6 Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Thu, 10 Mar 2022 15:33:26 +0100 Subject: [PATCH 3/6] transaction link repository, use raw query to get sum of hold available amount --- backend/src/graphql/model/TransactionLink.ts | 6 ++--- .../graphql/resolver/TransactionResolver.ts | 6 +++-- .../src/typeorm/repository/TransactionLink.ts | 16 ++++++++++++++ backend/src/util/validate.ts | 22 +++++-------------- 4 files changed, 29 insertions(+), 21 deletions(-) create mode 100644 backend/src/typeorm/repository/TransactionLink.ts diff --git a/backend/src/graphql/model/TransactionLink.ts b/backend/src/graphql/model/TransactionLink.ts index 97cded71a..fec02b9fd 100644 --- a/backend/src/graphql/model/TransactionLink.ts +++ b/backend/src/graphql/model/TransactionLink.ts @@ -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) diff --git a/backend/src/graphql/resolver/TransactionResolver.ts b/backend/src/graphql/resolver/TransactionResolver.ts index f04050fbf..1d1a00c39 100644 --- a/backend/src/graphql/resolver/TransactionResolver.ts +++ b/backend/src/graphql/resolver/TransactionResolver.ts @@ -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( diff --git a/backend/src/typeorm/repository/TransactionLink.ts b/backend/src/typeorm/repository/TransactionLink.ts new file mode 100644 index 000000000..5f7531bc8 --- /dev/null +++ b/backend/src/typeorm/repository/TransactionLink.ts @@ -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 { + async sumAmountToHoldAvailable(userId: number, date: Date): Promise { + 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) + } +} diff --git a/backend/src/util/validate.ts b/backend/src/util/validate.ts index c79cca076..0858ea50f 100644 --- a/backend/src/util/validate.ts +++ b/backend/src/util/validate.ts @@ -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 { - 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 } From fae9d9100466838e7e72a3b61f7427fe50d0a05a Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Thu, 10 Mar 2022 16:00:15 +0100 Subject: [PATCH 4/6] add comment to explain why set to null in constructor --- backend/src/graphql/model/TransactionLink.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/backend/src/graphql/model/TransactionLink.ts b/backend/src/graphql/model/TransactionLink.ts index fec02b9fd..a87d4a68a 100644 --- a/backend/src/graphql/model/TransactionLink.ts +++ b/backend/src/graphql/model/TransactionLink.ts @@ -15,6 +15,7 @@ export class TransactionLink { this.createdAt = transactionLink.createdAt this.validUntil = transactionLink.validUntil this.showEmail = transactionLink.showEmail + // Type 'Date | null | undefined' is not assignable to type 'Date | null'. this.deletedAt = null // transactionLink.deletedAt this.redeemedAt = null // transactionLink.redeemedAt this.redeemedBy = null // transactionLink.redeemedBy From 80650e60b81a23840f87569529e2d38496f7dbb3 Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Thu, 10 Mar 2022 18:00:47 +0100 Subject: [PATCH 5/6] remove apollo log plugin hack, improve model --- backend/src/graphql/model/TransactionLink.ts | 9 ++++----- backend/src/server/plugins.ts | 4 +--- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/backend/src/graphql/model/TransactionLink.ts b/backend/src/graphql/model/TransactionLink.ts index a87d4a68a..f41d34acc 100644 --- a/backend/src/graphql/model/TransactionLink.ts +++ b/backend/src/graphql/model/TransactionLink.ts @@ -5,7 +5,7 @@ import { User } from './User' @ObjectType() export class TransactionLink { - constructor(transactionLink: dbTransactionLink, user: User) { + constructor(transactionLink: dbTransactionLink, user: User, redeemedBy: User | null = null) { this.id = transactionLink.id this.user = user this.amount = transactionLink.amount @@ -15,10 +15,9 @@ export class TransactionLink { this.createdAt = transactionLink.createdAt this.validUntil = transactionLink.validUntil this.showEmail = transactionLink.showEmail - // Type 'Date | null | undefined' is not assignable to type 'Date | null'. - this.deletedAt = null // transactionLink.deletedAt - this.redeemedAt = null // transactionLink.redeemedAt - this.redeemedBy = null // transactionLink.redeemedBy + this.deletedAt = transactionLink.deletedAt + this.redeemedAt = transactionLink.redeemedAt + this.redeemedBy = redeemedBy } @Field(() => Number) diff --git a/backend/src/server/plugins.ts b/backend/src/server/plugins.ts index 8d21178f3..a407135ea 100644 --- a/backend/src/server/plugins.ts +++ b/backend/src/server/plugins.ts @@ -40,8 +40,6 @@ const apolloLogPlugin = ApolloLogPlugin({ }) const plugins = - process.env.NODE_ENV === 'development' || process.env.NODE_ENV === '"development"' - ? [setHeadersPlugin] - : [setHeadersPlugin, apolloLogPlugin] + process.env.NODE_ENV === 'development' ? [setHeadersPlugin] : [setHeadersPlugin, apolloLogPlugin] export default plugins From 47e491db84b819b751bf784d97646f78624ea02c Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Thu, 10 Mar 2022 18:01:13 +0100 Subject: [PATCH 6/6] update entity --- database/entity/0030-transaction_link/TransactionLink.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/database/entity/0030-transaction_link/TransactionLink.ts b/database/entity/0030-transaction_link/TransactionLink.ts index 6ea708547..177f23561 100644 --- a/database/entity/0030-transaction_link/TransactionLink.ts +++ b/database/entity/0030-transaction_link/TransactionLink.ts @@ -42,7 +42,7 @@ export class TransactionLink extends BaseEntity { createdAt: Date @DeleteDateColumn() - deletedAt?: Date | null + deletedAt: Date | null @Column({ type: 'datetime', @@ -61,8 +61,8 @@ export class TransactionLink extends BaseEntity { type: 'datetime', nullable: true, }) - redeemedAt?: Date | null + redeemedAt: Date | null @Column({ type: 'int', unsigned: true, nullable: true }) - redeemedBy?: number | null + redeemedBy: number | null }