diff --git a/config/config.js b/config/config.js index 53c043a..4b65131 100644 --- a/config/config.js +++ b/config/config.js @@ -7,19 +7,5 @@ module.exports = { "database": process.env.DB_DATABASE, "host": process.env.DB_HOST, "dialect": "postgres" - }, - "test": { - "username": "root", - "password": null, - "database": "database_test", - "host": "127.0.0.1", - "dialect": "mysql" - }, - "production": { - "username": "root", - "password": null, - "database": "database_production", - "host": "127.0.0.1", - "dialect": "mysql" } } diff --git a/migrations/20220617182657-create-users.js b/migrations/20220617182657-create-users.js index 2301e2d..b4f5d53 100644 --- a/migrations/20220617182657-create-users.js +++ b/migrations/20220617182657-create-users.js @@ -45,6 +45,10 @@ module.exports = { updatedAt: { allowNull: false, type: Sequelize.DATE + }, + deletedAt: { + allowNull: true, + type: Sequelize.DATE } }); }, diff --git a/migrations/20220816193348-add paranoid.js b/migrations/20220816193348-add paranoid.js new file mode 100644 index 0000000..f4fad37 --- /dev/null +++ b/migrations/20220816193348-add paranoid.js @@ -0,0 +1,31 @@ +'use strict'; + +const { sequelize } = require("../models"); + +module.exports = { + async up (queryInterface, Sequelize) { + // await queryInterface.addColumn("Users", { + // deletedAt: { + // allowNull: true, + // type: Sequelize.DATE, + // }, + // }); + await sequelize.define('users', { + deletedAt: { + allowNull: true, + type: Sequelize.DATE + } + }, { + paranoid: true + }) + }, + + async down (queryInterface, Sequelize) { + /** + * Add reverting commands here. + * + * Example: + * await queryInterface.dropTable('users'); + */ + } +}; diff --git a/migrations/20220816200519-add paranoid-2.js b/migrations/20220816200519-add paranoid-2.js new file mode 100644 index 0000000..7e814f9 --- /dev/null +++ b/migrations/20220816200519-add paranoid-2.js @@ -0,0 +1,16 @@ +'use strict'; + +module.exports = { + async up(queryInterface, Sequelize) { + await queryInterface.addColumn("Users", + 'deletedAt', { + allowNull: true, + type: Sequelize.DATE, + }, + ) + }, + + async down(queryInterface, Sequelize) { + await queryInterface.removeColumn("Users", "deletedAt"); + } +}; diff --git a/models/users.js b/models/users.js index 91438ec..2b70cff 100644 --- a/models/users.js +++ b/models/users.js @@ -1,7 +1,5 @@ -'use strict'; -const { - Model -} = require('sequelize'); +"use strict"; +const { Model } = require("sequelize"); module.exports = (sequelize, DataTypes) => { class Users extends Model { /** @@ -9,25 +7,26 @@ module.exports = (sequelize, DataTypes) => { * This method is not a part of Sequelize lifecycle. * The `models/index` file will call this method automatically. */ - static associate(models) { - Users.hasOne(models.Mentor), - Users.hasOne(models.Mentee) - } + static associate(models) {} } - Users.init({ - firstName: DataTypes.TEXT, - lastName: DataTypes.TEXT, - email: DataTypes.TEXT, - password: DataTypes.TEXT, - role: DataTypes.TEXT, - description: DataTypes.TEXT, - mediaURL: DataTypes.TEXT, - linkedinURL: DataTypes.TEXT, - gender: DataTypes.TEXT, - active: DataTypes.BOOLEAN - }, { - sequelize, - modelName: 'Users', - }); + Users.init( + { + firstName: DataTypes.TEXT, + lastName: DataTypes.TEXT, + email: DataTypes.TEXT, + password: DataTypes.TEXT, + role: DataTypes.TEXT, + description: DataTypes.TEXT, + mediaURL: DataTypes.TEXT, + linkedinURL: DataTypes.TEXT, + gender: DataTypes.TEXT, + active: DataTypes.BOOLEAN, + }, + { + sequelize, + modelName: "Users", + paranoid: true, + } + ); return Users; -}; \ No newline at end of file +}; diff --git a/package-lock.json b/package-lock.json index 828e338..ecb10ff 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,6 +13,7 @@ "debug": "~2.6.9", "dotenv": "^16.0.1", "express": "~4.16.1", + "googleapis": "^105.0.0", "morgan": "~1.9.1", "pg": "^8.7.3", "sequelize": "^6.21.0" @@ -63,6 +64,38 @@ "node": ">= 0.6" } }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agent-base/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/agent-base/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -105,6 +138,14 @@ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" }, + "node_modules/arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "engines": { + "node": ">=8" + } + }, "node_modules/at-least-node": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", @@ -120,6 +161,25 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/basic-auth": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", @@ -136,6 +196,14 @@ "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", "integrity": "sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==" }, + "node_modules/bignumber.js": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.0.tgz", + "integrity": "sha512-4LwHK4nfDOraBCtst+wOWIHbu1vhvAPJK8g8nROd4iuc3PSEjWif/qwbkh8jwCJz6yDBvtU4KPynETgrfh7y3A==", + "engines": { + "node": "*" + } + }, "node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -193,6 +261,11 @@ "node": ">=8" } }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" + }, "node_modules/buffer-writer": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", @@ -209,6 +282,18 @@ "node": ">= 0.8" } }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", @@ -388,6 +473,14 @@ "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.2.tgz", "integrity": "sha512-fmrwR04lsniq/uSr8yikThDTrM7epXHBAAjH9TbeH3rEA8tdCO7mRzB9hdmdGyJCxF8KERo9CITcm3kGuoyMhg==" }, + "node_modules/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==", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, "node_modules/editorconfig": { "version": "0.15.3", "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.15.3.tgz", @@ -565,6 +658,16 @@ "integrity": "sha512-OvgH5rB0XM+iDZGQ1Eg/o7IZn0XYJFVrN/9FQ4OWIYILyJJgVP2s1hLTOFn6UOZoDUI/HctGa0PFlE2n2HW3NQ==", "dev": true }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/fast-text-encoding": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.4.tgz", + "integrity": "sha512-x6lDDm/tBAzX9kmsPcZsNbvDs3Zey3+scsxaZElS8xWLgUMAg/oFLeewfUz0mu1CblHhhsu15jGkraldkFh8KQ==" + }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -648,8 +751,33 @@ "node_modules/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==" + }, + "node_modules/gaxios": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-5.0.1.tgz", + "integrity": "sha512-keK47BGKHyyOVQxgcUaSaFvr3ehZYAlvhvpHXy0YB2itzZef+GqZR8TBsfVRWghdwlKrYsn+8L8i3eblF7Oviw==", + "dependencies": { + "extend": "^3.0.2", + "https-proxy-agent": "^5.0.0", + "is-stream": "^2.0.0", + "node-fetch": "^2.6.7" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/gcp-metadata": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-5.0.0.tgz", + "integrity": "sha512-gfwuX3yA3nNsHSWUL4KG90UulNiq922Ukj3wLTrcnX33BB7PwB1o0ubR8KVvXu9nJH+P5w1j2SQSNNqto+H0DA==", + "dependencies": { + "gaxios": "^5.0.0", + "json-bigint": "^1.0.0" + }, + "engines": { + "node": ">=12" + } }, "node_modules/get-caller-file": { "version": "2.0.5", @@ -660,6 +788,19 @@ "node": "6.* || 8.* || >= 10.*" } }, + "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==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -692,17 +833,120 @@ "node": ">= 6" } }, + "node_modules/google-auth-library": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-8.1.1.tgz", + "integrity": "sha512-eG3pCfrLgVJe19KhAeZwW0m1LplNEo0FX1GboWf3hu18zD2jq8TUH2K8900AB2YRAuJ7A+1aSXDp1BODjwwRzg==", + "dependencies": { + "arrify": "^2.0.0", + "base64-js": "^1.3.0", + "ecdsa-sig-formatter": "^1.0.11", + "fast-text-encoding": "^1.0.0", + "gaxios": "^5.0.0", + "gcp-metadata": "^5.0.0", + "gtoken": "^6.0.0", + "jws": "^4.0.0", + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/google-auth-library/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/google-auth-library/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/google-p12-pem": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-4.0.0.tgz", + "integrity": "sha512-lRTMn5ElBdDixv4a86bixejPSRk1boRtUowNepeKEVvYiFlkLuAJUVpEz6PfObDHYEKnZWq/9a2zC98xu62A9w==", + "dependencies": { + "node-forge": "^1.3.1" + }, + "bin": { + "gp12-pem": "build/src/bin/gp12-pem.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/googleapis": { + "version": "105.0.0", + "resolved": "https://registry.npmjs.org/googleapis/-/googleapis-105.0.0.tgz", + "integrity": "sha512-wH/jU/6QpqwsjTKj4vfKZz97ne7xT7BBbKwzQEwnbsG8iH9Seyw19P+AuLJcxNNrmgblwLqfr3LORg4Okat1BQ==", + "dependencies": { + "google-auth-library": "^8.0.2", + "googleapis-common": "^6.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/googleapis-common": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/googleapis-common/-/googleapis-common-6.0.1.tgz", + "integrity": "sha512-COe4g+58FoIkLUe4ljlCl6ytgSqPYIyCrT9kEp+VDL3Ca5NAOqExZ13whJUZklmSgxS3isEbTBt5c7SgD0kfMA==", + "dependencies": { + "extend": "^3.0.2", + "gaxios": "^5.0.1", + "google-auth-library": "^8.0.2", + "qs": "^6.7.0", + "url-template": "^2.0.8", + "uuid": "^8.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/googleapis-common/node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/graceful-fs": { "version": "4.2.10", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", "dev": true }, + "node_modules/gtoken": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-6.1.1.tgz", + "integrity": "sha512-HPM4VzzPEGxjQ7T2xLrdSYBs+h1c0yHAUiN+8RHPDoiZbndlpg9Sx3SjWcrTt9+N3FHsSABEpjvdQVan5AAuZQ==", + "dependencies": { + "gaxios": "^5.0.1", + "google-p12-pem": "^4.0.0", + "jws": "^4.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, "dependencies": { "function-bind": "^1.1.1" }, @@ -719,6 +963,17 @@ "node": ">=4" } }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/http-errors": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", @@ -733,6 +988,39 @@ "node": ">= 0.6" } }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/https-proxy-agent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, "node_modules/iconv-lite": { "version": "0.4.23", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", @@ -856,6 +1144,17 @@ "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", "dev": true }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/js-beautify": { "version": "1.14.4", "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.14.4.tgz", @@ -876,6 +1175,14 @@ "node": ">=10" } }, + "node_modules/json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "dependencies": { + "bignumber.js": "^9.0.0" + } + }, "node_modules/jsonfile": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", @@ -888,6 +1195,25 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/jwa": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", + "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", + "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", + "dependencies": { + "jwa": "^2.0.0", + "safe-buffer": "^5.0.1" + } + }, "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", @@ -1041,6 +1367,33 @@ "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", "dev": true }, + "node_modules/node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "engines": { + "node": ">= 6.13.0" + } + }, "node_modules/nodemon": { "version": "2.0.19", "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.19.tgz", @@ -1109,6 +1462,14 @@ "node": ">=0.10.0" } }, + "node_modules/object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", @@ -1594,6 +1955,19 @@ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/sigmund": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", @@ -1741,6 +2115,11 @@ "node": "*" } }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, "node_modules/type": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", @@ -1794,6 +2173,11 @@ "node": ">= 0.8" } }, + "node_modules/url-template": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/url-template/-/url-template-2.0.8.tgz", + "integrity": "sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw==" + }, "node_modules/utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", @@ -1826,6 +2210,20 @@ "node": ">= 0.8" } }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/wkx": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/wkx/-/wkx-0.5.0.tgz", @@ -1947,6 +2345,29 @@ "negotiator": "0.6.3" } }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "requires": { + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, "ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -1977,6 +2398,11 @@ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" }, + "arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==" + }, "at-least-node": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", @@ -1989,6 +2415,11 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, "basic-auth": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", @@ -2002,6 +2433,11 @@ "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", "integrity": "sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==" }, + "bignumber.js": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.0.tgz", + "integrity": "sha512-4LwHK4nfDOraBCtst+wOWIHbu1vhvAPJK8g8nROd4iuc3PSEjWif/qwbkh8jwCJz6yDBvtU4KPynETgrfh7y3A==" + }, "binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -2050,6 +2486,11 @@ "fill-range": "^7.0.1" } }, + "buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" + }, "buffer-writer": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", @@ -2060,6 +2501,15 @@ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==" }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, "chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", @@ -2204,6 +2654,14 @@ "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.2.tgz", "integrity": "sha512-fmrwR04lsniq/uSr8yikThDTrM7epXHBAAjH9TbeH3rEA8tdCO7mRzB9hdmdGyJCxF8KERo9CITcm3kGuoyMhg==" }, + "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" + } + }, "editorconfig": { "version": "0.15.3", "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.15.3.tgz", @@ -2363,6 +2821,16 @@ } } }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "fast-text-encoding": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.4.tgz", + "integrity": "sha512-x6lDDm/tBAzX9kmsPcZsNbvDs3Zey3+scsxaZElS8xWLgUMAg/oFLeewfUz0mu1CblHhhsu15jGkraldkFh8KQ==" + }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -2424,8 +2892,27 @@ "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==" + }, + "gaxios": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-5.0.1.tgz", + "integrity": "sha512-keK47BGKHyyOVQxgcUaSaFvr3ehZYAlvhvpHXy0YB2itzZef+GqZR8TBsfVRWghdwlKrYsn+8L8i3eblF7Oviw==", + "requires": { + "extend": "^3.0.2", + "https-proxy-agent": "^5.0.0", + "is-stream": "^2.0.0", + "node-fetch": "^2.6.7" + } + }, + "gcp-metadata": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-5.0.0.tgz", + "integrity": "sha512-gfwuX3yA3nNsHSWUL4KG90UulNiq922Ukj3wLTrcnX33BB7PwB1o0ubR8KVvXu9nJH+P5w1j2SQSNNqto+H0DA==", + "requires": { + "gaxios": "^5.0.0", + "json-bigint": "^1.0.0" + } }, "get-caller-file": { "version": "2.0.5", @@ -2433,6 +2920,16 @@ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, + "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==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, "glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -2456,17 +2953,97 @@ "is-glob": "^4.0.1" } }, + "google-auth-library": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-8.1.1.tgz", + "integrity": "sha512-eG3pCfrLgVJe19KhAeZwW0m1LplNEo0FX1GboWf3hu18zD2jq8TUH2K8900AB2YRAuJ7A+1aSXDp1BODjwwRzg==", + "requires": { + "arrify": "^2.0.0", + "base64-js": "^1.3.0", + "ecdsa-sig-formatter": "^1.0.11", + "fast-text-encoding": "^1.0.0", + "gaxios": "^5.0.0", + "gcp-metadata": "^5.0.0", + "gtoken": "^6.0.0", + "jws": "^4.0.0", + "lru-cache": "^6.0.0" + }, + "dependencies": { + "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" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } + }, + "google-p12-pem": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-4.0.0.tgz", + "integrity": "sha512-lRTMn5ElBdDixv4a86bixejPSRk1boRtUowNepeKEVvYiFlkLuAJUVpEz6PfObDHYEKnZWq/9a2zC98xu62A9w==", + "requires": { + "node-forge": "^1.3.1" + } + }, + "googleapis": { + "version": "105.0.0", + "resolved": "https://registry.npmjs.org/googleapis/-/googleapis-105.0.0.tgz", + "integrity": "sha512-wH/jU/6QpqwsjTKj4vfKZz97ne7xT7BBbKwzQEwnbsG8iH9Seyw19P+AuLJcxNNrmgblwLqfr3LORg4Okat1BQ==", + "requires": { + "google-auth-library": "^8.0.2", + "googleapis-common": "^6.0.0" + } + }, + "googleapis-common": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/googleapis-common/-/googleapis-common-6.0.1.tgz", + "integrity": "sha512-COe4g+58FoIkLUe4ljlCl6ytgSqPYIyCrT9kEp+VDL3Ca5NAOqExZ13whJUZklmSgxS3isEbTBt5c7SgD0kfMA==", + "requires": { + "extend": "^3.0.2", + "gaxios": "^5.0.1", + "google-auth-library": "^8.0.2", + "qs": "^6.7.0", + "url-template": "^2.0.8", + "uuid": "^8.0.0" + }, + "dependencies": { + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } + } + } + }, "graceful-fs": { "version": "4.2.10", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", "dev": true }, + "gtoken": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-6.1.1.tgz", + "integrity": "sha512-HPM4VzzPEGxjQ7T2xLrdSYBs+h1c0yHAUiN+8RHPDoiZbndlpg9Sx3SjWcrTt9+N3FHsSABEpjvdQVan5AAuZQ==", + "requires": { + "gaxios": "^5.0.1", + "google-p12-pem": "^4.0.0", + "jws": "^4.0.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" } @@ -2477,6 +3054,11 @@ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, "http-errors": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", @@ -2488,6 +3070,30 @@ "statuses": ">= 1.4.0 < 2" } }, + "https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "requires": { + "agent-base": "6", + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, "iconv-lite": { "version": "0.4.23", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", @@ -2584,6 +3190,11 @@ "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", "dev": true }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" + }, "js-beautify": { "version": "1.14.4", "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.14.4.tgz", @@ -2596,6 +3207,14 @@ "nopt": "^5.0.0" } }, + "json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "requires": { + "bignumber.js": "^9.0.0" + } + }, "jsonfile": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", @@ -2606,6 +3225,25 @@ "universalify": "^2.0.0" } }, + "jwa": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", + "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", + "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==", + "requires": { + "jwa": "^2.0.0", + "safe-buffer": "^5.0.1" + } + }, "lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", @@ -2729,6 +3367,19 @@ "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", "dev": true }, + "node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "requires": { + "whatwg-url": "^5.0.0" + } + }, + "node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==" + }, "nodemon": { "version": "2.0.19", "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.19.tgz", @@ -2779,6 +3430,11 @@ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, + "object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" + }, "on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", @@ -3122,6 +3778,16 @@ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, "sigmund": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", @@ -3234,6 +3900,11 @@ } } }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, "type": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", @@ -3275,6 +3946,11 @@ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" }, + "url-template": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/url-template/-/url-template-2.0.8.tgz", + "integrity": "sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw==" + }, "utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", @@ -3295,6 +3971,20 @@ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "wkx": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/wkx/-/wkx-0.5.0.tgz", diff --git a/package.json b/package.json index c610b3b..4343244 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,7 @@ "debug": "~2.6.9", "dotenv": "^16.0.1", "express": "~4.16.1", + "googleapis": "^105.0.0", "morgan": "~1.9.1", "pg": "^8.7.3", "sequelize": "^6.21.0" diff --git a/routes/formRouting.js b/routes/formRouting.js deleted file mode 100644 index 876ffb9..0000000 --- a/routes/formRouting.js +++ /dev/null @@ -1,31 +0,0 @@ -var express = require('express'); -var router = express.Router(); -// const dataBase = require('../models') -router.post('/mentor', async (req, res) => { - - let { Q1, Q2, Q3, Q4, Q5, Q6 } = req.body - - try { - //create a dataBase entry - let answers = await dataBase.Mentor.create({ Q1, Q2, Q3, Q4, Q5, Q6 }) - res.json("answers") - - } catch (err) { - console.log('error', err) - return res.status(423).json({ err }) - } - -}) - -router.post('/mentee', async (req, res) => { - let { Q1, Q2, Q3, Q4, Q5 } = req.body - try { - // let answers = await dataBase.Mentee.create({ Q1, Q2, Q3, Q4, Q5 }) - res.json("answers") - } catch (err) { - console.log('error', err) - return res.status(423).json({ err }) - } - -}) -module.exports = router; \ No newline at end of file diff --git a/routes/forms.js b/routes/forms.js new file mode 100644 index 0000000..88ff65e --- /dev/null +++ b/routes/forms.js @@ -0,0 +1,27 @@ +const express = require('express'); +const router = express.Router(); +const db = require('../models') +router.post('/mentor', async (req, res) => { + let { id, Q1, Q2, Q3, Q4, Q5, Q6 } = req.body + try { + //create a dataBase entry + let answers = await db.Mentor.create({ userId: id, Q1, Q2, Q3, Q4, Q5, Q6 }) + res.json(answers) + } catch (err) { + console.log('error', err) + return res.status(423).json({ err }) + } +}) + +router.post('/mentee', async (req, res) => { + let { id, Q1, Q2, Q3, Q4, Q5 } = req.body + try { + let answers = await db.Mentee.create({ userId: id, Q1, Q2, Q3, Q4, Q5 }) + res.json(answers) + } catch (err) { + console.log('error', err) + return res.status(423).json({ err }) + } +}) + +module.exports = router; \ No newline at end of file diff --git a/routes/google.js b/routes/google.js new file mode 100644 index 0000000..8197c18 --- /dev/null +++ b/routes/google.js @@ -0,0 +1,74 @@ +var express = require('express'); +var router = express.Router(); +const {google} = require("googleapis"); +require('dotenv').config(); + +const credentials = +{ + type: process.env.VAR1, + project_id: process.env.VAR2, + private_key_id: process.env.VAR3, + private_key: process.env.VAR4, + client_email: process.env.VAR5, + client_id: process.env.VAR6, + auth_uri: process.env.VAR7, + token_uri: process.env.VAR8, + auth_provider_x509_cert_url: process.env.VAR9, + client_x509_cert_url: process.env.VAR10, +} + + +router.post('/google', async function(req, res, next) { + const auth = new google.auth.GoogleAuth({ + credentials: credentials, + scopes: "https://www.googleapis.com/auth/spreadsheets", + }); + // console.log(auth); + // Client instance auth + const client = await auth.getClient(); + + const rowValues = "Mentee"; + let spreadsheetId= "1bM7_YyERZx4iKOefjKD3wqXgNWiA9pssUcy-bqi7NWM"; + + // if(req.value.role == "Mentor") + if(rowValues == "Mentor") + { + spreadsheetId = "1KjFWSbpAddTq0qgucoqZPZ6sPpWFo4csAjkG3Xl2c-I" + } + // else if(req.value.role == "Mentee") + else if(rowValues == "Mentee") + { + spreadsheetId = "1bM7_YyERZx4iKOefjKD3wqXgNWiA9pssUcy-bqi7NWM" + } + + // Google Sheet API instance + const googleSheets = google.sheets({ version: "v4", auth: client}); + + // Get sheets data + + // const data = await googleSheets.spreadsheets.get({ + // }) + + // const getRows = await googleSheets.spreadsheets.values.get({ + // }) + + // Write rows to spreadsheet + googleSheets.spreadsheets.values.append({ + auth, + spreadsheetId, + range: "Sheet1!A:B", + valueInputOption: "USER_ENTERED", + resource: { + + values: [ + //req.body + // ["Test20", "test29"], + ["Jack", "Skiles", "Bob"], + ], + + } + }) + res.send("posted"); +}) + +module.exports = router; diff --git a/routes/users.js b/routes/users.js index e8a0b30..bb9b6f8 100644 --- a/routes/users.js +++ b/routes/users.js @@ -1,173 +1,437 @@ -const express = require('express'); +const express = require("express"); const router = express.Router(); -const bcrypt = require('bcryptjs'); +const bcrypt = require("bcryptjs"); -const db = require('../models'); +const db = require("../models"); -router.use(express.urlencoded({extended: false})) // body parser (if needed) -router.use(express.json()) - -/* sign-in routes */ -router.get('/login', (req,res) => { - - res.render('login') -}) - -router.post('/login', async (req, res)=>{ +// sign-in route +router.post("/login", async (req, res) => { try { - - let {email, password} = req.body - - let user = await db.users.findAll({where: {email}}) - - let result = bcrypt.compareSync(password, user.password); - - - if(result) { - console.log('Passwords Match!'); - res.redirect('/') - - } else { - // password is incorrect - res.render('login', {message: 'Incorrect username or password'}); - console.log('Incorrect username or password'); + let { email, password } = req.body; + let user = await db.Users.findOne({ where: { email } }); + if (user) { + console.log("User found", user); + let passCompare = bcrypt.compareSync(password, user.password); + if (passCompare) { + console.log("Passwords Match!"); + res.status(202).json({ + userID: user.userID, + firstName: user.firstName, + lastName: user.lastName, + email: user.email, + description: user.description, + role: user.role, + mediaURL: user.mediaURL, + linkedinURL: user.linkedinURL, + gender: user.gender, + active: user.active, + }); + } else { + res.status(404).json({ + code: 404, + message: "Incorrect password", + }); + console.log("Incorrect password"); + } + } else { + res.status(404).json({ + code: 404, + message: "No User Found with that email.", + }); + console.log("No User Found"); + } + } catch (err) { + console.log(err); + res.status(502).json({ + code: 502, + message: "No response from the servers. Please try again later.", + error: err, + }); } -} -catch (error) { - console.log(error); - res.render('login', {message: 'An error has occurred'}); -} -}) +}); -/* sign-out routes */ -router.get('/logout', (req, res)=>{ +// registration route - res.render('logout') -}) - -router.post('/logout', (req, res)=>{ - - res.render('logout') -}) - -/* user registration POST route */ -router.post('/register', async (req, res) => { - - let { email, password } = req.body; +router.post("/register", async (req, res) => { + let { + firstName, + lastName, + email, + password, + description, + linkedinURL, + gender, + } = req.body; try { - - let records = await db.users.findAll({ where: { email } }) - if (records.length === 0) { - - password = bcrypt.hashSync(password, 8) - - let newUserRecord = await db.users.create({email, password }) - return res.json({ userId: userId }) - } - else { - - return res.status(422).json({ error: "Email already exists" }) - } + let user = await db.Users.findOne({ where: { email } }); + if (!user) { + hashedPass = bcrypt.hashSync(password, 10); + const user = await db.Users.create({ + firstName, + lastName, + email, + password: hashedPass, + description, + linkedinURL, + gender, + }); + return res.json({ + userID: user.userID, + firstName: user.firstName, + lastName: user.lastName, + email: user.email, + description: user.description, + role: user.role, + mediaURL: user.mediaURL, + linkedinURL: user.linkedinURL, + gender: user.gender, + active: user.active, + }); + } else { + return res.status(409).json({ + code: 409, + message: "Email already exists", + }); + } + } catch (err) { + console.log(err); + return res.status(502).json({ + code: 502, + message: "No response from the servers. Please try again later.", + error: err, + }); } - catch (err) { - return res.status(423).json({ error: "Can't access database" }) - } - -}) +}); /* Admin GET route */ -router.get('/', (req, res)=>{ - - res.render('') -}) - -/* Admin POST register */ -router.post('/', (req, res)=>{ - - res.render('') -}) - -/* staff GET route */ -router.get('/', (req, res)=>{ - - res.render('') -}) - - //! get a list of all mentees /* mentee GET route */ -router.get('/mentee', async (req, res)=>{ -try { -let mentees = await db.Users.findAll({where: {role:'mentee'}}) - .then((results) => { - res.send(results) - }) -} catch (error) { - return res.status(423).json({ err }) -} - -}) - -//! get a list of all mentors /* mentor GET route */ -router.get('/mentor', async (req, res) => { +router.get("/admins", async (req, res) => { try { - let mentors = await db.Users.findAll({ where: { role: 'mentor' } }) - console.log(mentors) - .then((results) => { - res.send(results) - }) - } catch (error) { - return res.status(423).json({ error }) + let admins = await db.Users.findAll({ + where: { role: "admin" }, + }); + res.json(admins); + } catch (err) { + console.log(err); + return res.status(502).json({ + code: 502, + message: "No response from the servers. Please try again later.", + error: err, + }); } +}); -}) - -//! update a user info /* update POST route */ -router.post('/updateUser', async (req, res)=>{ -let {id, firstName, lastName, email, password, description, mediaURL,linkedinURL, gender} = req.body +// staff GET route +router.get("/staff", async (req, res) => { try { - const user = await db.users.update({ firstName, lastName, email, password, description, mediaURL, linkedinURL, gender }, - { where: { id: id } }) - res.json(user) - } catch (error) { - console.log(error) - res.json({ message: "there was an error", error: error }) + let users = await db.Users.findAll({ + where: { role: "staff" }, + }); + res.json(users); + } catch (err) { + return res.status(502).json({ + code: 502, + message: "No response from the servers. Please try again later.", + error: err, + }); } -}) +}); -//! delete user, send user id from front-end /* delete POST route */ -router.post('/users', async (req, res)=>{ - let { id } = req.body +// get a list of all mentees +router.get("/mentee", async (req, res) => { try { - - const user = await db.users.destroy({ where: { id: id } }) - res.json(user) - } catch (error) { - console.log(error) - res.json({ message: "there was an error", error: error }) + let user = await db.Users.findAll({ + where: { role: "mentee"}, + }); + res.json({ + userID: user.userID, + firstName: user.firstName, + lastName: user.lastName, + email: user.email, + description: user.description, + role: user.role, + mediaURL: user.mediaURL, + linkedinURL: user.linkedinURL, + gender: user.gender, + active: user.active, + }); + } catch (err) { + return res.status(502).json({ + code: 502, + message: "No response from the servers. Please try again later.", + error: err, + }); } -}) - -/* Admin delete POST route */ -router.post('/', (req, res)=>{ +}); - res.render('') -}) +// get a list of all mentors +router.get("/mentor", async (req, res) => { + try { + let user = await db.Users.findAll({ + where: { role: "mentor", deletedAt: null }, + }); + res.json({ + userID: user.userID, + firstName: user.firstName, + lastName: user.lastName, + email: user.email, + description: user.description, + role: user.role, + mediaURL: user.mediaURL, + linkedinURL: user.linkedinURL, + gender: user.gender, + active: user.active, + }); + } catch (err) { + return res.status(502).json({ + code: 502, + message: "No response from the servers. Please try again later.", + error: err, + }); + } +}); +//get all users in db, not deleted +router.get("/", async (req, res) => { + try { + let users = await db.Users.findAll(); + console.log("all users", users); + res.json(users); + } catch (err) { + console.log(err); + return res.status(502).json({ + code: 502, + message: "No response from the servers. Please try again later.", + error: err, + }); + } +}); + +// update a user info +router.post("/updateUser", async (req, res) => { + let { + id, + firstName, + lastName, + email, + password, + description, + mediaURL, + linkedinURL, + gender, + } = req.body; + + if (password) { + try { + hashedPass = bcrypt.hashSync(password, 10); + //update + await db.Users.update( + { + firstName, + lastName, + email, + password: hashedPass, + description, + mediaURL, + linkedinURL, + gender, + }, + { where: { id: id } } + ); + //pull same user again + const user = await db.Users.findOne({ where: { id: id } }); + + res.json({ + message: `User ${user.id} ${user.firstName} ${user.lastName} has been updated`, + user: { + userID: user.userID, + firstName: user.firstName, + lastName: user.lastName, + email: user.email, + description: user.description, + mediaURL: user.mediaURL, + linkedinURL: user.linkedinURL, + gender: user.gender, + }, + }); + } catch (err) { + console.log(err); + return res.status(502).json({ + code: 502, + message: "No response from the servers. Please try again later.", + error: err, + }); + } + } else { + try { + //update + await db.Users.update( + { + firstName, + lastName, + email, + description, + mediaURL, + linkedinURL, + gender, + }, + { where: { id: id } } + ); + //pull same user again + const user = await db.Users.findOne({ where: { id: id } }); + + res.json({ + message: `User ${user.id} ${user.firstName} ${user.lastName} has been updated`, + user: { + userID: user.userID, + firstName: user.firstName, + lastName: user.lastName, + email: user.email, + description: user.description, + mediaURL: user.mediaURL, + linkedinURL: user.linkedinURL, + gender: user.gender, + }, + }); + } catch (err) { + console.log(err); + return res.status(502).json({ + code: 502, + message: "No response from the servers. Please try again later.", + error: err, + }); + } + } +}); + +//admins update route +router.post("/admin/updateUser", async (req, res) => { + let { + id, + firstName, + lastName, + email, + password, + description, + mediaURL, + linkedinURL, + gender, + role, + active, + } = req.body; + + if (password) { + try { + hashedPass = bcrypt.hashSync(password, 10); + //update + const updateResult = await db.Users.update( + { + firstName, + lastName, + email, + password: hashedPass, + description, + mediaURL, + linkedinURL, + gender, + role, + active, + }, + { where: { id: id } } + ); + + console.log("user updated with password", updateResult); + //pull same user again + const user = await db.Users.findOne({ where: { id: id } }); + + res.json({ + message: `User ${user.id} ${user.firstName} ${user.lastName} & the password has been updated`, + user: { + userID: user.userID, + firstName: user.firstName, + lastName: user.lastName, + email: user.email, + description: user.description, + mediaURL: user.mediaURL, + linkedinURL: user.linkedinURL, + gender: user.gender, + role: user.role, + active: user.active, + }, + }); + } catch (err) { + console.log(err); + return res.status(502).json({ + code: 502, + message: "No response from the servers. Please try again later.", + error: err, + }); + } + } else { + try { + //update + const updateResult = await db.Users.update( + { + firstName, + lastName, + email, + description, + mediaURL, + linkedinURL, + gender, + role, + active, + }, + { where: { id: id } } + ); + console.log("user updated", updateResult); + //pull same user again + const user = await db.Users.findOne({ where: { id: id } }); + + res.json({ + message: `User ${user.id} ${user.firstName} ${user.lastName} has been updated`, + user: { + userID: user.userID, + firstName: user.firstName, + lastName: user.lastName, + email: user.email, + description: user.description, + mediaURL: user.mediaURL, + linkedinURL: user.linkedinURL, + gender: user.gender, + role: user.role, + active: user.active, + }, + }); + } catch (err) { + console.log(err); + return res.status(502).json({ + code: 502, + message: "No response from the servers. Please try again later.", + error: err, + }); + } + } +}); +// delete user (soft delete) user record still exists, just added a deletedAt column. Can be restored. +router.post("/delete", async (req, res) => { + let { id } = req.body; + try { + await db.Users.update({ active: false }, { where: { id: id } }); + await db.Users.destroy({ where: { id: id } }); + res.json({ + message: "User was deleted", + }); + } catch (err) { + console.log(err); + return res.status(502).json({ + code: 502, + message: "No response from the servers. Please try again later.", + error: err, + }); + } +}); module.exports = router; - - -// /* template route */ -/* */ -// router.get('/', (req, res)=>{ - -// res.render('') -// }) - - -// router.get('/', function(req, res, next) { - // res.send('respond with a resource'); - // }); - diff --git a/server.js b/server.js index 8348c95..423c246 100644 --- a/server.js +++ b/server.js @@ -1,12 +1,14 @@ -var express = require('express'); -var path = require('path'); -var cookieParser = require('cookie-parser'); -var logger = require('morgan'); +const express = require('express'); +const path = require('path'); +const cookieParser = require('cookie-parser'); +const logger = require('morgan'); +require("dotenv").config(); -var usersRouter = require('./routes/users'); -var form = require('./routes/formRouting'); +const usersRouter = require('./routes/users'); +const forms = require('./routes/forms'); +const googleRouter = require("./routes/google"); -var app = express(); +const app = express(); app.use(logger('dev')); app.use(express.json()); @@ -15,7 +17,8 @@ app.use(cookieParser()); app.use(express.static(path.resolve(__dirname + '/client/build'))); app.use('/users', usersRouter); -app.use('/form', form); +app.use('/forms', forms); +app.use("/google", googleRouter); // catch-all so react can handle routing app.get('*', (req, res) => {