From 635114f4fa6335b2a2a55a46bd10ca62a0c0ec7c Mon Sep 17 00:00:00 2001 From: tekhit Date: Fri, 21 Dec 2018 19:03:08 -0600 Subject: [PATCH 1/5] refactor: Export core-database typedefs --- .circleci/config.yml | 24 ++++++------ .../__tests__/__fixtures__/dummy-class.ts | 11 +++++- packages/core-database/package.json | 3 +- packages/core-database/src/index.ts | 38 +++---------------- packages/core-database/src/interface.ts | 38 ++++++++----------- packages/core-database/src/manager.ts | 8 ++-- packages/core-database/src/plugin.ts | 15 ++++++++ 7 files changed, 64 insertions(+), 73 deletions(-) create mode 100644 packages/core-database/src/plugin.ts diff --git a/.circleci/config.yml b/.circleci/config.yml index 64c4bcaed7..5ab0d714ee 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -73,8 +73,8 @@ jobs: name: core-logger-winston command: 'cd ~/ark-core/packages/core-logger-winston && yarn test:coverage' - run: - name: core-graphql - command: 'cd ~/ark-core/packages/core-graphql && yarn test:coverage' + name: core-api + command: 'cd ~/ark-core/packages/core-api && yarn test:coverage' - run: name: core-debugger-cli command: 'cd ~/ark-core/packages/core-debugger-cli && yarn test:coverage' @@ -82,8 +82,8 @@ jobs: name: core-container command: 'cd ~/ark-core/packages/core-container && yarn test:coverage' - run: - name: core - command: 'cd ~/ark-core/packages/core && yarn test:coverage' + name: core-graphql + command: 'cd ~/ark-core/packages/core-graphql && yarn test:coverage' - run: name: Last 1000 lines of test output when: on_fail @@ -164,8 +164,8 @@ jobs: name: core-logger-winston command: 'cd ~/ark-core/packages/core-logger-winston && yarn test:coverage' - run: - name: core-graphql - command: 'cd ~/ark-core/packages/core-graphql && yarn test:coverage' + name: core-api + command: 'cd ~/ark-core/packages/core-api && yarn test:coverage' - run: name: core-debugger-cli command: 'cd ~/ark-core/packages/core-debugger-cli && yarn test:coverage' @@ -173,8 +173,8 @@ jobs: name: core-container command: 'cd ~/ark-core/packages/core-container && yarn test:coverage' - run: - name: core - command: 'cd ~/ark-core/packages/core && yarn test:coverage' + name: core-graphql + command: 'cd ~/ark-core/packages/core-graphql && yarn test:coverage' - run: name: Last 1000 lines of test output when: on_fail @@ -343,8 +343,8 @@ jobs: name: core-database command: 'cd ~/ark-core/packages/core-database && yarn test:coverage' - run: - name: core-api - command: 'cd ~/ark-core/packages/core-api && yarn test:coverage' + name: core + command: 'cd ~/ark-core/packages/core && yarn test:coverage' - run: name: Last 1000 lines of test output when: on_fail @@ -601,8 +601,8 @@ jobs: name: core-database command: 'cd ~/ark-core/packages/core-database && yarn test:coverage' - run: - name: core-api - command: 'cd ~/ark-core/packages/core-api && yarn test:coverage' + name: core + command: 'cd ~/ark-core/packages/core && yarn test:coverage' - run: name: Last 1000 lines of test output when: on_fail diff --git a/packages/core-database/__tests__/__fixtures__/dummy-class.ts b/packages/core-database/__tests__/__fixtures__/dummy-class.ts index 271e500e21..442384ecc1 100644 --- a/packages/core-database/__tests__/__fixtures__/dummy-class.ts +++ b/packages/core-database/__tests__/__fixtures__/dummy-class.ts @@ -1,8 +1,13 @@ // tslint:disable:no-empty -import { ConnectionInterface } from "../../src/interface"; +import { ConnectionInterface } from "../../src"; export class DummyConnection extends ConnectionInterface { + + constructor(options: any) { + super(options); + } + public async connect(): Promise {} public async disconnect(): Promise {} @@ -60,4 +65,8 @@ export class DummyConnection extends ConnectionInterface { public async getTransaction(id): Promise { return true; } + + public async make(): Promise { + return this; + } } diff --git a/packages/core-database/package.json b/packages/core-database/package.json index 93566f7855..0c5800e49c 100644 --- a/packages/core-database/package.json +++ b/packages/core-database/package.json @@ -8,7 +8,8 @@ "Brian Faust " ], "license": "MIT", - "main": "dist/index.js", + "main": "dist/index", + "types": "dist/index", "files": [ "dist" ], diff --git a/packages/core-database/src/index.ts b/packages/core-database/src/index.ts index 6220e04f13..9f89918c3e 100644 --- a/packages/core-database/src/index.ts +++ b/packages/core-database/src/index.ts @@ -1,33 +1,5 @@ -import { Container } from "@arkecosystem/core-container"; -import { AbstractLogger } from "@arkecosystem/core-logger"; -import { defaults } from "./defaults"; -import { DatabaseManager } from "./manager"; - -/** - * The interface used by concrete implementations. - * @type {ConnectionInterface} - */ -import { ConnectionInterface } from "./interface"; - -/** - * The Wallet Manager. - * @type {WalletManager} - */ -import { WalletManager } from "./wallet-manager"; - -/** - * The struct used by the plugin container. - * @type {Object} - */ -export const plugin = { - pkg: require("../package.json"), - defaults, - alias: "databaseManager", - async register(container: Container, options) { - container.resolvePlugin("logger").info("Starting Database Manager"); - - return new DatabaseManager(); - }, -}; - -export { ConnectionInterface, WalletManager }; +export * from "./manager"; +export * from "./interface"; +export * from "./wallet-manager"; +export * from "./repositories/delegates"; +export * from "./repositories/wallets"; diff --git a/packages/core-database/src/interface.ts b/packages/core-database/src/interface.ts index 20e154b8e2..847c3e4380 100644 --- a/packages/core-database/src/interface.ts +++ b/packages/core-database/src/interface.ts @@ -14,41 +14,33 @@ const { Block } = models; const { TransactionTypes } = constants; export abstract class ConnectionInterface { - public config: any; - public logger: AbstractLogger; - public emitter: any; - - public connection: any; - public blocksInCurrentRound: any[]; - public stateStarted: boolean; - public restoredDatabaseIntegrity: boolean; - public walletManager: WalletManager; - public forgingDelegates: any[]; - public wallets: WalletsRepository; - public delegates: DelegatesRepository; - protected queuedQueries: any[]; + protected config: any; + protected logger: AbstractLogger; + protected emitter: any; + protected connection: any = null; + protected blocksInCurrentRound: any[] = null; + protected stateStarted: boolean = false; + protected restoredDatabaseIntegrity: boolean = false; + protected walletManager: WalletManager = null; + protected forgingDelegates: any[] = null; + protected wallets: WalletsRepository = null; + protected delegates: DelegatesRepository = null; + protected queuedQueries: any[] = null; /** * @constructor * @param {Object} options */ - public constructor(public readonly options) { + protected constructor(public readonly options: any) { this.config = app.getConfig(); this.logger = app.resolvePlugin("logger"); this.emitter = app.resolvePlugin("event-emitter"); - this.connection = null; - this.blocksInCurrentRound = null; - this.stateStarted = false; - this.restoredDatabaseIntegrity = false; - this.walletManager = null; - this.wallets = null; - this.delegates = null; - this.queuedQueries = null; - this.__registerListeners(); } + public abstract async make(): Promise; + /** * Get the current connection. * @return {ConnectionInterface} diff --git a/packages/core-database/src/manager.ts b/packages/core-database/src/manager.ts index b8fdde7f4d..8e9eb70e4e 100644 --- a/packages/core-database/src/manager.ts +++ b/packages/core-database/src/manager.ts @@ -1,5 +1,7 @@ +import { ConnectionInterface } from "./interface"; + export class DatabaseManager { - public connections: { [key: string]: any }; + public connections: { [key: string]: ConnectionInterface }; /** * Create a new database manager instance. @@ -14,7 +16,7 @@ export class DatabaseManager { * @param {String} name * @return {ConnectionInterface} */ - public connection(name = "default") { + public connection(name = "default"): ConnectionInterface { return this.connections[name]; } @@ -24,7 +26,7 @@ export class DatabaseManager { * @param {String} name * @return {void} */ - public async makeConnection(connection, name = "default") { + public async makeConnection(connection: ConnectionInterface, name = "default") { this.connections[name] = await connection.make(); } } diff --git a/packages/core-database/src/plugin.ts b/packages/core-database/src/plugin.ts new file mode 100644 index 0000000000..aa0c40d5ed --- /dev/null +++ b/packages/core-database/src/plugin.ts @@ -0,0 +1,15 @@ +import { Container } from "@arkecosystem/core-container"; +import { AbstractLogger } from "@arkecosystem/core-logger"; +import { defaults } from "./defaults"; +import { DatabaseManager } from "./manager"; + +export const plugin = { + pkg: require("../package.json"), + defaults, + alias: "databaseManager", + async register(container: Container, options) { + container.resolvePlugin("logger").info("Starting Database Manager"); + + return new DatabaseManager(); + }, +}; From 9f849c3a358ebebd526b3e47ca5720148774994d Mon Sep 17 00:00:00 2001 From: tekhit Date: Fri, 21 Dec 2018 19:56:34 -0600 Subject: [PATCH 2/5] refactor: Use core-database typdefs in core-database-postgres --- .../core-database-postgres/src/connection.ts | 8 ++++-- packages/core-database-postgres/src/index.ts | 3 ++- packages/core-database-postgres/src/spv.ts | 16 +++++------- packages/core-database/src/interface.ts | 25 ++++++++++--------- 4 files changed, 27 insertions(+), 25 deletions(-) diff --git a/packages/core-database-postgres/src/connection.ts b/packages/core-database-postgres/src/connection.ts index 6af5a7140e..c0ce238ecf 100644 --- a/packages/core-database-postgres/src/connection.ts +++ b/packages/core-database-postgres/src/connection.ts @@ -22,13 +22,17 @@ import { camelizeColumns } from "./utils"; const { Block, Transaction } = models; export class PostgresConnection extends ConnectionInterface { + public models: {}; + public query: QueryExecutor; private db: any; private cache: Map; - private models: {}; - private query: QueryExecutor; private pgp: any; private spvFinished: boolean; + public constructor(readonly options: any) { + super(options); + } + /** * Make the database connection instance. * @return {PostgresConnection} diff --git a/packages/core-database-postgres/src/index.ts b/packages/core-database-postgres/src/index.ts index 44c2e9493f..310560b92e 100644 --- a/packages/core-database-postgres/src/index.ts +++ b/packages/core-database-postgres/src/index.ts @@ -1,4 +1,5 @@ import { Container } from "@arkecosystem/core-container"; +import { DatabaseManager } from "@arkecosystem/core-database"; import { AbstractLogger } from "@arkecosystem/core-logger"; import { PostgresConnection } from "./connection"; import { defaults } from "./defaults"; @@ -18,7 +19,7 @@ export const plugin = { const postgres = new PostgresConnection(options); - const databaseManager = container.resolvePlugin("databaseManager"); + const databaseManager = container.resolvePlugin("databaseManager"); await databaseManager.makeConnection(postgres); return databaseManager.connection(); diff --git a/packages/core-database-postgres/src/spv.ts b/packages/core-database-postgres/src/spv.ts index bcaacb6cc1..8294e129bd 100644 --- a/packages/core-database-postgres/src/spv.ts +++ b/packages/core-database-postgres/src/spv.ts @@ -3,6 +3,7 @@ const { Transaction } = models; import { app } from "@arkecosystem/core-container"; import { AbstractLogger } from "@arkecosystem/core-logger"; +import {PostgresConnection} from "./connection"; import { queries } from "./queries"; const logger = app.resolvePlugin("logger"); @@ -17,16 +18,11 @@ export class SPV { private query: any; private activeDelegates: []; - /** - * Create a new wallet builder instance. - * @param {SequelizeConnection} database - * @return {void} - */ - constructor(database) { - this.connection = database.connection; - this.models = database.models; - this.walletManager = database.walletManager; - this.query = database.query; + constructor(connectionInterface : PostgresConnection) { + this.connection = connectionInterface.connection; + this.models = connectionInterface.models; + this.walletManager = connectionInterface.walletManager; + this.query = connectionInterface.query; } /** diff --git a/packages/core-database/src/interface.ts b/packages/core-database/src/interface.ts index 847c3e4380..07d313415f 100644 --- a/packages/core-database/src/interface.ts +++ b/packages/core-database/src/interface.ts @@ -14,18 +14,19 @@ const { Block } = models; const { TransactionTypes } = constants; export abstract class ConnectionInterface { - protected config: any; - protected logger: AbstractLogger; - protected emitter: any; - protected connection: any = null; - protected blocksInCurrentRound: any[] = null; - protected stateStarted: boolean = false; - protected restoredDatabaseIntegrity: boolean = false; - protected walletManager: WalletManager = null; - protected forgingDelegates: any[] = null; - protected wallets: WalletsRepository = null; - protected delegates: DelegatesRepository = null; - protected queuedQueries: any[] = null; + // TODO: Convert these to protected/private and provide the appropriate get/setters + public config: any; + public logger: AbstractLogger; + public emitter: any; + public connection: any = null; + public blocksInCurrentRound: any[] = null; + public stateStarted: boolean = false; + public restoredDatabaseIntegrity: boolean = false; + public walletManager: WalletManager = null; + public forgingDelegates: any[] = null; + public wallets: WalletsRepository = null; + public delegates: DelegatesRepository = null; + public queuedQueries: any[] = null; /** * @constructor From e5658c8e7ccfca52d8a5d5a3571cfe6f4c73ca09 Mon Sep 17 00:00:00 2001 From: tekhit Date: Sat, 22 Dec 2018 17:19:49 -0600 Subject: [PATCH 3/5] fix: failing tests --- packages/core-database/src/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/core-database/src/index.ts b/packages/core-database/src/index.ts index 9f89918c3e..cdce672996 100644 --- a/packages/core-database/src/index.ts +++ b/packages/core-database/src/index.ts @@ -3,3 +3,4 @@ export * from "./interface"; export * from "./wallet-manager"; export * from "./repositories/delegates"; export * from "./repositories/wallets"; +export * from "./plugin"; From 649086c0eb3b3c9d21464ab505fc522cc1a486f1 Mon Sep 17 00:00:00 2001 From: tekhit Date: Sat, 22 Dec 2018 21:09:03 -0600 Subject: [PATCH 4/5] refactor: Export core-database-postgres typedefs refactor: Remove un-used SPV.connection property refactor: Remove ConnectionInterface.connection property. This available in the 'options' object that's passed via constructor. refactor: Use inline-initialization instead of constructor initialization for concise code, unless we're accessing constructor parameters. --- packages/core-database-postgres/package.json | 3 +- .../core-database-postgres/src/connection.ts | 2 +- packages/core-database-postgres/src/index.ts | 42 ++----------------- packages/core-database-postgres/src/plugin.ts | 23 ++++++++++ packages/core-database-postgres/src/spv.ts | 9 ++-- .../src/sql/query-executor.ts | 4 +- .../core-database/__tests__/interface.test.ts | 14 ++----- packages/core-database/src/interface.ts | 25 +++-------- packages/core-database/src/manager.ts | 3 +- 9 files changed, 47 insertions(+), 78 deletions(-) create mode 100644 packages/core-database-postgres/src/plugin.ts diff --git a/packages/core-database-postgres/package.json b/packages/core-database-postgres/package.json index dc92191865..8531f12403 100644 --- a/packages/core-database-postgres/package.json +++ b/packages/core-database-postgres/package.json @@ -6,7 +6,8 @@ "Brian Faust " ], "license": "MIT", - "main": "dist/index.js", + "main": "dist/index", + "types": "dist/index", "files": [ "dist" ], diff --git a/packages/core-database-postgres/src/connection.ts b/packages/core-database-postgres/src/connection.ts index c0ce238ecf..880dc460f8 100644 --- a/packages/core-database-postgres/src/connection.ts +++ b/packages/core-database-postgres/src/connection.ts @@ -24,7 +24,7 @@ const { Block, Transaction } = models; export class PostgresConnection extends ConnectionInterface { public models: {}; public query: QueryExecutor; - private db: any; + public db: any; private cache: Map; private pgp: any; private spvFinished: boolean; diff --git a/packages/core-database-postgres/src/index.ts b/packages/core-database-postgres/src/index.ts index 310560b92e..f7d6a04322 100644 --- a/packages/core-database-postgres/src/index.ts +++ b/packages/core-database-postgres/src/index.ts @@ -1,38 +1,4 @@ -import { Container } from "@arkecosystem/core-container"; -import { DatabaseManager } from "@arkecosystem/core-database"; -import { AbstractLogger } from "@arkecosystem/core-logger"; -import { PostgresConnection } from "./connection"; -import { defaults } from "./defaults"; -import { migrations } from "./migrations"; - -/** - * The struct used by the plugin container. - * @type {Object} - */ -export const plugin = { - pkg: require("../package.json"), - defaults, - alias: "database", - extends: "@arkecosystem/core-database", - async register(container: Container, options) { - container.resolvePlugin("logger").info("Establishing Database Connection"); - - const postgres = new PostgresConnection(options); - - const databaseManager = container.resolvePlugin("databaseManager"); - await databaseManager.makeConnection(postgres); - - return databaseManager.connection(); - }, - async deregister(container: Container, options) { - container.resolvePlugin("logger").info("Closing Database Connection"); - - return container.resolvePlugin("database").disconnect(); - }, -}; - -/** - * The files required to migrate the database. - * @type {Array} - */ -export { migrations }; +export * from "./connection"; +export * from "./migrations"; +export * from "./spv"; +export * from "./plugin"; diff --git a/packages/core-database-postgres/src/plugin.ts b/packages/core-database-postgres/src/plugin.ts new file mode 100644 index 0000000000..0cc4f70b64 --- /dev/null +++ b/packages/core-database-postgres/src/plugin.ts @@ -0,0 +1,23 @@ +import { Container } from "@arkecosystem/core-container"; +import { DatabaseManager } from "@arkecosystem/core-database"; +import { AbstractLogger } from "@arkecosystem/core-logger"; +import { PostgresConnection } from "./connection"; +import { defaults } from "./defaults"; + +export const plugin = { + pkg: require("../package.json"), + defaults, + alias: "database", + extends: "@arkecosystem/core-database", + async register(container: Container, options) { + container.resolvePlugin("logger").info("Establishing Database Connection"); + + const databaseManager = container.resolvePlugin("databaseManager"); + return await databaseManager.makeConnection(new PostgresConnection(options)); + }, + async deregister(container: Container, options) { + container.resolvePlugin("logger").info("Closing Database Connection"); + + return container.resolvePlugin("database").disconnect(); + }, +}; diff --git a/packages/core-database-postgres/src/spv.ts b/packages/core-database-postgres/src/spv.ts index 8294e129bd..02e731ee2b 100644 --- a/packages/core-database-postgres/src/spv.ts +++ b/packages/core-database-postgres/src/spv.ts @@ -3,8 +3,9 @@ const { Transaction } = models; import { app } from "@arkecosystem/core-container"; import { AbstractLogger } from "@arkecosystem/core-logger"; -import {PostgresConnection} from "./connection"; +import { PostgresConnection } from "./connection"; import { queries } from "./queries"; +import { QueryExecutor } from "./sql/query-executor"; const logger = app.resolvePlugin("logger"); const config = app.getConfig(); @@ -12,14 +13,12 @@ const config = app.getConfig(); const genesisWallets = config.get("genesisBlock.transactions").map(tx => tx.senderId); export class SPV { - private connection: any; private models: any; private walletManager: any; - private query: any; + private query: QueryExecutor; private activeDelegates: []; - constructor(connectionInterface : PostgresConnection) { - this.connection = connectionInterface.connection; + constructor(connectionInterface: PostgresConnection) { this.models = connectionInterface.models; this.walletManager = connectionInterface.walletManager; this.query = connectionInterface.query; diff --git a/packages/core-database-postgres/src/sql/query-executor.ts b/packages/core-database-postgres/src/sql/query-executor.ts index 0f6d4962c2..64ec92b0b8 100644 --- a/packages/core-database-postgres/src/sql/query-executor.ts +++ b/packages/core-database-postgres/src/sql/query-executor.ts @@ -1,10 +1,12 @@ +import { PostgresConnection } from "../connection"; + export class QueryExecutor { /** * Create a new QueryExecutor instance. * @param {[type]} connection * @return {QueryBuilder} */ - constructor(public connection) {} + constructor(public connection: PostgresConnection) {} /** * Execute the given query and expect no results. diff --git a/packages/core-database/__tests__/interface.test.ts b/packages/core-database/__tests__/interface.test.ts index 9a37d39a2e..22447d3bbc 100644 --- a/packages/core-database/__tests__/interface.test.ts +++ b/packages/core-database/__tests__/interface.test.ts @@ -10,9 +10,9 @@ const { ARKTOSHI, TransactionTypes } = constants; let connectionInterface; let genesisBlock; -import { DelegatesRepository } from "../src/repositories/delegates"; -import { WalletsRepository } from "../src/repositories/wallets"; -import { WalletManager } from "../src/wallet-manager"; +import { DelegatesRepository } from "../src"; +import { WalletsRepository } from "../src"; +import { WalletManager } from "../src"; import { DummyConnection } from "./__fixtures__/dummy-class"; beforeAll(async () => { @@ -27,14 +27,6 @@ afterAll(async () => { }); describe("Connection Interface", () => { - describe("getConnection", () => { - it("should return the set connection", () => { - connectionInterface.connection = "fake-connection"; - - expect(connectionInterface.getConnection()).toBe("fake-connection"); - }); - }); - describe("__calcPreviousActiveDelegates", () => { it("should calculate the previous delegate list", async () => { const walletManager = new WalletManager(); diff --git a/packages/core-database/src/interface.ts b/packages/core-database/src/interface.ts index 07d313415f..4bf68551a7 100644 --- a/packages/core-database/src/interface.ts +++ b/packages/core-database/src/interface.ts @@ -1,24 +1,21 @@ import { app } from "@arkecosystem/core-container"; import { AbstractLogger } from "@arkecosystem/core-logger"; -import { configManager, constants, crypto, models, slots } from "@arkecosystem/crypto"; - import { roundCalculator } from "@arkecosystem/core-utils"; +import { configManager, constants, crypto, models, slots } from "@arkecosystem/crypto"; import assert from "assert"; import cloneDeep from "lodash/cloneDeep"; -import { WalletManager } from "./wallet-manager"; - import { DelegatesRepository } from "./repositories/delegates"; import { WalletsRepository } from "./repositories/wallets"; +import { WalletManager } from "./wallet-manager"; const { Block } = models; const { TransactionTypes } = constants; export abstract class ConnectionInterface { // TODO: Convert these to protected/private and provide the appropriate get/setters - public config: any; - public logger: AbstractLogger; - public emitter: any; - public connection: any = null; + public config = app.getConfig(); + public logger = app.resolvePlugin("logger"); + public emitter = app.resolvePlugin("event-emitter"); public blocksInCurrentRound: any[] = null; public stateStarted: boolean = false; public restoredDatabaseIntegrity: boolean = false; @@ -33,23 +30,11 @@ export abstract class ConnectionInterface { * @param {Object} options */ protected constructor(public readonly options: any) { - this.config = app.getConfig(); - this.logger = app.resolvePlugin("logger"); - this.emitter = app.resolvePlugin("event-emitter"); - this.__registerListeners(); } public abstract async make(): Promise; - /** - * Get the current connection. - * @return {ConnectionInterface} - */ - public getConnection(): any { - return this.connection; - } - /** * Connect to a database. * @return {void} diff --git a/packages/core-database/src/manager.ts b/packages/core-database/src/manager.ts index 8e9eb70e4e..3cf4676c2e 100644 --- a/packages/core-database/src/manager.ts +++ b/packages/core-database/src/manager.ts @@ -26,7 +26,8 @@ export class DatabaseManager { * @param {String} name * @return {void} */ - public async makeConnection(connection: ConnectionInterface, name = "default") { + public async makeConnection(connection: ConnectionInterface, name = "default"): Promise { this.connections[name] = await connection.make(); + return this.connection(name); } } From 6c645163c710d554341ac9abef9b33ac6e846021 Mon Sep 17 00:00:00 2001 From: tekhit Date: Sun, 23 Dec 2018 21:40:20 -0600 Subject: [PATCH 5/5] refactor: Use core-database-postgres typedefs in other modules refactor: more inline-initialization vs constructor refactor: Removed some redundant vars in core-api Repositories, use inherited references instead. --- .../core-api/__tests__/__support__/setup.ts | 7 +++-- .../__tests__/v2/handlers/blocks.test.ts | 7 +++-- .../__tests__/v2/handlers/delegates.test.ts | 13 +++++---- packages/core-api/package.json | 1 + .../core-api/src/interfaces/repository.ts | 2 -- packages/core-api/src/repositories/blocks.ts | 7 +++-- .../core-api/src/repositories/repository.ts | 28 +++++++++---------- .../core-api/src/repositories/transactions.ts | 5 +++- .../src/versions/1/accounts/methods.ts | 3 +- .../src/versions/1/delegates/methods.ts | 3 +- .../src/versions/1/shared/controller.ts | 17 ++++------- .../src/versions/2/blocks/transformer.ts | 3 +- .../src/versions/2/delegates/methods.ts | 3 +- .../src/versions/2/shared/controller.ts | 13 +++------ .../src/versions/2/wallets/methods.ts | 3 +- packages/core-blockchain/package.json | 1 + packages/core-blockchain/src/blockchain.ts | 3 +- packages/core-container/src/container.ts | 5 ++++ .../core-database-postgres/src/connection.ts | 7 ++--- packages/core-database-postgres/src/index.ts | 2 ++ .../src/models/model.ts | 4 +-- packages/core-database-postgres/src/plugin.ts | 3 +- packages/core-elasticsearch/package.json | 1 + .../core-elasticsearch/src/index/block.ts | 3 +- .../core-elasticsearch/src/index/index.ts | 3 +- .../core-elasticsearch/src/index/round.ts | 3 +- .../src/index/transaction.ts | 3 +- .../core-elasticsearch/src/index/wallet.ts | 3 +- packages/core-graphql/package.json | 1 + .../core-graphql/src/repositories/blocks.ts | 6 +--- .../src/repositories/repository.ts | 19 ++++--------- .../src/repositories/transactions.ts | 9 ++---- packages/core-p2p/package.json | 1 + packages/core-p2p/src/monitor.ts | 3 +- .../src/server/versions/1/handlers.ts | 5 ++-- .../versions/internal/handlers/rounds.ts | 3 +- .../internal/handlers/transactions.ts | 3 +- .../versions/internal/handlers/utils.ts | 6 ++-- packages/core-snapshots/src/index.ts | 5 ++-- .../core-test-utils/src/helpers/container.ts | 7 +++-- .../__tests__/__support__/setup.ts | 10 ++----- .../__tests__/connection.test.ts | 8 ++++-- .../__tests__/guard.test.ts | 21 +++++++------- .../__tests__/pool-wallet-manager.test.ts | 22 ++++++++------- packages/core-transaction-pool/package.json | 1 + .../core-transaction-pool/src/connection.ts | 3 +- packages/core-transaction-pool/src/guard.ts | 3 +- .../src/pool-wallet-manager.ts | 5 ++-- packages/core-vote-report/package.json | 1 + packages/core-vote-report/src/handler.ts | 3 +- 50 files changed, 159 insertions(+), 142 deletions(-) diff --git a/packages/core-api/__tests__/__support__/setup.ts b/packages/core-api/__tests__/__support__/setup.ts index 62637d6666..3dea295ee8 100644 --- a/packages/core-api/__tests__/__support__/setup.ts +++ b/packages/core-api/__tests__/__support__/setup.ts @@ -1,7 +1,8 @@ import { app } from "@arkecosystem/core-container"; +import { PostgresConnection } from "@arkecosystem/core-database-postgres"; import { setUpContainer } from "@arkecosystem/core-test-utils/src/helpers/container"; -import { delegates } from "../../../core-test-utils/src/fixtures/testnet/delegates"; +import { delegates } from "../../../core-test-utils/src/fixtures"; import { generateRound } from "./utils/generate-round"; import { queries } from "../../../core-database-postgres/src/queries"; @@ -20,7 +21,7 @@ async function setUp() { ], }); - const connection = app.resolvePlugin("database"); + const connection = app.resolvePlugin("database"); await connection.db.rounds.truncate(); await connection.buildWallets(1); await connection.saveWallets(true); @@ -32,7 +33,7 @@ async function tearDown() { } async function calculateRanks() { - const connection = app.resolvePlugin("database"); + const connection = app.resolvePlugin("database"); const rows = await connection.query.manyOrNone(queries.spv.delegatesRanks); diff --git a/packages/core-api/__tests__/v2/handlers/blocks.test.ts b/packages/core-api/__tests__/v2/handlers/blocks.test.ts index a0c3a739cd..bdf574ba40 100644 --- a/packages/core-api/__tests__/v2/handlers/blocks.test.ts +++ b/packages/core-api/__tests__/v2/handlers/blocks.test.ts @@ -4,10 +4,11 @@ import { utils } from "../utils"; import { models } from "@arkecosystem/crypto"; import genesisBlock from "../../../../core-test-utils/src/config/testnet/genesisBlock.json"; -import { blocks2to100 } from "../../../../core-test-utils/src/fixtures/testnet/blocks2to100"; -import { resetBlockchain } from "../../../../core-test-utils/src/helpers/blockchain"; +import { blocks2to100 } from "../../../../core-test-utils/src/fixtures"; +import { resetBlockchain } from "../../../../core-test-utils/src/helpers"; import { app } from "@arkecosystem/core-container"; +import { PostgresConnection } from "@arkecosystem/core-database-postgres"; const container = app; const { Block } = models; @@ -145,7 +146,7 @@ describe("API 2.0 - Blocks", () => { it("should POST a search for blocks with the exact specified previousBlock", async () => { // save a new block so that we can make the request with previousBlock const block2 = new Block(blocks2to100[0]); - const database = container.resolvePlugin("database"); + const database = container.resolvePlugin("database"); await database.saveBlock(block2); const response = await utils[request]("POST", "blocks/search", { diff --git a/packages/core-api/__tests__/v2/handlers/delegates.test.ts b/packages/core-api/__tests__/v2/handlers/delegates.test.ts index 24fa725114..ae129a3aa8 100644 --- a/packages/core-api/__tests__/v2/handlers/delegates.test.ts +++ b/packages/core-api/__tests__/v2/handlers/delegates.test.ts @@ -8,6 +8,7 @@ import { models } from "@arkecosystem/crypto"; const { Block } = models; import { app } from "@arkecosystem/core-container"; +import { PostgresConnection } from "@arkecosystem/core-database-postgres"; const delegate = { username: "genesis_9", @@ -63,8 +64,9 @@ describe("API 2.0 - Delegates", () => { expect(response.data.data).toBeArray(); response.data.data.forEach(utils.expectDelegate); - expect(response.data.data.sort((a, b) => - a.production.productivity > b.production.productivity)).toEqual(response.data.data); + expect( + response.data.data.sort((a, b) => a.production.productivity > b.production.productivity), + ).toEqual(response.data.data); }); }, ); @@ -78,8 +80,9 @@ describe("API 2.0 - Delegates", () => { expect(response.data.data).toBeArray(); response.data.data.forEach(utils.expectDelegate); - expect(response.data.data.sort((a, b) => - a.production.approval > b.production.approval)).toEqual(response.data.data); + expect(response.data.data.sort((a, b) => a.production.approval > b.production.approval)).toEqual( + response.data.data, + ); }); }, ); @@ -152,7 +155,7 @@ describe("API 2.0 - Delegates", () => { it("should GET all blocks for a delegate by the given identifier", async () => { // save a new block so that we can make the request with generatorPublicKey const block2 = new Block(blocks2to100[0]); - const database = app.resolvePlugin("database"); + const database = app.resolvePlugin("database"); await database.saveBlock(block2); const response = await utils[request]( diff --git a/packages/core-api/package.json b/packages/core-api/package.json index d4590cd79d..d45480d243 100644 --- a/packages/core-api/package.json +++ b/packages/core-api/package.json @@ -29,6 +29,7 @@ }, "dependencies": { "@arkecosystem/core-container": "^2.1.0", + "@arkecosystem/core-database-postgres": "^2.1.0", "@arkecosystem/core-logger": "^2.1.0", "@arkecosystem/core-http-utils": "^2.1.0", "@arkecosystem/core-transaction-pool": "^2.1.0", diff --git a/packages/core-api/src/interfaces/repository.ts b/packages/core-api/src/interfaces/repository.ts index 071bcd733b..b068e3100c 100644 --- a/packages/core-api/src/interfaces/repository.ts +++ b/packages/core-api/src/interfaces/repository.ts @@ -1,5 +1,3 @@ -import Hapi from "hapi"; - export interface IRepository { database: any; cache: any; diff --git a/packages/core-api/src/repositories/blocks.ts b/packages/core-api/src/repositories/blocks.ts index fb796d6877..74ccf084e3 100644 --- a/packages/core-api/src/repositories/blocks.ts +++ b/packages/core-api/src/repositories/blocks.ts @@ -1,9 +1,12 @@ -import { app } from "@arkecosystem/core-container"; import { IRepository } from "../interfaces/repository"; import { Repository } from "./repository"; import { buildFilterQuery } from "./utils/build-filter-query"; export class BlockRepository extends Repository implements IRepository { + constructor() { + super(); + } + /** * Get all blocks for the given parameters. * @param {Object} parameters @@ -115,7 +118,7 @@ export class BlockRepository extends Repository implements IRepository { }); } - public getModel(): object { + public getModel(): any { return this.database.models.block; } diff --git a/packages/core-api/src/repositories/repository.ts b/packages/core-api/src/repositories/repository.ts index 7bfe840def..df82231d62 100644 --- a/packages/core-api/src/repositories/repository.ts +++ b/packages/core-api/src/repositories/repository.ts @@ -1,25 +1,23 @@ import { app } from "@arkecosystem/core-container"; +import { PostgresConnection } from "@arkecosystem/core-database-postgres"; import snakeCase from "lodash/snakeCase"; - -export class Repository { - public database: any; - public cache: any; - public transactionPool: any; - public model: any; - public query: any; +import { IRepository } from "../interfaces/repository"; + +export abstract class Repository implements IRepository { + public database = app.resolvePlugin("database"); + public cache = this.database.getCache(); + public transactionPool = app.resolvePlugin("transactionPool"); + public model = this.getModel(); + public query = this.model.query(); public columns: string[] = []; - public constructor() { - this.database = app.resolvePlugin("database"); - this.cache = this.database.getCache(); - this.transactionPool = app.resolvePlugin("transactionPool"); - // @ts-ignore - this.model = this.getModel(); - this.query = this.model.query(); - + protected constructor() { this.__mapColumns(); } + // todo: Introduce a generic param to return type-safe models + public abstract getModel(): any; + public async _find(query): Promise { return this.database.query.oneOrNone(query.toQuery()); } diff --git a/packages/core-api/src/repositories/transactions.ts b/packages/core-api/src/repositories/transactions.ts index 5a5362a27d..d0866bad0d 100644 --- a/packages/core-api/src/repositories/transactions.ts +++ b/packages/core-api/src/repositories/transactions.ts @@ -1,4 +1,3 @@ -import { app } from "@arkecosystem/core-container"; import { constants, slots } from "@arkecosystem/crypto"; import dayjs from "dayjs-ext"; import partition from "lodash/partition"; @@ -7,6 +6,10 @@ import { Repository } from "./repository"; import { buildFilterQuery } from "./utils/build-filter-query"; export class TransactionsRepository extends Repository implements IRepository { + constructor() { + super(); + } + /** * Get all transactions. * @param {Object} params diff --git a/packages/core-api/src/versions/1/accounts/methods.ts b/packages/core-api/src/versions/1/accounts/methods.ts index 29adb164ec..752f384653 100644 --- a/packages/core-api/src/versions/1/accounts/methods.ts +++ b/packages/core-api/src/versions/1/accounts/methods.ts @@ -1,8 +1,9 @@ import { app } from "@arkecosystem/core-container"; +import { PostgresConnection } from "@arkecosystem/core-database-postgres"; import { generateCacheKey, getCacheTimeout } from "../../utils"; import { paginate, respondWith, toCollection, toResource } from "../utils"; -const database = app.resolvePlugin("database"); +const database = app.resolvePlugin("database"); const index = async request => { const { rows } = await database.wallets.findAll({ diff --git a/packages/core-api/src/versions/1/delegates/methods.ts b/packages/core-api/src/versions/1/delegates/methods.ts index 6dab2133d2..0342640ef5 100644 --- a/packages/core-api/src/versions/1/delegates/methods.ts +++ b/packages/core-api/src/versions/1/delegates/methods.ts @@ -1,8 +1,9 @@ import { app } from "@arkecosystem/core-container"; +import { PostgresConnection } from "@arkecosystem/core-database-postgres"; import { generateCacheKey, getCacheTimeout } from "../../utils"; import { paginate, respondWith, toCollection, toResource } from "../utils"; -const database = app.resolvePlugin("database"); +const database = app.resolvePlugin("database"); const index = async request => { const { count, rows } = await database.delegates.paginate({ diff --git a/packages/core-api/src/versions/1/shared/controller.ts b/packages/core-api/src/versions/1/shared/controller.ts index 8a304037c4..decfb2131f 100644 --- a/packages/core-api/src/versions/1/shared/controller.ts +++ b/packages/core-api/src/versions/1/shared/controller.ts @@ -1,19 +1,14 @@ import { app } from "@arkecosystem/core-container"; +import { PostgresConnection } from "@arkecosystem/core-database-postgres"; +import { AbstractLogger } from "@arkecosystem/core-logger"; import Hapi from "hapi"; import { paginate, respondWith, respondWithCache, toCollection, toResource } from "../utils"; export class Controller { - protected config: any; - protected blockchain: any; - protected database: any; - protected logger: any; - - public constructor() { - this.config = app.getConfig(); - this.blockchain = app.resolvePlugin("blockchain"); - this.database = app.resolvePlugin("database"); - this.logger = app.resolvePlugin("logger"); - } + protected config = app.getConfig(); + protected blockchain = app.resolvePlugin("blockchain"); + protected database = app.resolvePlugin("database"); + protected logger = app.resolvePlugin("logger"); protected paginate(request: Hapi.Request): any { return paginate(request); diff --git a/packages/core-api/src/versions/2/blocks/transformer.ts b/packages/core-api/src/versions/2/blocks/transformer.ts index 647dcbe2fd..ab2780245c 100644 --- a/packages/core-api/src/versions/2/blocks/transformer.ts +++ b/packages/core-api/src/versions/2/blocks/transformer.ts @@ -1,8 +1,9 @@ import { app } from "@arkecosystem/core-container"; +import { PostgresConnection } from "@arkecosystem/core-database-postgres"; import { bignumify, formatTimestamp } from "@arkecosystem/core-utils"; export function transformBlock(model) { - const database = app.resolvePlugin("database"); + const database = app.resolvePlugin("database"); const generator = database.walletManager.findByPublicKey(model.generatorPublicKey); model.reward = bignumify(model.reward); diff --git a/packages/core-api/src/versions/2/delegates/methods.ts b/packages/core-api/src/versions/2/delegates/methods.ts index e2aa12f86d..689ce6f74a 100644 --- a/packages/core-api/src/versions/2/delegates/methods.ts +++ b/packages/core-api/src/versions/2/delegates/methods.ts @@ -1,11 +1,12 @@ import { app } from "@arkecosystem/core-container"; +import { PostgresConnection } from "@arkecosystem/core-database-postgres"; import Boom from "boom"; import orderBy from "lodash/orderBy"; import { blocksRepository } from "../../../repositories"; import { generateCacheKey, getCacheTimeout } from "../../utils"; import { paginate, respondWithResource, toPagination } from "../utils"; -const database = app.resolvePlugin("database"); +const database = app.resolvePlugin("database"); const index = async request => { const delegates = await database.delegates.paginate({ diff --git a/packages/core-api/src/versions/2/shared/controller.ts b/packages/core-api/src/versions/2/shared/controller.ts index 58236b72e2..8d0fea2369 100644 --- a/packages/core-api/src/versions/2/shared/controller.ts +++ b/packages/core-api/src/versions/2/shared/controller.ts @@ -1,4 +1,5 @@ import { app } from "@arkecosystem/core-container"; +import { PostgresConnection } from "@arkecosystem/core-database-postgres"; import Hapi from "hapi"; import { @@ -12,15 +13,9 @@ import { } from "../utils"; export class Controller { - protected config: any; - protected blockchain: any; - protected database: any; - - public constructor() { - this.config = app.getConfig(); - this.blockchain = app.resolvePlugin("blockchain"); - this.database = app.resolvePlugin("database"); - } + protected config = app.getConfig(); + protected blockchain = app.resolvePlugin("blockchain"); + protected database = app.resolvePlugin("database"); protected paginate(request: Hapi.Request): any { return paginate(request); diff --git a/packages/core-api/src/versions/2/wallets/methods.ts b/packages/core-api/src/versions/2/wallets/methods.ts index d8906a2c38..f978fb4b3e 100644 --- a/packages/core-api/src/versions/2/wallets/methods.ts +++ b/packages/core-api/src/versions/2/wallets/methods.ts @@ -1,10 +1,11 @@ import { app } from "@arkecosystem/core-container"; +import { PostgresConnection } from "@arkecosystem/core-database-postgres"; import Boom from "boom"; import { transactionsRepository } from "../../../repositories"; import { generateCacheKey, getCacheTimeout } from "../../utils"; import { paginate, respondWithResource, toPagination } from "../utils"; -const database = app.resolvePlugin("database"); +const database = app.resolvePlugin("database"); const index = async request => { const wallets = await database.wallets.findAll({ diff --git a/packages/core-blockchain/package.json b/packages/core-blockchain/package.json index cca686f832..8d79d400e5 100644 --- a/packages/core-blockchain/package.json +++ b/packages/core-blockchain/package.json @@ -30,6 +30,7 @@ }, "dependencies": { "@arkecosystem/core-container": "^2.1.0", + "@arkecosystem/core-database-postgres": "^2.1.0", "@arkecosystem/core-logger": "^2.1.0", "@arkecosystem/core-utils": "^2.1.0", "@arkecosystem/crypto": "^2.1.0", diff --git a/packages/core-blockchain/src/blockchain.ts b/packages/core-blockchain/src/blockchain.ts index 6a7d005797..0ae5461319 100644 --- a/packages/core-blockchain/src/blockchain.ts +++ b/packages/core-blockchain/src/blockchain.ts @@ -1,5 +1,6 @@ /* tslint:disable:max-line-length */ import { app } from "@arkecosystem/core-container"; +import { PostgresConnection } from "@arkecosystem/core-database-postgres"; import { AbstractLogger } from "@arkecosystem/core-logger"; import { models, slots } from "@arkecosystem/crypto"; @@ -690,7 +691,7 @@ export class Blockchain { * @return {ConnectionInterface} */ get database() { - return app.resolvePlugin("database"); + return app.resolvePlugin("database"); } /** diff --git a/packages/core-container/src/container.ts b/packages/core-container/src/container.ts index 1df35703ee..944f7ae08d 100644 --- a/packages/core-container/src/container.ts +++ b/packages/core-container/src/container.ts @@ -250,6 +250,11 @@ export class Container { logger.info("Ark Core is trying to gracefully shut down to avoid data corruption :pizza:"); try { + /* TODO: core-database-postgres has a dep on core-container. Yet we have code in core-container fetching a reference to core-database-postgres. + If we try to import core-database-postgres types, we create a circular dependency: core-container -> core-database-postgres -> core-container. + The only thing we're doing here is trying to save the wallets upon shutdown. The code can and should be moved into core-database-postgres instead + and leverage either the plugins `tearDown` method or the event-emitter's 'shutdown' event + */ const database = this.resolvePlugin("database"); if (database) { const emitter = this.resolvePlugin("event-emitter"); diff --git a/packages/core-database-postgres/src/connection.ts b/packages/core-database-postgres/src/connection.ts index 880dc460f8..b02b426154 100644 --- a/packages/core-database-postgres/src/connection.ts +++ b/packages/core-database-postgres/src/connection.ts @@ -15,6 +15,7 @@ import { Bignum, models } from "@arkecosystem/crypto"; import { SPV } from "./spv"; import { migrations } from "./migrations"; +import { Model } from "./models"; import { repositories } from "./repositories"; import { QueryExecutor } from "./sql/query-executor"; import { camelizeColumns } from "./utils"; @@ -22,7 +23,7 @@ import { camelizeColumns } from "./utils"; const { Block, Transaction } = models; export class PostgresConnection extends ConnectionInterface { - public models: {}; + public models: { [key: string]: Model } = {}; public query: QueryExecutor; public db: any; private cache: Map; @@ -175,7 +176,7 @@ export class PostgresConnection extends ConnectionInterface { * @param {Array} delegates * @return {Array} */ - public async getActiveDelegates(height, delegates) { + public async getActiveDelegates(height, delegates?) { const maxDelegates = this.config.getMilestone(height).activeDelegates; const round = Math.floor((height - 1) / maxDelegates) + 1; @@ -660,8 +661,6 @@ export class PostgresConnection extends ConnectionInterface { * @return {void} */ public async __registerModels() { - this.models = {}; - for (const [key, Value] of Object.entries(require("./models"))) { this.models[key.toLowerCase()] = new (Value as any)(this.pgp); } diff --git a/packages/core-database-postgres/src/index.ts b/packages/core-database-postgres/src/index.ts index f7d6a04322..ff4bbde04b 100644 --- a/packages/core-database-postgres/src/index.ts +++ b/packages/core-database-postgres/src/index.ts @@ -1,4 +1,6 @@ export * from "./connection"; export * from "./migrations"; export * from "./spv"; +export * from "./models"; +export * from "./repositories"; export * from "./plugin"; diff --git a/packages/core-database-postgres/src/models/model.ts b/packages/core-database-postgres/src/models/model.ts index 507077f0f8..6d401f9dca 100644 --- a/packages/core-database-postgres/src/models/model.ts +++ b/packages/core-database-postgres/src/models/model.ts @@ -23,7 +23,7 @@ export abstract class Model { * Return the model & table definition. * @return {Object} */ - public query() { + public query(): any { const { schema, columns } = this.getColumnSet(); return sql.define({ name: this.getTable(), @@ -37,8 +37,8 @@ export abstract class Model { /** * Convert the "camelCase" keys to "snake_case". - * @param {Array} v * @return {ColumnSet} + * @param columns */ public createColumnSet(columns) { return new this.pgp.helpers.ColumnSet(columns, { diff --git a/packages/core-database-postgres/src/plugin.ts b/packages/core-database-postgres/src/plugin.ts index 0cc4f70b64..8f347d0a28 100644 --- a/packages/core-database-postgres/src/plugin.ts +++ b/packages/core-database-postgres/src/plugin.ts @@ -18,6 +18,7 @@ export const plugin = { async deregister(container: Container, options) { container.resolvePlugin("logger").info("Closing Database Connection"); - return container.resolvePlugin("database").disconnect(); + const connection = container.resolvePlugin("database"); + return connection.disconnect(); }, }; diff --git a/packages/core-elasticsearch/package.json b/packages/core-elasticsearch/package.json index d3e68b62f5..6824f27ac7 100644 --- a/packages/core-elasticsearch/package.json +++ b/packages/core-elasticsearch/package.json @@ -23,6 +23,7 @@ }, "dependencies": { "@arkecosystem/core-container": "^2.1.0", + "@arkecosystem/core-database-postgres": "^2.1.0", "@arkecosystem/core-logger": "^2.1.0", "@arkecosystem/core-http-utils": "^2.1.0", "@arkecosystem/crypto": "^2.1.0", diff --git a/packages/core-elasticsearch/src/index/block.ts b/packages/core-elasticsearch/src/index/block.ts index 2e1f5dc974..a9439b70a5 100644 --- a/packages/core-elasticsearch/src/index/block.ts +++ b/packages/core-elasticsearch/src/index/block.ts @@ -1,4 +1,5 @@ import { app } from "@arkecosystem/core-container"; +import { PostgresConnection } from "@arkecosystem/core-database-postgres"; import { AbstractLogger } from "@arkecosystem/core-logger"; import first from "lodash/first"; import last from "lodash/last"; @@ -8,7 +9,7 @@ import { Index } from "./index"; const emitter = app.resolvePlugin("event-emitter"); const logger = app.resolvePlugin("logger"); -const database = app.resolvePlugin("database"); +const database = app.resolvePlugin("database"); class BlockIndex extends Index { /** diff --git a/packages/core-elasticsearch/src/index/index.ts b/packages/core-elasticsearch/src/index/index.ts index 397e9f37db..28fef3fbed 100644 --- a/packages/core-elasticsearch/src/index/index.ts +++ b/packages/core-elasticsearch/src/index/index.ts @@ -1,11 +1,12 @@ import { app } from "@arkecosystem/core-container"; +import { PostgresConnection } from "@arkecosystem/core-database-postgres"; import { AbstractLogger } from "@arkecosystem/core-logger"; import { client } from "../services/client"; import { storage } from "../services/storage"; const emitter = app.resolvePlugin("event-emitter"); const logger = app.resolvePlugin("logger"); -const database = app.resolvePlugin("database"); +const database = app.resolvePlugin("database"); export abstract class Index { public chunkSize: any; diff --git a/packages/core-elasticsearch/src/index/round.ts b/packages/core-elasticsearch/src/index/round.ts index 4ff7438bb0..e47e7a8712 100644 --- a/packages/core-elasticsearch/src/index/round.ts +++ b/packages/core-elasticsearch/src/index/round.ts @@ -1,4 +1,5 @@ import { app } from "@arkecosystem/core-container"; +import { PostgresConnection } from "@arkecosystem/core-database-postgres"; import { AbstractLogger } from "@arkecosystem/core-logger"; import first from "lodash/first"; import last from "lodash/last"; @@ -8,7 +9,7 @@ import { Index } from "./index"; const emitter = app.resolvePlugin("event-emitter"); const logger = app.resolvePlugin("logger"); -const database = app.resolvePlugin("database"); +const database = app.resolvePlugin("database"); class RoundIndex extends Index { /** diff --git a/packages/core-elasticsearch/src/index/transaction.ts b/packages/core-elasticsearch/src/index/transaction.ts index 66d2c73015..deb314fee0 100644 --- a/packages/core-elasticsearch/src/index/transaction.ts +++ b/packages/core-elasticsearch/src/index/transaction.ts @@ -1,4 +1,5 @@ import { app } from "@arkecosystem/core-container"; +import { PostgresConnection } from "@arkecosystem/core-database-postgres"; import { AbstractLogger } from "@arkecosystem/core-logger"; import first from "lodash/first"; import last from "lodash/last"; @@ -11,7 +12,7 @@ const { Transaction } = models; const emitter = app.resolvePlugin("event-emitter"); const logger = app.resolvePlugin("logger"); -const database = app.resolvePlugin("database"); +const database = app.resolvePlugin("database"); class TransactionIndex extends Index { /** diff --git a/packages/core-elasticsearch/src/index/wallet.ts b/packages/core-elasticsearch/src/index/wallet.ts index 1c7d7bc166..dfd86eeb3e 100644 --- a/packages/core-elasticsearch/src/index/wallet.ts +++ b/packages/core-elasticsearch/src/index/wallet.ts @@ -1,11 +1,12 @@ import { app } from "@arkecosystem/core-container"; +import { PostgresConnection } from "@arkecosystem/core-database-postgres"; import { AbstractLogger } from "@arkecosystem/core-logger"; import { client } from "../services/client"; import { Index } from "./index"; const emitter = app.resolvePlugin("event-emitter"); const logger = app.resolvePlugin("logger"); -const database = app.resolvePlugin("database"); +const database = app.resolvePlugin("database"); class WalletIndex extends Index { /** diff --git a/packages/core-graphql/package.json b/packages/core-graphql/package.json index d4325f156d..7e91c7b6b2 100644 --- a/packages/core-graphql/package.json +++ b/packages/core-graphql/package.json @@ -28,6 +28,7 @@ }, "dependencies": { "@arkecosystem/core-container": "^2.1.0", + "@arkecosystem/core-database-postgres": "^2.1.0", "@arkecosystem/core-logger": "^2.1.0", "@arkecosystem/core-http-utils": "^2.1.0", "@arkecosystem/crypto": "^2.1.0", diff --git a/packages/core-graphql/src/repositories/blocks.ts b/packages/core-graphql/src/repositories/blocks.ts index 0fffb183cd..ed235dd5e8 100644 --- a/packages/core-graphql/src/repositories/blocks.ts +++ b/packages/core-graphql/src/repositories/blocks.ts @@ -1,7 +1,3 @@ -import { app } from "@arkecosystem/core-container"; - -const database = app.resolvePlugin("database"); - import { Repository } from "./repository"; import { buildFilterQuery } from "./utils/filter-query"; @@ -126,7 +122,7 @@ class BlocksRepository extends Repository { } public getModel() { - return database.models.block; + return this.database.models.block; } public __orderBy(parameters) { diff --git a/packages/core-graphql/src/repositories/repository.ts b/packages/core-graphql/src/repositories/repository.ts index 5cfea4bde1..5f1e8b476b 100644 --- a/packages/core-graphql/src/repositories/repository.ts +++ b/packages/core-graphql/src/repositories/repository.ts @@ -1,20 +1,13 @@ import { app } from "@arkecosystem/core-container"; +import { PostgresConnection } from "@arkecosystem/core-database-postgres"; export abstract class Repository { - public cache: any; - public model: any; - public query: any; - public database: any; - public transactionPool: any; - - constructor() { - this.database = app.resolvePlugin("database"); - this.transactionPool = app.resolvePlugin("transactionPool"); + public database = app.resolvePlugin("database"); + public transactionPool = app.resolvePlugin("transactionPool"); + public cache = this.database.getCache(); + public model = this.getModel(); + public query = this.model.query(); - this.cache = this.database.getCache(); - this.model = this.getModel(); - this.query = this.model.query(); - } public abstract getModel(): any; public async _find(query) { diff --git a/packages/core-graphql/src/repositories/transactions.ts b/packages/core-graphql/src/repositories/transactions.ts index e5c2cf272c..55e61a733f 100644 --- a/packages/core-graphql/src/repositories/transactions.ts +++ b/packages/core-graphql/src/repositories/transactions.ts @@ -1,5 +1,3 @@ -import { app } from "@arkecosystem/core-container"; - import { constants, slots } from "@arkecosystem/crypto"; import dayjs from "dayjs-ext"; @@ -7,7 +5,6 @@ import { Repository } from "./repository"; import { buildFilterQuery } from "./utils/filter-query"; const { TransactionTypes } = constants; -const database = app.resolvePlugin("database"); class TransactionsRepository extends Repository { /** @@ -324,7 +321,7 @@ class TransactionsRepository extends Repository { } public getModel() { - return database.models.transaction; + return this.database.models.transaction; } /** @@ -333,7 +330,7 @@ class TransactionsRepository extends Repository { * @return {Object} */ public async __mapBlocksToTransactions(data) { - const blockQuery = database.models.block.query(); + const blockQuery = this.database.models.block.query(); // Array... if (Array.isArray(data)) { @@ -423,7 +420,7 @@ class TransactionsRepository extends Repository { * @return {String} */ public __publicKeyFromSenderId(senderId) { - return database.walletManager.findByAddress(senderId).publicKey; + return this.database.walletManager.findByAddress(senderId).publicKey; } public __orderBy(parameters) { diff --git a/packages/core-p2p/package.json b/packages/core-p2p/package.json index b8b794c954..07ee28f4fa 100644 --- a/packages/core-p2p/package.json +++ b/packages/core-p2p/package.json @@ -31,6 +31,7 @@ }, "dependencies": { "@arkecosystem/core-container": "^2.1.0", + "@arkecosystem/core-database-postgres": "^2.1.0", "@arkecosystem/core-logger": "^2.1.0", "@arkecosystem/core-http-utils": "^2.1.0", "@arkecosystem/core-transaction-pool": "^2.1.0", diff --git a/packages/core-p2p/src/monitor.ts b/packages/core-p2p/src/monitor.ts index c2e7037219..8adec6e7a2 100755 --- a/packages/core-p2p/src/monitor.ts +++ b/packages/core-p2p/src/monitor.ts @@ -1,6 +1,7 @@ /* tslint:disable:max-line-length */ import { app } from "@arkecosystem/core-container"; +import { PostgresConnection } from "@arkecosystem/core-database-postgres"; import { AbstractLogger } from "@arkecosystem/core-logger"; import { slots } from "@arkecosystem/crypto"; import dayjs from "dayjs-ext"; @@ -714,7 +715,7 @@ class Monitor { * @return {[]String} */ public async __getRecentBlockIds() { - return app.resolvePlugin("database").getRecentBlockIds(); + return app.resolvePlugin("database").getRecentBlockIds(); } /** diff --git a/packages/core-p2p/src/server/versions/1/handlers.ts b/packages/core-p2p/src/server/versions/1/handlers.ts index 33ebd89edf..009b6e920c 100644 --- a/packages/core-p2p/src/server/versions/1/handlers.ts +++ b/packages/core-p2p/src/server/versions/1/handlers.ts @@ -1,4 +1,5 @@ import { app } from "@arkecosystem/core-container"; +import { PostgresConnection } from "@arkecosystem/core-database-postgres"; import { AbstractLogger } from "@arkecosystem/core-logger"; import { TransactionGuard } from "@arkecosystem/core-transaction-pool"; import { crypto, Joi, models, slots } from "@arkecosystem/crypto"; @@ -120,7 +121,7 @@ export const getTransactionsFromIds = { .slice(0, maxTransactions) .filter(id => id.match("[0-9a-fA-F]{32}")); - const rows = await app.resolvePlugin("database").getTransactionsFromIds(transactionIds); + const rows = await app.resolvePlugin("database").getTransactionsFromIds(transactionIds); // TODO: v1 compatibility patch. Add transformer and refactor later on const transactions = await rows.map(row => { @@ -330,7 +331,7 @@ export const getBlocks = { */ async handler(request, h) { try { - const database = app.resolvePlugin("database"); + const database = app.resolvePlugin("database"); const blockchain = app.resolvePlugin("blockchain"); const reqBlockHeight = +request.query.lastBlockHeight + 1; diff --git a/packages/core-p2p/src/server/versions/internal/handlers/rounds.ts b/packages/core-p2p/src/server/versions/internal/handlers/rounds.ts index ad055c9812..c71a0c0568 100644 --- a/packages/core-p2p/src/server/versions/internal/handlers/rounds.ts +++ b/packages/core-p2p/src/server/versions/internal/handlers/rounds.ts @@ -1,4 +1,5 @@ import { app } from "@arkecosystem/core-container"; +import { PostgresConnection } from "@arkecosystem/core-database-postgres"; import { slots } from "@arkecosystem/crypto"; const config = app.getConfig(); @@ -13,7 +14,7 @@ export const current = { * @return {Hapi.Response} */ async handler(request, h) { - const database = app.resolvePlugin("database"); + const database = app.resolvePlugin("database"); const blockchain = app.resolvePlugin("blockchain"); const lastBlock = blockchain.getLastBlock(); diff --git a/packages/core-p2p/src/server/versions/internal/handlers/transactions.ts b/packages/core-p2p/src/server/versions/internal/handlers/transactions.ts index d72f925725..d692cc4d62 100644 --- a/packages/core-p2p/src/server/versions/internal/handlers/transactions.ts +++ b/packages/core-p2p/src/server/versions/internal/handlers/transactions.ts @@ -1,4 +1,5 @@ import { app } from "@arkecosystem/core-container"; +import { PostgresConnection } from "@arkecosystem/core-database-postgres"; import { models } from "@arkecosystem/crypto"; import * as schema from "../schemas/transactions"; @@ -19,7 +20,7 @@ export const verify = { return { data: { - valid: await app.resolvePlugin("database").verifyTransaction(transaction), + valid: await app.resolvePlugin("database").verifyTransaction(transaction), }, }; }, diff --git a/packages/core-p2p/src/server/versions/internal/handlers/utils.ts b/packages/core-p2p/src/server/versions/internal/handlers/utils.ts index 5fe6083c13..d6eae028ec 100644 --- a/packages/core-p2p/src/server/versions/internal/handlers/utils.ts +++ b/packages/core-p2p/src/server/versions/internal/handlers/utils.ts @@ -1,4 +1,5 @@ import { app } from "@arkecosystem/core-container"; +import { PostgresConnection } from "@arkecosystem/core-database-postgres"; const emitter = app.resolvePlugin("event-emitter"); @@ -15,10 +16,11 @@ export const usernames = { */ async handler(request, h) { const blockchain = app.resolvePlugin("blockchain"); - const walletManager = app.resolvePlugin("database").walletManager; + const database = blockchain.database; + const walletManager = database.walletManager; const lastBlock = blockchain.getLastBlock(); - const delegates = await blockchain.database.getActiveDelegates(lastBlock ? lastBlock.data.height + 1 : 1); + const delegates = await database.getActiveDelegates(lastBlock ? lastBlock.data.height + 1 : 1); const data = {}; for (const delegate of delegates) { diff --git a/packages/core-snapshots/src/index.ts b/packages/core-snapshots/src/index.ts index 34ecea874b..444929dbef 100644 --- a/packages/core-snapshots/src/index.ts +++ b/packages/core-snapshots/src/index.ts @@ -1,4 +1,5 @@ -import { Container } from "@arkecosystem/core-container"; +import { Container } from "@arkecosystem/core-container"; +import { PostgresConnection } from "@arkecosystem/core-database-postgres"; import { defaults } from "./defaults"; import { SnapshotManager } from "./manager"; @@ -13,6 +14,6 @@ export const plugin = { async register(container: Container, options) { const manager = new SnapshotManager(options); - return manager.make(container.resolvePlugin("database")); + return manager.make(container.resolvePlugin("database")); }, }; diff --git a/packages/core-test-utils/src/helpers/container.ts b/packages/core-test-utils/src/helpers/container.ts index 109b2f141f..a7ef259e77 100644 --- a/packages/core-test-utils/src/helpers/container.ts +++ b/packages/core-test-utils/src/helpers/container.ts @@ -1,9 +1,9 @@ -import { app } from "@arkecosystem/core-container"; +import { app, Container } from "@arkecosystem/core-container"; import * as path from "path"; import "../matchers"; -export async function setUpContainer(options: any): Promise { - return app.setUp( +export async function setUpContainer(options: any): Promise { + await app.setUp( "2.0.0", { data: options.data || "~/.ark", @@ -13,4 +13,5 @@ export async function setUpContainer(options: any): Promise { }, options, ); + return app; } diff --git a/packages/core-transaction-pool/__tests__/__support__/setup.ts b/packages/core-transaction-pool/__tests__/__support__/setup.ts index 01ff257b75..3e6beffb0b 100644 --- a/packages/core-transaction-pool/__tests__/__support__/setup.ts +++ b/packages/core-transaction-pool/__tests__/__support__/setup.ts @@ -1,23 +1,19 @@ -import { app } from "@arkecosystem/core-container"; +import { app, Container } from "@arkecosystem/core-container"; import { setUpContainer } from "@arkecosystem/core-test-utils/src/helpers/container"; jest.setTimeout(60000); export const setUp = async () => { - await setUpContainer({ + return await setUpContainer({ exit: "@arkecosystem/core-blockchain", exclude: ["@arkecosystem/core-transaction-pool"], }); - - return app; }; export const setUpFull = async () => { - await setUpContainer({ + return await setUpContainer({ exit: "@arkecosystem/core-blockchain", }); - - return app; }; export const tearDown = async () => { diff --git a/packages/core-transaction-pool/__tests__/connection.test.ts b/packages/core-transaction-pool/__tests__/connection.test.ts index b8a75b642d..5f2560551f 100644 --- a/packages/core-transaction-pool/__tests__/connection.test.ts +++ b/packages/core-transaction-pool/__tests__/connection.test.ts @@ -2,6 +2,7 @@ import { fixtures, generators } from "@arkecosystem/core-test-utils"; import { app } from "@arkecosystem/core-container"; +import { PostgresConnection } from "@arkecosystem/core-database-postgres"; import { bignumify } from "@arkecosystem/core-utils"; import { constants, models, slots } from "@arkecosystem/crypto"; @@ -18,14 +19,14 @@ const { generateTransfers } = generators; const { delegatesSecrets } = fixtures; let config; -let database; +let database: PostgresConnection; let connection; beforeAll(async () => { await setUpFull(); config = app.getConfig(); - database = app.resolvePlugin("database"); + database = app.resolvePlugin("database"); connection = app.resolvePlugin("transactionPool"); // Ensure no cold wallet and enough funds @@ -430,7 +431,8 @@ describe("Connection", () => { // For some reason all genesis transactions fail signature verification, so // they are not loaded from the local storage and this fails otherwise. - const original = database.getForgedTransactionsId; + // TODO: Use jest.spyOn() to change behavior instead. jest.restoreAllMocks() will reset afterwards + const original = database.getForgedTransactionsIds; database.getForgedTransactionsIds = jest.fn(() => [forgedTransaction.id]); expect(forgedTransaction instanceof Transaction).toBeTrue(); diff --git a/packages/core-transaction-pool/__tests__/guard.test.ts b/packages/core-transaction-pool/__tests__/guard.test.ts index a58ee7fde7..0d134794be 100644 --- a/packages/core-transaction-pool/__tests__/guard.test.ts +++ b/packages/core-transaction-pool/__tests__/guard.test.ts @@ -1,16 +1,13 @@ +import { Container } from "@arkecosystem/core-container"; +import { PostgresConnection } from "@arkecosystem/core-database-postgres"; import { fixtures, generators } from "@arkecosystem/core-test-utils"; -import "jest-extended"; - import { configManager, crypto, slots } from "@arkecosystem/crypto"; +import bip39 from "bip39"; +import "jest-extended"; import { config as localConfig } from "../src/config"; import { TransactionGuard } from "../src/guard"; - -import bip39 from "bip39"; import { setUpFull, tearDown } from "./__support__/setup"; -import { TransactionPool } from "../src/connection"; -import { defaults } from "../src/defaults"; - const { generateDelegateRegistration, generateSecondSignature, @@ -21,7 +18,7 @@ const { const { delegates } = fixtures; -let container; +let container: Container; let guard; let transactionPool; @@ -182,7 +179,9 @@ describe("Transaction Guard", () => { const allTransactions = [...transfers, ...votes, ...delegateRegs, ...signatures]; allTransactions.forEach(transaction => { - container.resolvePlugin("database").walletManager.findByPublicKey(transaction.senderPublicKey); + container + .resolvePlugin("database") + .walletManager.findByPublicKey(transaction.senderPublicKey); }); // first validate the 1st transfer so that new wallet is updated with the amount @@ -214,7 +213,7 @@ describe("Transaction Guard", () => { const newWallet = transactionPool.walletManager.findByPublicKey(publicKey); // Make sure it is not considered a cold wallet - container.resolvePlugin("database").walletManager.reindex(newWallet); + container.resolvePlugin("database").walletManager.reindex(newWallet); expect(+delegateWallet.balance).toBe(+delegate3.balance); expect(+newWallet.balance).toBe(0); @@ -515,7 +514,7 @@ describe("Transaction Guard", () => { describe("__removeForgedTransactions", () => { it("should remove forged transactions", async () => { - const database = container.resolvePlugin("database"); + const database = container.resolvePlugin("database"); const getForgedTransactionsIds = database.getForgedTransactionsIds; const transfers = generateTransfers("testnet", delegates[0].secret, delegates[0].senderPublicKey, 1, 4); diff --git a/packages/core-transaction-pool/__tests__/pool-wallet-manager.test.ts b/packages/core-transaction-pool/__tests__/pool-wallet-manager.test.ts index 35f5bdb9c2..49fd78af06 100644 --- a/packages/core-transaction-pool/__tests__/pool-wallet-manager.test.ts +++ b/packages/core-transaction-pool/__tests__/pool-wallet-manager.test.ts @@ -1,19 +1,17 @@ +import { Container } from "@arkecosystem/core-container"; +import { PostgresConnection } from "@arkecosystem/core-database-postgres"; import { fixtures, generators } from "@arkecosystem/core-test-utils"; - -const { generateTransfers, generateWallets } = generators; -const { blocks2to100, delegates } = fixtures; - import { crypto, models } from "@arkecosystem/crypto"; import bip39 from "bip39"; - -import { setUpFull, tearDown } from "./__support__/setup"; - import { PoolWalletManager } from "../src/pool-wallet-manager"; +import { setUpFull, tearDown } from "./__support__/setup"; const { Block } = models; +const { generateTransfers, generateWallets } = generators; +const { blocks2to100, delegates } = fixtures; const arktoshi = 10 ** 8; -let container; +let container: Container; let poolWalletManager; let blockchain; @@ -102,7 +100,9 @@ describe("applyPoolTransactionToSender", () => { // This is normally refused because it's a cold wallet, but since we want // to test if chained transfers are refused, pretent it is not a cold wallet. - container.resolvePlugin("database").walletManager.findByPublicKey(transfer.senderPublicKey); + container + .resolvePlugin("database") + .walletManager.findByPublicKey(transfer.senderPublicKey); const errors = []; if (poolWalletManager.canApply(transfer, errors)) { @@ -118,7 +118,9 @@ describe("applyPoolTransactionToSender", () => { ); } - container.resolvePlugin("database").walletManager.forgetByPublicKey(transfer.publicKey); + container + .resolvePlugin("database") + .walletManager.forgetByPublicKey(transfer.publicKey); }); expect(+delegateWallet.balance).toBe(delegate.balance - (100 + 0.1) * arktoshi); diff --git a/packages/core-transaction-pool/package.json b/packages/core-transaction-pool/package.json index 4c2272bc66..b3d21cab24 100644 --- a/packages/core-transaction-pool/package.json +++ b/packages/core-transaction-pool/package.json @@ -34,6 +34,7 @@ "@arkecosystem/core-container": "^2.1.0", "@arkecosystem/core-logger": "^2.1.0", "@arkecosystem/core-database": "^2.1.0", + "@arkecosystem/core-database-postgres": "^2.1.0", "@arkecosystem/crypto": "^2.1.0", "@types/better-sqlite3": "^5.2.0", "@types/fs-extra": "^5.0.4", diff --git a/packages/core-transaction-pool/src/connection.ts b/packages/core-transaction-pool/src/connection.ts index 8f798c8960..7f96e69e05 100644 --- a/packages/core-transaction-pool/src/connection.ts +++ b/packages/core-transaction-pool/src/connection.ts @@ -1,4 +1,5 @@ import { app } from "@arkecosystem/core-container"; +import { PostgresConnection } from "@arkecosystem/core-database-postgres"; import { AbstractLogger } from "@arkecosystem/core-logger"; import assert from "assert"; @@ -9,7 +10,7 @@ import { Mem } from "./mem"; import { MemPoolTransaction } from "./mem-pool-transaction"; import { Storage } from "./storage"; -const database = app.resolvePlugin("database"); +const database = app.resolvePlugin("database"); const emitter = app.resolvePlugin("event-emitter"); const logger = app.resolvePlugin("logger"); diff --git a/packages/core-transaction-pool/src/guard.ts b/packages/core-transaction-pool/src/guard.ts index 8e4cf36411..9161e9bccb 100644 --- a/packages/core-transaction-pool/src/guard.ts +++ b/packages/core-transaction-pool/src/guard.ts @@ -1,4 +1,5 @@ import { app } from "@arkecosystem/core-container"; +import { PostgresConnection } from "@arkecosystem/core-database-postgres"; import { AbstractLogger } from "@arkecosystem/core-logger"; import { configManager, constants, models, slots } from "@arkecosystem/crypto"; import pluralize from "pluralize"; @@ -241,7 +242,7 @@ export class TransactionGuard { * @return {void} */ public async __removeForgedTransactions() { - const database = app.resolvePlugin("database"); + const database = app.resolvePlugin("database"); const forgedIdsSet = await database.getForgedTransactionsIds([ ...new Set([...this.accept.keys(), ...this.broadcast.keys()]), diff --git a/packages/core-transaction-pool/src/pool-wallet-manager.ts b/packages/core-transaction-pool/src/pool-wallet-manager.ts index c62c91ed75..0d75d6b697 100644 --- a/packages/core-transaction-pool/src/pool-wallet-manager.ts +++ b/packages/core-transaction-pool/src/pool-wallet-manager.ts @@ -1,12 +1,13 @@ import { app } from "@arkecosystem/core-container"; import { WalletManager } from "@arkecosystem/core-database"; +import { PostgresConnection } from "@arkecosystem/core-database-postgres"; import { constants, crypto, models } from "@arkecosystem/crypto"; const { Wallet } = models; const { TransactionTypes } = constants; export class PoolWalletManager extends WalletManager { - public database: any; + public database = app.resolvePlugin("database"); /** * Create a new pool wallet manager instance. @@ -14,8 +15,6 @@ export class PoolWalletManager extends WalletManager { */ constructor() { super(); - - this.database = app.resolvePlugin("database"); } /** diff --git a/packages/core-vote-report/package.json b/packages/core-vote-report/package.json index f2bd4f9375..5322756bdc 100644 --- a/packages/core-vote-report/package.json +++ b/packages/core-vote-report/package.json @@ -28,6 +28,7 @@ }, "dependencies": { "@arkecosystem/core-container": "^2.1.0", + "@arkecosystem/core-database-postgres": "^2.1.0", "@arkecosystem/core-http-utils": "^2.1.0", "@arkecosystem/core-utils": "^2.1.0", "@arkecosystem/crypto": "^2.1.0", diff --git a/packages/core-vote-report/src/handler.ts b/packages/core-vote-report/src/handler.ts index 46fd888ada..bc0d8621a1 100644 --- a/packages/core-vote-report/src/handler.ts +++ b/packages/core-vote-report/src/handler.ts @@ -1,4 +1,5 @@ import { app } from "@arkecosystem/core-container"; +import { PostgresConnection } from "@arkecosystem/core-database-postgres"; import { delegateCalculator, supplyCalculator } from "@arkecosystem/core-utils"; import { configManager } from "@arkecosystem/crypto"; import sumBy from "lodash/sumBy"; @@ -6,7 +7,7 @@ import sumBy from "lodash/sumBy"; export function handler(request, h) { const config = app.getConfig(); const blockchain = app.resolvePlugin("blockchain"); - const database = app.resolvePlugin("database"); + const database = app.resolvePlugin("database"); const formatDelegates = (delegates, lastHeight) => delegates.map((delegate, index) => {