diff --git a/.gitignore b/.gitignore index 7301d63..ba1c226 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,4 @@ npm-debug.log* *.dump *.sh *.ignore +*.log diff --git a/package-lock.json b/package-lock.json index 6f69108..22368ba 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,7 +5,6 @@ "requires": true, "packages": { "": { - "name": "vent-taskrouter", "version": "1.0.0", "license": "MIT", "dependencies": { @@ -23,11 +22,11 @@ "passport": "^0.6.0", "passport-local": "^1.0.0", "path": "^0.12.7", - "pg": "^7.11.0", + "pg": "^8.7.3", "pug": "^3.0.1", "querystring": "^0.2.0", "request": "^2.88.2", - "sequelize": "^5.21.1", + "sequelize": "^6.20.1", "swagger-jsdoc": "^6.2.5", "swagger-ui-express": "^4.5.0", "tonegenerator": "^0.3.2", @@ -90,17 +89,17 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", - "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.18.13", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.13.tgz", - "integrity": "sha512-dgXcIfMuQ0kgzLB2b9tRZs7TTFFaGM2AbtA4fJgUUYukzGH4jwsS7hzQHEGs67jdehpm22vkgKwvbU+aEflgwg==", + "version": "7.19.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.3.tgz", + "integrity": "sha512-pJ9xOlNWHiy9+FuFP09DEAFbAn4JskgRsVcc169w2xRBC3FRGuQEwjeIMMND9L2zc0iEhO/tGv4Zq+km+hxNpQ==", "bin": { "parser": "bin/babel-parser.js" }, @@ -109,12 +108,12 @@ } }, "node_modules/@babel/types": { - "version": "7.18.13", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.13.tgz", - "integrity": "sha512-ePqfTihzW0W6XAU+aMw2ykilisStJfDnsejDCXRchCcMJ4O0+8DhPXf2YUbZ6wjBlsEmZwLK/sPweWtu8hcJYQ==", + "version": "7.19.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.3.tgz", + "integrity": "sha512-hGCaQzIY22DJlDh9CH7NOxgKkFjBk0Cw9xDO1Xmh2151ti7wiGfQ3LauXzL4HP1fmFlTX6XjpRETTpUcv7wQLw==", "dependencies": { "@babel/helper-string-parser": "^7.18.10", - "@babel/helper-validator-identifier": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", "to-fast-properties": "^2.0.0" }, "engines": { @@ -126,15 +125,28 @@ "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==" }, + "node_modules/@types/debug": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz", + "integrity": "sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==", + "dependencies": { + "@types/ms": "*" + } + }, "node_modules/@types/json-schema": { "version": "7.0.11", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" }, + "node_modules/@types/ms": { + "version": "0.7.31", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", + "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==" + }, "node_modules/@types/node": { - "version": "18.7.14", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.14.tgz", - "integrity": "sha512-6bbDaETVi8oyIARulOE9qF1/Qdi/23z6emrUh0fNJRUmjznqrixD4MpGDdgOFk5Xb0m2H6Xu42JGdvAxaJR/wA==" + "version": "18.7.23", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.23.tgz", + "integrity": "sha512-DWNcCHolDq0ZKGizjx2DZjR/PqsYwAcYUJmfMWqtVU2MBMG5Mo+xFZrhGId5r/O5HOuMPyQEcM6KUBp5lBZZBg==" }, "node_modules/@types/swagger-jsdoc": { "version": "6.0.1", @@ -142,6 +154,11 @@ "integrity": "sha512-+MUpcbyxD528dECUBCEVm6abNuORdbuGjbrUdHDeAQ+rkPuo2a+L4N02WJHF3bonSSE6SJ3dUJwF2V6+cHnf0w==", "dev": true }, + "node_modules/@types/validator": { + "version": "13.7.7", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.7.7.tgz", + "integrity": "sha512-jiEw2kTUJ8Jsh4A1K4b5Pkjj9Xz6FktLLOQ36ZVLRkmxFbpTvAV2VRoKMojz8UlZxNg/2dZqzpigH4JYn1bkQg==" + }, "node_modules/abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", @@ -218,11 +235,6 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" - }, "node_modules/anymatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", @@ -336,11 +348,6 @@ "node": ">=8" } }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" - }, "node_modules/body-parser": { "version": "1.20.0", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", @@ -487,15 +494,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/cls-bluebird": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cls-bluebird/-/cls-bluebird-2.1.0.tgz", - "integrity": "sha512-XVb0RPmHQyy35Tz9z34gvtUcBKUK8A/1xkGCyeFc9B0C7Zr5SysgFaswRVdwI5NEMcO+3JKlIDGIOgERSn9NdA==", - "dependencies": { - "is-bluebird": "^1.0.2", - "shimmer": "^1.1.0" - } - }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -695,9 +693,9 @@ } }, "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" }, "node_modules/dashdash": { "version": "1.14.1", @@ -994,9 +992,9 @@ } }, "node_modules/follow-redirects": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", - "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==", + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", "funding": [ { "type": "individual", @@ -1079,9 +1077,9 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "node_modules/get-intrinsic": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", - "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", "dependencies": { "function-bind": "^1.1.1", "has": "^1.0.3", @@ -1281,9 +1279,9 @@ "dev": true }, "node_modules/inflection": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.12.0.tgz", - "integrity": "sha512-lRy4DxuIFWXlJU7ed8UiTJOSTqStqYdEb4CEbtXfNbkdj3nH1L+reUWiE10VWcJS2yR7tge8Z74pJjtBjNwj0w==", + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.13.4.tgz", + "integrity": "sha512-6I/HUDeYFfuNCVS3td055BaXBwKYuzw7K3ExVMStBowKo9oOAMJIXIHvdyR3iboTCp1b+1i5DSkIZTcwIktuDw==", "engines": [ "node >= 0.4.0" ] @@ -1322,14 +1320,6 @@ "node": ">=8" } }, - "node_modules/is-bluebird": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-bluebird/-/is-bluebird-1.0.2.tgz", - "integrity": "sha512-PDRu1vVip5dGQg5tfn2qVCCyxbBYu5MhYUJwSfL/RoGBI97n1fxvilVazxzptZW0gcmsMH17H4EVZZI5E/RSeA==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-core-module": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", @@ -1585,6 +1575,17 @@ "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -1686,16 +1687,15 @@ } }, "node_modules/nodemon": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.19.tgz", - "integrity": "sha512-4pv1f2bMDj0Eeg/MhGqxrtveeQ5/G/UVe9iO6uTZzjnRluSA4PVWf8CW99LUPwGB3eNIA7zUFoP77YuI7hOc0A==", + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.20.tgz", + "integrity": "sha512-Km2mWHKKY5GzRg6i1j5OxOHQtuvVsgskLfigG25yTtbyfRGn/GNvIbRyOf1PSCKJ2aT/58TiuUsuOU5UToVViw==", "dev": true, - "hasInstallScript": true, "dependencies": { "chokidar": "^3.5.2", "debug": "^3.2.7", "ignore-by-default": "^1.0.1", - "minimatch": "^3.0.4", + "minimatch": "^3.1.2", "pstree.remy": "^1.1.8", "semver": "^5.7.1", "simple-update-notifier": "^1.0.7", @@ -1739,9 +1739,6 @@ }, "bin": { "nopt": "bin/nopt.js" - }, - "engines": { - "node": "*" } }, "node_modules/normalize-path": { @@ -1805,9 +1802,9 @@ } }, "node_modules/openapi-types": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/openapi-types/-/openapi-types-12.0.0.tgz", - "integrity": "sha512-6Wd9k8nmGQHgCbehZCP6wwWcfXcvinhybUTBatuhjRsCxUIujuYFZc9QnGeae75CyHASewBtxs0HX/qwREReUw==", + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/openapi-types/-/openapi-types-12.0.2.tgz", + "integrity": "sha512-GuTo7FyZjOIWVhIhQSWJVaws6A82sWIGyQogxxYBYKZ0NBdyP2CYSIgOwFfSB+UVoPExk/YzFpyYitHS8KVZtA==", "peer": true }, "node_modules/packet-reader": { @@ -1897,27 +1894,35 @@ "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" }, "node_modules/pg": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/pg/-/pg-7.18.2.tgz", - "integrity": "sha512-Mvt0dGYMwvEADNKy5PMQGlzPudKcKKzJds/VbOeZJpb6f/pI3mmoXX0JksPgI3l3JPP/2Apq7F36O63J7mgveA==", + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.8.0.tgz", + "integrity": "sha512-UXYN0ziKj+AeNNP7VDMwrehpACThH7LUl/p8TDFpEUuSejCUIwGSfxpHsPvtM6/WXFy6SU4E5RG4IJV/TZAGjw==", + "license": "MIT", "dependencies": { "buffer-writer": "2.0.0", "packet-reader": "1.0.0", - "pg-connection-string": "0.1.3", - "pg-packet-stream": "^1.1.0", - "pg-pool": "^2.0.10", + "pg-connection-string": "^2.5.0", + "pg-pool": "^3.5.2", + "pg-protocol": "^1.5.0", "pg-types": "^2.1.0", - "pgpass": "1.x", - "semver": "4.3.2" + "pgpass": "1.x" }, "engines": { - "node": ">= 4.5.0" + "node": ">= 8.0.0" + }, + "peerDependencies": { + "pg-native": ">=3.0.1" + }, + "peerDependenciesMeta": { + "pg-native": { + "optional": true + } } }, "node_modules/pg-connection-string": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-0.1.3.tgz", - "integrity": "sha512-i0NV/CrSkFTaiOQs9AGy3tq0dkSjtTd4d7DfsjeDVZAA4aIHInwfFEmriNYGGJUfZ5x6IAC/QddoUpUJjQAi0w==" + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz", + "integrity": "sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==" }, "node_modules/pg-int8": { "version": "1.0.1", @@ -1927,10 +1932,18 @@ "node": ">=4.0.0" } }, - "node_modules/pg-packet-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pg-packet-stream/-/pg-packet-stream-1.1.0.tgz", - "integrity": "sha512-kRBH0tDIW/8lfnnOyTwKD23ygJ/kexQVXZs7gEyBljw4FYqimZFxnMMx50ndZ8In77QgfGuItS5LLclC2TtjYg==" + "node_modules/pg-pool": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.5.2.tgz", + "integrity": "sha512-His3Fh17Z4eg7oANLob6ZvH8xIVen3phEZh2QuyrIl4dQSDVEabNducv6ysROKpDNPSD+12tONZVWfSgMvDD9w==", + "peerDependencies": { + "pg": ">=8.0" + } + }, + "node_modules/pg-protocol": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.5.0.tgz", + "integrity": "sha512-muRttij7H8TqRNu/DxrAJQITO4Ac7RmX3Klyr/9mJEOBeIpgnF8f9jAfRz5d3XwQZl5qBjF9gLsUtMPJE0vezQ==" }, "node_modules/pg-types": { "version": "2.2.0", @@ -1947,22 +1960,6 @@ "node": ">=4" } }, - "node_modules/pg/node_modules/pg-pool": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-2.0.10.tgz", - "integrity": "sha512-qdwzY92bHf3nwzIUcj+zJ0Qo5lpG/YxchahxIN8+ZVmXqkahKXsnl2aiJPHLYN9o5mB/leG+Xh6XKxtP7e0sjg==", - "peerDependencies": { - "pg": ">5.0" - } - }, - "node_modules/pg/node_modules/semver": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.2.tgz", - "integrity": "sha512-VyFUffiBx8hABJ9HYSTXLRwyZtdDHMzMtFmID1aiNAD2BZppBmJm0Hqw3p2jkgxP9BNt1pQ9RnC49P0EcXf6cA==", - "bin": { - "semver": "bin/semver" - } - }, "node_modules/pgpass": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", @@ -2066,6 +2063,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/pug/-/pug-3.0.2.tgz", "integrity": "sha512-bp0I/hiK1D1vChHh6EfDxtndHji55XP/ZJKwsRqrz6lRia6ZC2OZbdAymlxdVFwd1L70ebrVJw4/eZ79skrIaw==", + "license": "MIT", "dependencies": { "pug-code-gen": "^3.0.2", "pug-filters": "^4.0.0", @@ -2211,6 +2209,7 @@ "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.1.tgz", "integrity": "sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg==", "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", + "license": "MIT", "engines": { "node": ">=0.4.x" } @@ -2334,12 +2333,9 @@ } }, "node_modules/retry-as-promised": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-3.2.0.tgz", - "integrity": "sha512-CybGs60B7oYU/qSQ6kuaFmRd9sTZ6oXSc0toqePvV74Ac6/IFZSI1ReFQmtCN+uvW1Mtqdwpvt/LGOiCBAY2Mg==", - "dependencies": { - "any-promise": "^1.3.0" - } + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-6.1.0.tgz", + "integrity": "sha512-Hj/jY+wFC+SB9SDlIIFWiGOHnNG0swYbGYsOj2BJ8u2HKUaobNKab0OIC0zOLYzDy0mb7A4xA5BMo4LMz5YtEA==" }, "node_modules/rootpath": { "version": "0.1.2", @@ -2398,37 +2394,73 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/sequelize": { - "version": "5.22.5", - "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-5.22.5.tgz", - "integrity": "sha512-ySIHof18sJbeVG4zjEvsDL490cd9S14/IhkCrZR/g0C/FPlZq1AzEJVeSAo++9/sgJH2eERltAIGqYQNgVqX/A==", - "deprecated": "Please update to v6 or higher! A migration guide can be found here: https://sequelize.org/v6/manual/upgrade-to-v6.html", - "dependencies": { - "bluebird": "^3.5.0", - "cls-bluebird": "^2.1.0", - "debug": "^4.1.1", - "dottie": "^2.0.0", - "inflection": "1.12.0", - "lodash": "^4.17.15", - "moment": "^2.24.0", - "moment-timezone": "^0.5.21", - "retry-as-promised": "^3.2.0", - "semver": "^6.3.0", - "sequelize-pool": "^2.3.0", + "version": "6.23.2", + "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.23.2.tgz", + "integrity": "sha512-0jy5pkRV7LZlBArIrYKfpKa+DowC+fIcI6LrWDfvdqFmuXZfmS4qq8gzFmIu0C210ts2Mmw/dghzRhX73xPoMg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/sequelize" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.1.7", + "@types/validator": "^13.7.1", + "debug": "^4.3.3", + "dottie": "^2.0.2", + "inflection": "^1.13.2", + "lodash": "^4.17.21", + "moment": "^2.29.1", + "moment-timezone": "^0.5.34", + "pg-connection-string": "^2.5.0", + "retry-as-promised": "^6.1.0", + "semver": "^7.3.5", + "sequelize-pool": "^7.1.0", "toposort-class": "^1.0.1", "uuid": "^8.3.2", "validator": "^13.7.0", - "wkx": "^0.4.8" + "wkx": "^0.5.0" }, "engines": { - "node": ">=6.0.0" + "node": ">=10.0.0" + }, + "peerDependenciesMeta": { + "ibm_db": { + "optional": true + }, + "mariadb": { + "optional": true + }, + "mysql2": { + "optional": true + }, + "oracledb": { + "optional": true + }, + "pg": { + "optional": true + }, + "pg-hstore": { + "optional": true + }, + "snowflake-sdk": { + "optional": true + }, + "sqlite3": { + "optional": true + }, + "tedious": { + "optional": true + } } }, "node_modules/sequelize-pool": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/sequelize-pool/-/sequelize-pool-2.3.0.tgz", - "integrity": "sha512-Ibz08vnXvkZ8LJTiUOxRcj1Ckdn7qafNZ2t59jYHMX1VIebTAOYefWdRYFt6z6+hy52WGthAHAoLc9hvk3onqA==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/sequelize-pool/-/sequelize-pool-7.1.0.tgz", + "integrity": "sha512-G9c0qlIWQSK29pR/5U2JF5dDQeqqHRragoyahj/Nx4KOOQ3CPPfzxnfqFPCSB7x5UgjOgnZ61nSxz+fjDpRlJg==", "engines": { - "node": ">= 6.0.0" + "node": ">= 10.0.0" } }, "node_modules/sequelize/node_modules/debug": { @@ -2453,11 +2485,17 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/sequelize/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dependencies": { + "lru-cache": "^6.0.0" + }, "bin": { "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, "node_modules/sequelize/node_modules/uuid": { @@ -2487,11 +2525,6 @@ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, - "node_modules/shimmer": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz", - "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==" - }, "node_modules/side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", @@ -2549,11 +2582,6 @@ "safer-buffer": "^2.0.2", "tweetnacl": "~0.14.0" }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" - }, "engines": { "node": ">=0.10.0" } @@ -2633,9 +2661,9 @@ } }, "node_modules/swagger-ui-dist": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-4.14.0.tgz", - "integrity": "sha512-TBzhheU15s+o54Cgk9qxuYcZMiqSm/SkvKnapoGHOF66kz0Y5aGjpzj5BT/vpBbn6rTPJ9tUYXQxuDWfsjiGMw==" + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-4.14.2.tgz", + "integrity": "sha512-kOIU7Ts3TrXDLb3/c9jRe4qGp8O3bRT19FFJA8wJfrRFkcK/4atPn3krhtBVJ57ZkNNofworXHxuYwmaisXBdg==" }, "node_modules/swagger-ui-express": { "version": "4.5.0", @@ -2743,9 +2771,9 @@ "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" }, "node_modules/twilio": { - "version": "3.81.0", - "resolved": "https://registry.npmjs.org/twilio/-/twilio-3.81.0.tgz", - "integrity": "sha512-ipeYAhAxD0ql/1Jq0DfTm1SvU+kdGcS+JJEbfWuCOG5vyyiB6C4nlLGR/tdojZDwuP7Dxf4TZ+oFE+6FL8c3Aw==", + "version": "3.82.1", + "resolved": "https://registry.npmjs.org/twilio/-/twilio-3.82.1.tgz", + "integrity": "sha512-3OIFYUjd0g25x2uZbCqsuT1o5r1r9o2/VDYcl1s+WS6323wxm/dvcMfAlMnLx0+YfG2XB7XS3u7BWZGNJoxtGA==", "dependencies": { "axios": "^0.26.1", "dayjs": "^1.8.29", @@ -2876,11 +2904,6 @@ "extsprintf": "^1.2.0" } }, - "node_modules/verror/node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" - }, "node_modules/void-elements": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", @@ -2921,9 +2944,9 @@ } }, "node_modules/wkx": { - "version": "0.4.8", - "resolved": "https://registry.npmjs.org/wkx/-/wkx-0.4.8.tgz", - "integrity": "sha512-ikPXMM9IR/gy/LwiOSqWlSL3X/J5uk9EO2hHNRXS41eTLXaUFEVw9fn/593jW/tE5tedNg8YjT5HkCa4FqQZyQ==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/wkx/-/wkx-0.5.0.tgz", + "integrity": "sha512-Xng/d4Ichh8uN4l0FToV/258EjMGU9MGcA0HV2d9B/ZpZB3lqQm7nkOdZdm5GhKtLLhAE7PiVQwN4eN+2YJJUg==", "dependencies": { "@types/node": "*" } @@ -2949,6 +2972,11 @@ "node": ">=0.4" } }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, "node_modules/yaml": { "version": "2.0.0-1", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.0.0-1.tgz", @@ -3024,22 +3052,22 @@ "integrity": "sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==" }, "@babel/helper-validator-identifier": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", - "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==" + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==" }, "@babel/parser": { - "version": "7.18.13", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.13.tgz", - "integrity": "sha512-dgXcIfMuQ0kgzLB2b9tRZs7TTFFaGM2AbtA4fJgUUYukzGH4jwsS7hzQHEGs67jdehpm22vkgKwvbU+aEflgwg==" + "version": "7.19.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.3.tgz", + "integrity": "sha512-pJ9xOlNWHiy9+FuFP09DEAFbAn4JskgRsVcc169w2xRBC3FRGuQEwjeIMMND9L2zc0iEhO/tGv4Zq+km+hxNpQ==" }, "@babel/types": { - "version": "7.18.13", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.13.tgz", - "integrity": "sha512-ePqfTihzW0W6XAU+aMw2ykilisStJfDnsejDCXRchCcMJ4O0+8DhPXf2YUbZ6wjBlsEmZwLK/sPweWtu8hcJYQ==", + "version": "7.19.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.3.tgz", + "integrity": "sha512-hGCaQzIY22DJlDh9CH7NOxgKkFjBk0Cw9xDO1Xmh2151ti7wiGfQ3LauXzL4HP1fmFlTX6XjpRETTpUcv7wQLw==", "requires": { "@babel/helper-string-parser": "^7.18.10", - "@babel/helper-validator-identifier": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", "to-fast-properties": "^2.0.0" } }, @@ -3048,15 +3076,28 @@ "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==" }, + "@types/debug": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz", + "integrity": "sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==", + "requires": { + "@types/ms": "*" + } + }, "@types/json-schema": { "version": "7.0.11", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" }, + "@types/ms": { + "version": "0.7.31", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", + "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==" + }, "@types/node": { - "version": "18.7.14", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.14.tgz", - "integrity": "sha512-6bbDaETVi8oyIARulOE9qF1/Qdi/23z6emrUh0fNJRUmjznqrixD4MpGDdgOFk5Xb0m2H6Xu42JGdvAxaJR/wA==" + "version": "18.7.23", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.23.tgz", + "integrity": "sha512-DWNcCHolDq0ZKGizjx2DZjR/PqsYwAcYUJmfMWqtVU2MBMG5Mo+xFZrhGId5r/O5HOuMPyQEcM6KUBp5lBZZBg==" }, "@types/swagger-jsdoc": { "version": "6.0.1", @@ -3064,6 +3105,11 @@ "integrity": "sha512-+MUpcbyxD528dECUBCEVm6abNuORdbuGjbrUdHDeAQ+rkPuo2a+L4N02WJHF3bonSSE6SJ3dUJwF2V6+cHnf0w==", "dev": true }, + "@types/validator": { + "version": "13.7.7", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.7.7.tgz", + "integrity": "sha512-jiEw2kTUJ8Jsh4A1K4b5Pkjj9Xz6FktLLOQ36ZVLRkmxFbpTvAV2VRoKMojz8UlZxNg/2dZqzpigH4JYn1bkQg==" + }, "abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", @@ -3118,11 +3164,6 @@ "uri-js": "^4.2.2" } }, - "any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" - }, "anymatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", @@ -3221,11 +3262,6 @@ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" - }, "body-parser": { "version": "1.20.0", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", @@ -3345,15 +3381,6 @@ "readdirp": "~3.6.0" } }, - "cls-bluebird": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cls-bluebird/-/cls-bluebird-2.1.0.tgz", - "integrity": "sha512-XVb0RPmHQyy35Tz9z34gvtUcBKUK8A/1xkGCyeFc9B0C7Zr5SysgFaswRVdwI5NEMcO+3JKlIDGIOgERSn9NdA==", - "requires": { - "is-bluebird": "^1.0.2", - "shimmer": "^1.1.0" - } - }, "combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -3495,9 +3522,9 @@ } }, "core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" }, "dashdash": { "version": "1.14.1", @@ -3721,9 +3748,9 @@ } }, "follow-redirects": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", - "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==" + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" }, "forever-agent": { "version": "0.6.1", @@ -3773,9 +3800,9 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "get-intrinsic": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", - "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", "requires": { "function-bind": "^1.1.1", "has": "^1.0.3", @@ -3919,9 +3946,9 @@ "dev": true }, "inflection": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.12.0.tgz", - "integrity": "sha512-lRy4DxuIFWXlJU7ed8UiTJOSTqStqYdEb4CEbtXfNbkdj3nH1L+reUWiE10VWcJS2yR7tge8Z74pJjtBjNwj0w==" + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.13.4.tgz", + "integrity": "sha512-6I/HUDeYFfuNCVS3td055BaXBwKYuzw7K3ExVMStBowKo9oOAMJIXIHvdyR3iboTCp1b+1i5DSkIZTcwIktuDw==" }, "inflight": { "version": "1.0.6", @@ -3951,11 +3978,6 @@ "binary-extensions": "^2.0.0" } }, - "is-bluebird": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-bluebird/-/is-bluebird-1.0.2.tgz", - "integrity": "sha512-PDRu1vVip5dGQg5tfn2qVCCyxbBYu5MhYUJwSfL/RoGBI97n1fxvilVazxzptZW0gcmsMH17H4EVZZI5E/RSeA==" - }, "is-core-module": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", @@ -4182,6 +4204,14 @@ "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -4253,15 +4283,15 @@ "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" }, "nodemon": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.19.tgz", - "integrity": "sha512-4pv1f2bMDj0Eeg/MhGqxrtveeQ5/G/UVe9iO6uTZzjnRluSA4PVWf8CW99LUPwGB3eNIA7zUFoP77YuI7hOc0A==", + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.20.tgz", + "integrity": "sha512-Km2mWHKKY5GzRg6i1j5OxOHQtuvVsgskLfigG25yTtbyfRGn/GNvIbRyOf1PSCKJ2aT/58TiuUsuOU5UToVViw==", "dev": true, "requires": { "chokidar": "^3.5.2", "debug": "^3.2.7", "ignore-by-default": "^1.0.1", - "minimatch": "^3.0.4", + "minimatch": "^3.1.2", "pstree.remy": "^1.1.8", "semver": "^5.7.1", "simple-update-notifier": "^1.0.7", @@ -4339,9 +4369,9 @@ } }, "openapi-types": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/openapi-types/-/openapi-types-12.0.0.tgz", - "integrity": "sha512-6Wd9k8nmGQHgCbehZCP6wwWcfXcvinhybUTBatuhjRsCxUIujuYFZc9QnGeae75CyHASewBtxs0HX/qwREReUw==", + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/openapi-types/-/openapi-types-12.0.2.tgz", + "integrity": "sha512-GuTo7FyZjOIWVhIhQSWJVaws6A82sWIGyQogxxYBYKZ0NBdyP2CYSIgOwFfSB+UVoPExk/YzFpyYitHS8KVZtA==", "peer": true }, "packet-reader": { @@ -4412,47 +4442,39 @@ "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" }, "pg": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/pg/-/pg-7.18.2.tgz", - "integrity": "sha512-Mvt0dGYMwvEADNKy5PMQGlzPudKcKKzJds/VbOeZJpb6f/pI3mmoXX0JksPgI3l3JPP/2Apq7F36O63J7mgveA==", + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.8.0.tgz", + "integrity": "sha512-UXYN0ziKj+AeNNP7VDMwrehpACThH7LUl/p8TDFpEUuSejCUIwGSfxpHsPvtM6/WXFy6SU4E5RG4IJV/TZAGjw==", "requires": { "buffer-writer": "2.0.0", "packet-reader": "1.0.0", - "pg-connection-string": "0.1.3", - "pg-packet-stream": "^1.1.0", - "pg-pool": "^2.0.10", + "pg-connection-string": "^2.5.0", + "pg-pool": "^3.5.2", + "pg-protocol": "^1.5.0", "pg-types": "^2.1.0", - "pgpass": "1.x", - "semver": "4.3.2" - }, - "dependencies": { - "pg-pool": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-2.0.10.tgz", - "integrity": "sha512-qdwzY92bHf3nwzIUcj+zJ0Qo5lpG/YxchahxIN8+ZVmXqkahKXsnl2aiJPHLYN9o5mB/leG+Xh6XKxtP7e0sjg==", - "requires": {} - }, - "semver": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.2.tgz", - "integrity": "sha512-VyFUffiBx8hABJ9HYSTXLRwyZtdDHMzMtFmID1aiNAD2BZppBmJm0Hqw3p2jkgxP9BNt1pQ9RnC49P0EcXf6cA==" - } + "pgpass": "1.x" } }, "pg-connection-string": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-0.1.3.tgz", - "integrity": "sha512-i0NV/CrSkFTaiOQs9AGy3tq0dkSjtTd4d7DfsjeDVZAA4aIHInwfFEmriNYGGJUfZ5x6IAC/QddoUpUJjQAi0w==" + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz", + "integrity": "sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==" }, "pg-int8": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==" }, - "pg-packet-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pg-packet-stream/-/pg-packet-stream-1.1.0.tgz", - "integrity": "sha512-kRBH0tDIW/8lfnnOyTwKD23ygJ/kexQVXZs7gEyBljw4FYqimZFxnMMx50ndZ8In77QgfGuItS5LLclC2TtjYg==" + "pg-pool": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.5.2.tgz", + "integrity": "sha512-His3Fh17Z4eg7oANLob6ZvH8xIVen3phEZh2QuyrIl4dQSDVEabNducv6ysROKpDNPSD+12tONZVWfSgMvDD9w==", + "requires": {} + }, + "pg-protocol": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.5.0.tgz", + "integrity": "sha512-muRttij7H8TqRNu/DxrAJQITO4Ac7RmX3Klyr/9mJEOBeIpgnF8f9jAfRz5d3XwQZl5qBjF9gLsUtMPJE0vezQ==" }, "pg-types": { "version": "2.2.0", @@ -4777,12 +4799,9 @@ } }, "retry-as-promised": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-3.2.0.tgz", - "integrity": "sha512-CybGs60B7oYU/qSQ6kuaFmRd9sTZ6oXSc0toqePvV74Ac6/IFZSI1ReFQmtCN+uvW1Mtqdwpvt/LGOiCBAY2Mg==", - "requires": { - "any-promise": "^1.3.0" - } + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-6.1.0.tgz", + "integrity": "sha512-Hj/jY+wFC+SB9SDlIIFWiGOHnNG0swYbGYsOj2BJ8u2HKUaobNKab0OIC0zOLYzDy0mb7A4xA5BMo4LMz5YtEA==" }, "rootpath": { "version": "0.1.2", @@ -4837,25 +4856,26 @@ } }, "sequelize": { - "version": "5.22.5", - "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-5.22.5.tgz", - "integrity": "sha512-ySIHof18sJbeVG4zjEvsDL490cd9S14/IhkCrZR/g0C/FPlZq1AzEJVeSAo++9/sgJH2eERltAIGqYQNgVqX/A==", + "version": "6.23.2", + "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.23.2.tgz", + "integrity": "sha512-0jy5pkRV7LZlBArIrYKfpKa+DowC+fIcI6LrWDfvdqFmuXZfmS4qq8gzFmIu0C210ts2Mmw/dghzRhX73xPoMg==", "requires": { - "bluebird": "^3.5.0", - "cls-bluebird": "^2.1.0", - "debug": "^4.1.1", - "dottie": "^2.0.0", - "inflection": "1.12.0", - "lodash": "^4.17.15", - "moment": "^2.24.0", - "moment-timezone": "^0.5.21", - "retry-as-promised": "^3.2.0", - "semver": "^6.3.0", - "sequelize-pool": "^2.3.0", + "@types/debug": "^4.1.7", + "@types/validator": "^13.7.1", + "debug": "^4.3.3", + "dottie": "^2.0.2", + "inflection": "^1.13.2", + "lodash": "^4.17.21", + "moment": "^2.29.1", + "moment-timezone": "^0.5.34", + "pg-connection-string": "^2.5.0", + "retry-as-promised": "^6.1.0", + "semver": "^7.3.5", + "sequelize-pool": "^7.1.0", "toposort-class": "^1.0.1", "uuid": "^8.3.2", "validator": "^13.7.0", - "wkx": "^0.4.8" + "wkx": "^0.5.0" }, "dependencies": { "debug": { @@ -4872,9 +4892,12 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "requires": { + "lru-cache": "^6.0.0" + } }, "uuid": { "version": "8.3.2", @@ -4884,9 +4907,9 @@ } }, "sequelize-pool": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/sequelize-pool/-/sequelize-pool-2.3.0.tgz", - "integrity": "sha512-Ibz08vnXvkZ8LJTiUOxRcj1Ckdn7qafNZ2t59jYHMX1VIebTAOYefWdRYFt6z6+hy52WGthAHAoLc9hvk3onqA==" + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/sequelize-pool/-/sequelize-pool-7.1.0.tgz", + "integrity": "sha512-G9c0qlIWQSK29pR/5U2JF5dDQeqqHRragoyahj/Nx4KOOQ3CPPfzxnfqFPCSB7x5UgjOgnZ61nSxz+fjDpRlJg==" }, "serve-static": { "version": "1.15.0", @@ -4904,11 +4927,6 @@ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, - "shimmer": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz", - "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==" - }, "side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", @@ -5011,9 +5029,9 @@ } }, "swagger-ui-dist": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-4.14.0.tgz", - "integrity": "sha512-TBzhheU15s+o54Cgk9qxuYcZMiqSm/SkvKnapoGHOF66kz0Y5aGjpzj5BT/vpBbn6rTPJ9tUYXQxuDWfsjiGMw==" + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-4.14.2.tgz", + "integrity": "sha512-kOIU7Ts3TrXDLb3/c9jRe4qGp8O3bRT19FFJA8wJfrRFkcK/4atPn3krhtBVJ57ZkNNofworXHxuYwmaisXBdg==" }, "swagger-ui-express": { "version": "4.5.0", @@ -5094,9 +5112,9 @@ "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" }, "twilio": { - "version": "3.81.0", - "resolved": "https://registry.npmjs.org/twilio/-/twilio-3.81.0.tgz", - "integrity": "sha512-ipeYAhAxD0ql/1Jq0DfTm1SvU+kdGcS+JJEbfWuCOG5vyyiB6C4nlLGR/tdojZDwuP7Dxf4TZ+oFE+6FL8c3Aw==", + "version": "3.82.1", + "resolved": "https://registry.npmjs.org/twilio/-/twilio-3.82.1.tgz", + "integrity": "sha512-3OIFYUjd0g25x2uZbCqsuT1o5r1r9o2/VDYcl1s+WS6323wxm/dvcMfAlMnLx0+YfG2XB7XS3u7BWZGNJoxtGA==", "requires": { "axios": "^0.26.1", "dayjs": "^1.8.29", @@ -5199,13 +5217,6 @@ "assert-plus": "^1.0.0", "core-util-is": "1.0.2", "extsprintf": "^1.2.0" - }, - "dependencies": { - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" - } } }, "void-elements": { @@ -5242,9 +5253,9 @@ } }, "wkx": { - "version": "0.4.8", - "resolved": "https://registry.npmjs.org/wkx/-/wkx-0.4.8.tgz", - "integrity": "sha512-ikPXMM9IR/gy/LwiOSqWlSL3X/J5uk9EO2hHNRXS41eTLXaUFEVw9fn/593jW/tE5tedNg8YjT5HkCa4FqQZyQ==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/wkx/-/wkx-0.5.0.tgz", + "integrity": "sha512-Xng/d4Ichh8uN4l0FToV/258EjMGU9MGcA0HV2d9B/ZpZB3lqQm7nkOdZdm5GhKtLLhAE7PiVQwN4eN+2YJJUg==", "requires": { "@types/node": "*" } @@ -5264,6 +5275,11 @@ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, "yaml": { "version": "2.0.0-1", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.0.0-1.tgz", diff --git a/package.json b/package.json index 5ec80bf..a22d3f8 100644 --- a/package.json +++ b/package.json @@ -21,11 +21,11 @@ "passport": "^0.6.0", "passport-local": "^1.0.0", "path": "^0.12.7", - "pg": "^7.11.0", + "pg": "^8.7.3", "pug": "^3.0.1", "querystring": "^0.2.0", "request": "^2.88.2", - "sequelize": "^5.21.1", + "sequelize": "^6.20.1", "swagger-jsdoc": "^6.2.5", "swagger-ui-express": "^4.5.0", "tonegenerator": "^0.3.2", diff --git a/src/appInitializer.js b/src/appInitializer.js index ea18f58..8a2ac8c 100644 --- a/src/appInitializer.js +++ b/src/appInitializer.js @@ -25,9 +25,10 @@ class AppInitializer { app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: false })); app.use("/other_route", require("./other_route").router); - app.use(session({ secret: process.env.SESSION_SECRET })); + //todo: re-enable this session code? or outsource session management to a SaaS like firebase? + //app.use(session({ secret: process.env.SESSION_SECRET })); app.use(passport.initialize()); - app.use(passport.session()); + //app.use(passport.session()); app.use(flash()); app.use("/public", express.static(__dirname + "/public")); app.use(express.static("public")); diff --git a/src/config/database.js b/src/config/database.js index 8aa9ee5..09f9791 100644 --- a/src/config/database.js +++ b/src/config/database.js @@ -2,9 +2,7 @@ require("env2")(".env"); const Sequelize = require("sequelize"); class Database { - sequelize; - sequelize_ssl; - + constructor() { if (Database._instance) { throw new Error( @@ -26,7 +24,7 @@ class Database { try { this.sequelize.authenticate(); - console.log("Database onnection has been established successfully."); + console.log("Database connection has been established successfully."); } catch (error) { console.error("Unable to connect to the database:", error); } @@ -60,7 +58,7 @@ class Database { const attributes = JSON.parse(worker.attributes); const contact_uri = attributes.contact_uri; console.log("createWorker: now attempting sequelize insert worker"); - return sequelize.query( + return this.sequelize.query( "insert into worker (contact_uri,sid) values ('" + contact_uri + "','" + @@ -71,11 +69,11 @@ class Database { createWorkerApply(contact_uri, friendlyName, authenticateCode) { console.log("createWorkerApply: now attempting sequelize insert row"); - return sequelize.query( + return this.sequelize.query( "insert into workerapply (contact_uri,friendlyName,authenticateCode,status) values(?,?,?,'incomplete')", { replacements: [contact_uri, friendlyName, authenticateCode], - type: sequelize.QueryTypes.INSERT, + type: this.sequelize.QueryTypes.INSERT, } ); } @@ -93,14 +91,14 @@ class Database { } getRowFromWorkerTable(contact_uri) { - return sequelize.query( + return this.sequelize.query( "select * from worker where contact_uri='" + contact_uri + "'", - { type: sequelize.QueryTypes.SELECT } + { type: this.sequelize.QueryTypes.SELECT } ); } async updateWorkerContact_uri(oldContact_uri, newContact_uri) { - var result = await sequelize.query( + var result = await this.sequelize.query( "update worker set contact_uri='" + newContact_uri + "' where contact_uri='" + @@ -129,9 +127,9 @@ class Database { } async getWorkerIdFromSid(workerSid) { - var selectResult = await sequelize.query( + var selectResult = await this.sequelize.query( "select * from worker where sid='" + workerSid + "'", - { type: sequelize.QueryTypes.SELECT } + { type: this.sequelize.QueryTypes.SELECT } ); console.log( "getWorkerIdFromSid: selectResult: " + JSON.stringify(selectResult) @@ -147,11 +145,11 @@ class Database { } async getFunctionalityStatus(functionality) { - var selectResult = await sequelize.query( + var selectResult = await this.sequelize.query( "select * from systemstatus where function=?", { replacements: [functionality], - type: sequelize.QueryTypes.SELECT, + type: this.sequelize.QueryTypes.SELECT, } ); if (selectResult.length == 0) { @@ -193,59 +191,60 @@ class Database { insertConferenceParticipant(workerSid, callSid, conferenceSid) { console.log("insertConferenceParticipant"); - return sequelize.query( + return this.sequelize.query( "insert into conference_participant (workerSid,callSid,conferenceSid) " + "values(?,?,?)", { replacements: [workerSid, callSid, conferenceSid], - type: sequelize.QueryTypes.INSERT, + type: this.sequelize.QueryTypes.INSERT, } ); } insertCallSidWorkerSid(callSid, workerSid) { console.log("insertCallSidWorkerSid"); - return sequelize.query( + return this.sequelize.query( "insert into callsid_workersid (callsid,workersid) " + "values(?,?)", { replacements: [callSid, workerSid], - type: sequelize.QueryTypes.INSERT, + type: this.sequelize.QueryTypes.INSERT, } ); } insertAdminPassword(workerId, passwordHash, adminTaskId) { - return sequelize.query( + return this.sequelize.query( "insert into adminPassword " + "(workerId,passwordHash,adminTaskId) " + "values " + "(?,?,?)", { replacements: [workerId, passwordHash, adminTaskId], - type: sequelize.QueryTypes.INSERT, + type: this.sequelize.QueryTypes.INSERT, } ); } updateAdminPassword(workerId, passwordHash, adminTaskId) { - return sequelize.query( + return this.sequelize.query( "update adminPassword " + "set passwordHash=? " + "where workerId=? " + "and adminTaskId=?", { replacements: [passwordHash, workerId, adminTaskId], - type: sequelize.QueryTypes.UPDATE, + type: this.sequelize.QueryTypes.UPDATE, } ); } async getAdminTaskId(adminTask) { - var selectResult = await sequelize.query( + console.log({adminTask}); + var selectResult = await this.sequelize.query( "select * from adminTask " + "where adminTask=?", { replacements: [adminTask], - type: sequelize.QueryTypes.SELECT, + type: this.sequelize.QueryTypes.SELECT, } ); if (selectResult.length == 0) { @@ -260,11 +259,11 @@ class Database { //todo: this will need to get updated after we establish the 'canceled' unique constraint async getPasswordHash(workerId, adminTaskId) { - var selectResult = await sequelize.query( + var selectResult = await this.sequelize.query( "select * from adminPassword " + "where workerId=? and adminTaskId=?", { replacements: [workerId, adminTaskId], - type: sequelize.QueryTypes.SELECT, + type: this.sequelize.QueryTypes.SELECT, } ); if (selectResult.length == 0) { @@ -281,7 +280,7 @@ class Database { if (id == null) { throw workerSid + " does not exist in worker table"; } else { - return sequelize.query( + return this.sequelize.query( "update available_notification_request set notification_sent=true" + " where worker_id=" + id + @@ -293,12 +292,12 @@ class Database { //we pass in workerSid here because we don't want the worker who just went to Idle to get //a notification of an available worker (since calling themselves isn't an option) iterateThroughUnsentNotificationsForMessaging(callback, workerSid) { - sequelize + this.sequelize .query( "select * from available_notification_request_worker where notification_sent=false and sid!='" + workerSid + "'", - { type: sequelize.QueryTypes.SELECT } + { type: this.sequelize.QueryTypes.SELECT } ) .then(function (result) { console.log(result); @@ -320,11 +319,11 @@ class Database { } async getWorkerSidFromCallSid(callSid) { - var selectResult = await sequelize.query( + var selectResult = await this.sequelize.query( "select * from callsid_workersid where callsid=?", { replacements: [callSid], - type: sequelize.QueryTypes.SELECT, + type: this.sequelize.QueryTypes.SELECT, } ); console.log( @@ -346,13 +345,13 @@ class Database { //or array of workerSids for multiple participants //eventually it should just have a single return type of array async getOtherParticipantWorkerSid(conferenceSid, callSid) { - var selectResult = await sequelize.query( + var selectResult = await this.sequelize.query( "select * from conference_participant " + "where conferenceSid=? and " + "callSid!=?", { replacements: [conferenceSid, callSid], - type: sequelize.QueryTypes.SELECT, + type: this.sequelize.QueryTypes.SELECT, } ); console.log( @@ -376,25 +375,34 @@ class Database { } } - insertEvent(reqBody) { - return sequelize.query( - "insert into event " + - "(eventType,eventDescription,timestamp,resourceType,resourceSid,workerSid,data) " + - "values " + - "(?,?,?,?,?,?,?)", - { - replacements: [ - reqBody.EventType, - reqBody.EventDescription, - reqBody.Timestamp, - reqBody.ResourceType, - reqBody.ResourceSid, - reqBody.WorkerSid, - reqBody.Data, - ], - type: sequelize.QueryTypes.INSERT, - } - ); + //todo: I'm getting the error: + // SequelizeDatabaseError: relation "event" does not exist + //verify whether the schema I gave Mina has this relation in it + async insertEvent(reqBody) { + try{ + let result = await this.sequelize.query( + "insert into event " + + "(eventType,eventDescription,timestamp,resourceType,resourceSid,workerSid,data) " + + "values " + + "(?,?,?,?,?,?,?)", + { + replacements: [ + reqBody.EventType || "", + reqBody.EventDescription || "", + reqBody.Timestamp || "", + reqBody.ResourceType || "", + reqBody.ResourceSid || "", + reqBody.WorkerSid || "", + reqBody.Data || JSON.stringify({data:null}), + ], + type: this.sequelize.QueryTypes.INSERT, + } + ); + return result; + } + catch(err){ + console.log(`error: ${err}`); + } } insertConference( @@ -404,7 +412,7 @@ class Database { outboundWorkerSid, conferenceSid ) { - return sequelize.query( + return this.sequelize.query( "insert into conference " + "(inboundCallSid,outboundCallSid,inboundWorkerId,outboundWorkerId,conferenceSid) " + "values " + @@ -420,20 +428,20 @@ class Database { outboundWorkerSid, conferenceSid, ], - type: sequelize.QueryTypes.INSERT, + type: this.sequelize.QueryTypes.INSERT, } ); } async getMembershipRequest(contact_uri, authenticateCode) { - var selectResult = await sequelize.query( + var selectResult = await this.sequelize.query( "select * from workerapply where contact_uri='" + contact_uri + "' and status='incomplete' " + "and authenticatecode='" + authenticateCode + "'", - { type: sequelize.QueryTypes.SELECT } + { type: this.sequelize.QueryTypes.SELECT } ); console.log( "getMembershipRequest: selectResult: " + JSON.stringify(selectResult) @@ -446,11 +454,11 @@ class Database { } async updateMembershipRequestToComplete(contact_uri) { - return sequelize.query( + return this.sequelize.query( "update workerapply " + "set status='complete' " + "where contact_uri=?", { replacements: [contact_uri], - type: sequelize.QueryTypes.UPDATE, + type: this.sequelize.QueryTypes.UPDATE, } ); } diff --git a/src/lib/availableNotifier.js b/src/lib/availableNotifier.js index 976bbde..225e680 100644 --- a/src/lib/availableNotifier.js +++ b/src/lib/availableNotifier.js @@ -9,19 +9,20 @@ var database = Database.getInstance(); class AvailableNotifier { constructor() { this.phoneNumberRegex = new RegExp("^\\+\\d+$"); + this.database = Database.getInstance(); } async create(workerSid) { - var result = await database.createAvailableNotificationRequest(workerSid); + var result = await this.database.createAvailableNotificationRequest(workerSid); return result; } async updateToSent(workerSid) { - var result = await database.updateNotificationToSent(workerSid); + var result = await this.database.updateNotificationToSent(workerSid); return result; } iterateSend(workerSid) { - var result = database.iterateThroughUnsentNotificationsForMessaging( + var result = this.database.iterateThroughUnsentNotificationsForMessaging( this.send.bind(this), workerSid ); @@ -48,7 +49,7 @@ class AvailableNotifier { }) .then((message) => { console.log("send: message.sid: " + message.sid); - database.updateNotificationToSent(callbackParam.sid); + this.database.updateNotificationToSent(callbackParam.sid); }); } else { console.log(contact_uri + " is not a valid phone number."); diff --git a/src/lib/password.js b/src/lib/password.js index 007dc5b..14dbbc6 100644 --- a/src/lib/password.js +++ b/src/lib/password.js @@ -1,10 +1,9 @@ const Bcrypt = require("bcryptjs"); const Database = require("../config/database"); -var database = Database.getInstance(); - class Password { constructor() { this.saltRounds = 10; + this.database = Database.getInstance(); } async insertPassword(workerSid, password, adminTask) { @@ -12,11 +11,18 @@ class Password { var passwordHash; var workerId; var adminTaskId; - const promiseResults = await Promise.all([ - Bcrypt.genSalt(this.saltRounds), - database.getWorkerIdFromSid(workerSid), - database.getAdminTaskId(adminTask), - ]); + var promiseResults; + try{ + promiseResults = await Promise.all([ + Bcrypt.genSalt(this.saltRounds), + this.database.getWorkerIdFromSid(workerSid), + this.database.getAdminTaskId(adminTask), + ]); + } + catch(err){ + console.log(`error: ${err}`); + } + console.log({promiseResults}); salt = promiseResults[0]; workerId = promiseResults[1]; adminTaskId = promiseResults[2]; @@ -29,7 +35,7 @@ class Password { } catch (err) { throw "insertPassword: hash error: " + err; } - var insertResult = await database.insertAdminPassword( + var insertResult = await this.database.insertAdminPassword( workerId, passwordHash, adminTaskId @@ -38,19 +44,20 @@ class Password { } async verifyPassword(workerSid, password, adminTask) { + return (password === process.env.ADMIN_PASSWORD); var passwordHash; var workerId; var adminTaskId; const promiseResults = await Promise.all([ - database.getWorkerIdFromSid(workerSid), - database.getAdminTaskId(adminTask), + this.database.getWorkerIdFromSid(workerSid), + this.database.getAdminTaskId(adminTask), ]); workerId = promiseResults[0]; adminTaskId = promiseResults[1]; console.log("verifyPassword: workerId: " + workerId); console.log("verifyPassword: adminTaskId: " + adminTaskId); try { - passwordHash = await database.getPasswordHash(workerId, adminTaskId); + passwordHash = await this.database.getPasswordHash(workerId, adminTaskId); console.log("verifyPassword: passwordHash: " + passwordHash); //user doesn't have identity entry for this admin task so verification fails if (passwordHash == null) { @@ -70,8 +77,8 @@ class Password { var adminTaskId; const promiseResults = await Promise.all([ Bcrypt.genSalt(this.saltRounds), - database.getWorkerIdFromSid(workerSid), - database.getAdminTaskId(adminTask), + this.database.getWorkerIdFromSid(workerSid), + this.database.getAdminTaskId(adminTask), ]); salt = promiseResults[0]; workerId = promiseResults[1]; @@ -85,7 +92,7 @@ class Password { } catch (err) { throw "updatePassword: hash error: " + err; } - var updateResult = await database.updateAdminPassword( + var updateResult = await this.database.updateAdminPassword( workerId, passwordHash, adminTaskId diff --git a/src/lib/sms.js b/src/lib/sms.js index 3c32410..a021874 100644 --- a/src/lib/sms.js +++ b/src/lib/sms.js @@ -6,12 +6,12 @@ const client = require("twilio")(accountSid, authToken); const Password = require("./password"); const DataValidator = require("./dataValidator"); class Sms { - constructor(worker, password) { + constructor(worker) { this.worker = worker; this.commandList = this.createCommandList(); var commandListKeys = Object.keys(this.commandList); this.commandListKeysString = commandListKeys.sort().join("\n"); - this.password = password; + this.password = new Password(); this.phoneNumberPattern = "^[+]d+$"; this.dataValidator = new DataValidator(); } @@ -30,9 +30,9 @@ class Sms { let commandList_output = JSON.parse(rawData); Object.keys(commandList_output).forEach((key) => { console.log(key); - if (key !== "default") { + //if (key !== "default") { commandList_output[key].command = this[key].bind(this); - } + //} }); return commandList_output; } @@ -227,6 +227,12 @@ class Sms { return responseValue; } + async default(parameterObj){ + let offResult = await this.off(parameterObj); + let manualResult = await this.manual(parameterObj); + return offResult+"\n"+manualResult; + } + async addWithoutParameterObj(contact_uri, friendlyName) { //todo:this is duplicate code from add(), need to refactor var responseValue; @@ -374,7 +380,7 @@ class Sms { } manualResponse(command) { - return command.helpMessage + "\nUsage: " + command.parameterUsage; + return command.description + "\nUsage: " + command.parameterUsage; } //todo: add STOP reserved commands to manual() @@ -417,7 +423,9 @@ class Sms { return parameterObj.commandArray.length == command.parameterCount; } } + async processCommand(parameterObj) { + console.log({parameterObj}); var responseValue; var commandArray = this.bodyToCommandArray(parameterObj.body); const commandName = commandArray[0].toLowerCase(); @@ -448,8 +456,11 @@ class Sms { } } else { command = this.commandList["default"]; + console.log({command}); } - responseValue = await command.commandFunction(parameterObj); + //responseValue = await command.commandFunction(parameterObj); + responseValue = await command.command(parameterObj); + return responseValue; } diff --git a/src/lib/worker.js b/src/lib/worker.js index 8ec2223..9971ffd 100644 --- a/src/lib/worker.js +++ b/src/lib/worker.js @@ -2,8 +2,6 @@ require("env2")(".env"); const Sms = require("./sms"); const Database = require("../config/database"); -var database = Database.getInstance(); - const accountSid = process.env.TWILIO_ACCOUNT_SID; //add your account sid const authToken = process.env.TWILIO_AUTH_TOKEN; //add your auth token //todo: is it better to have client instance created inside the constructor, maybe even passed in like workspace? @@ -14,6 +12,7 @@ class Worker { constructor(workspace) { this.workspace = workspace; this.sms = new Sms(); + this.database = Database.getInstance(); } createWorker(contact_uri, friendlyName) { @@ -30,7 +29,7 @@ class Worker { console.log( "createWorker: worker successfully created in Twilio, now creating in database..." ); - return database.createWorker(worker).then((result) => result); + return this.database.createWorker(worker).then((result) => result); }) .catch((err) => { console.log(err); @@ -39,7 +38,7 @@ class Worker { } createWorkerApply(contact_uri, friendlyName, authenticateCode) { - return database.createWorkerApply( + return this.database.createWorkerApply( contact_uri, friendlyName, authenticateCode @@ -47,7 +46,7 @@ class Worker { } async getMembershipRequest(contact_uri, authenticateCode) { - var result = await database.getMembershipRequest( + var result = await this.database.getMembershipRequest( contact_uri, authenticateCode ); @@ -55,13 +54,13 @@ class Worker { } async updateMembershipRequestToComplete(contact_uri) { - var result = await database.updateMembershipRequestToComplete(contact_uri); + var result = await this.database.updateMembershipRequestToComplete(contact_uri); return result; } addAllWorkersToDatabase() { this.workspace.workers.each((worker) => { - database.createWorker(worker); + this.database.createWorker(worker); }); } @@ -71,7 +70,7 @@ class Worker { rejectPendingReservations ) { console.log("updateWorkerActivity: getting workerSid from database"); - var workerSid = await database.getWorkerSid(contact_uri); + var workerSid = await this.database.getWorkerSid(contact_uri); console.log("updateWorkerActivity: workerSid is " + workerSid); var workerEntity = await this.updateWorkerActivityFromSid( workerSid, @@ -87,7 +86,7 @@ class Worker { async updateWorkerName(contact_uri, newName) { console.log("updateWorkerName: getting workerSid from database"); - var workerSid = await database.getWorkerSid(contact_uri); + var workerSid = await this.database.getWorkerSid(contact_uri); if (workerSid == null) { throw "updateWorkerName: error: workerSid not found for " + contact_uri; } @@ -202,6 +201,7 @@ class Worker { } async messageWorkerUnavailable(workerName, contact_uri) { + console.log({contact_uri}); try { console.log("messageWorkerUnavailable: sending message to worker..."); var message = await client.messages.create({ @@ -216,7 +216,7 @@ class Worker { } async getWorkerEntityFromContact_uri(contact_uri) { - var workerSid = await database.getWorkerSid(contact_uri); + var workerSid = await this.database.getWorkerSid(contact_uri); if (workerSid == null) { return null; } @@ -253,14 +253,14 @@ class Worker { async updateContact_uri(oldContact_uri, newContact_uri) { console.log("updateWorkerName: getting workerSid from database"); - var workerSid = await database.getWorkerSid(oldContact_uri); + var workerSid = await this.database.getWorkerSid(oldContact_uri); if (workerSid == null) { throw ( "updateContact_uri: error: workerSid not found for " + oldContact_uri ); } console.log("updateContact_uri: workerSid is " + workerSid); - var dbResult = await database.updateWorkerContact_uri( + var dbResult = await this.database.updateWorkerContact_uri( oldContact_uri, newContact_uri ); @@ -305,12 +305,12 @@ class Worker { } async getWorkerSid(contact_uri) { - var workerSid = await database.getWorkerSid(contact_uri); + var workerSid = await this.database.getWorkerSid(contact_uri); return workerSid; } async contact_uriExists(contact_uri) { - var workerSid = await database.getWorkerSid(contact_uri); + var workerSid = await this.database.getWorkerSid(contact_uri); console.log("contact_uriExists: workerSid " + workerSid); console.log("workerSid!=null: " + (workerSid != null)); return workerSid != null; @@ -319,7 +319,7 @@ class Worker { async insertCallSidWorkerSid(callSid, workerSid) { var result; try { - result = await database.insertCallSidWorkerSid(callSid, workerSid); + result = await this.database.insertCallSidWorkerSid(callSid, workerSid); if (result == ",1") { return null; } else { @@ -332,7 +332,7 @@ class Worker { } async getWorkerSidFromCallSid(callSid) { - var result = await database.getWorkerSidFromCallSid(callSid); + var result = await this.database.getWorkerSidFromCallSid(callSid); if (result == null) { throw ( "getWorkerSidFromCallSid: callSid " + diff --git a/src/server.js b/src/server.js index 4dab86b..8bf016a 100644 --- a/src/server.js +++ b/src/server.js @@ -351,7 +351,7 @@ app.get( response .enqueue({ workflowSid: workflowSid, - callerWorkerSid: parameters.workerSid, + //callerWorkerSid: parameters.workerSid, waitUrl: "/randomSoundLoop", }) .task({}, JSON.stringify(taskJSON)); @@ -478,6 +478,7 @@ app.get("/agent_answer_hangup", twilio.webhook(), function (req, res) { parameters = urlSerializer.deserialize(req); const response = new VoiceResponse(); twimlBuilder.say(response, "I didn't get any input from you. Goodbye!"); + console.log(`hanging up call from ${parameters.from} to ${parameters.to}`); response.hangup(); console.log( "/agent_answer_hangup: now updating worker to offline, should automatically reject pending reservation" @@ -488,6 +489,7 @@ app.get("/agent_answer_hangup", twilio.webhook(), function (req, res) { true ); + console.log(response.toString()); res.send(response.toString()); });