work on implementing

This commit is contained in:
Einhornimmond 2021-09-24 14:53:23 +02:00
parent e80cea5fc4
commit e2f6d1a006
4 changed files with 89 additions and 18 deletions

View File

@ -10,7 +10,10 @@ import { Decay } from './Decay'
@ObjectType() @ObjectType()
export class Transaction { export class Transaction {
constructor(json: any) { constructor()
constructor(json: any)
constructor(json?: any) {
if(json) {
this.type = json.type this.type = json.type
this.balance = Number(json.balance) this.balance = Number(json.balance)
this.decayStart = json.decay_start this.decayStart = json.decay_start
@ -23,6 +26,7 @@ export class Transaction {
this.date = json.date this.date = json.date
this.decay = json.decay ? new Decay(json.decay) : undefined this.decay = json.decay ? new Decay(json.decay) : undefined
} }
}
@Field(() => String) @Field(() => String)
type: string type: string

View File

@ -1,16 +1,64 @@
import { User as dbUser } from '../../typeorm/entity/User' import { User as dbUser } from '../../typeorm/entity/User'
import { TransactionList, Transaction } from '../models/Transaction' import { TransactionList, Transaction } from '../models/Transaction'
import { UserTransaction } from '../../typeorm/entity/UserTransaction' import { UserTransaction as dbUserTransaction } from '../../typeorm/entity/UserTransaction'
import { Transaction as dbTransaction } from '../../typeorm/entity/Transaction'
import { TransactionSendCoin as dbTransactionSendCoin} from '../../typeorm/entity/TransactionSendCoin'
import { TransactionCreation as dbTransactionCreation} from '../../typeorm/entity/TransactionCreation'
import calculateDecay from '../../util/decay'
import { roundFloorFrom4 } from '../../util/round'
function calculateAndAddDecayTransactions( async function calculateAndAddDecayTransactions(
userTransactions: UserTransaction[], userTransactions: dbUserTransaction[],
user: dbUser, user: dbUser,
decay: boolean, decay: boolean,
skipFirstTransaction: boolean, skipFirstTransaction: boolean,
): Transaction[] { ): Promise<Transaction[]> {
const transactions: Transaction[] = [] let finalTransactions: Transaction[] = []
let transactionIds: number[] = []
let involvedUserIds: number[] = []
return transactions userTransactions.forEach((userTransaction: dbUserTransaction) => {
transactionIds.push(userTransaction.transactionId)
involvedUserIds.push(userTransaction.userId)
})
// remove duplicates
// https://stackoverflow.com/questions/1960473/get-all-unique-values-in-a-javascript-array-remove-duplicates
const involvedUsersUnique = involvedUserIds.filter((v, i, a) => a.indexOf(v) === i)
const userIndiced = dbUser.getUsersIndiced(involvedUsersUnique)
const transactions = await dbTransaction
.createQueryBuilder('transaction')
.where('transaction.id IN (:...transactions)', { transactions: transactionIds})
.leftJoinAndSelect('transaction.sendCoin', 'transactionSendCoin', 'transactionSendCoin.transactionid = transaction.id')
.leftJoinAndSelect('transaction.creation', 'transactionCreation', 'transactionSendCoin.transactionid = transaction.id')
.getMany()
let transactionIndiced: dbTransaction[] = []
transactions.forEach((transaction: dbTransaction) => {
transactionIndiced[transaction.id] = transaction
})
const decayStartTransaction = await dbTransaction.createQueryBuilder('transaction')
.where('transaction.transactionTypeId = :transactionTypeId', { transactionTypeId: 9})
.orderBy('received', 'ASC')
.getOne()
userTransactions.forEach((userTransaction: dbUserTransaction, i:number) => {
const transaction = transactionIndiced[userTransaction.transactionId]
let finalTransaction = new Transaction
finalTransaction.transactionId = transaction.id
finalTransaction.date = transaction.received.toString()
finalTransaction.memo = transaction.memo
let prev = i > 0 ? userTransactions[i-1] : null
if(prev && prev.balance > 0) {
}
})
return finalTransactions
} }
export default async function listTransactions( export default async function listTransactions(

View File

@ -20,4 +20,11 @@ export class Transaction extends BaseEntity {
@Column({ name: 'blockchain_type_id' }) @Column({ name: 'blockchain_type_id' })
blockchainTypeId: number blockchainTypeId: number
static async findByTransactionTypeId(transactionTypeId: number): Promise<Transaction[]> {
return this.createQueryBuilder('transaction')
.where('transaction.transactionTypeId = :transactionTypeId', { transactionTypeId: transactionTypeId})
.getMany()
}
} }

View File

@ -32,4 +32,16 @@ export class User extends BaseEntity {
.where('hex(user.pubkey) = :pubkeyHex', { pubkeyHex }) .where('hex(user.pubkey) = :pubkeyHex', { pubkeyHex })
.getOneOrFail() .getOneOrFail()
} }
static async getUsersIndiced(userIds: number[]): Promise<User[]> {
const users = await this.createQueryBuilder('user')
.select(['user.id', 'user.firstName', 'user.lastName', 'user.email'])
.where('user.id IN (:...users)', { users: userIds})
.getMany()
let usersIndiced: User[] = []
users.forEach((value, index) => {
usersIndiced[index] = value
})
return usersIndiced
}
} }