mirror of
https://github.com/IT4Change/gradido.git
synced 2025-12-13 07:45:54 +00:00
lots of refacoting in TransactionResolver
This commit is contained in:
parent
9574af9278
commit
2d0d02c7f6
@ -150,57 +150,6 @@ async function calculateAndAddDecayTransactions(
|
|||||||
return finalTransactions
|
return finalTransactions
|
||||||
}
|
}
|
||||||
|
|
||||||
// Helper function
|
|
||||||
async function listTransactions(
|
|
||||||
currentPage: number,
|
|
||||||
pageSize: number,
|
|
||||||
order: Order,
|
|
||||||
user: dbUser,
|
|
||||||
onlyCreations: boolean,
|
|
||||||
): Promise<TransactionList> {
|
|
||||||
let limit = pageSize
|
|
||||||
let offset = 0
|
|
||||||
let skipFirstTransaction = false
|
|
||||||
if (currentPage > 1) {
|
|
||||||
offset = (currentPage - 1) * pageSize - 1
|
|
||||||
limit++
|
|
||||||
}
|
|
||||||
|
|
||||||
if (offset && order === Order.ASC) {
|
|
||||||
offset--
|
|
||||||
}
|
|
||||||
const userTransactionRepository = getCustomRepository(UserTransactionRepository)
|
|
||||||
let [userTransactions, userTransactionsCount] = await userTransactionRepository.findByUserPaged(
|
|
||||||
user.id,
|
|
||||||
limit,
|
|
||||||
offset,
|
|
||||||
order,
|
|
||||||
onlyCreations,
|
|
||||||
)
|
|
||||||
skipFirstTransaction = userTransactionsCount > offset + limit
|
|
||||||
const decay = !(currentPage > 1)
|
|
||||||
let transactions: Transaction[] = []
|
|
||||||
if (userTransactions.length) {
|
|
||||||
if (order === Order.DESC) {
|
|
||||||
userTransactions = userTransactions.reverse()
|
|
||||||
}
|
|
||||||
transactions = await calculateAndAddDecayTransactions(
|
|
||||||
userTransactions,
|
|
||||||
user,
|
|
||||||
decay,
|
|
||||||
skipFirstTransaction,
|
|
||||||
)
|
|
||||||
if (order === Order.DESC) {
|
|
||||||
transactions = transactions.reverse()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const transactionList = new TransactionList()
|
|
||||||
transactionList.count = userTransactionsCount
|
|
||||||
transactionList.transactions = transactions
|
|
||||||
return transactionList
|
|
||||||
}
|
|
||||||
|
|
||||||
// helper helper function
|
// helper helper function
|
||||||
async function updateStateBalance(
|
async function updateStateBalance(
|
||||||
user: dbUser,
|
user: dbUser,
|
||||||
@ -281,42 +230,71 @@ export class TransactionResolver {
|
|||||||
): Promise<TransactionList> {
|
): Promise<TransactionList> {
|
||||||
// load user
|
// load user
|
||||||
const userRepository = getCustomRepository(UserRepository)
|
const userRepository = getCustomRepository(UserRepository)
|
||||||
let userEntity: dbUser | undefined
|
const user = userId
|
||||||
if (userId) {
|
? await userRepository.findOneOrFail({ id: userId }, { withDeleted: true })
|
||||||
userEntity = await userRepository.findOneOrFail({ id: userId }, { withDeleted: true })
|
: await userRepository.findByPubkeyHex(context.pubKey)
|
||||||
} else {
|
|
||||||
userEntity = await userRepository.findByPubkeyHex(context.pubKey)
|
|
||||||
}
|
|
||||||
|
|
||||||
const transactions = await listTransactions(
|
let limit = pageSize
|
||||||
currentPage,
|
let offset = 0
|
||||||
pageSize,
|
let skipFirstTransaction = false
|
||||||
|
if (currentPage > 1) {
|
||||||
|
offset = (currentPage - 1) * pageSize - 1
|
||||||
|
limit++
|
||||||
|
}
|
||||||
|
if (offset && order === Order.ASC) {
|
||||||
|
offset--
|
||||||
|
}
|
||||||
|
const userTransactionRepository = getCustomRepository(UserTransactionRepository)
|
||||||
|
let [userTransactions, userTransactionsCount] = await userTransactionRepository.findByUserPaged(
|
||||||
|
user.id,
|
||||||
|
limit,
|
||||||
|
offset,
|
||||||
order,
|
order,
|
||||||
userEntity,
|
|
||||||
onlyCreations,
|
onlyCreations,
|
||||||
)
|
)
|
||||||
|
skipFirstTransaction = userTransactionsCount > offset + limit
|
||||||
|
const decay = !(currentPage > 1)
|
||||||
|
let transactions: Transaction[] = []
|
||||||
|
if (userTransactions.length) {
|
||||||
|
if (order === Order.DESC) {
|
||||||
|
userTransactions = userTransactions.reverse()
|
||||||
|
}
|
||||||
|
transactions = await calculateAndAddDecayTransactions(
|
||||||
|
userTransactions,
|
||||||
|
user,
|
||||||
|
decay,
|
||||||
|
skipFirstTransaction,
|
||||||
|
)
|
||||||
|
if (order === Order.DESC) {
|
||||||
|
transactions = transactions.reverse()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const transactionList = new TransactionList()
|
||||||
|
transactionList.count = userTransactionsCount
|
||||||
|
transactionList.transactions = transactions
|
||||||
|
|
||||||
// get gdt sum
|
// get gdt sum
|
||||||
transactions.gdtSum = null
|
transactionList.gdtSum = null
|
||||||
try {
|
try {
|
||||||
const resultGDTSum = await apiPost(`${CONFIG.GDT_API_URL}/GdtEntries/sumPerEmailApi`, {
|
const resultGDTSum = await apiPost(`${CONFIG.GDT_API_URL}/GdtEntries/sumPerEmailApi`, {
|
||||||
email: userEntity.email,
|
email: user.email,
|
||||||
})
|
})
|
||||||
if (resultGDTSum.success) transactions.gdtSum = Number(resultGDTSum.data.sum) || 0
|
if (resultGDTSum.success) transactionList.gdtSum = Number(resultGDTSum.data.sum) || 0
|
||||||
} catch (err: any) {}
|
} catch (err: any) {}
|
||||||
|
|
||||||
// get balance
|
// get balance
|
||||||
const balanceEntity = await dbBalance.findOne({ userId: userEntity.id })
|
const balanceEntity = await dbBalance.findOne({ userId: user.id })
|
||||||
if (balanceEntity) {
|
if (balanceEntity) {
|
||||||
const now = new Date()
|
const now = new Date()
|
||||||
transactions.balance = roundFloorFrom4(balanceEntity.amount)
|
transactionList.balance = roundFloorFrom4(balanceEntity.amount)
|
||||||
transactions.decay = roundFloorFrom4(
|
transactionList.decay = roundFloorFrom4(
|
||||||
calculateDecay(balanceEntity.amount, balanceEntity.recordDate, now).balance,
|
calculateDecay(balanceEntity.amount, balanceEntity.recordDate, now).balance,
|
||||||
)
|
)
|
||||||
transactions.decayDate = now.toString()
|
transactionList.decayDate = now.toString()
|
||||||
}
|
}
|
||||||
|
|
||||||
return transactions
|
return transactionList
|
||||||
}
|
}
|
||||||
|
|
||||||
@Authorized([RIGHTS.SEND_COINS])
|
@Authorized([RIGHTS.SEND_COINS])
|
||||||
@ -324,7 +302,7 @@ export class TransactionResolver {
|
|||||||
async sendCoins(
|
async sendCoins(
|
||||||
@Args() { email, amount, memo }: TransactionSendArgs,
|
@Args() { email, amount, memo }: TransactionSendArgs,
|
||||||
@Ctx() context: any,
|
@Ctx() context: any,
|
||||||
): Promise<string> {
|
): Promise<boolean> {
|
||||||
// TODO this is subject to replay attacks
|
// TODO this is subject to replay attacks
|
||||||
// validate sender user (logged in)
|
// validate sender user (logged in)
|
||||||
const userRepository = getCustomRepository(UserRepository)
|
const userRepository = getCustomRepository(UserRepository)
|
||||||
@ -332,8 +310,9 @@ export class TransactionResolver {
|
|||||||
if (senderUser.pubKey.length !== 32) {
|
if (senderUser.pubKey.length !== 32) {
|
||||||
throw new Error('invalid sender public key')
|
throw new Error('invalid sender public key')
|
||||||
}
|
}
|
||||||
|
// validate amount
|
||||||
if (!hasUserAmount(senderUser, amount)) {
|
if (!hasUserAmount(senderUser, amount)) {
|
||||||
throw new Error("user hasn't enough GDD")
|
throw new Error("user hasn't enough GDD or amount is < 0")
|
||||||
}
|
}
|
||||||
|
|
||||||
// validate recipient user
|
// validate recipient user
|
||||||
@ -349,11 +328,6 @@ export class TransactionResolver {
|
|||||||
throw new Error('invalid recipient public key')
|
throw new Error('invalid recipient public key')
|
||||||
}
|
}
|
||||||
|
|
||||||
// validate amount
|
|
||||||
if (amount <= 0) {
|
|
||||||
throw new Error('invalid amount')
|
|
||||||
}
|
|
||||||
|
|
||||||
const centAmount = Math.trunc(amount * 10000)
|
const centAmount = Math.trunc(amount * 10000)
|
||||||
|
|
||||||
const queryRunner = getConnection().createQueryRunner()
|
const queryRunner = getConnection().createQueryRunner()
|
||||||
@ -456,6 +430,6 @@ export class TransactionResolver {
|
|||||||
memo,
|
memo,
|
||||||
})
|
})
|
||||||
|
|
||||||
return 'success'
|
return true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user