From e836e85e7805241440ec859ad18ee21d4ee0f0fc Mon Sep 17 00:00:00 2001 From: Volodymyr Saakian Date: Sun, 22 Mar 2020 20:07:11 +0200 Subject: [PATCH] Update --- .DS_Store | Bin 0 -> 6148 bytes .eslintrc.js | 18 +- .gitignore | 2 + .prettierrc | 4 +- package-lock.json | 1538 +++++++++++++++++-- package.json | 10 +- src/.DS_Store | Bin 0 -> 6148 bytes src/api/FinanceApi.js | 36 +- src/api/MinfinApi.js | 8 +- src/bot.js | 85 - src/bot/bot.js | 86 ++ src/bot/commands/main.js | 19 + src/bot/menu/banks.js | 145 ++ src/bot/menu/providers.js | 60 + src/bot/menu/rates.js | 30 + src/bot/menu/user.js | 1 + src/bot/menu/wallet.js | 30 + src/bot/processor/finance.js | 42 + src/bot/processor/providers.js | 25 + src/bot/utils/addMenus.js | 16 + src/bot/utils/common.js | 11 + src/bot/utils/data.js | 9 + src/bot/utils/inline.js | 0 src/bot/utils/middlewares/index.js | 19 + src/bot/utils/middlewares/logger/log4js.js | 10 + src/bot/utils/middlewares/logger/tlogger.js | 3 + src/config/env.js | 6 +- src/config/firebaseKey.example.json | 12 + src/constants/api.js | 3 + src/constants/models.js | 9 + src/constants/rates.js | 5 + src/constants/timer.js | 4 + src/index.js | 19 +- src/models/Base.js | 50 + src/models/Finance.js | 9 + src/models/Minfin.js | 13 + src/models/Users.js | 23 + src/utils/aws/dynamo.js | 180 ++- src/utils/data.js | 2 + src/utils/firestore.js | 11 + src/utils/scheduler/RatesScheduler.js | 28 + 41 files changed, 2259 insertions(+), 322 deletions(-) create mode 100644 .DS_Store create mode 100644 src/.DS_Store delete mode 100644 src/bot.js create mode 100644 src/bot/bot.js create mode 100644 src/bot/commands/main.js create mode 100644 src/bot/menu/banks.js create mode 100644 src/bot/menu/providers.js create mode 100644 src/bot/menu/rates.js create mode 100644 src/bot/menu/user.js create mode 100644 src/bot/menu/wallet.js create mode 100644 src/bot/processor/finance.js create mode 100644 src/bot/processor/providers.js create mode 100644 src/bot/utils/addMenus.js create mode 100644 src/bot/utils/common.js create mode 100644 src/bot/utils/data.js create mode 100644 src/bot/utils/inline.js create mode 100644 src/bot/utils/middlewares/index.js create mode 100644 src/bot/utils/middlewares/logger/log4js.js create mode 100644 src/bot/utils/middlewares/logger/tlogger.js create mode 100644 src/config/firebaseKey.example.json create mode 100644 src/constants/api.js create mode 100644 src/constants/models.js create mode 100644 src/constants/rates.js create mode 100644 src/constants/timer.js create mode 100644 src/models/Base.js create mode 100644 src/models/Finance.js create mode 100644 src/models/Minfin.js create mode 100644 src/models/Users.js create mode 100644 src/utils/data.js create mode 100644 src/utils/firestore.js create mode 100644 src/utils/scheduler/RatesScheduler.js diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..9317db180a557094cdb5cfd01b8bbe41283ee1c9 GIT binary patch literal 6148 zcmeHK%}T>S5dOBU5~)Iu9)sS6K7p~si-;8Z07@FELSl-w;4$C}c+iWF;?axXoA?eM zoY|eW8)Azfh{z1gew+E(oqSn#vj9wQns$K>fPj>-u|drj!hY78G{mw+Xn2fl)Ex|q zd|ZoE!(U~9zg-J^7~v8(mG5Vs9(-S3#Bq`p3E6`8ljohg_RB%lpRV+eFTAy}W|zn& zu23MwIZlz=-V_-2%;Xmi?0zgfewnw&Z+)RphRTaYQFX6h0&veIs3-%|RR)v+ zWnj(#?++m= 1.43.0 < 2" + } + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, + "concat-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", + "optional": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" + } + }, "configstore": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", @@ -447,6 +807,12 @@ "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", "dev": true }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "optional": true + }, "create-error-class": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", @@ -473,6 +839,17 @@ "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", "dev": true }, + "date-and-time": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/date-and-time/-/date-and-time-0.12.0.tgz", + "integrity": "sha512-n2RJIAp93AucgF/U/Rz5WRS2Hjg5Z+QxscaaMCi6pVZT1JpJKRH+C08vyH/lRR1kxNXnPxgo3lWfd+jCb/UcuQ==", + "optional": true + }, + "date-format": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-3.0.0.tgz", + "integrity": "sha512-eyTcpKOcamdhWJXj56DpQMo1ylSQpcGtGKXcU0Tb97+K56/CF5amAqqqNj0+KvA0iw2ynxtHWFsPDSClCxe48w==" + }, "debug": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", @@ -489,6 +866,34 @@ "mimic-response": "^2.0.0" } }, + "deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.0.1.tgz", + "integrity": "sha512-7Et6r6XfNW61CPPCIYfm1YPGSmh6+CliYeL4km7GWJcpX5LTAflGF8drLLR+MZX+2P3NZfAfSduutBbSWqER4g==", + "optional": true, + "requires": { + "es-abstract": "^1.16.3", + "es-get-iterator": "^1.0.1", + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "isarray": "^2.0.5", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0", + "side-channel": "^1.0.1", + "which-boxed-primitive": "^1.0.1", + "which-collection": "^1.0.0" + }, + "dependencies": { + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "optional": true + } + } + }, "deep-extend": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", @@ -510,11 +915,18 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, "requires": { "object-keys": "^1.0.12" } }, + "dicer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.3.0.tgz", + "integrity": "sha512-MdceRRWqltEG2dZqO769g27N/3PXfcKl04VhYnBlo2YhH7zPi88VebsjTKclaOyiuMaGU72hTfw3VkUitGcVCA==", + "requires": { + "streamsearch": "0.1.2" + } + }, "doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -543,6 +955,49 @@ "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "optional": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "optional": true + } + } + }, + "ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "requires": { + "safe-buffer": "^5.0.1" + } + }, "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -557,6 +1012,12 @@ "once": "^1.4.0" } }, + "ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", + "optional": true + }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -570,7 +1031,6 @@ "version": "1.17.4", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", - "dev": true, "requires": { "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", @@ -585,11 +1045,33 @@ "string.prototype.trimright": "^2.1.1" } }, + "es-get-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.0.tgz", + "integrity": "sha512-UfrmHuWQlNMTs35e1ypnvikg6jCz3SK8v8ImvmDsh36fCVUR1MqoFDiyn0/k52C8NqO3YsO8Oe0azeesNuqSsQ==", + "optional": true, + "requires": { + "es-abstract": "^1.17.4", + "has-symbols": "^1.0.1", + "is-arguments": "^1.0.4", + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-string": "^1.0.5", + "isarray": "^2.0.5" + }, + "dependencies": { + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "optional": true + } + } + }, "es-to-primitive": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, "requires": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", @@ -853,13 +1335,13 @@ "dev": true }, "espree": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-6.1.2.tgz", - "integrity": "sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.0.tgz", + "integrity": "sha512-Xs8airJ7RQolnDIbLtRutmfvSsAe0xqMMAantCN/GMoqf81TFbeI1T7Jpd56qYu1uuh32dOG5W/X9uO+ghPXzA==", "dev": true, "requires": { "acorn": "^7.1.0", - "acorn-jsx": "^5.1.0", + "acorn-jsx": "^5.2.0", "eslint-visitor-keys": "^1.1.0" } }, @@ -899,6 +1381,12 @@ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, + "event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "optional": true + }, "events": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", @@ -919,6 +1407,12 @@ "strip-eof": "^1.0.0" } }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "optional": true + }, "external-editor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", @@ -954,6 +1448,20 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, + "fast-text-encoding": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.1.tgz", + "integrity": "sha512-x4FEgaz3zNRtJfLFqJmHWxkMDDvXVtaznj2V9jiP8ACUJrUgist4bP9FmDL2Vew2Y9mEQI/tG4GqabaitYp9CQ==", + "optional": true + }, + "faye-websocket": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", + "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", + "requires": { + "websocket-driver": ">=0.5.1" + } + }, "figures": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", @@ -990,6 +1498,27 @@ "locate-path": "^2.0.0" } }, + "firebase-admin": { + "version": "8.9.2", + "resolved": "https://registry.npmjs.org/firebase-admin/-/firebase-admin-8.9.2.tgz", + "integrity": "sha512-ix4qcx+hHnr3mnc41Z8EzQa9Mr+2nhogLEv6ktkOCCpdKJ+9HxW9vikRCElSbC8ICHLD0KIH0GVOIZK80vbvqw==", + "requires": { + "@firebase/database": "^0.5.17", + "@google-cloud/firestore": "^3.0.0", + "@google-cloud/storage": "^4.1.2", + "@types/node": "^8.10.59", + "dicer": "^0.3.0", + "jsonwebtoken": "8.1.0", + "node-forge": "0.7.4" + }, + "dependencies": { + "@types/node": { + "version": "8.10.59", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.59.tgz", + "integrity": "sha512-8RkBivJrDCyPpBXhVZcjh7cQxVBSmRk9QM7hOketZzp6Tg79c0N8kkpAIito9bnJ3HCVCHVYz+KHTEbfQNfeVQ==" + } + } + }, "flat-cache": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", @@ -1004,8 +1533,17 @@ "flatted": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", - "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==", - "dev": true + "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==" + }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } }, "fs.realpath": { "version": "1.0.0", @@ -1023,14 +1561,136 @@ "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "functional-red-black-tree": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" + }, + "gaxios": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-2.3.2.tgz", + "integrity": "sha512-K/+py7UvKRDaEwEKlLiRKrFr+wjGjsMz5qH7Vs549QJS7cpSCOT/BbWL7pzqECflc46FcNPipjSfB+V1m8PAhw==", + "optional": true, + "requires": { + "abort-controller": "^3.0.0", + "extend": "^3.0.2", + "https-proxy-agent": "^5.0.0", + "is-stream": "^2.0.0", + "node-fetch": "^2.3.0" + }, + "dependencies": { + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "optional": true + } + } + }, + "gcp-metadata": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-3.5.0.tgz", + "integrity": "sha512-ZQf+DLZ5aKcRpLzYUyBS3yo3N0JSa82lNDO8rj3nMSlovLcz2riKFBsYgDzeXcv75oo5eqB2lx+B14UvPoCRnA==", + "optional": true, + "requires": { + "gaxios": "^2.1.0", + "json-bigint": "^0.3.0" + } + }, + "gcs-resumable-upload": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/gcs-resumable-upload/-/gcs-resumable-upload-2.3.2.tgz", + "integrity": "sha512-OPS0iAmPCV+r7PziOIhyxmQOzsazFCy76yYDOS/Z80O/7cuny1KMfqDQa2T0jLaL8EreTU7EMZG5pUuqBKgzHA==", + "optional": true, + "requires": { + "abort-controller": "^3.0.0", + "configstore": "^5.0.0", + "gaxios": "^2.0.0", + "google-auth-library": "^5.0.0", + "pumpify": "^2.0.0", + "stream-events": "^1.0.4" + }, + "dependencies": { + "configstore": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "optional": true, + "requires": { + "dot-prop": "^5.2.0", + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" + } + }, + "crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "optional": true + }, + "dot-prop": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz", + "integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==", + "optional": true, + "requires": { + "is-obj": "^2.0.0" + } + }, + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "optional": true + }, + "make-dir": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz", + "integrity": "sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w==", + "optional": true, + "requires": { + "semver": "^6.0.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "optional": true + }, + "unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "optional": true, + "requires": { + "crypto-random-string": "^2.0.0" + } + }, + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "optional": true, + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", + "optional": true + } + } }, "get-stdin": { "version": "6.0.0", @@ -1077,9 +1737,9 @@ } }, "globals": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.3.0.tgz", - "integrity": "sha512-wAfjdLgFsPZsklLJvOBUBmzYE8/CwhEqSBEMRXA3qxIiNtyqvjYurAtIfDh6chlEPUfmTY3MnZh5Hfh4q0UlIw==", + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", "dev": true, "requires": { "type-fest": "^0.8.1" @@ -1093,6 +1753,88 @@ } } }, + "google-auth-library": { + "version": "5.10.1", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-5.10.1.tgz", + "integrity": "sha512-rOlaok5vlpV9rSiUu5EpR0vVpc+PhN62oF4RyX/6++DG1VsaulAFEMlDYBLjJDDPI6OcNOCGAKy9UVB/3NIDXg==", + "optional": true, + "requires": { + "arrify": "^2.0.0", + "base64-js": "^1.3.0", + "ecdsa-sig-formatter": "^1.0.11", + "fast-text-encoding": "^1.0.0", + "gaxios": "^2.1.0", + "gcp-metadata": "^3.4.0", + "gtoken": "^4.1.0", + "jws": "^4.0.0", + "lru-cache": "^5.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "optional": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "optional": true + } + } + }, + "google-gax": { + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-1.14.2.tgz", + "integrity": "sha512-Nde+FdqALbV3QgMA4KlkxOHfrj9busnZ3EECwy/1gDJm9vhKGwDLWzErqRU5g80OoGSAMgyY7DWIfqz7ina4Jw==", + "optional": true, + "requires": { + "@grpc/grpc-js": "^0.6.18", + "@grpc/proto-loader": "^0.5.1", + "@types/fs-extra": "^8.0.1", + "@types/long": "^4.0.0", + "abort-controller": "^3.0.0", + "duplexify": "^3.6.0", + "google-auth-library": "^5.0.0", + "is-stream-ended": "^0.1.4", + "lodash.at": "^4.6.0", + "lodash.has": "^4.5.2", + "node-fetch": "^2.6.0", + "protobufjs": "^6.8.8", + "retry-request": "^4.0.0", + "semver": "^6.0.0", + "walkdir": "^0.4.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "optional": true + } + } + }, + "google-p12-pem": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-2.0.4.tgz", + "integrity": "sha512-S4blHBQWZRnEW44OcR7TL9WR+QCqByRvhNDZ/uuQfpxywfupikf/miba8js1jZi6ZOGv5slgSuoshCWh6EMDzg==", + "optional": true, + "requires": { + "node-forge": "^0.9.0" + }, + "dependencies": { + "node-forge": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.1.tgz", + "integrity": "sha512-G6RlQt5Sb4GMBzXvhfkeFmbqR6MzhtnT7VTHuLadjkii3rdYHNdw0m8zA4BTxVIh68FicCQ2NSUANpsqkr9jvQ==", + "optional": true + } + } + }, "got": { "version": "10.6.0", "resolved": "https://registry.npmjs.org/got/-/got-10.6.0.tgz", @@ -1128,14 +1870,24 @@ "graceful-fs": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", - "dev": true + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" + }, + "gtoken": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-4.1.4.tgz", + "integrity": "sha512-VxirzD0SWoFUo5p8RDP8Jt2AGyOmyYcT/pOUgDKJCK+iSw0TMqwrVfY37RXTNmoKwrzmDHSk0GMT9FsgVmnVSA==", + "optional": true, + "requires": { + "gaxios": "^2.1.0", + "google-p12-pem": "^2.0.0", + "jws": "^4.0.0", + "mime": "^2.2.0" + } }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, "requires": { "function-bind": "^1.1.1" } @@ -1149,13 +1901,54 @@ "has-symbols": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "dev": true + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==" + }, + "hash-stream-validation": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/hash-stream-validation/-/hash-stream-validation-0.2.2.tgz", + "integrity": "sha512-cMlva5CxWZOrlS/cY0C+9qAzesn5srhFA8IT1VPiHc9bWWBLkJfEUIZr7MWoi89oOOGmpg8ymchaOjiArsGu5A==", + "optional": true, + "requires": { + "through2": "^2.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "optional": true + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "optional": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + } + } }, "hosted-git-info": { - "version": "2.8.7", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.7.tgz", - "integrity": "sha512-ChkjQtKJ3GI6SsI4O5jwr8q8EPrWCnxuc4Tbx+vRI5x6mDOpjKKltNo1lRlszw3xwgTOSns1ZRBiMmmwpcvLxg==", + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", "dev": true }, "http-cache-semantics": { @@ -1163,6 +1956,32 @@ "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", "integrity": "sha512-Z2EICWNJou7Tr9Bd2M2UqDJq3A9F2ePG9w3lIpjoyuSyXFP9QbniJVu3XQYytuw5ebmG7dXSXO9PgAjJG8DDKA==" }, + "http-parser-js": { + "version": "0.4.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.10.tgz", + "integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=" + }, + "http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "optional": true, + "requires": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + } + }, + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "optional": true, + "requires": { + "agent-base": "6", + "debug": "4" + } + }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -1208,8 +2027,7 @@ "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" }, "inflight": { "version": "1.0.6", @@ -1224,8 +2042,7 @@ "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "ini": { "version": "1.3.5", @@ -1234,23 +2051,23 @@ "dev": true }, "inquirer": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.4.tgz", - "integrity": "sha512-Bu5Td5+j11sCkqfqmUTiwv+tWisMtP0L7Q8WrqA2C/BbBhy1YTdFrvjjlrKq8oagA/tLQBski2Gcx/Sqyi2qSQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.1.0.tgz", + "integrity": "sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==", "dev": true, "requires": { "ansi-escapes": "^4.2.1", - "chalk": "^2.4.2", + "chalk": "^3.0.0", "cli-cursor": "^3.1.0", "cli-width": "^2.0.0", "external-editor": "^3.0.3", "figures": "^3.0.0", "lodash": "^4.17.15", "mute-stream": "0.0.8", - "run-async": "^2.2.0", + "run-async": "^2.4.0", "rxjs": "^6.5.3", "string-width": "^4.1.0", - "strip-ansi": "^5.1.0", + "strip-ansi": "^6.0.0", "through": "^2.3.6" }, "dependencies": { @@ -1260,6 +2077,47 @@ "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", "dev": true }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -1275,44 +2133,46 @@ "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.0" - }, - "dependencies": { - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - } } }, "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "dev": true, "requires": { - "ansi-regex": "^4.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - } + "ansi-regex": "^5.0.0" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" } } } }, + "is-arguments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", + "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==", + "optional": true + }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, + "is-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.0.tgz", + "integrity": "sha512-t5mGUXC/xRheCK431ylNiSkGGpBp8bHENBcENTkDT6ppwPzEVxNGZRvgvmOEfbWkFhA7D2GEuE2mmQTr78sl2g==", + "optional": true + }, "is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -1322,11 +2182,16 @@ "binary-extensions": "^2.0.0" } }, + "is-boolean-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.0.1.tgz", + "integrity": "sha512-TqZuVwa/sppcrhUCAYkGBk7w0yxfQQnxq28fjkO53tnK9FQXmdwz2JS5+GjsWQ6RByES1K40nI+yDic5c9/aAQ==", + "optional": true + }, "is-callable": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", - "dev": true + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==" }, "is-ci": { "version": "1.2.1", @@ -1340,8 +2205,7 @@ "is-date-object": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", - "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", - "dev": true + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==" }, "is-extglob": { "version": "2.1.1", @@ -1374,6 +2238,12 @@ "is-path-inside": "^1.0.0" } }, + "is-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.1.tgz", + "integrity": "sha512-T/S49scO8plUiAOA2DBTBG3JHpn1yiw0kRp6dgiZ0v2/6twi5eiB0rHtHFH9ZIrvlWc6+4O+m4zg5+Z833aXgw==", + "optional": true + }, "is-npm": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", @@ -1386,6 +2256,12 @@ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, + "is-number-object": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.4.tgz", + "integrity": "sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==", + "optional": true + }, "is-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", @@ -1417,7 +2293,6 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", - "dev": true, "requires": { "has": "^1.0.3" } @@ -1428,27 +2303,55 @@ "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", "dev": true }, + "is-set": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.1.tgz", + "integrity": "sha512-eJEzOtVyenDs1TMzSQ3kU3K+E0GUS9sno+F0OBT97xsgcJsF9nXMBtkT9/kut5JEpM7oL7X/0qxR17K3mcwIAA==", + "optional": true + }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", "dev": true }, + "is-stream-ended": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-stream-ended/-/is-stream-ended-0.1.4.tgz", + "integrity": "sha512-xj0XPvmr7bQFTvirqnFr50o0hQIh6ZItDqloxt5aJrR4NQsYeSsyFQERYGCAzfindAcnKjINnwEEgLx4IqVzQw==", + "optional": true + }, "is-string": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", - "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", - "dev": true + "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==" }, "is-symbol": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", - "dev": true, "requires": { "has-symbols": "^1.0.1" } }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "optional": true + }, + "is-weakmap": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", + "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "optional": true + }, + "is-weakset": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.1.tgz", + "integrity": "sha512-pi4vhbhVHGLxohUw7PhGsueT4vRGFoXhP7+RGN0jKIv9+8PWYCQTqtADngrxOm2g46hoH0+g8uZZBzMrvVGDmw==", + "optional": true + }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -1481,6 +2384,15 @@ "esprima": "^4.0.0" } }, + "json-bigint": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-0.3.0.tgz", + "integrity": "sha1-DM2RLEuCcNBfBW+9E4FLU9OCWx4=", + "optional": true, + "requires": { + "bignumber.js": "^7.0.0" + } + }, "json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", @@ -1498,6 +2410,73 @@ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", "dev": true }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsonwebtoken": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.1.0.tgz", + "integrity": "sha1-xjl80uX9WD1lwAeoPce7eOaYK4M=", + "requires": { + "jws": "^3.1.4", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.0.0", + "xtend": "^4.0.1" + }, + "dependencies": { + "jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "requires": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "requires": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + } + } + }, + "jwa": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", + "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", + "optional": true, + "requires": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "jws": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", + "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", + "optional": true, + "requires": { + "jwa": "^2.0.0", + "safe-buffer": "^5.0.1" + } + }, "keyv": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.0.0.tgz", @@ -1558,8 +2537,78 @@ "lodash": { "version": "4.17.15", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", - "dev": true + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + }, + "lodash.at": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.at/-/lodash.at-4.6.0.tgz", + "integrity": "sha1-k83OZk8KGZTqM9181A4jr9EbD/g=", + "optional": true + }, + "lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=", + "optional": true + }, + "lodash.has": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/lodash.has/-/lodash.has-4.5.2.tgz", + "integrity": "sha1-0Z9NwQlQWMzL4rDN9O4P5Ko3yGI=", + "optional": true + }, + "lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" + }, + "lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" + }, + "lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=" + }, + "lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=" + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" + }, + "lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" + }, + "lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" + }, + "log4js": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.1.2.tgz", + "integrity": "sha512-knS4Y30pC1e0n7rfx3VxcLOdBCsEo0o6/C7PVTGxdVK+5b1TYOSGQPn9FDcrhkoQBV29qwmA2mtkznPAQKnxQg==", + "requires": { + "date-format": "^3.0.0", + "debug": "^4.1.1", + "flatted": "^2.0.1", + "rfdc": "^1.1.4", + "streamroller": "^2.2.3" + } + }, + "long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", + "optional": true }, "lowercase-keys": { "version": "2.0.0", @@ -1585,11 +2634,31 @@ "pify": "^3.0.0" } }, + "mime": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", + "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", + "optional": true + }, + "mime-db": { + "version": "1.43.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", + "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==", + "optional": true + }, + "mime-types": { + "version": "2.1.26", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", + "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", + "optional": true, + "requires": { + "mime-db": "1.43.0" + } + }, "mimic-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" }, "mimic-response": { "version": "2.1.0", @@ -1660,6 +2729,11 @@ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" }, + "node-forge": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.4.tgz", + "integrity": "sha512-8Df0906+tq/omxuCZD6PqhPaQDYuyJ1d+VITgxoIA8zvQd1ru+nMJcDChHH324MWitIgbVkAkQoGEEVJNpn/PA==" + }, "nodemon": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.2.tgz", @@ -1733,20 +2807,23 @@ "object-inspect": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", - "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", - "dev": true + "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==" + }, + "object-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.2.tgz", + "integrity": "sha512-Epah+btZd5wrrfjkJZq1AOB9O6OxUQto45hzFd7lXGrpHPGE0W1k+426yrZV+k6NJOzLNNW/nVsmZdIWsAqoOQ==", + "optional": true }, "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" }, "object.assign": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", - "dev": true, "requires": { "define-properties": "^1.1.2", "function-bind": "^1.1.1", @@ -1790,7 +2867,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", - "dev": true, "requires": { "mimic-fn": "^2.1.0" } @@ -2017,12 +3093,47 @@ "fast-diff": "^1.1.2" } }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "optional": true + }, "progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true }, + "protobufjs": { + "version": "6.8.8", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.8.8.tgz", + "integrity": "sha512-AAmHtD5pXgZfi7GMpllpO3q1Xw1OYldr+dMUlAnffGTAhqkg72WdmSY71uKBF/JuyiKs8psYbtKrhi0ASCD8qw==", + "optional": true, + "requires": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/long": "^4.0.0", + "@types/node": "^10.1.0", + "long": "^4.0.0" + }, + "dependencies": { + "@types/node": { + "version": "10.17.17", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.17.tgz", + "integrity": "sha512-gpNnRnZP3VWzzj5k3qrpRC6Rk3H/uclhAVo1aIvwzK5p5cOrs9yEyQ8H/HBsBY0u5rrWxXEiVPQ0dEB6pkjE8Q==", + "optional": true + } + } + }, "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", @@ -2044,6 +3155,31 @@ "once": "^1.3.1" } }, + "pumpify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-2.0.1.tgz", + "integrity": "sha512-m7KOje7jZxrmutanlkS1daj1dS6z6BgslzOXmcSEpIlCxM3VJH7lG5QLeck/6hgF6F4crFf01UtQmNsJfweTAw==", + "optional": true, + "requires": { + "duplexify": "^4.1.1", + "inherits": "^2.0.3", + "pump": "^3.0.0" + }, + "dependencies": { + "duplexify": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.1.tgz", + "integrity": "sha512-DY3xVEmVHTv1wSzKNbwoU6nVjzI369Y6sPoqfYr0/xlx3IdX2n94xIszTcjPO8W8ZIv0Wb0PXNcjuZyT4wiICA==", + "optional": true, + "requires": { + "end-of-stream": "^1.4.1", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1", + "stream-shift": "^1.0.0" + } + } + } + }, "punycode": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", @@ -2087,6 +3223,17 @@ "read-pkg": "^2.0.0" } }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "optional": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, "readdirp": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.3.0.tgz", @@ -2096,6 +3243,16 @@ "picomatch": "^2.0.7" } }, + "regexp.prototype.flags": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", + "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", + "optional": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + } + }, "regexpp": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", @@ -2154,6 +3311,21 @@ "signal-exit": "^3.0.2" } }, + "retry-request": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-4.1.1.tgz", + "integrity": "sha512-BINDzVtLI2BDukjWmjAIRZ0oglnCAkpP2vQjM3jdLhmT62h0xnQgciPwBRDAvHqpkPT2Wo1XuUyLyn6nbGrZQQ==", + "optional": true, + "requires": { + "debug": "^4.1.1", + "through2": "^3.0.1" + } + }, + "rfdc": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.1.4.tgz", + "integrity": "sha512-5C9HXdzK8EAqN7JDif30jqsBzavB7wLpaubisuQIGHWf2gUXSpzy6ArX/+Da8RjFpagWsCn+pIgxTMAmKw9Zug==" + }, "rimraf": { "version": "2.6.3", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", @@ -2184,8 +3356,7 @@ "safe-buffer": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", - "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", - "dev": true + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" }, "safer-buffer": { "version": "2.1.2", @@ -2233,11 +3404,20 @@ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", "dev": true }, + "side-channel": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.2.tgz", + "integrity": "sha512-7rL9YlPHg7Ancea1S96Pa8/QWb4BtXL/TZvS6B8XFetGBeuhAsfmUspK6DokBeZ64+Kj9TCNRD/30pVz1BvQNA==", + "optional": true, + "requires": { + "es-abstract": "^1.17.0-next.1", + "object-inspect": "^1.7.0" + } + }, "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" }, "slice-ansi": { "version": "2.1.0", @@ -2250,6 +3430,12 @@ "is-fullwidth-code-point": "^2.0.0" } }, + "snakeize": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/snakeize/-/snakeize-0.1.0.tgz", + "integrity": "sha1-EMCI2LWOsHazIpu1oE4jLOEmQi0=", + "optional": true + }, "spdx-correct": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", @@ -2288,6 +3474,43 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, + "stream-events": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz", + "integrity": "sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==", + "optional": true, + "requires": { + "stubs": "^3.0.0" + } + }, + "stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", + "optional": true + }, + "streamroller": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-2.2.3.tgz", + "integrity": "sha512-AegmvQsscTRhHVO46PhCDerjIpxi7E+d2GxgUDu+nzw/HuLnUdxHWr6WQ+mVn/4iJgMKKFFdiUwFcFRDvcjCtw==", + "requires": { + "date-format": "^2.1.0", + "debug": "^4.1.1", + "fs-extra": "^8.1.0" + }, + "dependencies": { + "date-format": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-2.1.0.tgz", + "integrity": "sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA==" + } + } + }, + "streamsearch": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", + "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=" + }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", @@ -2302,7 +3525,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", - "dev": true, "requires": { "define-properties": "^1.1.3", "function-bind": "^1.1.1" @@ -2312,12 +3534,28 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", - "dev": true, "requires": { "define-properties": "^1.1.3", "function-bind": "^1.1.1" } }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "optional": true + } + } + }, "strip-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", @@ -2345,6 +3583,12 @@ "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", "dev": true }, + "stubs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz", + "integrity": "sha1-6NK6H6nJBXAwPAMLaQD31fiavls=", + "optional": true + }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -2400,6 +3644,27 @@ } } }, + "teeny-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-6.0.2.tgz", + "integrity": "sha512-B6fxA0fSnY/bul06NggdN1nywtr5U5Uvt96pHfTi8pi4MNe6++VUWcAAFBrcMeha94s+gULwA5WvagoSZ+AcYg==", + "optional": true, + "requires": { + "http-proxy-agent": "^4.0.0", + "https-proxy-agent": "^5.0.0", + "node-fetch": "^2.2.0", + "stream-events": "^1.0.5", + "uuid": "^3.3.2" + }, + "dependencies": { + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "optional": true + } + } + }, "telegraf": { "version": "3.36.0", "resolved": "https://registry.npmjs.org/telegraf/-/telegraf-3.36.0.tgz", @@ -2414,6 +3679,11 @@ "telegram-typings": "^3.6.0" } }, + "telegraf-inline-menu": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/telegraf-inline-menu/-/telegraf-inline-menu-4.0.0.tgz", + "integrity": "sha512-1tEL9+xfq9/HA8pD0XebfQeqKg6+aqqtlBck/GGXxK/BrA1L15Ou8z7mXnAI9lVdrFWuMVguG2sZpiwpAviFYw==" + }, "telegram-typings": { "version": "3.6.1", "resolved": "https://registry.npmjs.org/telegram-typings/-/telegram-typings-3.6.1.tgz", @@ -2440,6 +3710,15 @@ "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", "dev": true }, + "through2": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.1.tgz", + "integrity": "sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==", + "optional": true, + "requires": { + "readable-stream": "2 || 3" + } + }, "timed-out": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", @@ -2498,6 +3777,21 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.10.0.tgz", "integrity": "sha512-EUV9jo4sffrwlg8s0zDhP0T2WD3pru5Xi0+HTE3zTUmBaZNhfkite9PdSJwdXLwPVW0jnAHT56pZHIOYckPEiw==" }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "optional": true + }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "optional": true, + "requires": { + "is-typedarray": "^1.0.0" + } + }, "undefsafe": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.3.tgz", @@ -2533,6 +3827,11 @@ "crypto-random-string": "^1.0.0" } }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + }, "unzip-response": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", @@ -2592,6 +3891,12 @@ "prepend-http": "^1.0.1" } }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "optional": true + }, "uuid": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.2.tgz", @@ -2613,6 +3918,27 @@ "spdx-expression-parse": "^3.0.0" } }, + "walkdir": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.4.1.tgz", + "integrity": "sha512-3eBwRyEln6E1MSzcxcVpQIhRG8Q1jLvEqRmCZqS3dsfXEDR/AhOF4d+jHg1qvDCpYaVRZjENPQyrVxAkQqxPgQ==", + "optional": true + }, + "websocket-driver": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.3.tgz", + "integrity": "sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg==", + "requires": { + "http-parser-js": ">=0.4.0 <0.4.11", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", + "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==" + }, "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", @@ -2622,6 +3948,31 @@ "isexe": "^2.0.0" } }, + "which-boxed-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.1.tgz", + "integrity": "sha512-7BT4TwISdDGBgaemWU0N0OU7FeAEJ9Oo2P1PHRm/FCWoEi2VLWC9b6xvxAA3C/NMpxg3HXVgi0sMmGbNUbNepQ==", + "optional": true, + "requires": { + "is-bigint": "^1.0.0", + "is-boolean-object": "^1.0.0", + "is-number-object": "^1.0.3", + "is-string": "^1.0.4", + "is-symbol": "^1.0.2" + } + }, + "which-collection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", + "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "optional": true, + "requires": { + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-weakmap": "^2.0.1", + "is-weakset": "^2.0.1" + } + }, "widest-line": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", @@ -2682,6 +4033,11 @@ "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=" }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + }, "yallist": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", diff --git a/package.json b/package.json index 131efd3..043251f 100644 --- a/package.json +++ b/package.json @@ -22,17 +22,21 @@ "dependencies": { "aws-sdk": "^2.628.0", "dotenv": "^8.2.0", + "firebase-admin": "^8.9.2", "got": "^10.6.0", + "lodash": "^4.17.15", + "log4js": "^6.1.2", "telegraf": "^3.36.0", + "telegraf-inline-menu": "^4.0.0", "uuid": "^7.0.2" }, "devDependencies": { - "nodemon": "^2.0.2", - "eslint": "^6.6.0", + "eslint": "^6.8.0", "eslint-config-airbnb-base": "^14.0.0", "eslint-config-prettier": "^6.5.0", - "eslint-plugin-import": "^2.18.2", + "eslint-plugin-import": "^2.20.1", "eslint-plugin-prettier": "^3.1.1", + "nodemon": "^2.0.2", "prettier": "1.19.1" } } diff --git a/src/.DS_Store b/src/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..4aadbaf5c5c2594c0b33c5d788f24a942e67d320 GIT binary patch literal 6148 zcmeHK%}T>S5T5OiMvBmbV2}F>J&O=a1W#THo;3~DLgE%`?-3utHxQ3LfOzzsym<1P z-KE_%)|(dJ%=(11HynXuwsDM2MuLR zJ=PBG(t*Jq0e~Htt>D`JTLCp2fT_pYAuJH(Qh_d2`6GsM>9A`bmwK!nx^z;uGUoA> zl|P{ { - if (banks.includes(val.title)) { - return [...acc, val]; - } - return [...acc]; - }, []); - - return findedBanks - .map(bank => { - const firstLine = `${bank.title}: \n`; - const nextLines = Object.keys(bank.currencies).reduce((acc, key) => { - const currency = bank.currencies[key]; - if (currencyIgnore.includes(key)) { - return [...acc]; - } - return [ - ...acc, - `${key}: ${parseInt(currency.ask).toFixed(2)}/${parseInt( - currency.bid - ).toFixed(2)}` - ]; - }, []); - return firstLine + nextLines.join('\n'); - }) - .join('\n\n'); - } - async getData() { - this.data = await Http.get( - 'http://resources.finance.ua/ru/public/currency-cash.json' - ); + this.data = await Http.get(FINANCE_API); return this.data; } } diff --git a/src/api/MinfinApi.js b/src/api/MinfinApi.js index 488278a..830e11b 100644 --- a/src/api/MinfinApi.js +++ b/src/api/MinfinApi.js @@ -1,7 +1,11 @@ const Http = require('../utils/http'); +const { MINFIN_KEY } = require('../config/env'); class MinfinApi { - static async get() { - return Http.get('http://resources.finance.ua/ru/public/currency-cash.json'); + async getData() { + this.data = Http.get(`http://api.minfin.com.ua/mb/${MINFIN_KEY}/`); + return this.data; } } + +module.exports = MinfinApi; diff --git a/src/bot.js b/src/bot.js deleted file mode 100644 index 881ccc4..0000000 --- a/src/bot.js +++ /dev/null @@ -1,85 +0,0 @@ -const Telegraf = require('telegraf'); -const Telegram = require('telegraf/telegram'); -const session = require('telegraf/session'); -const Extra = require('telegraf/extra'); -const Markup = require('telegraf/markup'); -const { TOKEN } = require('./config/env'); -const DynamoDatabase = require('./utils/aws/dynamo'); -const FinanceApi = require('./api/FinanceApi'); -//251408559 user -//978534005 bot - -class TelegramExecutor extends DynamoDatabase { - async execute() { - const bot = new Telegraf(TOKEN); - // console.log(await this.putItem()); - console.log('Started!'); - - // bot.use(session()); - // bot.use(Telegraf.log()); - // bot.use((ctx, next) => { - // ctx.state.text = ctx.message.text; - // return next(); - // }); - bot.start(async ctx => { - ctx.reply('Welcome to exchange bot!'); - }); - bot.help(ctx => ctx.reply('Send me a sticker')); - bot.on('sticker', ctx => ctx.reply('👍')); - bot.command('showratesfinance', async ctx => { - const financeApi = new FinanceApi(); - await financeApi.getData(); - const template = financeApi.generateMessageTemplate(); - // console.log(ctx.state); - ctx.session.counter = ctx.session.counter || 0; - ctx.session.counter++; - console.log(ctx.session.counter); - // return ctx.reply( - // template, - // ); - // return ctx.reply( - // template, - // Markup.keyboard([ - // 'Every 6 hours', - // 'Every 12 hours', - // 'Every day', - // 'Every 2 days' - // ]) - // .oneTime() - // .resize() - // .extra() - // ); - return ctx.reply(template); - }); - bot.command('showratesminfin', async ctx => { - console.log(ctx.message); - const data = { - ...ctx.message.from, - chatId: ctx.message.chat.id, - date: ctx.message.date, - text: ctx.message.text - }; - await this.putItem(data); - - // ctx.state = { A: 2 }; - // console.log(ctx.state); - // console.log(123123); - console.log(ctx.session); - - return ctx.reply('Rates from minfin'); - }); - bot.on('text', async ctx => { - const data = { - ...ctx.message.from, - chatId: ctx.message.chat.id, - date: ctx.message.date, - text: ctx.message.text - }; - await this.putItem(data); - return ctx.reply(ctx.message.text); - }); - bot.launch(); - } -} - -module.exports = TelegramExecutor; diff --git a/src/bot/bot.js b/src/bot/bot.js new file mode 100644 index 0000000..f5affb9 --- /dev/null +++ b/src/bot/bot.js @@ -0,0 +1,86 @@ +const Telegraf = require('telegraf'); +const Markup = require('telegraf/markup'); +const { get, isEmpty } = require('lodash'); +const { TOKEN } = require('../config/env'); +const UsersModel = require('../models/Users'); +const addMenus = require('./utils/addMenus'); +const addMainCommands = require('./commands/main'); +const applyMiddlewares = require('./utils/middlewares'); +const UserModel = require('../models/Users'); + +const execute = () => { + const bot = new Telegraf(TOKEN); + applyMiddlewares(bot); + + bot.start(async ctx => { + const usersModel = new UsersModel(); + const model = { + ...ctx.message.from, + message_id: ctx.message.message_id, + date: ctx.message.date, + }; + await usersModel.save(`${ctx.message.from.id}`, model); + return ctx.reply( + 'Welcome to exchange rates bot!', + Markup.keyboard([ + ['🗄 Providers', '🏦 Banks', '⏰ Schedule time', '💸 Rates'], + ['⚙️ Setting', '💸 Wallet', '🤑 Donation'], + ]) + .oneTime() + .resize() + .extra(), + ); + }); + + addMenus(bot); + addMainCommands(bot); + + bot.hears(/\d+/, async ctx => { + const textMessage = +ctx.message.text; + let templateCallbackMessage; + + if (!isEmpty(ctx.session.triggers)) { + const userModel = new UserModel(); + const user = await userModel.get(ctx.state.userId); + const { balance } = user.wallet; + if (ctx.session.triggers.topup) { + const result = balance + textMessage; + await userModel.update(ctx.state.userId, { + wallet: { balance: result }, + }); + templateCallbackMessage = `Your balance topped up by ${textMessage}$\nCurrent balance: ${result}$`; + } + if (ctx.session.triggers.topdown) { + const result = balance - textMessage; + await userModel.update(ctx.state.userId, { + wallet: { balance: result }, + }); + templateCallbackMessage = `Your balance topped down by ${textMessage}$\nCurrent balance: ${result}$`; + } + ctx.session.triggers = {}; + return ctx.replyWithHTML(templateCallbackMessage); + } + return ctx.reply('Some wrong action! Please write something else.'); + }); + + bot.help(ctx => + ctx.reply( + 'Welcome to exchange rates bot!', + Markup.keyboard([ + ['⏰ Schedule', '🏦 Banks'], + ['⚙️ Setting', '💸 Wallet'], + ['⭐️ Rate us', '🤑 Donation'], + ]) + .oneTime() + .resize() + .extra(), + ), + ); + + bot.on('text', async ctx => + ctx.reply('Some wrong action! Please write something else.'), + ); + bot.launch(); +}; + +module.exports = { execute }; diff --git a/src/bot/commands/main.js b/src/bot/commands/main.js new file mode 100644 index 0000000..2447729 --- /dev/null +++ b/src/bot/commands/main.js @@ -0,0 +1,19 @@ +const FinanceApi = require('../../api/FinanceApi'); +const FinanceModel = require('../../models/Finance'); +const { generateMessageTemplate } = require('../processor/finance'); + +const mainCommands = bot => { + bot.command('showratesfinance', async ctx => { + const financeApi = new FinanceApi(); + const data = await financeApi.getData(); + const financeModel = new FinanceModel(); + await financeModel.save(data); + const template = generateMessageTemplate(data.organizations); + return ctx.reply(template); + }); + + bot.command('showratesminfin', async ctx => + ctx.reply('Rates from minfin currently unavailable'), + ); +}; +module.exports = mainCommands; diff --git a/src/bot/menu/banks.js b/src/bot/menu/banks.js new file mode 100644 index 0000000..c314eba --- /dev/null +++ b/src/bot/menu/banks.js @@ -0,0 +1,145 @@ +const Markup = require('telegraf/markup'); +const { capitalize } = require('lodash'); +const { + createArray, + getPattern, + getCallbackUserId, +} = require('../utils/common'); +const { transformBankData } = require('../utils/data'); +const UserModel = require('../../models/Users'); +const FinanceModel = require('../../models/Finance'); +const { chooseExistedProviders } = require('../processor/providers'); + +module.exports = bot => { + const templateCallbackMessage = + 'Which one provider do you want to chose banks inside?\n'; + const financeModel = new FinanceModel(); + const userModel = new UserModel(); + + bot.hears(/(🏦 Banks)|(\/banks)/, async ctx => + chooseExistedProviders(ctx, templateCallbackMessage, 'provider:banks'), + ); + + const renderColumnButton = ( + data, + provider, + index, + columns, + menuPrefix = 'banks', + customPrefix = 'bank_name', + ) => + data + .slice(index * columns, index * columns + columns) + .map(({ title, id, enabled }) => + Markup.callbackButton( + `${capitalize(title)}${enabled ? ' ✅' : ''}`, + `${id}:${provider}:${menuPrefix}:${customPrefix}`, + ), + ); + + const createInlineButtonsColumns = ( + bankData, + provider = 'finance', + page = 1, + pageNumMaxElem = 20, + columns = 2, + ) => { + if (pageNumMaxElem > 20) { + throw new Error('Too much elements in list'); + } + const pagesQuantity = Math.ceil(bankData.length / pageNumMaxElem); + const correctLength = Math.ceil(pageNumMaxElem / columns); + const realPage = page - 1; + return createArray(correctLength).reduce((acc, value, index, array) => { + const realBankData = bankData.slice( + realPage * pageNumMaxElem, + realPage * pageNumMaxElem + pageNumMaxElem, + ); + if (index === 0 && page > 1) { + acc.push([ + Markup.callbackButton('Prev ⬅️', `prev:${provider}:provider:banks`), + ]); + } + if (index + 1 === array.length && pagesQuantity !== page) { + return [ + ...acc, + renderColumnButton(realBankData, provider, index, columns), + [Markup.callbackButton('Next ➡️', `next:${provider}:provider:banks`)], + ]; + } + + return [ + ...acc, + renderColumnButton(realBankData, provider, index, columns), + ]; + }, []); + }; + + bot.action('finance:provider:banks', async ctx => { + const finance = await financeModel.getLatest(); + const [provider] = ctx.match.split(':'); + const user = await userModel.get(getCallbackUserId(ctx)); + const bankData = transformBankData(finance.organizations, user, provider); + await ctx.answerCbQuery('Checked!'); + ctx.session.bankPage = 1; + await ctx.editMessageText(`Please choose banks for ${provider} provider!`); + return ctx.editMessageReplyMarkup( + Markup.inlineKeyboard(createInlineButtonsColumns(bankData, provider)), + ); + }); + + bot.action(/(next|prev):[a-zA-Z]+:provider:banks/, async ctx => { + const finance = await financeModel.getLatest(); + const pattern = getPattern(ctx); + const actionPattern = pattern[0]; + const provider = pattern[1]; + const user = await userModel.get(getCallbackUserId(ctx)); + const bankData = transformBankData(finance.organizations, user, provider); + const makeCalc = action => { + switch (action) { + case 'prev': + ctx.session.bankPage--; + return ctx.session.bankPage; + case 'next': + ctx.session.bankPage++; + return ctx.session.bankPage; + default: + ctx.session.bankPage++; + return ctx.session.bankPage; + } + }; + const page = makeCalc(actionPattern); + await ctx.answerCbQuery(`Going to the ${actionPattern} page!`); + return ctx.editMessageReplyMarkup( + Markup.inlineKeyboard( + createInlineButtonsColumns(bankData, provider, page), + ), + ); + }); + + bot.action(/:banks:bank_name/, async ctx => { + const [bankId, provider] = getPattern(ctx); + const user = await userModel.get(getCallbackUserId(ctx)); + const finance = await financeModel.getLatest(); + + if (!user.subscriptions[provider].banks.includes(bankId)) { + user.subscriptions[provider].banks.push(bankId); + } else { + const index = user.subscriptions[provider].banks.findIndex( + id => id === bankId, + ); + user.subscriptions[provider].banks.splice(index, 1); + } + await userModel.update(getCallbackUserId(ctx), { + subscriptions: user.subscriptions, + }); + const bankData = transformBankData(finance.organizations, user, provider); + + await ctx.answerCbQuery('Checked!'); + return ctx.editMessageReplyMarkup( + Markup.inlineKeyboard( + createInlineButtonsColumns(bankData, provider, ctx.session.bankPage), + ), + ); + }); +}; diff --git a/src/bot/menu/providers.js b/src/bot/menu/providers.js new file mode 100644 index 0000000..9bd61bd --- /dev/null +++ b/src/bot/menu/providers.js @@ -0,0 +1,60 @@ +const Extra = require('telegraf/extra'); +const Markup = require('telegraf/markup'); +const { getCallbackUserId } = require('../utils/common'); +const UserModel = require('../../models/Users'); + +module.exports = bot => { + const templateCallbackMessage = + 'Which one provider do you want to have subscriptions?\nPlease check provider for schedule!'; + + const backButtons = ({ minfin, finance }) => + Extra.HTML().markup( + Markup.inlineKeyboard([ + Markup.callbackButton( + minfin.enabled ? 'Minfin ✅' : 'Minfin', + 'minfin:provider', + ), + Markup.callbackButton( + finance.enabled ? 'Finance ✅' : 'Finance', + 'finance:provider', + ), + ]), + ); + + bot.hears(/(🗄 Providers)|(\/providers)/, async ctx => { + const userModel = new UserModel(); + const user = await userModel.get(ctx.update.message.from.id); + return ctx.replyWithHTML( + templateCallbackMessage, + backButtons(user.subscriptions), + ); + }); + + bot.action('minfin:provider', async ctx => { + const userModel = new UserModel(); + const user = await userModel.get(getCallbackUserId(ctx)); + user.subscriptions.minfin.enabled = !user.subscriptions.minfin.enabled; + await userModel.update(getCallbackUserId(ctx), { + subscriptions: user.subscriptions, + }); + await ctx.answerCbQuery('Checked!'); + return ctx.editMessageText( + templateCallbackMessage, + backButtons(user.subscriptions), + ); + }); + + bot.action('finance:provider', async ctx => { + const userModel = new UserModel(); + const user = await userModel.get(getCallbackUserId(ctx)); + user.subscriptions.finance.enabled = !user.subscriptions.finance.enabled; + await userModel.update(getCallbackUserId(ctx), { + subscriptions: user.subscriptions, + }); + await ctx.answerCbQuery('Checked!'); + return ctx.editMessageText( + templateCallbackMessage, + backButtons(user.subscriptions), + ); + }); +}; diff --git a/src/bot/menu/rates.js b/src/bot/menu/rates.js new file mode 100644 index 0000000..030d440 --- /dev/null +++ b/src/bot/menu/rates.js @@ -0,0 +1,30 @@ +const { chooseExistedProviders } = require('../processor/providers'); +const { generateMessageTemplate } = require('../processor/finance'); +const FinanceModel = require('../../models/Finance'); +const UserModel = require('../../models/Users'); +const { getCallbackUserId } = require('../utils/common'); + +module.exports = bot => { + const financeModel = new FinanceModel(); + const userModel = new UserModel(); + + bot.hears('💸 Rates', async ctx => + chooseExistedProviders(ctx, 'Choose what rates you need?', 'rates'), + ); + bot.action('finance:rates', async ctx => { + const finance = await financeModel.getLatest(); + const user = await userModel.get(getCallbackUserId(ctx)); + const financeSubscriptionBanks = user.subscriptions.finance.banks; + if (financeSubscriptionBanks.length) { + const template = generateMessageTemplate( + finance.organizations, + financeSubscriptionBanks, + ); + return ctx.reply(template); + } + return ctx.reply( + 'Please choose any banks in "Banks" in current "Finance" provider to show any banks!', + ); + }); + bot.action('minfin:rates', ctx => {}); +}; diff --git a/src/bot/menu/user.js b/src/bot/menu/user.js new file mode 100644 index 0000000..d37426f --- /dev/null +++ b/src/bot/menu/user.js @@ -0,0 +1 @@ +module.exports = bot => {}; diff --git a/src/bot/menu/wallet.js b/src/bot/menu/wallet.js new file mode 100644 index 0000000..7744f86 --- /dev/null +++ b/src/bot/menu/wallet.js @@ -0,0 +1,30 @@ +const Extra = require('telegraf/extra'); +const Markup = require('telegraf/markup'); +const UserModel = require('../../models/Users'); + +module.exports = bot => { + bot.hears('💸 Wallet', async ctx => { + const userModel = new UserModel(); + const user = await userModel.get(ctx.state.userId); + return ctx.replyWithHTML( + `Your balance: \nUSD: ${user.wallet.balance}\nPlease choose action!`, + Extra.HTML().markup( + Markup.inlineKeyboard([ + Markup.callbackButton('Top up', 'topup:wallet'), + Markup.callbackButton('Top down', 'topdown:wallet'), + ]), + ), + ); + }); + bot.action('topup:wallet', async ctx => { + await ctx.answerCbQuery(); + ctx.session.triggers = { topup: true }; + return ctx.reply('Please type on which count you want to top up!'); + }); + + bot.action('topdown:wallet', async ctx => { + await ctx.answerCbQuery(); + ctx.session.triggers = { topdown: true }; + return ctx.reply('Please type on which count you want to top down!'); + }); +}; diff --git a/src/bot/processor/finance.js b/src/bot/processor/finance.js new file mode 100644 index 0000000..cf0a644 --- /dev/null +++ b/src/bot/processor/finance.js @@ -0,0 +1,42 @@ +const FinanceApi = require('../../api/FinanceApi'); +const FinanceModel = require('../../models/Finance'); +const { prepareRate } = require('../../utils/data'); +const { RUB } = require('../../constants/rates'); + +const generateMessageTemplate = ( + organizations, + chosedBanks, + ignoreRates = [RUB], +) => { + const findedBanks = organizations.reduce((acc, val) => { + if (chosedBanks.includes(val.id)) { + return [...acc, val]; + } + return [...acc]; + }, []); + const preparedTemplate = findedBanks + .map(bank => { + const firstLine = `${bank.title}: \n`; + const nextLines = Object.keys(bank.currencies).reduce((acc, key) => { + const currency = bank.currencies[key]; + if (ignoreRates.includes(key)) { + return [...acc]; + } + return [ + ...acc, + `${key}: ${prepareRate(currency.ask)}/${prepareRate(currency.bid)}`, + ]; + }, []); + return firstLine + nextLines.join('\n'); + }) + .join('\n\n'); + return preparedTemplate.length ? preparedTemplate : 'No one banks found!'; +}; + +const getAndSaveFinanceData = async () => { + const financeApi = new FinanceApi(); + const data = await financeApi.getData(); + await FinanceModel.save(data); +}; + +module.exports = { getAndSaveFinanceData, generateMessageTemplate }; diff --git a/src/bot/processor/providers.js b/src/bot/processor/providers.js new file mode 100644 index 0000000..3eee0c0 --- /dev/null +++ b/src/bot/processor/providers.js @@ -0,0 +1,25 @@ +const Markup = require('telegraf/markup'); +const { capitalize } = require('lodash'); +const UserModel = require('../../models/Users'); + +const chooseExistedProviders = async (ctx, callbackMessage, prefix) => { + const userModel = new UserModel(); + const user = await userModel.get(ctx.update.message.from.id); + const existedSubscriptions = Object.keys(user.subscriptions).filter( + key => user.subscriptions[key].enabled, + ); + if (existedSubscriptions.length) { + return ctx.reply( + callbackMessage, + Markup.inlineKeyboard([ + existedSubscriptions.map(value => + Markup.callbackButton(capitalize(value), `${value}:${prefix}`), + ), + ]).extra(), + ); + } + return ctx.reply( + 'You did not chose any providers! Please go to "🗄 Providers" menu or /providers', + ); +}; +module.exports = { chooseExistedProviders }; diff --git a/src/bot/utils/addMenus.js b/src/bot/utils/addMenus.js new file mode 100644 index 0000000..a063da0 --- /dev/null +++ b/src/bot/utils/addMenus.js @@ -0,0 +1,16 @@ +const fs = require('fs'); +const path = require('path'); + +const MENUS_DIR = path.resolve(__dirname, '../menu'); + +module.exports = async bot => { + const data = fs.readdirSync(MENUS_DIR); + data.forEach(file => { + try { + const menu = require(path.resolve(MENUS_DIR, file)); + menu(bot); + } catch (e) { + console.error(e); + } + }); +}; diff --git a/src/bot/utils/common.js b/src/bot/utils/common.js new file mode 100644 index 0000000..02ad356 --- /dev/null +++ b/src/bot/utils/common.js @@ -0,0 +1,11 @@ +const { get } = require('lodash'); + +const getUserId = ctx => get(ctx, 'message.id'); + +const getCallbackUserId = ctx => get(ctx, 'update.callback_query.from.id'); + +const getPattern = ctx => get(ctx, 'match.input', '').split(':'); + +const createArray = num => new Array(num).fill(null); + +module.exports = { getUserId, getCallbackUserId, createArray, getPattern }; diff --git a/src/bot/utils/data.js b/src/bot/utils/data.js new file mode 100644 index 0000000..58ca1d9 --- /dev/null +++ b/src/bot/utils/data.js @@ -0,0 +1,9 @@ +const transformBankData = (bankData, user, provider) => { + return Object.values(bankData).map(value => ({ + title: value.title, + id: value.id, + enabled: user.subscriptions[provider].banks.includes(value.id), + })); +}; + +module.exports = { transformBankData }; diff --git a/src/bot/utils/inline.js b/src/bot/utils/inline.js new file mode 100644 index 0000000..e69de29 diff --git a/src/bot/utils/middlewares/index.js b/src/bot/utils/middlewares/index.js new file mode 100644 index 0000000..cc0d32b --- /dev/null +++ b/src/bot/utils/middlewares/index.js @@ -0,0 +1,19 @@ +const session = require('telegraf/session'); +const { get } = require('lodash'); +const logger = require('./logger/tlogger'); + +module.exports = bot => { + // bot.use(logger()); + bot.use(session()); + bot.use(async (ctx, next) => { + if (get(ctx, 'message.from.id')) { + ctx.state.userId = ctx.message.from.id; + } + ctx.session.triggers = ctx.session.triggers || {}; + ctx.session.bankPage = ctx.session.bankPage || 1; + await next(); + }); + bot.catch(ctx => { + console.error(ctx); + }); +}; diff --git a/src/bot/utils/middlewares/logger/log4js.js b/src/bot/utils/middlewares/logger/log4js.js new file mode 100644 index 0000000..5e0756e --- /dev/null +++ b/src/bot/utils/middlewares/logger/log4js.js @@ -0,0 +1,10 @@ +const { configure, getLogger } = require('log4js'); + +configure({ + appenders: { cheese: { type: 'file', filename: 'cheese.log' } }, + categories: { default: { appenders: ['cheese'], level: 'error' } }, +}); + +const logger = getLogger('Exchange rate'); + +module.exports = { logger }; diff --git a/src/bot/utils/middlewares/logger/tlogger.js b/src/bot/utils/middlewares/logger/tlogger.js new file mode 100644 index 0000000..e747d63 --- /dev/null +++ b/src/bot/utils/middlewares/logger/tlogger.js @@ -0,0 +1,3 @@ +const Telegraf = require('telegraf'); + +module.exports = () => Telegraf.log(); diff --git a/src/config/env.js b/src/config/env.js index 76d04c1..9abe5b9 100644 --- a/src/config/env.js +++ b/src/config/env.js @@ -1,5 +1,7 @@ -require("dotenv").config(); +require('dotenv').config(); module.exports = { - TOKEN: process.env.TOKEN + DEBUG: process.env.DEBUG, + TOKEN: process.env.TOKEN, + MINFIN_KEY: process.env.MINFIN_KEY, }; diff --git a/src/config/firebaseKey.example.json b/src/config/firebaseKey.example.json new file mode 100644 index 0000000..ce5348c --- /dev/null +++ b/src/config/firebaseKey.example.json @@ -0,0 +1,12 @@ +{ + "type": "service_account", + "project_id": "exchange-bot-babd5", + "private_key_id": "private_key_id", + "private_key": "privateKey", + "client_email": "firebase-adminsdk-rkydu@exchange-bot-babd5.iam.gserviceaccount.com", + "client_id": "client_id", + "auth_uri": "https://accounts.google.com/o/oauth2/auth", + "token_uri": "https://oauth2.googleapis.com/token", + "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", + "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/firebase-adminsdk-rkydu%40exchange-bot-babd5.iam.gserviceaccount.com" +} diff --git a/src/constants/api.js b/src/constants/api.js new file mode 100644 index 0000000..cc8c07a --- /dev/null +++ b/src/constants/api.js @@ -0,0 +1,3 @@ +const FINANCE_API = 'http://resources.finance.ua/ru/public/currency-cash.json'; + +module.exports = { FINANCE_API }; diff --git a/src/constants/models.js b/src/constants/models.js new file mode 100644 index 0000000..b171c34 --- /dev/null +++ b/src/constants/models.js @@ -0,0 +1,9 @@ +const USERS = 'users'; +const EXCHANGE_RATES_MINFIN = 'exchange-rates-minfin'; +const EXCHANGE_RATES_FINANCE_UA = 'exchange-rates-finance-ua'; + +module.exports = { + USERS, + EXCHANGE_RATES_MINFIN, + EXCHANGE_RATES_FINANCE_UA, +}; diff --git a/src/constants/rates.js b/src/constants/rates.js new file mode 100644 index 0000000..ef62fe4 --- /dev/null +++ b/src/constants/rates.js @@ -0,0 +1,5 @@ +const USD = 'USD'; +const RUB = 'RUB'; +const UAH = 'UAH'; + +module.exports = { USD, RUB, UAH }; diff --git a/src/constants/timer.js b/src/constants/timer.js new file mode 100644 index 0000000..cffcf13 --- /dev/null +++ b/src/constants/timer.js @@ -0,0 +1,4 @@ +const DAY = 86400000; +const HALF_DAY = 43200000; + +module.exports = { DAY, HALF_DAY }; diff --git a/src/index.js b/src/index.js index f55c678..cdf64b2 100644 --- a/src/index.js +++ b/src/index.js @@ -1,8 +1,13 @@ -const got = require('got'); -const AWS = require('aws-sdk'); -const TelegramExecutor = require('./bot'); +const { execute } = require('./bot/bot'); +const RatesScheduller = require('./utils/scheduler/RatesScheduler'); -(async () => { - const botInstance = new TelegramExecutor(); - await botInstance.execute(); -})(); +const start = async () => { + execute(); + RatesScheduller.scheduleFinanceJob(); + // RatesScheduller.scheduleMinfinJob(); +}; +start() + .then(() => console.log('Telegram bot started!')) + .catch(e => { + // console.error(e); + }); diff --git a/src/models/Base.js b/src/models/Base.js new file mode 100644 index 0000000..d49de35 --- /dev/null +++ b/src/models/Base.js @@ -0,0 +1,50 @@ +const { v4: uuid } = require('uuid'); +const firestore = require('../utils/firestore'); + +class BaseModel { + constructor({ name }) { + this.name = name; + this.collection = firestore.collection(this.name); + } + + async getLatestBankById(id) { + const latest = await this.getLatest(); + return latest.organizations.find(bank => bank.id === id); + } + + async getLatest() { + const data = await this.collection + .limit(1) + .orderBy('date', 'desc') + .get(); + if (!data.size) { + throw new Error('No such document!'); + } else { + const result = []; + data.forEach(value => result.push(value.data())); + return result[0]; + } + } + + async getAll() { + return this.collection.get(); + } + + async get(id) { + const doc = await this.collection.doc(`${id}`).get(); + if (!doc.exists) { + throw new Error('No such document!'); + } else { + return doc.data(); + } + } + + async update(id, data) { + return this.collection.doc(`${id}`).update(data); + } + + async save(data) { + return this.collection.doc(uuid()).set(data); + } +} +module.exports = BaseModel; diff --git a/src/models/Finance.js b/src/models/Finance.js new file mode 100644 index 0000000..5456c52 --- /dev/null +++ b/src/models/Finance.js @@ -0,0 +1,9 @@ +const BaseModel = require('./Base'); +const { EXCHANGE_RATES_FINANCE_UA } = require('../constants/models'); + +class FinanceModel extends BaseModel { + constructor() { + super({ name: EXCHANGE_RATES_FINANCE_UA }); + } +} +module.exports = FinanceModel; diff --git a/src/models/Minfin.js b/src/models/Minfin.js new file mode 100644 index 0000000..1d3610e --- /dev/null +++ b/src/models/Minfin.js @@ -0,0 +1,13 @@ +const BaseModel = require('./Base'); +const { EXCHANGE_RATES_MINFIN } = require('../constants/models'); + +class MinfinModel extends BaseModel { + constructor() { + super({ name: EXCHANGE_RATES_MINFIN }); + } + + async save(data) { + this.save({ rates: data }); + } +} +module.exports = MinfinModel; diff --git a/src/models/Users.js b/src/models/Users.js new file mode 100644 index 0000000..60a1eae --- /dev/null +++ b/src/models/Users.js @@ -0,0 +1,23 @@ +const BaseModel = require('./Base'); +const { USERS } = require('../constants/models'); + +class UsersModel extends BaseModel { + constructor() { + super({ name: USERS }); + } + + async save(id, data) { + const modData = { + ...data, + subscriptions: { + minfin: { enabled: false, banks: [] }, + finance: { enabled: false, banks: [] }, + }, + wallet: { + balance: 0, + }, + }; + return this.collection.doc(id).set(modData); + } +} +module.exports = UsersModel; diff --git a/src/utils/aws/dynamo.js b/src/utils/aws/dynamo.js index 0a7b6e2..8ddc6b0 100644 --- a/src/utils/aws/dynamo.js +++ b/src/utils/aws/dynamo.js @@ -7,61 +7,61 @@ class DynamoDatabase { constructor() { this.dynamodb = new AWS.DynamoDB({ region: 'us-east-2', - apiVersion: '2012-08-10' + apiVersion: '2012-08-10', }); } - async listTables() { - return this.dynamodb.listTables({}).promise(); - } - async scan() { - var params = { - TableName: tableName - }; - this.dynamodb.scan(params, function(err, data) { - if (err) { - console.log('Error', err); - } else { - console.log('Success', data.Items); - } - }); - } + // async listTables() { + // return this.dynamodb.listTables({}).promise(); + // } - async get() { - var params = { - TableName: tableName, - KeyConditionExpression: 'CUSTOMER_ID = :i' - // ExpressionAttributeValues: [(':i': ['2'])] - }; - this.dynamodb.query(params, function(err, data) { - if (err) { - console.log('Error', err); - } else { - console.log('Success', data.Items); - } - }); - } + // async scan() { + // var params = { + // TableName: tableName, + // }; + // this.dynamodb.scan(params, function(err, data) { + // if (err) { + // console.log('Error', err); + // } else { + // console.log('Success', data.Items); + // } + // }); + // } - async getItem() { - var params = { - TableName: tableName, - Key: { - 123: {} - }, - ProjectionExpression: 'integer' - }; - this.dynamodb.getItem(params, function(err, data) { - if (err) { - console.log('Error', err); - } else { - console.log('Success', data.Item); - } - }); - } + // async get() { + // var params = { + // TableName: tableName, + // KeyConditionExpression: 'CUSTOMER_ID = :i', + // // ExpressionAttributeValues: [(':i': ['2'])] + // }; + // this.dynamodb.query(params, function(err, data) { + // if (err) { + // console.log('Error', err); + // } else { + // console.log('Success', data.Items); + // } + // }); + // } + + // async getItem() { + // var params = { + // TableName: tableName, + // Key: { + // 123: {}, + // }, + // ProjectionExpression: 'integer', + // }; + // this.dynamodb.getItem(params, function(err, data) { + // if (err) { + // console.log('Error', err); + // } else { + // console.log('Success', data.Item); + // } + // }); + // } async putItem(data) { const getType = type => { - // console.log(type); switch (type) { case 'string': return 'S'; @@ -77,66 +77,64 @@ class DynamoDatabase { const preparedData = Object.keys(data).reduce((acc, key) => { return { ...acc, - [key]: { [getType(typeof data[key])]: String(data[key]) } + [key]: { [getType(typeof data[key])]: String(data[key]) }, }; }, {}); - console.log(preparedData); const params = { TableName: tableName, Item: { 'exchane-rates-ukraine-bot-primary-key': { S: uuid() }, - ...preparedData + ...preparedData, }, - ReturnValues: 'NONE' + ReturnValues: 'NONE', }; try { - const data = await this.dynamodb.putItem(params).promise(); - console.log(data); + await this.dynamodb.putItem(params).promise(); } catch (e) { throw new Error(e); } } - async deleteItem() { - var params = { - TableName: tableName, - Key: { - KEY_NAME: { N: 'VALUE' } - } - }; - this.dynamodb.deleteItem(params, function(err, data) { - if (err) { - console.log('Error', err); - } else { - console.log('Success', data); - } - }); - } - async batchGetItem() { - var params = { - RequestItems: { - TABLE_NAME: { - Keys: [ - { KEY_NAME: { N: 'KEY_VALUE_1' } }, - { KEY_NAME: { N: 'KEY_VALUE_2' } }, - { KEY_NAME: { N: 'KEY_VALUE_3' } } - ], - ProjectionExpression: 'KEY_NAME, ATTRIBUTE' - } - } - }; + // async deleteItem() { + // var params = { + // TableName: tableName, + // Key: { + // KEY_NAME: { N: 'VALUE' }, + // }, + // }; + // this.dynamodb.deleteItem(params, function(err, data) { + // if (err) { + // console.log('Error', err); + // } else { + // console.log('Success', data); + // } + // }); + // } + // async batchGetItem() { + // const params = { + // RequestItems: { + // TABLE_NAME: { + // Keys: [ + // { KEY_NAME: { N: 'KEY_VALUE_1' } }, + // { KEY_NAME: { N: 'KEY_VALUE_2' } }, + // { KEY_NAME: { N: 'KEY_VALUE_3' } }, + // ], + // ProjectionExpression: 'KEY_NAME, ATTRIBUTE', + // }, + // }, + // }; - this.dynamodb.batchGetItem(params, function(err, data) { - if (err) { - console.log('Error', err); - } else { - data.Responses.TABLE_NAME.forEach(function(element, index, array) { - console.log(element); - }); - } - }); - } + // this.dynamodb.batchGetItem(params, (err, data) => { + // if (err) { + // console.log('Error', err); + // } else { + // data.Responses.TABLE_NAME.forEach(function(element, index, array) { + // console.log(element); + // }); + // } + // }); + // } } module.exports = DynamoDatabase; diff --git a/src/utils/data.js b/src/utils/data.js new file mode 100644 index 0000000..48a8f5c --- /dev/null +++ b/src/utils/data.js @@ -0,0 +1,2 @@ +const prepareRate = rate => parseInt(rate, 10).toFixed(2); +module.exports = { prepareRate }; diff --git a/src/utils/firestore.js b/src/utils/firestore.js new file mode 100644 index 0000000..5191f6c --- /dev/null +++ b/src/utils/firestore.js @@ -0,0 +1,11 @@ +const admin = require('firebase-admin'); + +const serviceAccount = require('../config/firebaseKey.json'); + +admin.initializeApp({ + credential: admin.credential.cert(serviceAccount), +}); + +const db = admin.firestore(); + +module.exports = db; diff --git a/src/utils/scheduler/RatesScheduler.js b/src/utils/scheduler/RatesScheduler.js new file mode 100644 index 0000000..be84fac --- /dev/null +++ b/src/utils/scheduler/RatesScheduler.js @@ -0,0 +1,28 @@ +const MinfinApi = require('../../api/MinfinApi'); +const FinanceApi = require('../../api/FinanceApi'); +const MinfinModel = require('../../models/Minfin'); +const FinanceModel = require('../../models/Finance'); +const { logger } = require('../../bot/utils/middlewares/logger/log4js'); +const { HALF_DAY, DAY } = require('../../constants/timer'); + +class RatesScheduller { + static scheduleFinanceJob() { + setInterval(async () => { + logger.info('Saving finance data'); + const financeInstance = new FinanceApi(); + const data = await financeInstance.getData(); + await FinanceModel.save(data); + }, HALF_DAY); + } + + static scheduleMinfinJob() { + setInterval(async () => { + logger.info('Saving minfin data'); + const minfinApi = new MinfinApi(); + const data = await minfinApi.getData(); + await MinfinModel.save(data); + }, DAY); + } +} + +module.exports = RatesScheduller;