From 8277773006aa8f8d4f732e07fc0183f3e6321809 Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Wed, 23 Mar 2022 18:13:54 +0100 Subject: [PATCH 01/14] add gdtSum query --- backend/src/auth/RIGHTS.ts | 1 + backend/src/auth/ROLES.ts | 1 + backend/src/graphql/resolver/GdtResolver.ts | 21 +++++++++++++++++++-- 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/backend/src/auth/RIGHTS.ts b/backend/src/auth/RIGHTS.ts index f40088779..57401d361 100644 --- a/backend/src/auth/RIGHTS.ts +++ b/backend/src/auth/RIGHTS.ts @@ -24,6 +24,7 @@ export enum RIGHTS { QUERY_TRANSACTION_LINK = 'QUERY_TRANSACTION_LINK', REDEEM_TRANSACTION_LINK = 'REDEEM_TRANSACTION_LINK', LIST_TRANSACTION_LINKS = 'LIST_TRANSACTION_LINKS', + GDT_SUM = 'GDT_SUM', // Admin SEARCH_USERS = 'SEARCH_USERS', CREATE_PENDING_CREATION = 'CREATE_PENDING_CREATION', diff --git a/backend/src/auth/ROLES.ts b/backend/src/auth/ROLES.ts index 82c689848..5cb8f833a 100644 --- a/backend/src/auth/ROLES.ts +++ b/backend/src/auth/ROLES.ts @@ -22,6 +22,7 @@ export const ROLE_USER = new Role('user', [ RIGHTS.DELETE_TRANSACTION_LINK, RIGHTS.REDEEM_TRANSACTION_LINK, RIGHTS.LIST_TRANSACTION_LINKS, + RIGHTS.GDT_SUM, ]) export const ROLE_ADMIN = new Role('admin', Object.values(RIGHTS)) // all rights diff --git a/backend/src/graphql/resolver/GdtResolver.ts b/backend/src/graphql/resolver/GdtResolver.ts index 26ae9b210..302b17a4a 100644 --- a/backend/src/graphql/resolver/GdtResolver.ts +++ b/backend/src/graphql/resolver/GdtResolver.ts @@ -13,13 +13,11 @@ import { RIGHTS } from '@/auth/RIGHTS' export class GdtResolver { @Authorized([RIGHTS.LIST_GDT_ENTRIES]) @Query(() => GdtEntryList) - // eslint-disable-next-line @typescript-eslint/no-explicit-any async listGDTEntries( @Args() { currentPage = 1, pageSize = 5, order = Order.DESC }: Paginated, @Ctx() context: any, ): Promise { - // load user const userEntity = context.user try { @@ -35,6 +33,25 @@ export class GdtResolver { } } + @Authorized([RIGHTS.GDT_SUM]) + @Query(() => Number | null) + async gdtSum(@Ctx() context: any): Promise { + const { user } = context + try { + const resultGDTSum = await apiPost(`${CONFIG.GDT_API_URL}/GdtEntries/sumPerEmailApi`, { + email: user.email, + }) + if (!resultGDTSum.success) { + throw new Error('Call not successful') + } + return Number(resultGDTSum.data.sum) || 0 + } catch (err: any) { + // eslint-disable-next-line no-console + console.log('Could not query GDT Server', err) + return null + } + } + @Authorized([RIGHTS.EXIST_PID]) @Query(() => Number) // eslint-disable-next-line @typescript-eslint/no-explicit-any From 243058ee5a6cddbd1e474b5939f510509dd967f8 Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Wed, 23 Mar 2022 18:18:07 +0100 Subject: [PATCH 02/14] get GDT sum via GDT resolver --- .../graphql/resolver/TransactionResolver.ts | 19 ++++--------------- 1 file changed, 4 insertions(+), 15 deletions(-) diff --git a/backend/src/graphql/resolver/TransactionResolver.ts b/backend/src/graphql/resolver/TransactionResolver.ts index 03640817f..3164eaf8e 100644 --- a/backend/src/graphql/resolver/TransactionResolver.ts +++ b/backend/src/graphql/resolver/TransactionResolver.ts @@ -6,7 +6,6 @@ import { Resolver, Query, Args, Authorized, Ctx, Mutation } from 'type-graphql' import { getCustomRepository, getConnection } from '@dbTools/typeorm' -import CONFIG from '@/config' import { sendTransactionReceivedEmail } from '@/mailer/sendTransactionReceivedEmail' import { Transaction } from '@model/Transaction' @@ -24,7 +23,6 @@ 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' import { calculateBalance, isHexPublicKey } from '@/util/validate' import { RIGHTS } from '@/auth/RIGHTS' @@ -34,6 +32,8 @@ import { virtualLinkTransaction, virtualDecayTransaction } from '@/util/virtualT import Decimal from 'decimal.js-light' import { calculateDecay } from '@/util/decay' +import GdtResolver from './GdtResolver' + export const executeTransaction = async ( amount: Decimal, memo: string, @@ -143,19 +143,8 @@ export class TransactionResolver { ) // get GDT - let balanceGDT = null - try { - const resultGDTSum = await apiPost(`${CONFIG.GDT_API_URL}/GdtEntries/sumPerEmailApi`, { - email: user.email, - }) - if (!resultGDTSum.success) { - throw new Error('Call not successful') - } - balanceGDT = Number(resultGDTSum.data.sum) || 0 - } catch (err: any) { - // eslint-disable-next-line no-console - console.log('Could not query GDT Server', err) - } + gdtResolver = new GdtResolver() + const balanceGDT = await gdtResolver.gdtSum() if (!lastTransaction) { return new TransactionList(new Decimal(0), [], 0, 0, balanceGDT) From f46bd23c11426200849819345e377c5fe619f5d3 Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Wed, 23 Mar 2022 19:05:19 +0100 Subject: [PATCH 03/14] refactor balance model --- backend/src/graphql/model/Balance.ts | 47 +++++++++++++++++++++++----- 1 file changed, 40 insertions(+), 7 deletions(-) diff --git a/backend/src/graphql/model/Balance.ts b/backend/src/graphql/model/Balance.ts index 2f1eeb406..6a93a5b63 100644 --- a/backend/src/graphql/model/Balance.ts +++ b/backend/src/graphql/model/Balance.ts @@ -1,22 +1,55 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ import { ObjectType, Field } from 'type-graphql' import Decimal from 'decimal.js-light' +import CONFIG from '@/config' @ObjectType() export class Balance { - constructor(json: any) { - this.balance = json.balance - this.decay = json.decay - this.decayDate = json.decay_date + constructor(data: { + balance: Decimal + decay: Decimal + lastBookedBalance: Decimal + balanceGDT: number | null + count: number + linkCount: number + decayStartBlock?: Date + lastBookedDate?: Date | null + }) { + this.balance = data.balance + this.decay = data.decay + this.lastBookedBalance = data.lastBookedBalance + this.balanceGDT = data.balanceGDT || null + this.count = data.count + this.linkCount = data.linkCount + this.decayStartBlock = data.decayStartBlock || CONFIG.DECAY_START_TIME + this.lastBookedDate = data.lastBookedDate || null } + // the actual balance, decay included @Field(() => Decimal) balance: Decimal + // the decay since the last booked balance @Field(() => Decimal) decay: Decimal + @Field(() => Decimal) + lastBookedBalance: Decimal + + @Field(() => Number, { nullable: true }) + balanceGDT: number | null + + // the count of all transactions + @Field(() => Number) + count: number + + // the count of transaction links + @Field(() => Number) + linkCount: number + @Field(() => Date) - decayDate: Date + decayStartBlock: Date + + // may be null as there may be no transaction + @Field(() => Date, { nullable: true }) + lastBookedDate: Date | null } From a1ac6600b7b79c393448ee9f6ee04475f697c623 Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Wed, 23 Mar 2022 19:06:12 +0100 Subject: [PATCH 04/14] refactor resolvers to use balance resolver and model --- .../src/graphql/resolver/BalanceResolver.ts | 39 ++++++++++++++++--- backend/src/graphql/resolver/GdtResolver.ts | 6 +-- .../graphql/resolver/TransactionResolver.ts | 6 +-- 3 files changed, 39 insertions(+), 12 deletions(-) diff --git a/backend/src/graphql/resolver/BalanceResolver.ts b/backend/src/graphql/resolver/BalanceResolver.ts index 09d2fdc92..5093d4347 100644 --- a/backend/src/graphql/resolver/BalanceResolver.ts +++ b/backend/src/graphql/resolver/BalanceResolver.ts @@ -5,18 +5,23 @@ import { Resolver, Query, Ctx, Authorized } from 'type-graphql' import { Balance } from '@model/Balance' import { calculateDecay } from '@/util/decay' import { RIGHTS } from '@/auth/RIGHTS' -import { Transaction } from '@entity/Transaction' +import { Transaction, Transaction as dbTransaction } from '@entity/Transaction' import Decimal from 'decimal.js-light' +import { GdtResolver } from './GdtResolver' +import { TransactionLink as dbTransactionLink } from '@entity/TransactionLink' +import { MoreThan } from '@dbTools/typeorm' @Resolver() export class BalanceResolver { @Authorized([RIGHTS.BALANCE]) @Query(() => Balance) async balance(@Ctx() context: any): Promise { - // load user and balance const { user } = context const now = new Date() + const gdtResolver = new GdtResolver() + const balanceGDT = await gdtResolver.gdtSum(context) + const lastTransaction = await Transaction.findOne( { userId: user.id }, { order: { balanceDate: 'DESC' } }, @@ -27,14 +32,36 @@ export class BalanceResolver { return new Balance({ balance: new Decimal(0), decay: new Decimal(0), - decay_date: now.toString(), + lastBookedBalance: new Decimal(0), + balanceGDT, + count: 0, + linkCount: 0, }) } + const count = await dbTransaction.count({ where: { userId: user.id } }) + const linkCount = await dbTransactionLink.count({ + where: { + userId: user.id, + redeemedAt: null, + validUntil: MoreThan(new Date()), + }, + }) + + const calculatedDecay = calculateDecay( + lastTransaction.balance, + lastTransaction.balanceDate, + now, + ) + return new Balance({ - balance: lastTransaction.balance, - decay: calculateDecay(lastTransaction.balance, lastTransaction.balanceDate, now).balance, - decay_date: now.toString(), + balance: calculatedDecay.balance, + decay: calculatedDecay.decay, + lastBookedBalance: lastTransaction.balance, + balanceGDT, + count, + linkCount, + lastBookedDate: lastTransaction.balanceDate, }) } } diff --git a/backend/src/graphql/resolver/GdtResolver.ts b/backend/src/graphql/resolver/GdtResolver.ts index 302b17a4a..a563a0845 100644 --- a/backend/src/graphql/resolver/GdtResolver.ts +++ b/backend/src/graphql/resolver/GdtResolver.ts @@ -5,7 +5,7 @@ import { Resolver, Query, Args, Ctx, Authorized, Arg } from 'type-graphql' import CONFIG from '@/config' import { GdtEntryList } from '@model/GdtEntryList' import Paginated from '@arg/Paginated' -import { apiGet } from '@/apis/HttpRequest' +import { apiGet, apiPost } from '@/apis/HttpRequest' import { Order } from '@enum/Order' import { RIGHTS } from '@/auth/RIGHTS' @@ -34,7 +34,7 @@ export class GdtResolver { } @Authorized([RIGHTS.GDT_SUM]) - @Query(() => Number | null) + @Query(() => Number) async gdtSum(@Ctx() context: any): Promise { const { user } = context try { @@ -48,7 +48,7 @@ export class GdtResolver { } catch (err: any) { // eslint-disable-next-line no-console console.log('Could not query GDT Server', err) - return null + return 0 } } diff --git a/backend/src/graphql/resolver/TransactionResolver.ts b/backend/src/graphql/resolver/TransactionResolver.ts index 3164eaf8e..8109ba70a 100644 --- a/backend/src/graphql/resolver/TransactionResolver.ts +++ b/backend/src/graphql/resolver/TransactionResolver.ts @@ -32,7 +32,7 @@ import { virtualLinkTransaction, virtualDecayTransaction } from '@/util/virtualT import Decimal from 'decimal.js-light' import { calculateDecay } from '@/util/decay' -import GdtResolver from './GdtResolver' +import { GdtResolver } from './GdtResolver' export const executeTransaction = async ( amount: Decimal, @@ -143,8 +143,8 @@ export class TransactionResolver { ) // get GDT - gdtResolver = new GdtResolver() - const balanceGDT = await gdtResolver.gdtSum() + const gdtResolver = new GdtResolver() + const balanceGDT = await gdtResolver.gdtSum(context) if (!lastTransaction) { return new TransactionList(new Decimal(0), [], 0, 0, balanceGDT) From 3a8229f60f8388f6c1e724c8ce2da575d28b8c0d Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Wed, 23 Mar 2022 19:18:18 +0100 Subject: [PATCH 05/14] include hold available amount in balance calculation --- backend/src/graphql/resolver/BalanceResolver.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/backend/src/graphql/resolver/BalanceResolver.ts b/backend/src/graphql/resolver/BalanceResolver.ts index 5093d4347..4867da54d 100644 --- a/backend/src/graphql/resolver/BalanceResolver.ts +++ b/backend/src/graphql/resolver/BalanceResolver.ts @@ -9,7 +9,8 @@ import { Transaction, Transaction as dbTransaction } from '@entity/Transaction' import Decimal from 'decimal.js-light' import { GdtResolver } from './GdtResolver' import { TransactionLink as dbTransactionLink } from '@entity/TransactionLink' -import { MoreThan } from '@dbTools/typeorm' +import { MoreThan, getCustomRepository } from '@dbTools/typeorm' +import { TransactionLinkRepository } from '@repository/TransactionLink' @Resolver() export class BalanceResolver { @@ -48,8 +49,11 @@ export class BalanceResolver { }, }) + const transactionLinkRepository = getCustomRepository(TransactionLinkRepository) + const { sumHoldAvailableAmount } = await transactionLinkRepository.summary(user.id, now) + const calculatedDecay = calculateDecay( - lastTransaction.balance, + lastTransaction.balance.minus(sumHoldAvailableAmount.toString()), lastTransaction.balanceDate, now, ) From d584651fc10fe61ea65de98b614a8ce19480707b Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Tue, 29 Mar 2022 01:11:25 +0200 Subject: [PATCH 06/14] rename right to GDT_BALANCE --- backend/src/auth/RIGHTS.ts | 2 +- backend/src/auth/ROLES.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/src/auth/RIGHTS.ts b/backend/src/auth/RIGHTS.ts index 57401d361..5cd0c421d 100644 --- a/backend/src/auth/RIGHTS.ts +++ b/backend/src/auth/RIGHTS.ts @@ -24,7 +24,7 @@ export enum RIGHTS { QUERY_TRANSACTION_LINK = 'QUERY_TRANSACTION_LINK', REDEEM_TRANSACTION_LINK = 'REDEEM_TRANSACTION_LINK', LIST_TRANSACTION_LINKS = 'LIST_TRANSACTION_LINKS', - GDT_SUM = 'GDT_SUM', + GDT_BALANCE = 'GDT_SUM', // Admin SEARCH_USERS = 'SEARCH_USERS', CREATE_PENDING_CREATION = 'CREATE_PENDING_CREATION', diff --git a/backend/src/auth/ROLES.ts b/backend/src/auth/ROLES.ts index 5cb8f833a..891fe1844 100644 --- a/backend/src/auth/ROLES.ts +++ b/backend/src/auth/ROLES.ts @@ -22,7 +22,7 @@ export const ROLE_USER = new Role('user', [ RIGHTS.DELETE_TRANSACTION_LINK, RIGHTS.REDEEM_TRANSACTION_LINK, RIGHTS.LIST_TRANSACTION_LINKS, - RIGHTS.GDT_SUM, + RIGHTS.GDT_BALANCE, ]) export const ROLE_ADMIN = new Role('admin', Object.values(RIGHTS)) // all rights From e9e97549a7b33cd6da4e628479c5134f5ffcb859 Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Tue, 29 Mar 2022 01:12:07 +0200 Subject: [PATCH 07/14] rename right to GDT_BALANCE, rename query to gdtBalance, ensure gdtBalance is null when API call fails --- backend/src/graphql/resolver/BalanceResolver.ts | 2 +- backend/src/graphql/resolver/GdtResolver.ts | 6 +++--- backend/src/graphql/resolver/TransactionResolver.ts | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/backend/src/graphql/resolver/BalanceResolver.ts b/backend/src/graphql/resolver/BalanceResolver.ts index 4867da54d..dfaafc8e0 100644 --- a/backend/src/graphql/resolver/BalanceResolver.ts +++ b/backend/src/graphql/resolver/BalanceResolver.ts @@ -21,7 +21,7 @@ export class BalanceResolver { const now = new Date() const gdtResolver = new GdtResolver() - const balanceGDT = await gdtResolver.gdtSum(context) + const balanceGDT = await gdtResolver.gdtBalance(context) const lastTransaction = await Transaction.findOne( { userId: user.id }, diff --git a/backend/src/graphql/resolver/GdtResolver.ts b/backend/src/graphql/resolver/GdtResolver.ts index a563a0845..e2409160b 100644 --- a/backend/src/graphql/resolver/GdtResolver.ts +++ b/backend/src/graphql/resolver/GdtResolver.ts @@ -33,9 +33,9 @@ export class GdtResolver { } } - @Authorized([RIGHTS.GDT_SUM]) + @Authorized([RIGHTS.GDT_BALANCE]) @Query(() => Number) - async gdtSum(@Ctx() context: any): Promise { + async gdtBalance(@Ctx() context: any): Promise { const { user } = context try { const resultGDTSum = await apiPost(`${CONFIG.GDT_API_URL}/GdtEntries/sumPerEmailApi`, { @@ -48,7 +48,7 @@ export class GdtResolver { } catch (err: any) { // eslint-disable-next-line no-console console.log('Could not query GDT Server', err) - return 0 + return null } } diff --git a/backend/src/graphql/resolver/TransactionResolver.ts b/backend/src/graphql/resolver/TransactionResolver.ts index 1a5bf80d6..00b47658b 100644 --- a/backend/src/graphql/resolver/TransactionResolver.ts +++ b/backend/src/graphql/resolver/TransactionResolver.ts @@ -156,7 +156,7 @@ export class TransactionResolver { // get GDT const gdtResolver = new GdtResolver() - const balanceGDT = await gdtResolver.gdtSum(context) + const balanceGDT = await gdtResolver.gdtBalance(context) if (!lastTransaction) { return new TransactionList(new Decimal(0), [], 0, 0, balanceGDT) From 03da5aa34319d8ae1198f5145aba3b6b9627a012 Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Tue, 29 Mar 2022 01:29:08 +0200 Subject: [PATCH 08/14] change transaction list query to new balance object --- frontend/src/graphql/queries.js | 15 ++++++++++----- frontend/src/layouts/DashboardLayout_gdd.vue | 12 +++++++----- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/frontend/src/graphql/queries.js b/frontend/src/graphql/queries.js index e47da0fea..ecd8208b5 100644 --- a/frontend/src/graphql/queries.js +++ b/frontend/src/graphql/queries.js @@ -45,11 +45,16 @@ export const logout = gql` export const transactionsQuery = gql` query($currentPage: Int = 1, $pageSize: Int = 25, $order: Order = DESC) { transactionList(currentPage: $currentPage, pageSize: $pageSize, order: $order) { - balanceGDT - count - linkCount - balance - decayStartBlock + balance { + balance + decay + lastBookedBalance + balanceGDT + count + linkCount + decayStartBlock + lastBookedDate + } transactions { id typeId diff --git a/frontend/src/layouts/DashboardLayout_gdd.vue b/frontend/src/layouts/DashboardLayout_gdd.vue index 9abcf42cf..de2c68bf0 100755 --- a/frontend/src/layouts/DashboardLayout_gdd.vue +++ b/frontend/src/layouts/DashboardLayout_gdd.vue @@ -103,12 +103,14 @@ export default { data: { transactionList }, } = result this.GdtBalance = - transactionList.balanceGDT === null ? null : Number(transactionList.balanceGDT) + transactionList.balance.balanceGDT === null + ? null + : Number(transactionList.balance.balanceGDT) this.transactions = transactionList.transactions - this.balance = Number(transactionList.balance) - this.transactionCount = transactionList.count - this.transactionLinkCount = transactionList.linkCount - this.decayStartBlock = new Date(transactionList.decayStartBlock) + this.balance = Number(transactionList.balance.balance) + this.transactionCount = transactionList.balance.count + this.transactionLinkCount = transactionList.balance.linkCount + this.decayStartBlock = new Date(transactionList.balance.decayStartBlock) this.pending = false }) .catch((error) => { From dc3031531136498d699ac9082ab85798c6a844b6 Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Tue, 29 Mar 2022 01:31:23 +0200 Subject: [PATCH 09/14] change resolved object to new schema --- frontend/src/layouts/DashboardLayout_gdd.spec.js | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/frontend/src/layouts/DashboardLayout_gdd.spec.js b/frontend/src/layouts/DashboardLayout_gdd.spec.js index ed2199a91..ac079b0f3 100644 --- a/frontend/src/layouts/DashboardLayout_gdd.spec.js +++ b/frontend/src/layouts/DashboardLayout_gdd.spec.js @@ -145,11 +145,13 @@ describe('DashboardLayoutGdd', () => { apolloMock.mockResolvedValue({ data: { transactionList: { - balanceGDT: 100, - count: 4, - linkCount: 8, - balance: 1450, - decay: 1250, + balance: { + balanceGDT: 100, + count: 4, + linkCount: 8, + balance: 1450, + decay: 1250, + }, transactions: ['transaction', 'transaction', 'transaction', 'transaction'], }, }, From 27ad1d2e229ac11d6ddeb577bc356adf07367616 Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Tue, 29 Mar 2022 01:54:13 +0200 Subject: [PATCH 10/14] transaction list model contains balance, user balance resolver to create transacton list result --- backend/src/graphql/model/TransactionList.ts | 32 +++--------------- .../src/graphql/resolver/BalanceResolver.ts | 33 +++++++++++-------- .../graphql/resolver/TransactionResolver.ts | 23 +++++-------- 3 files changed, 32 insertions(+), 56 deletions(-) diff --git a/backend/src/graphql/model/TransactionList.ts b/backend/src/graphql/model/TransactionList.ts index 9e8356747..888c30dc7 100644 --- a/backend/src/graphql/model/TransactionList.ts +++ b/backend/src/graphql/model/TransactionList.ts @@ -1,40 +1,16 @@ import { ObjectType, Field } from 'type-graphql' -import CONFIG from '@/config' -import Decimal from 'decimal.js-light' import { Transaction } from './Transaction' +import { Balance } from './Balance' @ObjectType() export class TransactionList { - constructor( - balance: Decimal, - transactions: Transaction[], - count: number, - linkCount: number, - balanceGDT?: number | null, - decayStartBlock: Date = CONFIG.DECAY_START_TIME, - ) { + constructor(balance: Balance, transactions: Transaction[]) { this.balance = balance this.transactions = transactions - this.count = count - this.linkCount = linkCount - this.balanceGDT = balanceGDT || null - this.decayStartBlock = decayStartBlock } - @Field(() => Number, { nullable: true }) - balanceGDT: number | null - - @Field(() => Number) - count: number - - @Field(() => Number) - linkCount: number - - @Field(() => Decimal) - balance: Decimal - - @Field(() => Date) - decayStartBlock: Date + @Field(() => Balance) + balance: Balance @Field(() => [Transaction]) transactions: Transaction[] diff --git a/backend/src/graphql/resolver/BalanceResolver.ts b/backend/src/graphql/resolver/BalanceResolver.ts index dfaafc8e0..f206cb0b9 100644 --- a/backend/src/graphql/resolver/BalanceResolver.ts +++ b/backend/src/graphql/resolver/BalanceResolver.ts @@ -23,10 +23,9 @@ export class BalanceResolver { const gdtResolver = new GdtResolver() const balanceGDT = await gdtResolver.gdtBalance(context) - const lastTransaction = await Transaction.findOne( - { userId: user.id }, - { order: { balanceDate: 'DESC' } }, - ) + const lastTransaction = context.lastTransaction + ? context.lastTransaction + : await Transaction.findOne({ userId: user.id }, { order: { balanceDate: 'DESC' } }) // No balance found if (!lastTransaction) { @@ -40,17 +39,25 @@ export class BalanceResolver { }) } - const count = await dbTransaction.count({ where: { userId: user.id } }) - const linkCount = await dbTransactionLink.count({ - where: { - userId: user.id, - redeemedAt: null, - validUntil: MoreThan(new Date()), - }, - }) + const count = + context.count || context.count === 0 + ? context.count + : await dbTransaction.count({ where: { userId: user.id } }) + const linkCount = + context.linkCount || context.linkCount === 0 + ? context.linkCount + : await dbTransactionLink.count({ + where: { + userId: user.id, + redeemedAt: null, + validUntil: MoreThan(new Date()), + }, + }) const transactionLinkRepository = getCustomRepository(TransactionLinkRepository) - const { sumHoldAvailableAmount } = await transactionLinkRepository.summary(user.id, now) + const { sumHoldAvailableAmount } = context.sumHoldAvailableAmount + ? { sumHoldAvailableAmount: context.sumHoldAvailableAmount } + : await transactionLinkRepository.summary(user.id, now) const calculatedDecay = calculateDecay( lastTransaction.balance.minus(sumHoldAvailableAmount.toString()), diff --git a/backend/src/graphql/resolver/TransactionResolver.ts b/backend/src/graphql/resolver/TransactionResolver.ts index 00b47658b..bb7a5c2f6 100644 --- a/backend/src/graphql/resolver/TransactionResolver.ts +++ b/backend/src/graphql/resolver/TransactionResolver.ts @@ -30,9 +30,8 @@ import { User } from '@model/User' import { communityUser } from '@/util/communityUser' import { virtualLinkTransaction, virtualDecayTransaction } from '@/util/virtualTransactions' import Decimal from 'decimal.js-light' -import { calculateDecay } from '@/util/decay' -import { GdtResolver } from './GdtResolver' +import { BalanceResolver } from './BalanceResolver' const MEMO_MAX_CHARS = 255 const MEMO_MIN_CHARS = 5 @@ -154,12 +153,11 @@ export class TransactionResolver { { order: { balanceDate: 'DESC' } }, ) - // get GDT - const gdtResolver = new GdtResolver() - const balanceGDT = await gdtResolver.gdtBalance(context) + const balanceResolver = new BalanceResolver() + context.lastTransaction = lastTransaction if (!lastTransaction) { - return new TransactionList(new Decimal(0), [], 0, 0, balanceGDT) + return new TransactionList(await balanceResolver.balance(context), []) } // find transactions @@ -172,6 +170,7 @@ export class TransactionResolver { offset, order, ) + context.count = userTransactionsCount // find involved users; I am involved const involvedUserIds: number[] = [user.id] @@ -194,6 +193,8 @@ export class TransactionResolver { const transactionLinkRepository = getCustomRepository(TransactionLinkRepository) const { sumHoldAvailableAmount, sumAmount, lastDate, firstDate, transactionLinkcount } = await transactionLinkRepository.summary(user.id, now) + context.linkCount = transactionLinkcount + context.sumHoldAvailableAmount = sumHoldAvailableAmount // decay & link transactions if (currentPage === 1 && order === Order.DESC) { @@ -226,15 +227,7 @@ export class TransactionResolver { }) // Construct Result - return new TransactionList( - calculateDecay(lastTransaction.balance, lastTransaction.balanceDate, now).balance.minus( - sumHoldAvailableAmount.toString(), - ), - transactions, - userTransactionsCount, - transactionLinkcount, - balanceGDT, - ) + return new TransactionList(await balanceResolver.balance(context), transactions) } @Authorized([RIGHTS.SEND_COINS]) From 51258b838eac07844959820c3ff1bedaad1cfd73 Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Tue, 29 Mar 2022 01:55:59 +0200 Subject: [PATCH 11/14] set rights correctly --- backend/src/auth/RIGHTS.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/auth/RIGHTS.ts b/backend/src/auth/RIGHTS.ts index 5cd0c421d..93c7d8ea8 100644 --- a/backend/src/auth/RIGHTS.ts +++ b/backend/src/auth/RIGHTS.ts @@ -24,7 +24,7 @@ export enum RIGHTS { QUERY_TRANSACTION_LINK = 'QUERY_TRANSACTION_LINK', REDEEM_TRANSACTION_LINK = 'REDEEM_TRANSACTION_LINK', LIST_TRANSACTION_LINKS = 'LIST_TRANSACTION_LINKS', - GDT_BALANCE = 'GDT_SUM', + GDT_BALANCE = 'GDT_BALANCE', // Admin SEARCH_USERS = 'SEARCH_USERS', CREATE_PENDING_CREATION = 'CREATE_PENDING_CREATION', From feb89cf4e02c2033b98d27ff535d01fe12c8476b Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Tue, 29 Mar 2022 01:58:20 +0200 Subject: [PATCH 12/14] import transaction as db transaction --- backend/src/graphql/resolver/BalanceResolver.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/src/graphql/resolver/BalanceResolver.ts b/backend/src/graphql/resolver/BalanceResolver.ts index f206cb0b9..7d30f6868 100644 --- a/backend/src/graphql/resolver/BalanceResolver.ts +++ b/backend/src/graphql/resolver/BalanceResolver.ts @@ -5,7 +5,7 @@ import { Resolver, Query, Ctx, Authorized } from 'type-graphql' import { Balance } from '@model/Balance' import { calculateDecay } from '@/util/decay' import { RIGHTS } from '@/auth/RIGHTS' -import { Transaction, Transaction as dbTransaction } from '@entity/Transaction' +import { Transaction as dbTransaction } from '@entity/Transaction' import Decimal from 'decimal.js-light' import { GdtResolver } from './GdtResolver' import { TransactionLink as dbTransactionLink } from '@entity/TransactionLink' @@ -25,7 +25,7 @@ export class BalanceResolver { const lastTransaction = context.lastTransaction ? context.lastTransaction - : await Transaction.findOne({ userId: user.id }, { order: { balanceDate: 'DESC' } }) + : await dbTransaction.findOne({ userId: user.id }, { order: { balanceDate: 'DESC' } }) // No balance found if (!lastTransaction) { From 633eef7c1615f16dc49e83b6eabd874c08a8ae66 Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Tue, 29 Mar 2022 02:34:13 +0200 Subject: [PATCH 13/14] round GDD values in balance object --- backend/src/graphql/resolver/BalanceResolver.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/backend/src/graphql/resolver/BalanceResolver.ts b/backend/src/graphql/resolver/BalanceResolver.ts index 7d30f6868..a311d5cdc 100644 --- a/backend/src/graphql/resolver/BalanceResolver.ts +++ b/backend/src/graphql/resolver/BalanceResolver.ts @@ -66,9 +66,9 @@ export class BalanceResolver { ) return new Balance({ - balance: calculatedDecay.balance, - decay: calculatedDecay.decay, - lastBookedBalance: lastTransaction.balance, + balance: calculatedDecay.balance.toDecimalPlaces(2, Decimal.ROUND_DOWN), // round towards zero + decay: calculatedDecay.decay.toDecimalPlaces(2, Decimal.ROUND_FLOOR), // round towards - infinity + lastBookedBalance: lastTransaction.balance.toDecimalPlaces(2, Decimal.ROUND_DOWN), balanceGDT, count, linkCount, From 90e6798a7d58e4257a2e70cb4c0594a32a6d9ee6 Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Tue, 29 Mar 2022 16:10:06 +0200 Subject: [PATCH 14/14] rename context.count to context.transactionCount --- backend/src/graphql/resolver/BalanceResolver.ts | 4 ++-- backend/src/graphql/resolver/TransactionResolver.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/backend/src/graphql/resolver/BalanceResolver.ts b/backend/src/graphql/resolver/BalanceResolver.ts index a311d5cdc..672e07b12 100644 --- a/backend/src/graphql/resolver/BalanceResolver.ts +++ b/backend/src/graphql/resolver/BalanceResolver.ts @@ -40,8 +40,8 @@ export class BalanceResolver { } const count = - context.count || context.count === 0 - ? context.count + context.transactionCount || context.transactionCount === 0 + ? context.transactionCount : await dbTransaction.count({ where: { userId: user.id } }) const linkCount = context.linkCount || context.linkCount === 0 diff --git a/backend/src/graphql/resolver/TransactionResolver.ts b/backend/src/graphql/resolver/TransactionResolver.ts index bb7a5c2f6..310ea37d1 100644 --- a/backend/src/graphql/resolver/TransactionResolver.ts +++ b/backend/src/graphql/resolver/TransactionResolver.ts @@ -170,7 +170,7 @@ export class TransactionResolver { offset, order, ) - context.count = userTransactionsCount + context.transactionCount = userTransactionsCount // find involved users; I am involved const involvedUserIds: number[] = [user.id]