From a9ba92f67bb207bd8ba744861c0ef64add4918b2 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Thu, 31 Mar 2022 12:32:35 +0200 Subject: [PATCH 1/9] Transaction Resolver: transmit Redeem Link to calculateBalance --- backend/src/graphql/resolver/TransactionResolver.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/backend/src/graphql/resolver/TransactionResolver.ts b/backend/src/graphql/resolver/TransactionResolver.ts index 461a70a00..240369006 100644 --- a/backend/src/graphql/resolver/TransactionResolver.ts +++ b/backend/src/graphql/resolver/TransactionResolver.ts @@ -57,7 +57,12 @@ export const executeTransaction = async ( // validate amount const receivedCallDate = new Date() - const sendBalance = await calculateBalance(sender.id, amount.mul(-1), receivedCallDate) + const sendBalance = await calculateBalance( + sender.id, + amount.mul(-1), + receivedCallDate, + transactionLink, + ) if (!sendBalance) { throw new Error("user hasn't enough GDD or amount is < 0") } From fa7f2b9d87581f7c07dee6c64b8a01e3697de355 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Thu, 31 Mar 2022 12:33:29 +0200 Subject: [PATCH 2/9] calculateBalance: If we redeem a link, make sure we do not consider its amount as blocked when calculating the balance --- backend/src/util/validate.ts | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/backend/src/util/validate.ts b/backend/src/util/validate.ts index 95e1bf699..5d2f39aa0 100644 --- a/backend/src/util/validate.ts +++ b/backend/src/util/validate.ts @@ -4,6 +4,7 @@ import { Transaction } from '@entity/Transaction' import { Decay } from '@model/Decay' import { getCustomRepository } from '@dbTools/typeorm' import { TransactionLinkRepository } from '@repository/TransactionLink' +import { TransactionLink as dbTransactionLink } from '@entity/TransactionLink' function isStringBoolean(value: string): boolean { const lowerValue = value.toLowerCase() @@ -21,6 +22,7 @@ async function calculateBalance( userId: number, amount: Decimal, time: Date, + transactionLink?: dbTransactionLink | null, ): Promise<{ balance: Decimal; decay: Decay; lastTransactionId: number } | null> { const lastTransaction = await Transaction.findOne({ userId }, { order: { balanceDate: 'DESC' } }) if (!lastTransaction) return null @@ -32,7 +34,13 @@ async function calculateBalance( const transactionLinkRepository = getCustomRepository(TransactionLinkRepository) const { sumHoldAvailableAmount } = await transactionLinkRepository.summary(userId, time) - if (balance.minus(sumHoldAvailableAmount.toString()).lessThan(0)) { + // If we want to redeem a link we need to make sure that the link amount is not calculated as blocked + // else we cannot redeem links which are more or equal to half of what an account actually owns + const sumHoldAvailableAmountMinusTransactionLink = transactionLink + ? sumHoldAvailableAmount.minus(transactionLink.amount.toString()) + : sumHoldAvailableAmount + + if (balance.minus(sumHoldAvailableAmountMinusTransactionLink.toString()).lessThan(0)) { return null } return { balance, lastTransactionId: lastTransaction.id, decay } From 04807bd225603f6c88c60052e51bb90cf24c4e93 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Thu, 31 Mar 2022 12:34:09 +0200 Subject: [PATCH 3/9] corrected comment --- backend/src/util/validate.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/util/validate.ts b/backend/src/util/validate.ts index 5d2f39aa0..1a0ce02ce 100644 --- a/backend/src/util/validate.ts +++ b/backend/src/util/validate.ts @@ -34,7 +34,7 @@ async function calculateBalance( const transactionLinkRepository = getCustomRepository(TransactionLinkRepository) const { sumHoldAvailableAmount } = await transactionLinkRepository.summary(userId, time) - // If we want to redeem a link we need to make sure that the link amount is not calculated as blocked + // 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 const sumHoldAvailableAmountMinusTransactionLink = transactionLink ? sumHoldAvailableAmount.minus(transactionLink.amount.toString()) From d0dc8dc0fd653a3ef3cbb158dfc513be37192187 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Thu, 31 Mar 2022 13:16:53 +0200 Subject: [PATCH 4/9] the backend returns an array of errors, we display the first --- frontend/src/pages/Send.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/pages/Send.vue b/frontend/src/pages/Send.vue index 270187bec..903de6e49 100644 --- a/frontend/src/pages/Send.vue +++ b/frontend/src/pages/Send.vue @@ -134,7 +134,7 @@ export default { this.currentTransactionStep = TRANSACTION_STEPS.transactionResultSendSuccess }) .catch((err) => { - this.errorResult = err.message + this.errorResult = err[0].message this.error = true this.currentTransactionStep = TRANSACTION_STEPS.transactionResultSendError }) From 06dcb2380e19892587ac120e4e8420e0162c1be6 Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Thu, 31 Mar 2022 13:48:15 +0200 Subject: [PATCH 5/9] seed creations months ago from now --- .../src/seeds/creation/CreationInterface.ts | 2 ++ backend/src/seeds/creation/index.ts | 13 ++++++------ backend/src/seeds/factory/creation.ts | 21 +++++++++++++++++++ 3 files changed, 29 insertions(+), 7 deletions(-) diff --git a/backend/src/seeds/creation/CreationInterface.ts b/backend/src/seeds/creation/CreationInterface.ts index 8723f441d..3e0f3cf6c 100644 --- a/backend/src/seeds/creation/CreationInterface.ts +++ b/backend/src/seeds/creation/CreationInterface.ts @@ -4,4 +4,6 @@ export interface CreationInterface { memo: string creationDate: string confirmed?: boolean + // number of months to move the confirmed creation to the past + moveCreationDate?: number } diff --git a/backend/src/seeds/creation/index.ts b/backend/src/seeds/creation/index.ts index 7396a7ec8..20d30d94c 100644 --- a/backend/src/seeds/creation/index.ts +++ b/backend/src/seeds/creation/index.ts @@ -1,29 +1,28 @@ import { CreationInterface } from './CreationInterface' - -const lastMonth = (date: Date): string => { - return new Date(date.getFullYear(), date.getMonth() - 1, 1).toISOString() -} +import { nMonthsBefore } from '../factory/creation' export const creations: CreationInterface[] = [ { email: 'bibi@bloxberg.de', amount: 1000, memo: 'Herzlich Willkommen bei Gradido!', - creationDate: lastMonth(new Date()), + creationDate: nMonthsBefore(new Date()), confirmed: true, + moveCreationDate: 12, }, { email: 'bob@baumeister.de', amount: 1000, memo: 'Herzlich Willkommen bei Gradido!', - creationDate: lastMonth(new Date()), + creationDate: nMonthsBefore(new Date()), confirmed: true, + moveCreationDate: 8, }, { email: 'raeuber@hotzenplotz.de', amount: 1000, memo: 'Herzlich Willkommen bei Gradido!', - creationDate: lastMonth(new Date()), + creationDate: nMonthsBefore(new Date()), confirmed: true, }, ] diff --git a/backend/src/seeds/factory/creation.ts b/backend/src/seeds/factory/creation.ts index d4d4c8101..64f693360 100644 --- a/backend/src/seeds/factory/creation.ts +++ b/backend/src/seeds/factory/creation.ts @@ -6,9 +6,14 @@ import { login } from '@/seeds/graphql/queries' import { CreationInterface } from '@/seeds/creation/CreationInterface' import { ApolloServerTestClient } from 'apollo-server-testing' import { User } from '@entity/User' +import { Transaction } from '@entity/Transaction' import { AdminPendingCreation } from '@entity/AdminPendingCreation' // import CONFIG from '@/config/index' +export const nMonthsBefore = (date: Date, months = 1): string => { + return new Date(date.getFullYear(), date.getMonth() - months, 1).toISOString() +} + export const creationFactory = async ( client: ApolloServerTestClient, creation: CreationInterface, @@ -34,5 +39,21 @@ export const creationFactory = async ( }) await mutate({ mutation: confirmPendingCreation, variables: { id: pendingCreation.id } }) + + if (creation.moveCreationDate) { + const transaction = await Transaction.findOneOrFail({ + where: { userId: user.id, creationDate: new Date(creation.creationDate) }, + order: { balanceDate: 'DESC' }, + }) + if (transaction.decay.equals(0) && transaction.creationDate) { + transaction.creationDate = new Date( + nMonthsBefore(transaction.creationDate, creation.moveCreationDate), + ) + transaction.balanceDate = new Date( + nMonthsBefore(transaction.balanceDate, creation.moveCreationDate), + ) + await transaction.save() + } + } } } From aee53d17c0e9badfee8d0405094f39e109754355 Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Thu, 31 Mar 2022 14:11:32 +0200 Subject: [PATCH 6/9] error message from server is toasted correctly --- frontend/src/pages/Send.spec.js | 4 +--- frontend/src/pages/Send.vue | 6 +++--- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/frontend/src/pages/Send.spec.js b/frontend/src/pages/Send.spec.js index 9fe774e33..802fdf8a7 100644 --- a/frontend/src/pages/Send.spec.js +++ b/frontend/src/pages/Send.spec.js @@ -155,8 +155,6 @@ describe('Send', () => { }) }) - /* LINK */ - describe('transaction form link', () => { beforeEach(async () => { apolloMutationMock.mockResolvedValue({ @@ -261,7 +259,7 @@ describe('Send', () => { }) it('toasts an error message', () => { - expect(toastErrorSpy).toBeCalledWith({ message: 'OUCH!' }) + expect(toastErrorSpy).toBeCalledWith('OUCH!') }) }) }) diff --git a/frontend/src/pages/Send.vue b/frontend/src/pages/Send.vue index 903de6e49..668e24493 100644 --- a/frontend/src/pages/Send.vue +++ b/frontend/src/pages/Send.vue @@ -133,8 +133,8 @@ export default { this.transactionData = { ...EMPTY_TRANSACTION_DATA } this.currentTransactionStep = TRANSACTION_STEPS.transactionResultSendSuccess }) - .catch((err) => { - this.errorResult = err[0].message + .catch((error) => { + this.errorResult = error.message this.error = true this.currentTransactionStep = TRANSACTION_STEPS.transactionResultSendError }) @@ -153,7 +153,7 @@ export default { this.updateTransactions({}) }) .catch((error) => { - this.toastError(error) + this.toastError(error.message) }) break default: From b53aef90f883a06ff789e652ef68f1f846e02f23 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Thu, 31 Mar 2022 20:52:59 +0200 Subject: [PATCH 7/9] Update backend/src/util/validate.ts Co-authored-by: Moriz Wahl --- backend/src/util/validate.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/backend/src/util/validate.ts b/backend/src/util/validate.ts index 1a0ce02ce..b158761da 100644 --- a/backend/src/util/validate.ts +++ b/backend/src/util/validate.ts @@ -36,11 +36,9 @@ async function calculateBalance( // 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 - const sumHoldAvailableAmountMinusTransactionLink = transactionLink - ? sumHoldAvailableAmount.minus(transactionLink.amount.toString()) - : sumHoldAvailableAmount + const releasedLinkAmount = transactionLink ? transactionLink.amount : new Decimal(0) - if (balance.minus(sumHoldAvailableAmountMinusTransactionLink.toString()).lessThan(0)) { + if (balance.minus(sumHoldAvailableAmount.toString()).plus(releasedLinkAmount.toString()).lessThan(0)) { return null } return { balance, lastTransactionId: lastTransaction.id, decay } From ef675980a8fc0266c2aecb97f3068ed636b34ad6 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Thu, 31 Mar 2022 21:04:16 +0200 Subject: [PATCH 8/9] lint fixes --- backend/src/util/validate.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/backend/src/util/validate.ts b/backend/src/util/validate.ts index b158761da..3c8cd5935 100644 --- a/backend/src/util/validate.ts +++ b/backend/src/util/validate.ts @@ -38,7 +38,9 @@ async function calculateBalance( // else we cannot redeem links which are more or equal to half of what an account actually owns const releasedLinkAmount = transactionLink ? transactionLink.amount : new Decimal(0) - if (balance.minus(sumHoldAvailableAmount.toString()).plus(releasedLinkAmount.toString()).lessThan(0)) { + if ( + balance.minus(sumHoldAvailableAmount.toString()).plus(releasedLinkAmount.toString()).lessThan(0) + ) { return null } return { balance, lastTransactionId: lastTransaction.id, decay } From 3ef0074d33f657979e68806f9a73ac9259e19d98 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Thu, 31 Mar 2022 21:47:55 +0200 Subject: [PATCH 9/9] free not only the link value but also the decay amount withheld --- backend/src/util/validate.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/util/validate.ts b/backend/src/util/validate.ts index 3c8cd5935..8d1c90ca4 100644 --- a/backend/src/util/validate.ts +++ b/backend/src/util/validate.ts @@ -36,7 +36,7 @@ async function calculateBalance( // 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 - const releasedLinkAmount = transactionLink ? transactionLink.amount : new Decimal(0) + const releasedLinkAmount = transactionLink ? transactionLink.holdAvailableAmount : new Decimal(0) if ( balance.minus(sumHoldAvailableAmount.toString()).plus(releasedLinkAmount.toString()).lessThan(0)