diff --git a/package-lock.json b/package-lock.json index 5ab5e24..f277e02 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6,7 +6,7 @@ "packages": { "": { "name": "symbol-statistics-service", - "version": "1.1.1", + "version": "1.1.2", "dependencies": { "@types/cors": "^2.8.6", "@types/express": "^4.17.6", @@ -16,8 +16,9 @@ "cors": "^2.8.5", "dotenv": "^8.2.0", "express": "^4.17.1", + "lodash": "^4.17.21", "module-alias": "^2.2.2", - "mongoose": "^5.9.16", + "mongoose": "^5.11.12", "symbol-sdk": "^1.0.1", "tcp-ping": "^0.1.1", "utf8": "^3.0.0", @@ -26,7 +27,7 @@ }, "devDependencies": { "@openapitools/openapi-generator-cli": "^2.2.6", - "@types/mongoose": "^5.7.14", + "@types/lodash": "^4.14.176", "@types/node": "^14.14.10", "@types/winston": "^2.4.4", "@typescript-eslint/eslint-plugin": "^4.4.0", @@ -514,6 +515,12 @@ "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==", "dev": true }, + "node_modules/@types/lodash": { + "version": "4.14.176", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.176.tgz", + "integrity": "sha512-xZmuPTa3rlZoIbtDUyJKZQimJV3bxCmzMIO2c9Pz9afyDro6kr7R79GwcB6mRhuoPmV2p1Vb66WOJH7F886WKQ==", + "dev": true + }, "node_modules/@types/mime": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.3.tgz", @@ -528,16 +535,6 @@ "@types/node": "*" } }, - "node_modules/@types/mongoose": { - "version": "5.10.3", - "resolved": "https://registry.npmjs.org/@types/mongoose/-/mongoose-5.10.3.tgz", - "integrity": "sha512-VfdnaFImXEJZZiuL2ID/ysZs4inOIjxwrAnUgkr5eum2O2BLhFkiSI0i87AwignVva1qWTJ3H3DyM0Rf4USJ4A==", - "dev": true, - "dependencies": { - "@types/mongodb": "*", - "@types/node": "*" - } - }, "node_modules/@types/node": { "version": "14.14.21", "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.21.tgz", @@ -3430,8 +3427,7 @@ "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "node_modules/lodash.get": { "version": "4.4.2", @@ -3761,23 +3757,21 @@ } }, "node_modules/mongoose": { - "version": "5.13.12", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.13.12.tgz", - "integrity": "sha512-ZEuZ3X/yop9XyOyuCYMz+oxJxXBclm9LIsjKHB0QX2eaNqKNqkvZFzkElbJCj8FDvYmBZFh0OFHlkREhtie6uA==", + "version": "5.11.12", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.11.12.tgz", + "integrity": "sha512-70wST9hnVlPbt5nKClPKJo54ULIACOVGYdg8fyj17sWtCJLyURCDahhzUh+oUA7WVykOW2ZMqWm2kujBIWYagg==", "dependencies": { - "@types/bson": "1.x || 4.0.x", "@types/mongodb": "^3.5.27", "bson": "^1.1.4", "kareem": "2.3.2", - "mongodb": "3.7.2", + "mongodb": "3.6.3", "mongoose-legacy-pluralize": "1.0.2", - "mpath": "0.8.4", - "mquery": "3.2.5", + "mpath": "0.8.3", + "mquery": "3.2.3", "ms": "2.1.2", - "optional-require": "1.0.x", "regexp-clone": "1.0.0", "safe-buffer": "5.2.1", - "sift": "13.5.2", + "sift": "7.0.1", "sliced": "1.0.1" }, "engines": { @@ -4163,14 +4157,6 @@ "node": ">=8" } }, - "node_modules/optional-require": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/optional-require/-/optional-require-1.0.3.tgz", - "integrity": "sha512-RV2Zp2MY2aeYK5G+B/Sps8lW5NHAzE5QClbFP15j+PWmP+T9PxlJXBOOLoSAdgwFvS4t0aMR4vpedMkbHfh0nA==", - "engines": { - "node": ">=4" - } - }, "node_modules/optionator": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", @@ -6219,38 +6205,20 @@ }, "dependencies": { "@apidevtools/json-schema-ref-parser": { - "version": "9.0.9", - "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.0.9.tgz", - "integrity": "sha512-GBD2Le9w2+lVFoc4vswGI/TjkNIZSVp7+9xPf+X3uidBfWnAeUWmquteSyt0+VCrhNMWj/FTABISQrD3Z/YA+w==", + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.0.7.tgz", + "integrity": "sha512-QdwOGF1+eeyFh+17v2Tz626WX0nucd1iKOm6JUTUvCZdbolblCOOQCxGrQPY0f7jEhn36PiAWqZnsC2r5vmUWg==", "dev": true, "requires": { "@jsdevtools/ono": "^7.1.3", - "@types/json-schema": "^7.0.6", "call-me-maybe": "^1.0.1", - "js-yaml": "^4.1.0" - }, - "dependencies": { - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - } + "js-yaml": "^3.13.1" } }, "@apidevtools/openapi-schemas": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@apidevtools/openapi-schemas/-/openapi-schemas-2.1.0.tgz", - "integrity": "sha512-Zc1AlqrJlX3SlpupFGpiLi2EbteyP7fXmUOGup6/DnkRgjP9bgMM/ag+n91rsv0U1Gpz0H3VILA/o3bW7Ua6BQ==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@apidevtools/openapi-schemas/-/openapi-schemas-2.0.4.tgz", + "integrity": "sha512-ob5c4UiaMYkb24pNhvfSABShAwpREvUGCkqjiz/BX9gKZ32y/S22M+ALIHftTAuv9KsFVSpVdIDzi9ZzFh5TCA==", "dev": true }, "@apidevtools/swagger-methods": { @@ -6260,9 +6228,9 @@ "dev": true }, "@apidevtools/swagger-parser": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/@apidevtools/swagger-parser/-/swagger-parser-10.0.3.tgz", - "integrity": "sha512-sNiLY51vZOmSPFZA5TF35KZ2HbgYklQnTSDnkghamzLb3EkNtcQnrBQEj5AOCxHpTtXpqMCRM1CrmV2rG6nw4g==", + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@apidevtools/swagger-parser/-/swagger-parser-10.0.2.tgz", + "integrity": "sha512-JFxcEyp8RlNHgBCE98nwuTkZT6eNFPc1aosWV6wPcQph72TSEEu1k3baJD4/x1qznU+JiDdz8F5pTwabZh+Dhg==", "dev": true, "requires": { "@apidevtools/json-schema-ref-parser": "^9.0.6", @@ -6270,7 +6238,7 @@ "@apidevtools/swagger-methods": "^3.0.2", "@jsdevtools/ono": "^7.1.3", "call-me-maybe": "^1.0.1", - "z-schema": "^5.0.1" + "z-schema": "^4.2.3" } }, "@babel/code-frame": { @@ -6610,6 +6578,12 @@ "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==", "dev": true }, + "@types/lodash": { + "version": "4.14.176", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.176.tgz", + "integrity": "sha512-xZmuPTa3rlZoIbtDUyJKZQimJV3bxCmzMIO2c9Pz9afyDro6kr7R79GwcB6mRhuoPmV2p1Vb66WOJH7F886WKQ==", + "dev": true + }, "@types/mime": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.3.tgz", @@ -6624,16 +6598,6 @@ "@types/node": "*" } }, - "@types/mongoose": { - "version": "5.10.3", - "resolved": "https://registry.npmjs.org/@types/mongoose/-/mongoose-5.10.3.tgz", - "integrity": "sha512-VfdnaFImXEJZZiuL2ID/ysZs4inOIjxwrAnUgkr5eum2O2BLhFkiSI0i87AwignVva1qWTJ3H3DyM0Rf4USJ4A==", - "dev": true, - "requires": { - "@types/mongodb": "*", - "@types/node": "*" - } - }, "@types/node": { "version": "14.14.21", "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.21.tgz", @@ -8827,8 +8791,7 @@ "lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "lodash.get": { "version": "4.4.2", @@ -9055,8 +9018,7 @@ "integrity": "sha512-A/78XjoX2EmNvppVWEhM2oGk3x4lLxnkEA4jTbaK97QKSDjkIoOsKQlfylt/d3kKKi596Qy3NP5XrXJ6fZIC9Q==" }, "mongodb": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.7.2.tgz", + "version": "https://registry.npmjs.org/mongodb/-/mongodb-3.7.2.tgz", "integrity": "sha512-/Qi0LmOjzIoV66Y2JQkqmIIfFOy7ZKsXnQNlUXPFXChOw3FCdNqVD5zvci9ybm6pkMe/Nw+Rz9I0Zsk2a+05iQ==", "requires": { "bl": "^2.2.1", @@ -9078,23 +9040,21 @@ } }, "mongoose": { - "version": "5.13.12", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.13.12.tgz", - "integrity": "sha512-ZEuZ3X/yop9XyOyuCYMz+oxJxXBclm9LIsjKHB0QX2eaNqKNqkvZFzkElbJCj8FDvYmBZFh0OFHlkREhtie6uA==", + "version": "5.11.12", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.11.12.tgz", + "integrity": "sha512-70wST9hnVlPbt5nKClPKJo54ULIACOVGYdg8fyj17sWtCJLyURCDahhzUh+oUA7WVykOW2ZMqWm2kujBIWYagg==", "requires": { - "@types/bson": "1.x || 4.0.x", "@types/mongodb": "^3.5.27", "bson": "^1.1.4", "kareem": "2.3.2", - "mongodb": "3.7.2", + "mongodb": "3.6.3", "mongoose-legacy-pluralize": "1.0.2", - "mpath": "0.8.4", - "mquery": "3.2.5", + "mpath": "0.8.3", + "mquery": "3.2.3", "ms": "2.1.2", - "optional-require": "1.0.x", "regexp-clone": "1.0.0", "safe-buffer": "5.2.1", - "sift": "13.5.2", + "sift": "7.0.1", "sliced": "1.0.1" }, "dependencies": { @@ -9117,13 +9077,11 @@ "requires": {} }, "mpath": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.8.4.tgz", + "version": "https://registry.npmjs.org/mpath/-/mpath-0.8.4.tgz", "integrity": "sha512-DTxNZomBcTWlrMW76jy1wvV37X/cNNxPW1y2Jzd4DZkAaC5ZGsm8bfGfNOthcDuRJujXLqiuS6o3Tpy0JEoh7g==" }, "mquery": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/mquery/-/mquery-3.2.5.tgz", + "version": "https://registry.npmjs.org/mquery/-/mquery-3.2.5.tgz", "integrity": "sha512-VjOKHHgU84wij7IUoZzFRU07IAxd5kWJaDmyUzQlbjHjyoeK5TNeeo8ZsFDtTYnSgpW6n/nMNIHvE3u8Lbrf4A==", "requires": { "bluebird": "3.5.1", @@ -9389,11 +9347,6 @@ "yaml": "1.10.2" } }, - "optional-require": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/optional-require/-/optional-require-1.0.3.tgz", - "integrity": "sha512-RV2Zp2MY2aeYK5G+B/Sps8lW5NHAzE5QClbFP15j+PWmP+T9PxlJXBOOLoSAdgwFvS4t0aMR4vpedMkbHfh0nA==" - }, "optionator": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", @@ -10044,8 +9997,7 @@ "dev": true }, "sift": { - "version": "13.5.2", - "resolved": "https://registry.npmjs.org/sift/-/sift-13.5.2.tgz", + "version": "https://registry.npmjs.org/sift/-/sift-13.5.2.tgz", "integrity": "sha512-+gxdEOMA2J+AI+fVsCqeNn7Tgx3M9ZN9jdi95939l1IJ8cZsqS8sqpJyOkic2SJk+1+98Uwryt/gL6XDaV+UZA==" }, "signal-exit": { @@ -10737,9 +10689,9 @@ "dev": true }, "validator": { - "version": "13.6.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-13.6.0.tgz", - "integrity": "sha512-gVgKbdbHgtxpRyR8K0O6oFZPhhB5tT1jeEHZR0Znr9Svg03U0+r9DXWMrnRAB+HtCStDQKlaIZm42tVsVjqtjg==", + "version": "12.2.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-12.2.0.tgz", + "integrity": "sha512-jJfE/DW6tIK1Ek8nCfNFqt8Wb3nzMoAbocBF6/Icgg1ZFSBpObdnwVY2jQj6qUqzhx5jc71fpvBWyLGO7Xl+nQ==", "dev": true }, "vary": { @@ -10970,15 +10922,15 @@ "dev": true }, "z-schema": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.1.tgz", - "integrity": "sha512-Gp8xU2lULhREqTWj9t4BEAeA7M835n4fWJ9KjGWksV3wmLUdOJo2hAr+QYvkVZIGOOTyeN274g1f95dKRsgYgQ==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-4.2.3.tgz", + "integrity": "sha512-zkvK/9TC6p38IwcrbnT3ul9in1UX4cm1y/VZSs4GHKIiDCrlafc+YQBgQBUdDXLAoZHf2qvQ7gJJOo6yT1LH6A==", "dev": true, "requires": { "commander": "^2.7.1", "lodash.get": "^4.4.2", "lodash.isequal": "^4.5.0", - "validator": "^13.6.0" + "validator": "^12.0.0" } } } diff --git a/package.json b/package.json index 0b35a85..1a0c2a2 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ }, "devDependencies": { "@openapitools/openapi-generator-cli": "^2.2.6", - "@types/mongoose": "^5.7.14", + "@types/lodash": "^4.14.176", "@types/node": "^14.14.10", "@types/winston": "^2.4.4", "@typescript-eslint/eslint-plugin": "^4.4.0", @@ -47,8 +47,9 @@ "cors": "^2.8.5", "dotenv": "^8.2.0", "express": "^4.17.1", + "lodash": "^4.17.21", "module-alias": "^2.2.2", - "mongoose": "^5.9.16", + "mongoose": "^5.11.12", "symbol-sdk": "^1.0.1", "tcp-ping": "^0.1.1", "utf8": "^3.0.0", diff --git a/src/infrastructure/Page.ts b/src/infrastructure/Page.ts new file mode 100644 index 0000000..49b3cf9 --- /dev/null +++ b/src/infrastructure/Page.ts @@ -0,0 +1,92 @@ +import { Order, SearchCriteria } from '@src/models/SearchCriteria'; +import { Document, Model, Query } from 'mongoose'; + +export interface Pagination { + pageSize: number; + pageNumber: number; +} + +export interface IPage { + data: R[]; + pagination: Pagination; +} + +export interface Parameters { + pageNumber?: string | number; + pageSize?: string | number; + order?: string; + [key: string]: unknown; +} + +/** + * @template T Data item type. Document of the collection + * @template R Data item type. Result type of formatData() function + */ +export class Page implements IPage { + data: R[]; + pagination: Pagination; + private query: Query; + private formatData: (data: T[]) => Array; + private formatFilter: (parameters: Parameters) => Record; + + constructor( + parameters: Parameters, + model: Model, + formatData: (data: T[]) => Array, + formatFilter: (parameters: Parameters) => Record = (_) => _, + ) { + this.formatData = formatData; + this.formatFilter = formatFilter; + const searchCriteria = this.parametersToSearchCriteria(parameters); + const filter = this.parametersToFilter(parameters); + const pageIndex = searchCriteria.pageNumber - 1; + + this.pagination = { + pageSize: searchCriteria.pageSize, + pageNumber: searchCriteria.pageNumber, + }; + this.data = []; + this.query = model + .find(filter as any) + .sort(searchCriteria.order == Order.Desc ? { _id: -1 } : { _id: 1 }) + .limit(searchCriteria.pageSize) + .skip(searchCriteria.pageSize * pageIndex); + } + + async exec(): Promise> { + const data = await this.query.exec(); + + this.data = this.formatData(data); + return this; + } + + toJSON(): string { + return JSON.stringify(this.toObject()); + } + + toObject(): IPage { + return { + data: this.data, + pagination: this.pagination, + }; + } + + private parametersToSearchCriteria(parameters: Parameters): SearchCriteria { + const pageNumber = parseInt(parameters.pageNumber as string) || 1; + const pageSize = parseInt(parameters.pageSize as string) || 10; + const order = (parameters.order as Order) || Order.Desc; + + return { + pageNumber, + pageSize, + order, + }; + } + + private parametersToFilter(parameters: Parameters): Record { + const { pageNumber, pageSize, order, ...rest } = parameters; + const filter = this.formatFilter({ ...rest }); + + return filter; + } +} diff --git a/src/infrastructure/Pagination.ts b/src/infrastructure/Pagination.ts deleted file mode 100644 index 746afef..0000000 --- a/src/infrastructure/Pagination.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { Request } from 'express'; -import { Document, Model } from 'mongoose'; - -export enum SortType { - ASC = 1, - DESC = -1, -} - -export enum Order { - Asc = 'asc', - Desc = 'desc', -} - -export interface SearchCriteria { - pageNumber: number; - pageSize: number; - order: Order; -} - -export interface PaginationResponse { - pageSize: number; - pageNumber: number; - lastPageNumber?: number; - data: T[]; -} - -export class PaginationResponse implements PaginationResponse { - data: T[]; - pageSize: number; - pageNumber: number; - lastPageNumber?: number; - - constructor(data: T[], searchCriteria: SearchCriteria, recordsCount?: number) { - this.data = data; - this.pageSize = searchCriteria.pageSize; - this.pageNumber = searchCriteria.pageNumber; - if (recordsCount) this.lastPageNumber = Math.ceil(recordsCount / searchCriteria.pageSize); - } -} - -export class Pagination { - public static async getPage(model: Model, searchCriteria: SearchCriteria): Promise> { - const pageIndex = searchCriteria.pageNumber - 1; - const data = await model - .find() - .sort(searchCriteria.order == Order.Desc ? { _id: -1 } : { _id: 1 }) - .limit(searchCriteria.pageSize) - .skip(searchCriteria.pageSize * pageIndex) - .exec(); - - return new PaginationResponse(data, searchCriteria); - } - - public static reqToSearchCriteria(req: Request): SearchCriteria { - const pageNumber = parseInt(req.query.pageNumber as string) || 1; - const pageSize = parseInt(req.query.pageSize as string) || 10; - const order = (req.query.order as Order) || Order.Desc; - - return { - pageNumber, - pageSize, - order, - }; - } -} diff --git a/src/models/SearchCriteria.ts b/src/models/SearchCriteria.ts new file mode 100644 index 0000000..c14c7ce --- /dev/null +++ b/src/models/SearchCriteria.ts @@ -0,0 +1,10 @@ +export enum Order { + Asc = 'asc', + Desc = 'desc', +} + +export interface SearchCriteria { + pageNumber: number; + pageSize: number; + order: Order; +} diff --git a/src/services/ChainHeightMonitor.ts b/src/services/ChainHeightMonitor.ts index 3f47658..09db94a 100644 --- a/src/services/ChainHeightMonitor.ts +++ b/src/services/ChainHeightMonitor.ts @@ -44,7 +44,7 @@ export class ChainHeightMonitor { this.start(); } } catch (e) { - logger.error(`Unhandled error during a loop. ${e.message}. Restarting Monitor..`); + logger.error(`Unhandled error during a loop. ${(e as Error).message}. Restarting Monitor..`); await sleep(this.interval); this.stop(); this.start(); @@ -100,7 +100,7 @@ export class ChainHeightMonitor { else this.finalizedHeights[chainInfo.latestFinalizedBlock.height] = 1; } } catch (e) { - logger.error(`Node chain height monitor failed. ${e.message}`); + logger.error(`Node chain height monitor failed. ${(e as Error).message}`); } } }; diff --git a/src/services/DataBase.ts b/src/services/DataBase.ts index 7651405..d905490 100644 --- a/src/services/DataBase.ts +++ b/src/services/DataBase.ts @@ -8,7 +8,6 @@ import { INodesStats, NodesStatsDocument, NodesStats } from '@src/models/NodesSt import { INodeHeightStats, NodeHeightStatsDocument, NodeHeightStats } from '@src/models/NodeHeightStats'; import { NodeCountSeries } from '@src/models/NodeCountSeries'; import { AbstractTimeSeriesDocument } from '@src/models/AbstractTimeSeries'; -import { SearchCriteria, Pagination, PaginationResponse } from '@src/infrastructure/Pagination'; const logger: winston.Logger = Logger.getLogger(basename(__filename)); @@ -36,10 +35,6 @@ export class DataBase { .exec(); }; - static getNodeListWithCriteria = async (searchCriteria: SearchCriteria): Promise> => { - return Pagination.getPage(Node, searchCriteria); - }; - static getNodeByPublicKey = (publicKey: string): Promise => { return Node.findOne({ publicKey }).exec(); }; diff --git a/src/services/GeolocationMonitor.ts b/src/services/GeolocationMonitor.ts index ed79ca7..af93a27 100644 --- a/src/services/GeolocationMonitor.ts +++ b/src/services/GeolocationMonitor.ts @@ -42,7 +42,7 @@ export class GeolocationMonitor { this.start(); } } catch (e) { - logger.error(`Unhandled error during a loop. ${e.message}. Restarting Monitor..`); + logger.error(`Unhandled error during a loop. ${(e as Error).message}. Restarting Monitor..`); await sleep(this.interval); this.stop(); this.start(); @@ -92,7 +92,7 @@ export class GeolocationMonitor { // await this.updateCollection(); } catch (e) { - logger.error(`Error getting host info. ${e.message}`); + logger.error(`Error getting host info. ${(e as Error).message}`); } } }; @@ -115,7 +115,7 @@ export class GeolocationMonitor { logger.info(`New host info added to collection`); } } catch (e) { - logger.error(`Failed to add new host info to collection`, e.message); + logger.error(`Failed to add new host info to collection`, (e as Error).message); } }; @@ -132,7 +132,7 @@ export class GeolocationMonitor { memoryCache.setArray('nodesHostDetail', nodesHostDetail, ['host']); } catch (e) { - logger.error('Failed to cache "nodesHostDetail" collection to memory. ' + e.message); + logger.error('Failed to cache "nodesHostDetail" collection to memory. ' + (e as Error).message); } }; } diff --git a/src/services/HostInfo.ts b/src/services/HostInfo.ts index e929d69..53391ff 100644 --- a/src/services/HostInfo.ts +++ b/src/services/HostInfo.ts @@ -43,7 +43,7 @@ export class HostInfo { zip: data.zip, }; } catch (e) { - logger.error(`Failed to get host ${host} info ${e.message}`); + logger.error(`Failed to get host ${host} info ${(e as Error).message}`); return null; } }; diff --git a/src/services/NodeMonitor.ts b/src/services/NodeMonitor.ts index 6dddb95..dcb9e10 100644 --- a/src/services/NodeMonitor.ts +++ b/src/services/NodeMonitor.ts @@ -65,7 +65,7 @@ export class NodeMonitor { setTimeout(() => this.start(), this.interval); } } catch (e) { - logger.error(`Unhandled error during a loop. ${e.message}. Restarting NodeMonitor..`); + logger.error(`Unhandled error during a loop. ${(e as Error).message}. Restarting NodeMonitor..`); this.stop(); this.start(); } @@ -119,7 +119,7 @@ export class NodeMonitor { host, }); } catch (e) { - logger.error(`FetchNodesByURL. Failed to get /node/info from "${nodeUrl}". ${e.message}`); + logger.error(`FetchNodesByURL. Failed to get /node/info from "${nodeUrl}". ${(e as Error).message}`); } } @@ -130,7 +130,7 @@ export class NodeMonitor { if (Array.isArray(nodePeers.data)) nodeList = [...nodeList, ...nodePeers.data]; } catch (e) { - logger.error(`FetchNodesByURL. Failed to get /node/peers from "${nodeUrl}". ${e.message}`); + logger.error(`FetchNodesByURL. Failed to get /node/peers from "${nodeUrl}". ${(e as Error).message}`); } return nodeList; @@ -169,7 +169,7 @@ export class NodeMonitor { nodeWithInfo.apiStatus = await ApiNodeService.getStatus(node.host); } } catch (e) { - logger.error(`GetNodeInfo. Failed to fetch info for "${node}". ${e.message}`); + logger.error(`GetNodeInfo. Failed to fetch info for "${node}". ${(e as Error).message}`); } return nodeWithInfo; @@ -198,7 +198,7 @@ export class NodeMonitor { await DataBase.updateNodeList(this.nodeList); await DataBase.updateNodesStats(this.nodesStats); } catch (e) { - logger.error(`Failed to update collection. ${e.message}`); + logger.error(`Failed to update collection. ${(e as Error).message}`); await DataBase.updateNodeList(prevNodeList); } } else logger.error(`Failed to update collection. Collection length = ${this.nodeList.length}`); @@ -210,7 +210,7 @@ export class NodeMonitor { memoryCache.set('nodeList', nodeList); } catch (e) { - logger.error('Failed to cache Node collection to memory. ' + e.message); + logger.error('Failed to cache Node collection to memory. ' + (e as Error).message); } }; diff --git a/src/utils.ts b/src/utils.ts index 18a9918..87f17ec 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -1,5 +1,7 @@ -import { INode } from '@src/models/Node'; +import { Request } from 'express'; +import * as _ from 'lodash'; import * as path from 'path'; +import { INode } from '@src/models/Node'; export const stringToArray = (str: string | undefined): Array => { let result = null; @@ -58,3 +60,10 @@ export const splitArray = (array: Array, chunks: number): Array => all[ch] = [].concat(all[ch] || [], one); return all; }, []); + +export const reqToPageParameters = (req: Request, filterKeys?: Array): { [key: string]: unknown } => { + const searchCriteria = _.pick(req.query, 'pageNumber', 'pageSize', 'order'); + const filter = _.pick(req.query, filterKeys || []); + + return { ...searchCriteria, ...filter }; +};