From 0b67da3d2c74225286cd48f5e90565c3322cfbdb Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Tue, 30 Nov 2021 10:08:59 +0100 Subject: [PATCH 01/11] update README --- database/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/database/README.md b/database/README.md index f78eca113..8d490496b 100644 --- a/database/README.md +++ b/database/README.md @@ -39,6 +39,7 @@ yarn seed ## Seeded Users | email | password | admin | +|------------------------|------------|---------| | peter@lustig.de | `Aa12345_` | `true` | | bibi@bloxberg.de | `Aa12345_` | `false` | | raeuber@hotzenplotz.de | `Aa12345_` | `false` | From 43b9f9394bff98329ee8f64049eeb7b56bb78c5d Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Tue, 30 Nov 2021 10:39:20 +0100 Subject: [PATCH 02/11] add transaction factory --- database/src/factories/transaction.factory.ts | 20 +++++++++++++++++++ database/src/interface/TransactionContext.ts | 12 +++++++++++ 2 files changed, 32 insertions(+) create mode 100644 database/src/factories/transaction.factory.ts create mode 100644 database/src/interface/TransactionContext.ts diff --git a/database/src/factories/transaction.factory.ts b/database/src/factories/transaction.factory.ts new file mode 100644 index 000000000..e9efe1316 --- /dev/null +++ b/database/src/factories/transaction.factory.ts @@ -0,0 +1,20 @@ +import Faker from 'faker' +import { define } from 'typeorm-seeding' +import { Transaction } from '../../entity/Transaction' +import { TransactionContext } from '../interface/TransactionContext' +import { randomBytes } from 'crypto' + +define(Transaction, (faker: typeof Faker, context?: TransactionContext) => { + if (!context) context = {} + + const transaction = new Transaction() + transaction.transactionTypeId = context.transactionTypeId ? context.transactionTypeId : 2 + transaction.txHash = context.txHash ? context.txHash : randomBytes(48) + transaction.memo = context.memo ? context.memo : faker.lorem.sentence() + transaction.received = context.received ? context.received : new Date() + transaction.blockchainTypeId = context.blockchainTypeId ? context.blockchainTypeId : 1 + if (context.transactionSendCoin) transaction.transactionSendCoin = context.transactionSendCoin + if (context.transactionCreation) transaction.transactionCreation = context.transactionCreation + + return transaction +}) diff --git a/database/src/interface/TransactionContext.ts b/database/src/interface/TransactionContext.ts new file mode 100644 index 000000000..f43b57046 --- /dev/null +++ b/database/src/interface/TransactionContext.ts @@ -0,0 +1,12 @@ +import { TransactionSendCoin } from '../../entity/TransactionSendCoin' +import { TransactionCreation } from '../../entity/TransactionCreation' + +export interface TransactionContext { + transactionTypeId?: number + txHash?: Buffer + memo?: string + received?: Date + blockchainTypeId?: number + transactionSendCoin?: TransactionSendCoin + transactionCreation?: TransactionCreation +} From 964b974142056c9e188961dd77ae27c4a81c4684 Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Tue, 30 Nov 2021 11:14:53 +0100 Subject: [PATCH 03/11] seed decay start block --- database/src/factories/transaction.factory.ts | 2 +- database/src/index.ts | 2 ++ database/src/seeds/decay-start-block.seed.ts | 17 +++++++++++++++++ 3 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 database/src/seeds/decay-start-block.seed.ts diff --git a/database/src/factories/transaction.factory.ts b/database/src/factories/transaction.factory.ts index e9efe1316..4880ace5b 100644 --- a/database/src/factories/transaction.factory.ts +++ b/database/src/factories/transaction.factory.ts @@ -10,7 +10,7 @@ define(Transaction, (faker: typeof Faker, context?: TransactionContext) => { const transaction = new Transaction() transaction.transactionTypeId = context.transactionTypeId ? context.transactionTypeId : 2 transaction.txHash = context.txHash ? context.txHash : randomBytes(48) - transaction.memo = context.memo ? context.memo : faker.lorem.sentence() + transaction.memo = context.memo || context.memo === '' ? context.memo : faker.lorem.sentence() transaction.received = context.received ? context.received : new Date() transaction.blockchainTypeId = context.blockchainTypeId ? context.blockchainTypeId : 1 if (context.transactionSendCoin) transaction.transactionSendCoin = context.transactionSendCoin diff --git a/database/src/index.ts b/database/src/index.ts index ec5328a9a..28b54cccc 100644 --- a/database/src/index.ts +++ b/database/src/index.ts @@ -9,6 +9,7 @@ import { CreatePeterLustigSeed } from './seeds/users/peter-lustig.admin.seed' import { CreateBibiBloxbergSeed } from './seeds/users/bibi-bloxberg.seed' import { CreateRaeuberHotzenplotzSeed } from './seeds/users/raeuber-hotzenplotz.seed' import { CreateBobBaumeisterSeed } from './seeds/users/bob-baumeister.seed' +import { DecayStartBlockSeed } from './seeds/decay-start-block.seed' const run = async (command: string) => { // Database actions not supported by our migration library @@ -63,6 +64,7 @@ const run = async (command: string) => { await runSeeder(CreateBibiBloxbergSeed) await runSeeder(CreateRaeuberHotzenplotzSeed) await runSeeder(CreateBobBaumeisterSeed) + await runSeeder(DecayStartBlockSeed) break default: throw new Error(`Unsupported command ${command}`) diff --git a/database/src/seeds/decay-start-block.seed.ts b/database/src/seeds/decay-start-block.seed.ts new file mode 100644 index 000000000..fd62ee333 --- /dev/null +++ b/database/src/seeds/decay-start-block.seed.ts @@ -0,0 +1,17 @@ +import { Factory, Seeder } from 'typeorm-seeding' +import { Transaction } from '../../entity/Transaction' + +export class DecayStartBlockSeed implements Seeder { + public async run(factory: Factory): Promise { + await factory(Transaction)({ + transactionTypeId: 9, + txHash: Buffer.from( + '9c9c4152b8a4cfbac287eee18d2d262e9de756fae726fc0ca36b788564973fff00000000000000000000000000000000', + 'hex', + ), + memo: '', + received: new Date('2021-11-30T09:13:26'), + blockchainTypeId: 1, + }).create() + } +} From 728233052885b2f77d804b53369f3821ca8422ec Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Tue, 30 Nov 2021 12:25:05 +0100 Subject: [PATCH 04/11] Balance Interface and OneToOne User -> Balance --- database/entity/0001-init_db/Balance.ts | 7 ++++++- database/entity/0001-init_db/User.ts | 6 +++++- database/src/interface/TransactionContext.ts | 8 ++++++++ 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/database/entity/0001-init_db/Balance.ts b/database/entity/0001-init_db/Balance.ts index c1ca359f1..e0c1b7bd0 100644 --- a/database/entity/0001-init_db/Balance.ts +++ b/database/entity/0001-init_db/Balance.ts @@ -1,4 +1,5 @@ -import { BaseEntity, Entity, PrimaryGeneratedColumn, Column } from 'typeorm' +import { BaseEntity, Entity, PrimaryGeneratedColumn, Column, JoinColumn, OneToOne } from 'typeorm' +import { User } from '../User' @Entity('state_balances') export class Balance extends BaseEntity { @@ -16,4 +17,8 @@ export class Balance extends BaseEntity { @Column({ type: 'bigint' }) amount: number + + @OneToOne(() => User, { nullable: false }) + @JoinColumn({ name: 'user_id' }) + user: User } diff --git a/database/entity/0001-init_db/User.ts b/database/entity/0001-init_db/User.ts index 7280dca40..545d4f5c5 100644 --- a/database/entity/0001-init_db/User.ts +++ b/database/entity/0001-init_db/User.ts @@ -1,4 +1,5 @@ -import { BaseEntity, Entity, PrimaryGeneratedColumn, Column } from 'typeorm' +import { BaseEntity, Entity, PrimaryGeneratedColumn, Column, OneToOne } from 'typeorm' +import { Balance } from '../Balance' // Moriz: I do not like the idea of having two user tables @Entity('state_users') @@ -29,4 +30,7 @@ export class User extends BaseEntity { @Column() disabled: boolean + + @OneToOne(() => Balance, (balance) => balance.user) + balance: Balance } diff --git a/database/src/interface/TransactionContext.ts b/database/src/interface/TransactionContext.ts index f43b57046..4cda149af 100644 --- a/database/src/interface/TransactionContext.ts +++ b/database/src/interface/TransactionContext.ts @@ -1,5 +1,6 @@ import { TransactionSendCoin } from '../../entity/TransactionSendCoin' import { TransactionCreation } from '../../entity/TransactionCreation' +import { User } from '../../entity/User' export interface TransactionContext { transactionTypeId?: number @@ -10,3 +11,10 @@ export interface TransactionContext { transactionSendCoin?: TransactionSendCoin transactionCreation?: TransactionCreation } + +export interface BalanceContext { + modified?: Date + recordDate?: Date + amount?: number + user?: User +} From 4717b0ba4cd983a46dbd76599c7faef7d403f1df Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Tue, 30 Nov 2021 13:20:59 +0100 Subject: [PATCH 05/11] Add balance for seeded users --- database/entity/0001-init_db/Balance.ts | 2 +- database/src/factories/balance.factory.ts | 18 +++++++++++++ database/src/index.ts | 2 +- database/src/interface/UserInterface.ts | 6 +++++ database/src/seeds/helpers/user-helpers.ts | 27 ++++++++++++++----- database/src/seeds/users/bibi-bloxberg.ts | 4 +++ database/src/seeds/users/bob-baumeister.ts | 4 +++ .../src/seeds/users/raeuber-hotzenplotz.ts | 4 +++ 8 files changed, 59 insertions(+), 8 deletions(-) create mode 100644 database/src/factories/balance.factory.ts diff --git a/database/entity/0001-init_db/Balance.ts b/database/entity/0001-init_db/Balance.ts index e0c1b7bd0..1a7050daf 100644 --- a/database/entity/0001-init_db/Balance.ts +++ b/database/entity/0001-init_db/Balance.ts @@ -19,6 +19,6 @@ export class Balance extends BaseEntity { amount: number @OneToOne(() => User, { nullable: false }) - @JoinColumn({ name: 'user_id' }) + @JoinColumn({ name: 'state_user_id' }) user: User } diff --git a/database/src/factories/balance.factory.ts b/database/src/factories/balance.factory.ts new file mode 100644 index 000000000..2c344be99 --- /dev/null +++ b/database/src/factories/balance.factory.ts @@ -0,0 +1,18 @@ +import Faker from 'faker' +import { define } from 'typeorm-seeding' +import { Balance } from '../../entity/Balance' +import { BalanceContext } from '../interface/TransactionContext' + +define(Balance, (faker: typeof Faker, context?: BalanceContext) => { + if (!context || !context.user) { + throw new Error('Balance: No user present!') + } + + const balance = new Balance() + balance.modified = context.modified ? context.modified : faker.date.recent() + balance.recordDate = context.recordDate ? context.recordDate : faker.date.recent() + balance.amount = context.amount ? context.amount : 10000000 + balance.user = context.user + + return balance +}) diff --git a/database/src/index.ts b/database/src/index.ts index 28b54cccc..94566c9f5 100644 --- a/database/src/index.ts +++ b/database/src/index.ts @@ -60,11 +60,11 @@ const run = async (command: string) => { root: process.cwd(), configName: 'ormconfig.js', }) + await runSeeder(DecayStartBlockSeed) await runSeeder(CreatePeterLustigSeed) await runSeeder(CreateBibiBloxbergSeed) await runSeeder(CreateRaeuberHotzenplotzSeed) await runSeeder(CreateBobBaumeisterSeed) - await runSeeder(DecayStartBlockSeed) break default: throw new Error(`Unsupported command ${command}`) diff --git a/database/src/interface/UserInterface.ts b/database/src/interface/UserInterface.ts index 942158593..33919fb74 100644 --- a/database/src/interface/UserInterface.ts +++ b/database/src/interface/UserInterface.ts @@ -27,4 +27,10 @@ export interface UserInterface { modified?: Date // flag for admin isAdmin?: boolean + // flag for balance + addBalance?: boolean + // balance + balanceModified?: Date + recordDate?: Date + amount?: number } diff --git a/database/src/seeds/helpers/user-helpers.ts b/database/src/seeds/helpers/user-helpers.ts index 805104519..79068c2ec 100644 --- a/database/src/seeds/helpers/user-helpers.ts +++ b/database/src/seeds/helpers/user-helpers.ts @@ -5,16 +5,18 @@ import { ServerUserContext, LoginUserRolesContext, } from '../../interface/UserContext' +import { BalanceContext } from '../../interface/TransactionContext' import { UserInterface } from '../../interface/UserInterface' import { User } from '../../../entity/User' import { LoginUser } from '../../../entity/LoginUser' import { LoginUserBackup } from '../../../entity/LoginUserBackup' import { ServerUser } from '../../../entity/ServerUser' import { LoginUserRoles } from '../../../entity/LoginUserRoles' +import { Balance } from '../../../entity/Balance' import { Factory } from 'typeorm-seeding' export const userSeeder = async (factory: Factory, userData: UserInterface): Promise => { - await factory(User)(createUserContext(userData)).create() + const user = await factory(User)(createUserContext(userData)).create() const loginUser = await factory(LoginUser)(createLoginUserContext(userData)).create() await factory(LoginUserBackup)(createLoginUserBackupContext(userData, loginUser)).create() @@ -25,9 +27,13 @@ export const userSeeder = async (factory: Factory, userData: UserInterface): Pro // It works with LoginRoles empty!! await factory(LoginUserRoles)(createLoginUserRolesContext(loginUser)).create() } + + if (userData.addBalance) { + await factory(Balance)(createBalanceContext(userData, user)).create() + } } -export const createUserContext = (context: UserInterface): UserContext => { +const createUserContext = (context: UserInterface): UserContext => { return { pubkey: context.pubKey, email: context.email, @@ -38,7 +44,7 @@ export const createUserContext = (context: UserInterface): UserContext => { } } -export const createLoginUserContext = (context: UserInterface): LoginUserContext => { +const createLoginUserContext = (context: UserInterface): LoginUserContext => { return { email: context.email, firstName: context.firstName, @@ -59,7 +65,7 @@ export const createLoginUserContext = (context: UserInterface): LoginUserContext } } -export const createLoginUserBackupContext = ( +const createLoginUserBackupContext = ( context: UserInterface, loginUser: LoginUser, ): LoginUserBackupContext => { @@ -70,7 +76,7 @@ export const createLoginUserBackupContext = ( } } -export const createServerUserContext = (context: UserInterface): ServerUserContext => { +const createServerUserContext = (context: UserInterface): ServerUserContext => { return { role: context.role, username: context.username, @@ -83,9 +89,18 @@ export const createServerUserContext = (context: UserInterface): ServerUserConte } } -export const createLoginUserRolesContext = (loginUser: LoginUser): LoginUserRolesContext => { +const createLoginUserRolesContext = (loginUser: LoginUser): LoginUserRolesContext => { return { userId: loginUser.id, roleId: 1, } } + +const createBalanceContext = (context: UserInterface, user: User): BalanceContext => { + return { + modified: context.balanceModified, + recordDate: context.recordDate, + amount: context.amount, + user, + } +} diff --git a/database/src/seeds/users/bibi-bloxberg.ts b/database/src/seeds/users/bibi-bloxberg.ts index d87e3eb4a..3fc9274b9 100644 --- a/database/src/seeds/users/bibi-bloxberg.ts +++ b/database/src/seeds/users/bibi-bloxberg.ts @@ -22,4 +22,8 @@ export const bibiBloxberg = { 'knife normal level all hurdle crucial color avoid warrior stadium road bachelor affair topple hawk pottery right afford immune two ceiling budget glance hour ', mnemonicType: 2, isAdmin: false, + addBalance: true, + balanceModified: new Date('2021-11-30T10:37:11'), + recordDate: new Date('2021-11-30T10:37:11'), + amount: 10000000, } diff --git a/database/src/seeds/users/bob-baumeister.ts b/database/src/seeds/users/bob-baumeister.ts index 33ce35656..bc9bdbbc1 100644 --- a/database/src/seeds/users/bob-baumeister.ts +++ b/database/src/seeds/users/bob-baumeister.ts @@ -22,4 +22,8 @@ export const bobBaumeister = { 'detail master source effort unable waste tilt flush domain orchard art truck hint barrel response gate impose peanut secret merry three uncle wink resource ', mnemonicType: 2, isAdmin: false, + addBalance: true, + balanceModified: new Date('2021-11-30T10:37:14'), + recordDate: new Date('2021-11-30T10:37:14'), + amount: 10000000, } diff --git a/database/src/seeds/users/raeuber-hotzenplotz.ts b/database/src/seeds/users/raeuber-hotzenplotz.ts index 10fcf8af1..b1a6cc6b0 100644 --- a/database/src/seeds/users/raeuber-hotzenplotz.ts +++ b/database/src/seeds/users/raeuber-hotzenplotz.ts @@ -22,4 +22,8 @@ export const raeuberHotzenplotz = { 'gospel trip tenant mouse spider skill auto curious man video chief response same little over expire drum display fancy clinic keen throw urge basket ', mnemonicType: 2, isAdmin: false, + addBalance: true, + balanceModified: new Date('2021-11-30T10:37:13'), + recordDate: new Date('2021-11-30T10:37:13'), + amount: 10000000, } From 66e629daa2081c3a35b07e99245f7e6d30304e4d Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Wed, 1 Dec 2021 11:02:00 +0100 Subject: [PATCH 06/11] Interface for TransactionCreateCoin and TransactionSendCoin --- database/src/interface/TransactionContext.ts | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/database/src/interface/TransactionContext.ts b/database/src/interface/TransactionContext.ts index 4cda149af..182a924a3 100644 --- a/database/src/interface/TransactionContext.ts +++ b/database/src/interface/TransactionContext.ts @@ -1,3 +1,4 @@ +import { Transaction } from '../../entity/Transaction' import { TransactionSendCoin } from '../../entity/TransactionSendCoin' import { TransactionCreation } from '../../entity/TransactionCreation' import { User } from '../../entity/User' @@ -18,3 +19,20 @@ export interface BalanceContext { amount?: number user?: User } + +export interface TransactionSendCoinContext { + senderPublic?: Buffer + userId?: number + recipiantPublic?: Buffer + recipiantUserId?: number + amount?: number + senderFinalBalance?: number + transaction?: Transaction +} + +export interface TransactionCreationContext { + userId?: number + amount?: number + targetDate?: Timestamp + transaction?: Transaction +} From 2a5b0e49fe29c18e067031604922d6dc79d6398b Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Wed, 1 Dec 2021 13:58:24 +0100 Subject: [PATCH 07/11] add userTransactions, transactionCreation and transaction --- .../factories/transaction-creation.factory.ts | 18 ++++++ .../src/factories/user-transaction.factory.ts | 19 ++++++ database/src/interface/TransactionContext.ts | 8 +++ database/src/interface/UserInterface.ts | 4 +- database/src/seeds/helpers/user-helpers.ts | 60 ++++++++++++++++++- database/src/seeds/users/bibi-bloxberg.ts | 5 ++ database/src/seeds/users/bob-baumeister.ts | 5 ++ .../src/seeds/users/raeuber-hotzenplotz.ts | 5 ++ 8 files changed, 122 insertions(+), 2 deletions(-) create mode 100644 database/src/factories/transaction-creation.factory.ts create mode 100644 database/src/factories/user-transaction.factory.ts diff --git a/database/src/factories/transaction-creation.factory.ts b/database/src/factories/transaction-creation.factory.ts new file mode 100644 index 000000000..ec0b9e8a6 --- /dev/null +++ b/database/src/factories/transaction-creation.factory.ts @@ -0,0 +1,18 @@ +import Faker from 'faker' +import { define } from 'typeorm-seeding' +import { TransactionCreation } from '../../entity/TransactionCreation' +import { TransactionCreationContext } from '../interface/TransactionContext' + +define(TransactionCreation, (faker: typeof Faker, context?: TransactionCreationContext) => { + if (!context || !context.userId || !context.transaction) { + throw new Error('TransactionCreation: No userId and/or transaction present!') + } + + const transactionCreation = new TransactionCreation() + transactionCreation.userId = context.userId + transactionCreation.amount = context.amount ? context.amount : 100000 + transactionCreation.targetDate = context.targetDate ? context.targetDate : new Date() + transactionCreation.transaction = context.transaction + + return transactionCreation +}) diff --git a/database/src/factories/user-transaction.factory.ts b/database/src/factories/user-transaction.factory.ts new file mode 100644 index 000000000..7ea79235b --- /dev/null +++ b/database/src/factories/user-transaction.factory.ts @@ -0,0 +1,19 @@ +import Faker from 'faker' +import { define } from 'typeorm-seeding' +import { UserTransaction } from '../../entity/UserTransaction' +import { UserTransactionContext } from '../interface/TransactionContext' + +define(UserTransaction, (faker: typeof Faker, context?: UserTransactionContext) => { + if (!context || !context.userId || !context.transactionId) { + throw new Error('UserTransaction: No userId and/or transactionId present!') + } + + const userTransaction = new UserTransaction() + userTransaction.userId = context.userId + userTransaction.transactionId = context.transactionId + userTransaction.transactionTypeId = context.transactionTypeId ? context.transactionTypeId : 1 + userTransaction.balance = context.balance ? context.balance : 100000 + userTransaction.balanceDate = context.balanceDate ? context.balanceDate : new Date() + + return userTransaction +}) diff --git a/database/src/interface/TransactionContext.ts b/database/src/interface/TransactionContext.ts index 182a924a3..3a6ceadc0 100644 --- a/database/src/interface/TransactionContext.ts +++ b/database/src/interface/TransactionContext.ts @@ -36,3 +36,11 @@ export interface TransactionCreationContext { targetDate?: Timestamp transaction?: Transaction } + +export interface UserTransactionContext { + userId?: number + transactionId?: number + transactionTypeId?: number + balance?: number + balanceDate?: Date +} diff --git a/database/src/interface/UserInterface.ts b/database/src/interface/UserInterface.ts index 33919fb74..ae8b4ecdb 100644 --- a/database/src/interface/UserInterface.ts +++ b/database/src/interface/UserInterface.ts @@ -27,10 +27,12 @@ export interface UserInterface { modified?: Date // flag for admin isAdmin?: boolean - // flag for balance + // flag for balance (creation of 1000 GDD) addBalance?: boolean // balance balanceModified?: Date recordDate?: Date + targetDate?: Date amount?: number + creationTxHash?: Buffer } diff --git a/database/src/seeds/helpers/user-helpers.ts b/database/src/seeds/helpers/user-helpers.ts index 79068c2ec..54e8c76d1 100644 --- a/database/src/seeds/helpers/user-helpers.ts +++ b/database/src/seeds/helpers/user-helpers.ts @@ -5,7 +5,12 @@ import { ServerUserContext, LoginUserRolesContext, } from '../../interface/UserContext' -import { BalanceContext } from '../../interface/TransactionContext' +import { + BalanceContext, + TransactionContext, + TransactionCreationContext, + UserTransactionContext, +} from '../../interface/TransactionContext' import { UserInterface } from '../../interface/UserInterface' import { User } from '../../../entity/User' import { LoginUser } from '../../../entity/LoginUser' @@ -13,6 +18,9 @@ import { LoginUserBackup } from '../../../entity/LoginUserBackup' import { ServerUser } from '../../../entity/ServerUser' import { LoginUserRoles } from '../../../entity/LoginUserRoles' import { Balance } from '../../../entity/Balance' +import { Transaction } from '../../../entity/Transaction' +import { UserTransaction } from '../../../entity/UserTransaction' +import { TransactionCreation } from '../../../entity/TransactionCreation' import { Factory } from 'typeorm-seeding' export const userSeeder = async (factory: Factory, userData: UserInterface): Promise => { @@ -29,7 +37,17 @@ export const userSeeder = async (factory: Factory, userData: UserInterface): Pro } if (userData.addBalance) { + // create some GDD for the user await factory(Balance)(createBalanceContext(userData, user)).create() + const transaction = await factory(Transaction)( + createTransactionContext(userData, 1, 'Herzlich Willkommen bei Gradido!'), + ).create() + await factory(TransactionCreation)( + createTransactionCreationContext(userData, user, transaction), + ).create() + await factory(UserTransaction)( + createUserTransactionContext(userData, user, transaction), + ).create() } } @@ -104,3 +122,43 @@ const createBalanceContext = (context: UserInterface, user: User): BalanceContex user, } } + +const createTransactionContext = ( + context: UserInterface, + type: number, + memo: string, +): TransactionContext => { + return { + transactionTypeId: type, + txHash: context.creationTxHash, + memo, + received: context.recordDate, + } +} + +const createTransactionCreationContext = ( + context: UserInterface, + user: User, + transaction: Transaction, +): TransactionCreationContext => { + return { + userId: user.id, + amount: context.amount, + targetDate: context.targetDate, + transaction, + } +} + +const createUserTransactionContext = ( + context: UserInterface, + user: User, + transaction: Transaction, +): UserTransactionContext => { + return { + userId: user.id, + transactionId: transaction.id, + transactionTypeId: transaction.transactionTypeId, + balance: context.amount, + balanceDate: context.recordDate, + } +} diff --git a/database/src/seeds/users/bibi-bloxberg.ts b/database/src/seeds/users/bibi-bloxberg.ts index 3fc9274b9..9d5421a9f 100644 --- a/database/src/seeds/users/bibi-bloxberg.ts +++ b/database/src/seeds/users/bibi-bloxberg.ts @@ -25,5 +25,10 @@ export const bibiBloxberg = { addBalance: true, balanceModified: new Date('2021-11-30T10:37:11'), recordDate: new Date('2021-11-30T10:37:11'), + targetDate: new Date('2021-08-01 00:00:00'), amount: 10000000, + creationTxHash: Buffer.from( + '51103dc0fc2ca5d5d75a9557a1e899304e5406cfdb1328d8df6414d527b0118100000000000000000000000000000000', + 'hex', + ), } diff --git a/database/src/seeds/users/bob-baumeister.ts b/database/src/seeds/users/bob-baumeister.ts index bc9bdbbc1..c075361a4 100644 --- a/database/src/seeds/users/bob-baumeister.ts +++ b/database/src/seeds/users/bob-baumeister.ts @@ -25,5 +25,10 @@ export const bobBaumeister = { addBalance: true, balanceModified: new Date('2021-11-30T10:37:14'), recordDate: new Date('2021-11-30T10:37:14'), + targetDate: new Date('2021-08-01 00:00:00'), amount: 10000000, + creationTxHash: Buffer.from( + 'be095dc87acb94987e71168fee8ecbf50ecb43a180b1006e75d573b35725c69c00000000000000000000000000000000', + 'hex', + ), } diff --git a/database/src/seeds/users/raeuber-hotzenplotz.ts b/database/src/seeds/users/raeuber-hotzenplotz.ts index b1a6cc6b0..6380a8beb 100644 --- a/database/src/seeds/users/raeuber-hotzenplotz.ts +++ b/database/src/seeds/users/raeuber-hotzenplotz.ts @@ -25,5 +25,10 @@ export const raeuberHotzenplotz = { addBalance: true, balanceModified: new Date('2021-11-30T10:37:13'), recordDate: new Date('2021-11-30T10:37:13'), + targetDate: new Date('2021-08-01 00:00:00'), amount: 10000000, + creationTxHash: Buffer.from( + '23ba44fd84deb59b9f32969ad0cb18bfa4588be1bdb99c396888506474c16c1900000000000000000000000000000000', + 'hex', + ), } From e99aa0d5adf4809ebea34ed3582b935a77e377fc Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Wed, 1 Dec 2021 14:03:56 +0100 Subject: [PATCH 08/11] timestamp to date --- database/src/interface/TransactionContext.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/database/src/interface/TransactionContext.ts b/database/src/interface/TransactionContext.ts index 3a6ceadc0..e1122bc3e 100644 --- a/database/src/interface/TransactionContext.ts +++ b/database/src/interface/TransactionContext.ts @@ -33,7 +33,7 @@ export interface TransactionSendCoinContext { export interface TransactionCreationContext { userId?: number amount?: number - targetDate?: Timestamp + targetDate?: Date transaction?: Transaction } From 5ae9d8b6637d49245b506b4f2ff22b9fa70d90d1 Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Thu, 2 Dec 2021 09:29:05 +0100 Subject: [PATCH 09/11] Timestamp to date --- database/entity/0001-init_db/TransactionCreation.ts | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/database/entity/0001-init_db/TransactionCreation.ts b/database/entity/0001-init_db/TransactionCreation.ts index 4a8bdd571..8b9c02623 100644 --- a/database/entity/0001-init_db/TransactionCreation.ts +++ b/database/entity/0001-init_db/TransactionCreation.ts @@ -1,12 +1,4 @@ -import { - BaseEntity, - Entity, - PrimaryGeneratedColumn, - Column, - Timestamp, - OneToOne, - JoinColumn, -} from 'typeorm' +import { BaseEntity, Entity, PrimaryGeneratedColumn, Column, OneToOne, JoinColumn } from 'typeorm' import { Transaction } from './Transaction' @Entity('transaction_creations') @@ -24,7 +16,7 @@ export class TransactionCreation extends BaseEntity { amount: number @Column({ name: 'target_date', type: 'timestamp' }) - targetDate: Timestamp + targetDate: Date @OneToOne(() => Transaction) @JoinColumn({ name: 'transaction_id' }) From c3fe8b90dd5ff75d99757d4df327d19d9661e119 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Wed, 24 Nov 2021 11:13:19 +0100 Subject: [PATCH 10/11] entity model --- .../0001-init_db/TransactionSignature.ts | 21 +++++++++++++++++++ database/entity/TransactionSignature.ts | 1 + 2 files changed, 22 insertions(+) create mode 100644 database/entity/0001-init_db/TransactionSignature.ts create mode 100644 database/entity/TransactionSignature.ts diff --git a/database/entity/0001-init_db/TransactionSignature.ts b/database/entity/0001-init_db/TransactionSignature.ts new file mode 100644 index 000000000..df3e02ba6 --- /dev/null +++ b/database/entity/0001-init_db/TransactionSignature.ts @@ -0,0 +1,21 @@ +import { BaseEntity, Entity, PrimaryGeneratedColumn, Column, ManyToOne, JoinColumn } from 'typeorm' +import { Transaction } from './Transaction' + +@Entity('transaction_signatures') +export class TransactionSignature extends BaseEntity { + @PrimaryGeneratedColumn() + id: number + + @Column({ name: 'transaction_id' }) + transactionId: number + + @Column({ type: 'binary', length: 64 }) + signature: Buffer + + @Column({ type: 'binary', length: 32 }) + pubkey: Buffer + + @ManyToOne(() => Transaction) + @JoinColumn({ name: 'transaction_id' }) + transaction: Transaction +} diff --git a/database/entity/TransactionSignature.ts b/database/entity/TransactionSignature.ts new file mode 100644 index 000000000..e3c9cbe1c --- /dev/null +++ b/database/entity/TransactionSignature.ts @@ -0,0 +1 @@ +export { TransactionSignature } from './0001-init_db/TransactionSignature' From 3392ca025a7a2125f56d75bec57140131c15f90a Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Thu, 2 Dec 2021 10:06:36 +0100 Subject: [PATCH 11/11] seed transaction signature for the three creations --- database/entity/index.ts | 2 ++ .../factories/transaction-signature.factory.ts | 18 ++++++++++++++++++ database/src/interface/TransactionContext.ts | 6 ++++++ database/src/interface/UserInterface.ts | 2 ++ database/src/seeds/helpers/user-helpers.ts | 16 ++++++++++++++++ database/src/seeds/users/bibi-bloxberg.ts | 8 ++++++++ database/src/seeds/users/bob-baumeister.ts | 8 ++++++++ .../src/seeds/users/raeuber-hotzenplotz.ts | 8 ++++++++ 8 files changed, 68 insertions(+) create mode 100644 database/src/factories/transaction-signature.factory.ts diff --git a/database/entity/index.ts b/database/entity/index.ts index 901b4ab0d..875746c82 100644 --- a/database/entity/index.ts +++ b/database/entity/index.ts @@ -8,6 +8,7 @@ import { Migration } from './Migration' import { ServerUser } from './ServerUser' import { Transaction } from './Transaction' import { TransactionCreation } from './TransactionCreation' +import { TransactionSignature } from './TransactionSignature' import { TransactionSendCoin } from './TransactionSendCoin' import { User } from './User' import { UserSetting } from './UserSetting' @@ -24,6 +25,7 @@ export const entities = [ ServerUser, Transaction, TransactionCreation, + TransactionSignature, TransactionSendCoin, User, UserSetting, diff --git a/database/src/factories/transaction-signature.factory.ts b/database/src/factories/transaction-signature.factory.ts new file mode 100644 index 000000000..b79e15052 --- /dev/null +++ b/database/src/factories/transaction-signature.factory.ts @@ -0,0 +1,18 @@ +import Faker from 'faker' +import { define } from 'typeorm-seeding' +import { TransactionSignature } from '../../entity/TransactionSignature' +import { TransactionSignatureContext } from '../interface/TransactionContext' +import { randomBytes } from 'crypto' + +define(TransactionSignature, (faker: typeof Faker, context?: TransactionSignatureContext) => { + if (!context || !context.transaction) { + throw new Error('TransactionSignature: No transaction present!') + } + + const transactionSignature = new TransactionSignature() + transactionSignature.signature = context.signature ? context.signature : randomBytes(64) + transactionSignature.pubkey = context.pubkey ? context.pubkey : randomBytes(32) + transactionSignature.transaction = context.transaction + + return transactionSignature +}) diff --git a/database/src/interface/TransactionContext.ts b/database/src/interface/TransactionContext.ts index e1122bc3e..481959c5f 100644 --- a/database/src/interface/TransactionContext.ts +++ b/database/src/interface/TransactionContext.ts @@ -44,3 +44,9 @@ export interface UserTransactionContext { balance?: number balanceDate?: Date } + +export interface TransactionSignatureContext { + signature?: Buffer + pubkey?: Buffer + transaction?: Transaction +} diff --git a/database/src/interface/UserInterface.ts b/database/src/interface/UserInterface.ts index ae8b4ecdb..70be6cff4 100644 --- a/database/src/interface/UserInterface.ts +++ b/database/src/interface/UserInterface.ts @@ -35,4 +35,6 @@ export interface UserInterface { targetDate?: Date amount?: number creationTxHash?: Buffer + signature?: Buffer + signaturePubkey?: Buffer } diff --git a/database/src/seeds/helpers/user-helpers.ts b/database/src/seeds/helpers/user-helpers.ts index 54e8c76d1..bd46ecdee 100644 --- a/database/src/seeds/helpers/user-helpers.ts +++ b/database/src/seeds/helpers/user-helpers.ts @@ -10,6 +10,7 @@ import { TransactionContext, TransactionCreationContext, UserTransactionContext, + TransactionSignatureContext, } from '../../interface/TransactionContext' import { UserInterface } from '../../interface/UserInterface' import { User } from '../../../entity/User' @@ -19,6 +20,7 @@ import { ServerUser } from '../../../entity/ServerUser' import { LoginUserRoles } from '../../../entity/LoginUserRoles' import { Balance } from '../../../entity/Balance' import { Transaction } from '../../../entity/Transaction' +import { TransactionSignature } from '../../../entity/TransactionSignature' import { UserTransaction } from '../../../entity/UserTransaction' import { TransactionCreation } from '../../../entity/TransactionCreation' import { Factory } from 'typeorm-seeding' @@ -48,6 +50,9 @@ export const userSeeder = async (factory: Factory, userData: UserInterface): Pro await factory(UserTransaction)( createUserTransactionContext(userData, user, transaction), ).create() + await factory(TransactionSignature)( + createTransactionSignatureContext(userData, transaction), + ).create() } } @@ -162,3 +167,14 @@ const createUserTransactionContext = ( balanceDate: context.recordDate, } } + +const createTransactionSignatureContext = ( + context: UserInterface, + transaction: Transaction, +): TransactionSignatureContext => { + return { + signature: context.signature, + pubkey: context.signaturePubkey, + transaction, + } +} diff --git a/database/src/seeds/users/bibi-bloxberg.ts b/database/src/seeds/users/bibi-bloxberg.ts index 9d5421a9f..30ad4eb4c 100644 --- a/database/src/seeds/users/bibi-bloxberg.ts +++ b/database/src/seeds/users/bibi-bloxberg.ts @@ -31,4 +31,12 @@ export const bibiBloxberg = { '51103dc0fc2ca5d5d75a9557a1e899304e5406cfdb1328d8df6414d527b0118100000000000000000000000000000000', 'hex', ), + signature: Buffer.from( + '2a2c71f3e41adc060bbc3086577e2d57d24eeeb0a7727339c3f85aad813808f601d7e1df56a26e0929d2e67fc054fca429ccfa283ed2782185c7f009fe008f0c', + 'hex', + ), + signaturePubkey: Buffer.from( + '7281e0ee3258b08801f3ec73e431b4519677f65c03b0382c63a913b5784ee770', + 'hex', + ), } diff --git a/database/src/seeds/users/bob-baumeister.ts b/database/src/seeds/users/bob-baumeister.ts index c075361a4..a6933d7c1 100644 --- a/database/src/seeds/users/bob-baumeister.ts +++ b/database/src/seeds/users/bob-baumeister.ts @@ -31,4 +31,12 @@ export const bobBaumeister = { 'be095dc87acb94987e71168fee8ecbf50ecb43a180b1006e75d573b35725c69c00000000000000000000000000000000', 'hex', ), + signature: Buffer.from( + '1fbd6b9a3d359923b2501557f3bc79fa7e428127c8090fb16bc490b4d87870ab142b3817ddd902d22f0b26472a483233784a0e460c0622661752a13978903905', + 'hex', + ), + signaturePubkey: Buffer.from( + '7281e0ee3258b08801f3ec73e431b4519677f65c03b0382c63a913b5784ee770', + 'hex', + ), } diff --git a/database/src/seeds/users/raeuber-hotzenplotz.ts b/database/src/seeds/users/raeuber-hotzenplotz.ts index 6380a8beb..eb2118af5 100644 --- a/database/src/seeds/users/raeuber-hotzenplotz.ts +++ b/database/src/seeds/users/raeuber-hotzenplotz.ts @@ -31,4 +31,12 @@ export const raeuberHotzenplotz = { '23ba44fd84deb59b9f32969ad0cb18bfa4588be1bdb99c396888506474c16c1900000000000000000000000000000000', 'hex', ), + signature: Buffer.from( + '756d3da061687c575d1dbc5073908f646aa5f498b0927b217c83b48af471450e571dfe8421fb8e1f1ebd1104526b7e7c6fa78684e2da59c8f7f5a8dc3d9e5b0b', + 'hex', + ), + signaturePubkey: Buffer.from( + '7281e0ee3258b08801f3ec73e431b4519677f65c03b0382c63a913b5784ee770', + 'hex', + ), }