diff --git a/backend/src/graphql/models/Transaction.ts b/backend/src/graphql/models/Transaction.ts index a2f2d19c1..7ce7d4494 100644 --- a/backend/src/graphql/models/Transaction.ts +++ b/backend/src/graphql/models/Transaction.ts @@ -10,18 +10,22 @@ import { Decay } from './Decay' @ObjectType() export class Transaction { - constructor(json: any) { - this.type = json.type - this.balance = Number(json.balance) - this.decayStart = json.decay_start - this.decayEnd = json.decay_end - this.decayDuration = json.decay_duration - this.memo = json.memo - this.transactionId = json.transaction_id - this.name = json.name - this.email = json.email - this.date = json.date - this.decay = json.decay ? new Decay(json.decay) : undefined + constructor() + constructor(json: any) + constructor(json?: any) { + if(json) { + this.type = json.type + this.balance = Number(json.balance) + this.decayStart = json.decay_start + this.decayEnd = json.decay_end + this.decayDuration = json.decay_duration + this.memo = json.memo + this.transactionId = json.transaction_id + this.name = json.name + this.email = json.email + this.date = json.date + this.decay = json.decay ? new Decay(json.decay) : undefined + } } @Field(() => String) diff --git a/backend/src/graphql/resolvers/listTransactions.ts b/backend/src/graphql/resolvers/listTransactions.ts index ed992fe81..fc4c6de43 100644 --- a/backend/src/graphql/resolvers/listTransactions.ts +++ b/backend/src/graphql/resolvers/listTransactions.ts @@ -1,16 +1,64 @@ import { User as dbUser } from '../../typeorm/entity/User' 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( - userTransactions: UserTransaction[], +async function calculateAndAddDecayTransactions( + userTransactions: dbUserTransaction[], user: dbUser, decay: boolean, skipFirstTransaction: boolean, -): Transaction[] { - const transactions: Transaction[] = [] +): Promise { + 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( diff --git a/backend/src/typeorm/entity/Transaction.ts b/backend/src/typeorm/entity/Transaction.ts index 4fdaf6eb8..c9ecbf29f 100644 --- a/backend/src/typeorm/entity/Transaction.ts +++ b/backend/src/typeorm/entity/Transaction.ts @@ -20,4 +20,11 @@ export class Transaction extends BaseEntity { @Column({ name: 'blockchain_type_id' }) blockchainTypeId: number + static async findByTransactionTypeId(transactionTypeId: number): Promise { + return this.createQueryBuilder('transaction') + .where('transaction.transactionTypeId = :transactionTypeId', { transactionTypeId: transactionTypeId}) + .getMany() + } + + } diff --git a/backend/src/typeorm/entity/User.ts b/backend/src/typeorm/entity/User.ts index f7b8ed7c1..67ecb9ea0 100644 --- a/backend/src/typeorm/entity/User.ts +++ b/backend/src/typeorm/entity/User.ts @@ -37,4 +37,16 @@ export class User extends BaseEntity { .where('hex(user.pubkey) = :pubkeyHex', { pubkeyHex }) .getOneOrFail() } + + static async getUsersIndiced(userIds: number[]): Promise { + 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 + } }