typescript(multiplayer-backend): initial commit
Signed-off-by: prescientmoon <git@moonythm.dev>
This commit is contained in:
parent
1544ca69e2
commit
7f3b756378
|
@ -1,5 +1,3 @@
|
||||||
//public config
|
|
||||||
|
|
||||||
//interfaces
|
//interfaces
|
||||||
export interface routeList {
|
export interface routeList {
|
||||||
[key: string]: string
|
[key: string]: string
|
||||||
|
@ -17,6 +15,12 @@ export const routes: routeList = {
|
||||||
}
|
}
|
||||||
|
|
||||||
//whitelist of urls
|
//whitelist of urls
|
||||||
export const whiteList = [{
|
export const whiteList: whiteListUrl[] = [{
|
||||||
url: "http://localhost:4200"
|
url: "localhost:4200"
|
||||||
}]
|
},{
|
||||||
|
url: "localhost:8000"
|
||||||
|
},{
|
||||||
|
url: "localhost:3000"
|
||||||
|
}]
|
||||||
|
|
||||||
|
export const staticRoutes:string[] = []
|
355
typescript/multiplayer-backend/package-lock.json
generated
355
typescript/multiplayer-backend/package-lock.json
generated
|
@ -235,6 +235,12 @@
|
||||||
"integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=",
|
"integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=",
|
||||||
"optional": true
|
"optional": true
|
||||||
},
|
},
|
||||||
|
"@types/bcryptjs": {
|
||||||
|
"version": "2.4.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/@types/bcryptjs/-/bcryptjs-2.4.2.tgz",
|
||||||
|
"integrity": "sha512-LiMQ6EOPob/4yUL66SZzu6Yh77cbzJFYll+ZfaPiPPFswtIlA/Fs1MzdKYA7JApHU49zQTbJGX3PDmCpIdDBRQ==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"@types/body-parser": {
|
"@types/body-parser": {
|
||||||
"version": "1.17.0",
|
"version": "1.17.0",
|
||||||
"resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.17.0.tgz",
|
"resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.17.0.tgz",
|
||||||
|
@ -245,12 +251,30 @@
|
||||||
"@types/node": "*"
|
"@types/node": "*"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"@types/bson": {
|
||||||
|
"version": "4.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@types/bson/-/bson-4.0.0.tgz",
|
||||||
|
"integrity": "sha512-pq/rqJwJWkbS10crsG5bgnrisL8pML79KlMKQMoQwLUjlPAkrUHMvHJ3oGwE7WHR61Lv/nadMwXVAD2b+fpD8Q==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"@types/node": "*"
|
||||||
|
}
|
||||||
|
},
|
||||||
"@types/caseless": {
|
"@types/caseless": {
|
||||||
"version": "0.12.2",
|
"version": "0.12.2",
|
||||||
"resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.2.tgz",
|
"resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.2.tgz",
|
||||||
"integrity": "sha512-6ckxMjBBD8URvjB6J3NcnuAn5Pkl7t3TizAg+xdlzzQGSPSmBcXf8KoIH0ua/i+tio+ZRUHEXp0HEmvaR4kt0w==",
|
"integrity": "sha512-6ckxMjBBD8URvjB6J3NcnuAn5Pkl7t3TizAg+xdlzzQGSPSmBcXf8KoIH0ua/i+tio+ZRUHEXp0HEmvaR4kt0w==",
|
||||||
"optional": true
|
"optional": true
|
||||||
},
|
},
|
||||||
|
"@types/chalk": {
|
||||||
|
"version": "2.2.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@types/chalk/-/chalk-2.2.0.tgz",
|
||||||
|
"integrity": "sha512-1zzPV9FDe1I/WHhRkf9SNgqtRJWZqrBWgu7JGveuHmmyR9CnAPCie2N/x+iHrgnpYBIcCJWHBoMRv2TRWktsvw==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"chalk": "*"
|
||||||
|
}
|
||||||
|
},
|
||||||
"@types/connect": {
|
"@types/connect": {
|
||||||
"version": "3.4.32",
|
"version": "3.4.32",
|
||||||
"resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.32.tgz",
|
"resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.32.tgz",
|
||||||
|
@ -260,6 +284,18 @@
|
||||||
"@types/node": "*"
|
"@types/node": "*"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"@types/connect-mongo": {
|
||||||
|
"version": "0.0.41",
|
||||||
|
"resolved": "https://registry.npmjs.org/@types/connect-mongo/-/connect-mongo-0.0.41.tgz",
|
||||||
|
"integrity": "sha512-l2ork/LNrZftIaYQstJozRHwijmWz7QRbNMIo3UKVDcfsFeh5hyrHHwmurcqOEEstnw1kxaJF4Yr93AykfPsLg==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"@types/express": "*",
|
||||||
|
"@types/express-session": "*",
|
||||||
|
"@types/mongodb": "*",
|
||||||
|
"@types/mongoose": "*"
|
||||||
|
}
|
||||||
|
},
|
||||||
"@types/dotenv": {
|
"@types/dotenv": {
|
||||||
"version": "6.1.1",
|
"version": "6.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/@types/dotenv/-/dotenv-6.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/@types/dotenv/-/dotenv-6.1.1.tgz",
|
||||||
|
@ -327,6 +363,12 @@
|
||||||
"@types/node": "*"
|
"@types/node": "*"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"@types/lodash": {
|
||||||
|
"version": "4.14.123",
|
||||||
|
"resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.123.tgz",
|
||||||
|
"integrity": "sha512-pQvPkc4Nltyx7G1Ww45OjVqUsJP4UsZm+GWJpigXgkikZqJgRm4c48g027o6tdgubWHwFRF15iFd+Y4Pmqv6+Q==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"@types/long": {
|
"@types/long": {
|
||||||
"version": "4.0.0",
|
"version": "4.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.0.tgz",
|
||||||
|
@ -339,6 +381,35 @@
|
||||||
"integrity": "sha512-FwI9gX75FgVBJ7ywgnq/P7tw+/o1GUbtP0KzbtusLigAOgIgNISRK0ZPl4qertvXSIE8YbsVJueQ90cDt9YYyw==",
|
"integrity": "sha512-FwI9gX75FgVBJ7ywgnq/P7tw+/o1GUbtP0KzbtusLigAOgIgNISRK0ZPl4qertvXSIE8YbsVJueQ90cDt9YYyw==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"@types/mongodb": {
|
||||||
|
"version": "3.1.26",
|
||||||
|
"resolved": "https://registry.npmjs.org/@types/mongodb/-/mongodb-3.1.26.tgz",
|
||||||
|
"integrity": "sha512-i7+l95IbqnGLRW+AJ6F2nzqosLUgU022lDuoHhbQquMV7tgek0vNUg9RwC2Fn7ImBSQSFdCWeU394ciPEwSeaQ==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"@types/bson": "*",
|
||||||
|
"@types/node": "*"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"@types/mongoose": {
|
||||||
|
"version": "5.5.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@types/mongoose/-/mongoose-5.5.0.tgz",
|
||||||
|
"integrity": "sha512-LIuVYQ/6y3ak5f+0C6J+t1ufZA/dM0bqkmEHOtbPO6pH/VB09Tn+BoTh2T2/UbkKH4SLdvupQQRBuCu3XXxynQ==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"@types/mongodb": "*",
|
||||||
|
"@types/node": "*"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"@types/morgan": {
|
||||||
|
"version": "1.7.35",
|
||||||
|
"resolved": "https://registry.npmjs.org/@types/morgan/-/morgan-1.7.35.tgz",
|
||||||
|
"integrity": "sha512-E9qFi0seOkdlQnCTPv54brNfGWeFdRaEhI5tSue4pdx/V+xfxvMETsxXhOEcj1cYL+0n/jcTEmj/jD2gjzCwMg==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"@types/express": "*"
|
||||||
|
}
|
||||||
|
},
|
||||||
"@types/node": {
|
"@types/node": {
|
||||||
"version": "11.13.0",
|
"version": "11.13.0",
|
||||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-11.13.0.tgz",
|
"resolved": "https://registry.npmjs.org/@types/node/-/node-11.13.0.tgz",
|
||||||
|
@ -430,7 +501,6 @@
|
||||||
"version": "3.2.1",
|
"version": "3.2.1",
|
||||||
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
|
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
|
||||||
"integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
|
"integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
"requires": {
|
||||||
"color-convert": "^1.9.0"
|
"color-convert": "^1.9.0"
|
||||||
}
|
}
|
||||||
|
@ -601,6 +671,19 @@
|
||||||
"integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==",
|
"integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==",
|
||||||
"optional": true
|
"optional": true
|
||||||
},
|
},
|
||||||
|
"basic-auth": {
|
||||||
|
"version": "2.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz",
|
||||||
|
"integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==",
|
||||||
|
"requires": {
|
||||||
|
"safe-buffer": "5.1.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"bcryptjs": {
|
||||||
|
"version": "2.4.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz",
|
||||||
|
"integrity": "sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms="
|
||||||
|
},
|
||||||
"bignumber.js": {
|
"bignumber.js": {
|
||||||
"version": "7.2.1",
|
"version": "7.2.1",
|
||||||
"resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-7.2.1.tgz",
|
"resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-7.2.1.tgz",
|
||||||
|
@ -613,6 +696,11 @@
|
||||||
"integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==",
|
"integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"bluebird": {
|
||||||
|
"version": "3.5.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz",
|
||||||
|
"integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA=="
|
||||||
|
},
|
||||||
"body-parser": {
|
"body-parser": {
|
||||||
"version": "1.18.3",
|
"version": "1.18.3",
|
||||||
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz",
|
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz",
|
||||||
|
@ -694,6 +782,11 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"bson": {
|
||||||
|
"version": "1.1.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/bson/-/bson-1.1.1.tgz",
|
||||||
|
"integrity": "sha512-jCGVYLoYMHDkOsbwJZBCqwMHyH4c+wzgI9hG7Z6SZJRXWr+x58pdIbm2i9a/jFGCkRJqRUr8eoI7lDWa0hTkxg=="
|
||||||
|
},
|
||||||
"buffer-equal-constant-time": {
|
"buffer-equal-constant-time": {
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
|
||||||
|
@ -704,6 +797,11 @@
|
||||||
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
|
||||||
"integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A=="
|
"integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A=="
|
||||||
},
|
},
|
||||||
|
"buffer-shims": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz",
|
||||||
|
"integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E="
|
||||||
|
},
|
||||||
"bun": {
|
"bun": {
|
||||||
"version": "0.0.12",
|
"version": "0.0.12",
|
||||||
"resolved": "https://registry.npmjs.org/bun/-/bun-0.0.12.tgz",
|
"resolved": "https://registry.npmjs.org/bun/-/bun-0.0.12.tgz",
|
||||||
|
@ -794,7 +892,6 @@
|
||||||
"version": "2.4.2",
|
"version": "2.4.2",
|
||||||
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
|
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
|
||||||
"integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
|
"integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
"requires": {
|
||||||
"ansi-styles": "^3.2.1",
|
"ansi-styles": "^3.2.1",
|
||||||
"escape-string-regexp": "^1.0.5",
|
"escape-string-regexp": "^1.0.5",
|
||||||
|
@ -924,7 +1021,6 @@
|
||||||
"version": "1.9.3",
|
"version": "1.9.3",
|
||||||
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
|
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
|
||||||
"integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
|
"integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
"requires": {
|
||||||
"color-name": "1.1.3"
|
"color-name": "1.1.3"
|
||||||
}
|
}
|
||||||
|
@ -932,8 +1028,7 @@
|
||||||
"color-name": {
|
"color-name": {
|
||||||
"version": "1.1.3",
|
"version": "1.1.3",
|
||||||
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
|
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
|
||||||
"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
|
"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
|
||||||
"dev": true
|
|
||||||
},
|
},
|
||||||
"colour": {
|
"colour": {
|
||||||
"version": "0.7.1",
|
"version": "0.7.1",
|
||||||
|
@ -1001,6 +1096,72 @@
|
||||||
"xdg-basedir": "^3.0.0"
|
"xdg-basedir": "^3.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"connect-mongo": {
|
||||||
|
"version": "2.0.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/connect-mongo/-/connect-mongo-2.0.3.tgz",
|
||||||
|
"integrity": "sha512-Vs+QZ/6X6gbCrP1Ls7Oh/wlyY6pgpbPSrUKF5yRT+zd+4GZPNbjNquxquZ+Clv2+03HBXE7T4lVM0PUcaBhihg==",
|
||||||
|
"requires": {
|
||||||
|
"mongodb": "^2.0.36"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"bson": {
|
||||||
|
"version": "1.0.9",
|
||||||
|
"resolved": "https://registry.npmjs.org/bson/-/bson-1.0.9.tgz",
|
||||||
|
"integrity": "sha512-IQX9/h7WdMBIW/q/++tGd+emQr0XMdeZ6icnT/74Xk9fnabWn+gZgpE+9V+gujL3hhJOoNrnDVY7tWdzc7NUTg=="
|
||||||
|
},
|
||||||
|
"es6-promise": {
|
||||||
|
"version": "3.2.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.2.1.tgz",
|
||||||
|
"integrity": "sha1-7FYjOGgDKQkgcXDDlEjiREndH8Q="
|
||||||
|
},
|
||||||
|
"mongodb": {
|
||||||
|
"version": "2.2.36",
|
||||||
|
"resolved": "https://registry.npmjs.org/mongodb/-/mongodb-2.2.36.tgz",
|
||||||
|
"integrity": "sha512-P2SBLQ8Z0PVx71ngoXwo12+FiSfbNfGOClAao03/bant5DgLNkOPAck5IaJcEk4gKlQhDEURzfR3xuBG1/B+IA==",
|
||||||
|
"requires": {
|
||||||
|
"es6-promise": "3.2.1",
|
||||||
|
"mongodb-core": "2.1.20",
|
||||||
|
"readable-stream": "2.2.7"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"mongodb-core": {
|
||||||
|
"version": "2.1.20",
|
||||||
|
"resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-2.1.20.tgz",
|
||||||
|
"integrity": "sha512-IN57CX5/Q1bhDq6ShAR6gIv4koFsZP7L8WOK1S0lR0pVDQaScffSMV5jxubLsmZ7J+UdqmykKw4r9hG3XQEGgQ==",
|
||||||
|
"requires": {
|
||||||
|
"bson": "~1.0.4",
|
||||||
|
"require_optional": "~1.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"process-nextick-args": {
|
||||||
|
"version": "1.0.7",
|
||||||
|
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz",
|
||||||
|
"integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M="
|
||||||
|
},
|
||||||
|
"readable-stream": {
|
||||||
|
"version": "2.2.7",
|
||||||
|
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.7.tgz",
|
||||||
|
"integrity": "sha1-BwV6y+JGeyIELTb5jFrVBwVOlbE=",
|
||||||
|
"requires": {
|
||||||
|
"buffer-shims": "~1.0.0",
|
||||||
|
"core-util-is": "~1.0.0",
|
||||||
|
"inherits": "~2.0.1",
|
||||||
|
"isarray": "~1.0.0",
|
||||||
|
"process-nextick-args": "~1.0.6",
|
||||||
|
"string_decoder": "~1.0.0",
|
||||||
|
"util-deprecate": "~1.0.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"string_decoder": {
|
||||||
|
"version": "1.0.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
|
||||||
|
"integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==",
|
||||||
|
"requires": {
|
||||||
|
"safe-buffer": "~5.1.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"content-disposition": {
|
"content-disposition": {
|
||||||
"version": "0.5.2",
|
"version": "0.5.2",
|
||||||
"resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz",
|
"resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz",
|
||||||
|
@ -1253,8 +1414,7 @@
|
||||||
"escape-string-regexp": {
|
"escape-string-regexp": {
|
||||||
"version": "1.0.5",
|
"version": "1.0.5",
|
||||||
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
|
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
|
||||||
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
|
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
|
||||||
"dev": true
|
|
||||||
},
|
},
|
||||||
"etag": {
|
"etag": {
|
||||||
"version": "1.8.1",
|
"version": "1.8.1",
|
||||||
|
@ -1587,6 +1747,11 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"firestore-store": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/firestore-store/-/firestore-store-1.0.0.tgz",
|
||||||
|
"integrity": "sha512-brRdcWKHMxcGu065TjmTBAF6Dai2oS9IN/Z44B6vrGNdCph/dNea18MuylhRk/GjmSNIIylTYiEdF/v+z0IxHg=="
|
||||||
|
},
|
||||||
"for-in": {
|
"for-in": {
|
||||||
"version": "1.0.2",
|
"version": "1.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
|
||||||
|
@ -2928,8 +3093,7 @@
|
||||||
"has-flag": {
|
"has-flag": {
|
||||||
"version": "3.0.0",
|
"version": "3.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
|
||||||
"integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
|
"integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
|
||||||
"dev": true
|
|
||||||
},
|
},
|
||||||
"has-value": {
|
"has-value": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
|
@ -3318,6 +3482,11 @@
|
||||||
"safe-buffer": "^5.0.1"
|
"safe-buffer": "^5.0.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"kareem": {
|
||||||
|
"version": "2.3.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.0.tgz",
|
||||||
|
"integrity": "sha512-6hHxsp9e6zQU8nXsP+02HGWXwTkOEw6IROhF2ZA28cYbUk4eJ6QbtZvdqZOdD9YPKghG3apk5eOCvs+tLl3lRg=="
|
||||||
|
},
|
||||||
"kind-of": {
|
"kind-of": {
|
||||||
"version": "6.0.2",
|
"version": "6.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
|
||||||
|
@ -3468,6 +3637,12 @@
|
||||||
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
|
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
|
||||||
"integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
|
"integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
|
||||||
},
|
},
|
||||||
|
"memory-pager": {
|
||||||
|
"version": "1.5.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz",
|
||||||
|
"integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==",
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
"merge-descriptors": {
|
"merge-descriptors": {
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
|
||||||
|
@ -3553,6 +3728,115 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"mongodb": {
|
||||||
|
"version": "3.2.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.2.3.tgz",
|
||||||
|
"integrity": "sha512-jw8UyPsq4QleZ9z+t/pIVy3L++51vKdaJ2Q/XXeYxk/3cnKioAH8H6f5tkkDivrQL4PUgUOHe9uZzkpRFH1XtQ==",
|
||||||
|
"requires": {
|
||||||
|
"mongodb-core": "^3.2.3",
|
||||||
|
"safe-buffer": "^5.1.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"mongodb-core": {
|
||||||
|
"version": "3.2.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-3.2.3.tgz",
|
||||||
|
"integrity": "sha512-UyI0rmvPPkjOJV8XGWa9VCTq7R4hBVipimhnAXeSXnuAPjuTqbyfA5Ec9RcYJ1Hhu+ISnc8bJ1KfGZd4ZkYARQ==",
|
||||||
|
"requires": {
|
||||||
|
"bson": "^1.1.1",
|
||||||
|
"require_optional": "^1.0.1",
|
||||||
|
"safe-buffer": "^5.1.2",
|
||||||
|
"saslprep": "^1.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"mongoose": {
|
||||||
|
"version": "5.5.7",
|
||||||
|
"resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.5.7.tgz",
|
||||||
|
"integrity": "sha512-Xs4SVuMGkMRdmKZ6ATGVvbp2pjI+KENCNhPZMnksjU3ZerkJHGhWKrUE1A6e/5iZ2lTu6Oz9AOPcfrDgp6BCUw==",
|
||||||
|
"requires": {
|
||||||
|
"async": "2.6.1",
|
||||||
|
"bson": "~1.1.1",
|
||||||
|
"kareem": "2.3.0",
|
||||||
|
"mongodb": "3.2.3",
|
||||||
|
"mongodb-core": "3.2.3",
|
||||||
|
"mongoose-legacy-pluralize": "1.0.2",
|
||||||
|
"mpath": "0.6.0",
|
||||||
|
"mquery": "3.2.0",
|
||||||
|
"ms": "2.1.1",
|
||||||
|
"regexp-clone": "0.0.1",
|
||||||
|
"safe-buffer": "5.1.2",
|
||||||
|
"sift": "7.0.1",
|
||||||
|
"sliced": "1.0.1"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"async": {
|
||||||
|
"version": "2.6.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz",
|
||||||
|
"integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==",
|
||||||
|
"requires": {
|
||||||
|
"lodash": "^4.17.10"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ms": {
|
||||||
|
"version": "2.1.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
|
||||||
|
"integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg=="
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"mongoose-legacy-pluralize": {
|
||||||
|
"version": "1.0.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz",
|
||||||
|
"integrity": "sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ=="
|
||||||
|
},
|
||||||
|
"morgan": {
|
||||||
|
"version": "1.9.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.1.tgz",
|
||||||
|
"integrity": "sha512-HQStPIV4y3afTiCYVxirakhlCfGkI161c76kKFca7Fk1JusM//Qeo1ej2XaMniiNeaZklMVrh3vTtIzpzwbpmA==",
|
||||||
|
"requires": {
|
||||||
|
"basic-auth": "~2.0.0",
|
||||||
|
"debug": "2.6.9",
|
||||||
|
"depd": "~1.1.2",
|
||||||
|
"on-finished": "~2.3.0",
|
||||||
|
"on-headers": "~1.0.1"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"debug": {
|
||||||
|
"version": "2.6.9",
|
||||||
|
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
|
||||||
|
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
|
||||||
|
"requires": {
|
||||||
|
"ms": "2.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"mpath": {
|
||||||
|
"version": "0.6.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/mpath/-/mpath-0.6.0.tgz",
|
||||||
|
"integrity": "sha512-i75qh79MJ5Xo/sbhxrDrPSEG0H/mr1kcZXJ8dH6URU5jD/knFxCVqVC/gVSW7GIXL/9hHWlT9haLbCXWOll3qw=="
|
||||||
|
},
|
||||||
|
"mquery": {
|
||||||
|
"version": "3.2.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/mquery/-/mquery-3.2.0.tgz",
|
||||||
|
"integrity": "sha512-qPJcdK/yqcbQiKoemAt62Y0BAc0fTEKo1IThodBD+O5meQRJT/2HSe5QpBNwaa4CjskoGrYWsEyjkqgiE0qjhg==",
|
||||||
|
"requires": {
|
||||||
|
"bluebird": "3.5.1",
|
||||||
|
"debug": "3.1.0",
|
||||||
|
"regexp-clone": "0.0.1",
|
||||||
|
"safe-buffer": "5.1.2",
|
||||||
|
"sliced": "1.0.1"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"debug": {
|
||||||
|
"version": "3.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
|
||||||
|
"integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
|
||||||
|
"requires": {
|
||||||
|
"ms": "2.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"ms": {
|
"ms": {
|
||||||
"version": "2.0.0",
|
"version": "2.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
|
||||||
|
@ -3957,6 +4241,11 @@
|
||||||
"safe-regex": "^1.1.0"
|
"safe-regex": "^1.1.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"regexp-clone": {
|
||||||
|
"version": "0.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-0.0.1.tgz",
|
||||||
|
"integrity": "sha1-p8LgmJH9vzj7sQ03b7cwA+aKxYk="
|
||||||
|
},
|
||||||
"registry-auth-token": {
|
"registry-auth-token": {
|
||||||
"version": "3.4.0",
|
"version": "3.4.0",
|
||||||
"resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz",
|
"resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz",
|
||||||
|
@ -3994,6 +4283,20 @@
|
||||||
"integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
|
"integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"require_optional": {
|
||||||
|
"version": "1.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz",
|
||||||
|
"integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==",
|
||||||
|
"requires": {
|
||||||
|
"resolve-from": "^2.0.0",
|
||||||
|
"semver": "^5.1.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"resolve-from": {
|
||||||
|
"version": "2.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz",
|
||||||
|
"integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c="
|
||||||
|
},
|
||||||
"resolve-url": {
|
"resolve-url": {
|
||||||
"version": "0.2.1",
|
"version": "0.2.1",
|
||||||
"resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
|
"resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
|
||||||
|
@ -4046,6 +4349,15 @@
|
||||||
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
|
||||||
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
|
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
|
||||||
},
|
},
|
||||||
|
"saslprep": {
|
||||||
|
"version": "1.0.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz",
|
||||||
|
"integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==",
|
||||||
|
"optional": true,
|
||||||
|
"requires": {
|
||||||
|
"sparse-bitfield": "^3.0.3"
|
||||||
|
}
|
||||||
|
},
|
||||||
"semver": {
|
"semver": {
|
||||||
"version": "5.7.0",
|
"version": "5.7.0",
|
||||||
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
|
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
|
||||||
|
@ -4144,11 +4456,21 @@
|
||||||
"integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
|
"integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"sift": {
|
||||||
|
"version": "7.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/sift/-/sift-7.0.1.tgz",
|
||||||
|
"integrity": "sha512-oqD7PMJ+uO6jV9EQCl0LrRw1OwsiPsiFQR5AR30heR+4Dl7jBBbDLnNvWiak20tzZlSE1H7RB30SX/1j/YYT7g=="
|
||||||
|
},
|
||||||
"signal-exit": {
|
"signal-exit": {
|
||||||
"version": "3.0.2",
|
"version": "3.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
|
||||||
"integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0="
|
"integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0="
|
||||||
},
|
},
|
||||||
|
"sliced": {
|
||||||
|
"version": "1.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz",
|
||||||
|
"integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E="
|
||||||
|
},
|
||||||
"snakeize": {
|
"snakeize": {
|
||||||
"version": "0.1.0",
|
"version": "0.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/snakeize/-/snakeize-0.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/snakeize/-/snakeize-0.1.0.tgz",
|
||||||
|
@ -4312,6 +4634,15 @@
|
||||||
"integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
|
"integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"sparse-bitfield": {
|
||||||
|
"version": "3.0.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz",
|
||||||
|
"integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=",
|
||||||
|
"optional": true,
|
||||||
|
"requires": {
|
||||||
|
"memory-pager": "^1.0.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
"split-array-stream": {
|
"split-array-stream": {
|
||||||
"version": "2.0.0",
|
"version": "2.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/split-array-stream/-/split-array-stream-2.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/split-array-stream/-/split-array-stream-2.0.0.tgz",
|
||||||
|
@ -4425,7 +4756,6 @@
|
||||||
"version": "5.5.0",
|
"version": "5.5.0",
|
||||||
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
|
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
|
||||||
"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
|
"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
"requires": {
|
||||||
"has-flag": "^3.0.0"
|
"has-flag": "^3.0.0"
|
||||||
}
|
}
|
||||||
|
@ -4516,6 +4846,11 @@
|
||||||
"nopt": "~1.0.10"
|
"nopt": "~1.0.10"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"ts-mongoose": {
|
||||||
|
"version": "0.0.14",
|
||||||
|
"resolved": "https://registry.npmjs.org/ts-mongoose/-/ts-mongoose-0.0.14.tgz",
|
||||||
|
"integrity": "sha512-CoVFdDYVrueUVn2P3rw74P7TomYEGhemnMm7EIiPltaROIyiKM1QyomCuakJMctp2kMaMQV1l9syauWc1ZKpnw=="
|
||||||
|
},
|
||||||
"ts-node": {
|
"ts-node": {
|
||||||
"version": "8.0.3",
|
"version": "8.0.3",
|
||||||
"resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.0.3.tgz",
|
"resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.0.3.tgz",
|
||||||
|
|
|
@ -16,19 +16,33 @@
|
||||||
"author": "Matei Adriel",
|
"author": "Matei Adriel",
|
||||||
"license": "ISC",
|
"license": "ISC",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
"@types/bcryptjs": "^2.4.2",
|
||||||
|
"@types/chalk": "^2.2.0",
|
||||||
|
"@types/connect-mongo": "0.0.41",
|
||||||
"@types/dotenv": "^6.1.1",
|
"@types/dotenv": "^6.1.1",
|
||||||
"@types/express": "^4.16.1",
|
"@types/express": "^4.16.1",
|
||||||
"@types/express-session": "^1.15.12",
|
"@types/express-session": "^1.15.12",
|
||||||
"@types/express-validator": "^3.0.0",
|
"@types/express-validator": "^3.0.0",
|
||||||
|
"@types/lodash": "^4.14.123",
|
||||||
|
"@types/mongoose": "^5.5.0",
|
||||||
|
"@types/morgan": "^1.7.35",
|
||||||
"nodemon": "^1.18.10",
|
"nodemon": "^1.18.10",
|
||||||
"ts-node": "^8.0.3"
|
"ts-node": "^8.0.3"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"bcryptjs": "^2.4.3",
|
||||||
|
"chalk": "^2.4.2",
|
||||||
|
"connect-mongo": "^2.0.3",
|
||||||
"dotenv": "^7.0.0",
|
"dotenv": "^7.0.0",
|
||||||
"express": "^4.16.4",
|
"express": "^4.16.4",
|
||||||
"express-session": "^1.16.1",
|
"express-session": "^1.16.1",
|
||||||
"express-validator": "^5.3.1",
|
"express-validator": "^5.3.1",
|
||||||
"firebase-admin": "^7.2.0",
|
"firebase-admin": "^7.2.0",
|
||||||
|
"firestore-store": "^1.0.0",
|
||||||
|
"lodash": "^4.17.11",
|
||||||
|
"mongoose": "^5.5.7",
|
||||||
|
"morgan": "^1.9.1",
|
||||||
|
"ts-mongoose": "0.0.14",
|
||||||
"typescript": "^3.4.1"
|
"typescript": "^3.4.1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,26 +1,56 @@
|
||||||
import * as express from "express"
|
import * as express from "express"
|
||||||
import { baseUrl, routes } from "../config";
|
import * as sessions from "express-session"
|
||||||
import { performance } from "perf_hooks"
|
import chalk from "chalk";
|
||||||
import { shortLogger } from "./routes/logging/shortLog";
|
|
||||||
|
|
||||||
export interface serverSetupResults{
|
import { staticRoutes } from "../config";
|
||||||
time:number;
|
import { routes } from "./routes"
|
||||||
app:express.Application
|
import { urlencoded } from "body-parser";
|
||||||
|
import { database } from "./services/db/firestore"
|
||||||
|
import { morganChalk } from "./middleware/morgan";
|
||||||
|
import { sessionMiddleware } from "./middleware/sessions"
|
||||||
|
|
||||||
|
|
||||||
|
// @ts-ignore no declaration file
|
||||||
|
// import * as store from "firestore-store"
|
||||||
|
import * as store from "connect-mongo"
|
||||||
|
import { connection, connected } from "./services/db/mongo";
|
||||||
|
|
||||||
|
// const firestore = store(sessions)
|
||||||
|
export interface serverSetupResults {
|
||||||
|
app: express.Application
|
||||||
}
|
}
|
||||||
|
|
||||||
export const setupServer = ():serverSetupResults => {
|
export const setupServer = (): Promise<serverSetupResults> =>
|
||||||
|
new Promise(async (res, rej) => {
|
||||||
|
try {
|
||||||
|
let MongoStore = store(sessions)
|
||||||
|
|
||||||
const start = performance.now()
|
await connected
|
||||||
const app = express()
|
|
||||||
|
|
||||||
for (let i in routes) {
|
//create express app
|
||||||
const route = require(`${process.cwd()}/${baseUrl}${routes[i]}`)
|
const app = express()
|
||||||
app.use(i, route.router)
|
|
||||||
}
|
|
||||||
|
|
||||||
const time = performance.now() - start
|
app.use(urlencoded({ extended: true }), sessions({
|
||||||
const message = `Server created in: ${Math.floor(time)}ms`
|
secret: process.env.SESSION_SECRET,
|
||||||
shortLogger.log("Server created",message)
|
saveUninitialized: false,
|
||||||
|
resave: false,
|
||||||
|
store: new MongoStore({ mongooseConnection: connection })
|
||||||
|
}), morganChalk, sessionMiddleware)
|
||||||
|
|
||||||
return {app,time}
|
//load static routes
|
||||||
}
|
staticRoutes.forEach(route => {
|
||||||
|
app.use(express.static(`${route}`))
|
||||||
|
})
|
||||||
|
|
||||||
|
//Load normal routes
|
||||||
|
for (let i in routes) {
|
||||||
|
app.use(`/${i}`, routes[i])
|
||||||
|
}
|
||||||
|
console.log(chalk.bold.green("👏 Succesfully creatd server!"))
|
||||||
|
|
||||||
|
res({ app })
|
||||||
|
}
|
||||||
|
catch (err) {
|
||||||
|
rej(err)
|
||||||
|
}
|
||||||
|
})
|
|
@ -1,11 +1,27 @@
|
||||||
import { config } from "dotenv"
|
import { config } from "dotenv"
|
||||||
import { setupServer } from "./createServer";
|
import { setupServer } from "./createServer";
|
||||||
|
import { connected } from "./services/db/mongo"
|
||||||
|
import chalk from "chalk";
|
||||||
|
|
||||||
//extract env variables
|
//⚓ connect to mongodb
|
||||||
|
connected.then(val => {
|
||||||
|
console.log(chalk.bold.green("⚓ Succesfully connected to mongoDb!!!"))
|
||||||
|
}).catch(err => {
|
||||||
|
console.log(err)
|
||||||
|
console.log(chalk.bold.red("😭 Something went wrong when connecting to mongoDb!!!"))
|
||||||
|
process.exit(1)
|
||||||
|
})
|
||||||
|
|
||||||
|
//🗻 extract env variables
|
||||||
config()
|
config()
|
||||||
|
|
||||||
//create the server
|
const main = async () => {
|
||||||
const {app} = setupServer()
|
|
||||||
|
|
||||||
//start listeing to requests
|
//create the server
|
||||||
app.listen(process.env.PORT)
|
const { app } = await setupServer()
|
||||||
|
|
||||||
|
//start listeing to requests
|
||||||
|
app.listen(process.env.PORT)
|
||||||
|
}
|
||||||
|
|
||||||
|
main()
|
|
@ -1,5 +1,8 @@
|
||||||
import { Request, Response } from "express"
|
import { Request, Response } from "express"
|
||||||
import { whiteList, whiteListUrl } from "../../config"
|
import { whiteList } from "../../config"
|
||||||
|
import { includes } from "lodash"
|
||||||
|
|
||||||
|
const urls = whiteList.map(urlObject => urlObject.url)
|
||||||
|
|
||||||
//TODO: remove from here
|
//TODO: remove from here
|
||||||
const defaultMethods = "GET, POST, OPTIONS, PUT, PATCH, DELETE"
|
const defaultMethods = "GET, POST, OPTIONS, PUT, PATCH, DELETE"
|
||||||
|
@ -9,21 +12,17 @@ const defaultMethods = "GET, POST, OPTIONS, PUT, PATCH, DELETE"
|
||||||
* @param url the url to allow
|
* @param url the url to allow
|
||||||
* @param methods the methods to allow the url to do
|
* @param methods the methods to allow the url to do
|
||||||
*/
|
*/
|
||||||
export const corsErrorFixer = ({url,methods}:whiteListUrl) => {
|
export const corsErrorFixer = (req: Request, res: Response, next: any) => {
|
||||||
return (req: Request, res: Response, next: any) => {
|
const host = req.get("host")
|
||||||
res.setHeader('Access-Control-Allow-Origin', url) // Website you wish to allow to connect
|
const methods: any = whiteList.find(value => value.url == host) || { methods: undefined }
|
||||||
res.setHeader('Access-Control-Allow-Methods', methods || defaultMethods) //// Request methods you wish to allow
|
|
||||||
res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type') // Request headers you wish to allow
|
|
||||||
|
|
||||||
// Pass to next layer of middleware
|
if (!includes(urls, host))
|
||||||
next();
|
return next()
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
res.setHeader('Access-Control-Allow-Origin', host) // Website you wish to allow to connect
|
||||||
* used to allow all urls on the whitelist
|
res.setHeader('Access-Control-Allow-Methods', methods.methods || defaultMethods) //// Request methods you wish to allow
|
||||||
*/
|
res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type') // Request headers you wish to allow
|
||||||
export const allowWhitelist = () => {
|
|
||||||
return whiteList.map(value => corsErrorFixer(value))
|
|
||||||
}
|
|
||||||
|
|
||||||
|
// Pass to next layer of middleware
|
||||||
|
next();
|
||||||
|
}
|
|
@ -0,0 +1,26 @@
|
||||||
|
import * as morgan from "morgan"
|
||||||
|
import chalk from "chalk"
|
||||||
|
|
||||||
|
const { floor } = Math
|
||||||
|
|
||||||
|
export const morganChalk = morgan(function (tokens, req, res) {
|
||||||
|
const status = Number(tokens.status(req,res))
|
||||||
|
const statusFirstDigit = floor(status / 100)
|
||||||
|
|
||||||
|
const emoji = (status === 200) ?
|
||||||
|
"👌" : (status === 203) ?
|
||||||
|
"🔎" : (status == 202) ?
|
||||||
|
"🚧" : (status === 302) ?
|
||||||
|
"🏹" : (statusFirstDigit === 2) ?
|
||||||
|
"🌝" : (statusFirstDigit === 4) ?
|
||||||
|
"😠" :
|
||||||
|
"❓"
|
||||||
|
|
||||||
|
return [
|
||||||
|
chalk.bold(`${emoji} `),
|
||||||
|
chalk.green.bold(tokens.method(req, res)),
|
||||||
|
chalk.red.bold(tokens.status(req, res)),
|
||||||
|
chalk.blue.italic(tokens.url(req, res)),
|
||||||
|
chalk.yellow(`${tokens['response-time'](req, res)} ms`),
|
||||||
|
].join(' ');
|
||||||
|
});
|
|
@ -0,0 +1 @@
|
||||||
|
export * from "./sessions"
|
|
@ -0,0 +1,24 @@
|
||||||
|
import { Response, Request } from "express";
|
||||||
|
|
||||||
|
const getToken = (req: Request) => {
|
||||||
|
if (req.headers.authorization && req.headers.authorization.split(' ')[0] === 'Bearer') { // Authorization: Bearer g1jipjgi1ifjioj
|
||||||
|
// Handle token presented as a Bearer token in the Authorization header
|
||||||
|
return req.headers.authorization.split(' ')[1];
|
||||||
|
} else if (req.query && req.query.token) {
|
||||||
|
// Handle token presented as URI param
|
||||||
|
return req.query.token;
|
||||||
|
} else if (req.cookies && req.cookies.token) {
|
||||||
|
// Handle token presented as a cookie parameter
|
||||||
|
return req.cookies.token;
|
||||||
|
}
|
||||||
|
// If we return null, we couldn't find a token.
|
||||||
|
// In this case, the JWT middleware will return a 401 (unauthorized) to the client for this request
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const sessionMiddleware = (req: Request, res: Response, next: Function) => {
|
||||||
|
const token = getToken(req)
|
||||||
|
console.log(token)
|
||||||
|
|
||||||
|
next()
|
||||||
|
}
|
9
typescript/multiplayer-backend/src/models/Password.ts
Normal file
9
typescript/multiplayer-backend/src/models/Password.ts
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
import { createSchema, Type, typedModel, ExtractDoc } from "ts-mongoose"
|
||||||
|
|
||||||
|
const PasswordSchema = createSchema({
|
||||||
|
uid: Type.string(),
|
||||||
|
password: Type.string()
|
||||||
|
})
|
||||||
|
|
||||||
|
export const Passsord = typedModel("Password", PasswordSchema)
|
||||||
|
export type PasswordDoc = ExtractDoc<typeof PasswordSchema>;
|
13
typescript/multiplayer-backend/src/models/User.ts
Normal file
13
typescript/multiplayer-backend/src/models/User.ts
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
import { createSchema, Type, typedModel, ExtractDoc } from "ts-mongoose"
|
||||||
|
|
||||||
|
const UserSchema = createSchema({
|
||||||
|
name: Type.string(),
|
||||||
|
email: Type.string(),
|
||||||
|
photo: Type.string(),
|
||||||
|
friends: Type.array().of(Type.string()),
|
||||||
|
description: Type.optionalString(),
|
||||||
|
uid: Type.string()
|
||||||
|
})
|
||||||
|
|
||||||
|
export const User = typedModel("User", UserSchema)
|
||||||
|
export type UserDoc = ExtractDoc<typeof UserSchema>;
|
|
@ -1,11 +1,49 @@
|
||||||
import { Router, Response, Request, urlencoded } from "express"
|
import { Router, Response, Request } from "express"
|
||||||
import { reddirect } from "../../middleware/reddirect";
|
import { reddirect } from "../../middleware/reddirect";
|
||||||
import { allowWhitelist } from "../../middleware/corsErrorMiddleware";
|
|
||||||
import * as sessions from "express-session"
|
|
||||||
import * as validator from "express-validator"
|
import * as validator from "express-validator"
|
||||||
|
import { generateUid, encodePassword } from "../../services/auth/signup";
|
||||||
|
import { savePassword } from "../../services/auth/signup";
|
||||||
|
import { corsErrorFixer } from "../../middleware/corsErrorMiddleware";
|
||||||
|
import { config } from "dotenv"
|
||||||
|
import { compare } from "bcryptjs";
|
||||||
|
import { User, UserDoc } from "../../models/User";
|
||||||
|
import { Passsord } from "../../models/Password";
|
||||||
|
|
||||||
|
//extract env variables
|
||||||
|
config()
|
||||||
|
|
||||||
const router = Router()
|
const router = Router()
|
||||||
|
|
||||||
|
router.get("/test", (req, res) => {
|
||||||
|
res.send("just a test")
|
||||||
|
})
|
||||||
|
|
||||||
|
const loginHtml = (req: Request, res: Response) => {
|
||||||
|
res.send(`
|
||||||
|
<form action="/auth/login" method=post>
|
||||||
|
<div>
|
||||||
|
<label for=email>email</label>
|
||||||
|
<input type=text id=email name=email>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<label for=password>password</label>
|
||||||
|
<input type=password id=password name=password>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<label for=name>name</label>
|
||||||
|
<input type=name id=name name=name>
|
||||||
|
</div>
|
||||||
|
<button type=submit onclick="
|
||||||
|
alert('click')
|
||||||
|
fetch('/',{
|
||||||
|
headers: {
|
||||||
|
authorization: 'do u see this?'
|
||||||
|
}
|
||||||
|
})">Submit</button>
|
||||||
|
</form>
|
||||||
|
`)
|
||||||
|
}
|
||||||
|
|
||||||
const sayHello = (req: Request, res: Response) => {
|
const sayHello = (req: Request, res: Response) => {
|
||||||
res.send(`
|
res.send(`
|
||||||
<form action="/auth" method=post>
|
<form action="/auth" method=post>
|
||||||
|
@ -13,34 +51,172 @@ const sayHello = (req: Request, res: Response) => {
|
||||||
<label for=email>email</label>
|
<label for=email>email</label>
|
||||||
<input type=text id=email name=email>
|
<input type=text id=email name=email>
|
||||||
</div>
|
</div>
|
||||||
|
<div>
|
||||||
|
<label for=password>password</label>
|
||||||
|
<input type=password id=password name=password>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<label for=name>name</label>
|
||||||
|
<input type=name id=name name=name>
|
||||||
|
</div>
|
||||||
<button type=submit>Submit</button>
|
<button type=submit>Submit</button>
|
||||||
</form>
|
</form>
|
||||||
`)
|
`)
|
||||||
}
|
}
|
||||||
|
|
||||||
const auth = (req: Request, res: Response, next: any) => {
|
const authHandler = async (req: Request, res: Response) => {
|
||||||
//validate
|
try {
|
||||||
req.check("email", "email isnt valid").isEmail()
|
//if already logged in return the uid
|
||||||
const errors = req.validationErrors()
|
if (req.session.uid)
|
||||||
|
return res.redirect("auth/account")
|
||||||
|
|
||||||
//if we have erros mark it
|
//get data from body
|
||||||
if (errors)
|
const { password, email, name } = req.body
|
||||||
req.session.errors = errors
|
|
||||||
|
|
||||||
//reddirect to page
|
//check if the email isnt used
|
||||||
res.send(errors || "Succes!!!")
|
if (await User.findOne({ name }))
|
||||||
|
res.redirect("login")
|
||||||
|
|
||||||
|
//validate
|
||||||
|
req.check("email", "email isnt valid").isEmail()
|
||||||
|
const errors = req.validationErrors()
|
||||||
|
|
||||||
|
if (errors)
|
||||||
|
res.json({ error: `${req.body.email} is not a valid email` })
|
||||||
|
|
||||||
|
//generate an uid
|
||||||
|
const uid = await generateUid()
|
||||||
|
|
||||||
|
const user = new User({
|
||||||
|
email,
|
||||||
|
friends: [],
|
||||||
|
name,
|
||||||
|
photo: process.env.DEFAULTPROFILEPIC,
|
||||||
|
uid
|
||||||
|
} as UserDoc) //used for my editor to help me
|
||||||
|
|
||||||
|
encodePassword(password)
|
||||||
|
|
||||||
|
//save the password and the user in the db
|
||||||
|
await Promise.all([
|
||||||
|
encodePassword(password).then(result => savePassword(uid, result)),
|
||||||
|
user.save()
|
||||||
|
])
|
||||||
|
|
||||||
|
//save things in session
|
||||||
|
req.session.uid = uid
|
||||||
|
|
||||||
|
//save in the session
|
||||||
|
req.session.save(() => { })
|
||||||
|
|
||||||
|
//send uid back
|
||||||
|
res.json({
|
||||||
|
succes: true,
|
||||||
|
data: {
|
||||||
|
uid
|
||||||
|
}
|
||||||
|
}).status(200)
|
||||||
|
}
|
||||||
|
catch (errors) {
|
||||||
|
//send erros to clinet
|
||||||
|
res.json({ errors })
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
router.use(...allowWhitelist())
|
const account = async (req: Request, res: Response) => {
|
||||||
router.use("*", urlencoded({ extended: true }), validator(), sessions({
|
try {
|
||||||
secret: process.env.SESSION_SECRET,
|
if (!req.session.uid)
|
||||||
saveUninitialized: false,
|
res.json({
|
||||||
resave: false
|
succes: false,
|
||||||
}))
|
errors: ["uid doesnt exist"]
|
||||||
|
}).status(203)
|
||||||
|
|
||||||
router.get("/", sayHello)
|
res.json({
|
||||||
router.post("/", auth)
|
succes: true,
|
||||||
|
data: {
|
||||||
|
uid: req.session.uid
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
catch (errors) {
|
||||||
|
//send erros to clinet
|
||||||
|
res.json({ errors })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const login = async (req: Request, res: Response) => {
|
||||||
|
try {
|
||||||
|
//check if we have an email or an username, and if we are note already logged in
|
||||||
|
if (req.session.uid)
|
||||||
|
return res.redirect("account")
|
||||||
|
|
||||||
|
let type = "name"
|
||||||
|
|
||||||
|
if (req.body.email)
|
||||||
|
type = "email"
|
||||||
|
|
||||||
|
const { password } = req.body
|
||||||
|
const data = req.body[(type == "name") ? "name" : type]
|
||||||
|
|
||||||
|
const doc = await User.findOne({ [data]: req.body[data] })
|
||||||
|
const uid = doc.uid
|
||||||
|
|
||||||
|
//check if the password is good
|
||||||
|
const passwordHash = await Passsord.findOne({ uid })
|
||||||
|
const match = await compare(password, passwordHash.password)
|
||||||
|
|
||||||
|
//return result
|
||||||
|
if (!match)
|
||||||
|
return res.json({
|
||||||
|
succes: false,
|
||||||
|
errors: ["wrong password"],
|
||||||
|
data: {
|
||||||
|
uid,
|
||||||
|
hash: passwordHash.password,
|
||||||
|
password,
|
||||||
|
[data]: req.body[data]
|
||||||
|
}
|
||||||
|
}).status(400)
|
||||||
|
|
||||||
|
//update the session ond save it
|
||||||
|
req.session.uid = uid
|
||||||
|
req.session.save(() => { })
|
||||||
|
|
||||||
|
//send it to the clinet
|
||||||
|
return res.json({ uid })
|
||||||
|
}
|
||||||
|
catch (errors) {
|
||||||
|
return res.json({ errors })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const logout = async (req: Request, res: Response) => {
|
||||||
|
//clear the uid
|
||||||
|
req.session.uid = undefined
|
||||||
|
|
||||||
|
//save it to the db
|
||||||
|
req.session.save(() => { })
|
||||||
|
|
||||||
|
res.send({ succes: true })
|
||||||
|
}
|
||||||
|
|
||||||
|
router.use("*", validator(), corsErrorFixer)
|
||||||
|
|
||||||
|
router
|
||||||
|
.get("/", sayHello)
|
||||||
|
.post("/", authHandler)
|
||||||
|
.get("/login", loginHtml)
|
||||||
|
.post("/login", login)
|
||||||
|
.get("/account", account)
|
||||||
|
.get("/logout", logout)
|
||||||
|
.get("/uid", (req, res) => {
|
||||||
|
res.send(req.session.uid)
|
||||||
|
})
|
||||||
|
.get("/test/uid", async (req, res) => {
|
||||||
|
res.send(await generateUid())
|
||||||
|
})
|
||||||
|
|
||||||
router.use("/*", reddirect("/auth"))
|
router.use("/*", reddirect("/auth"))
|
||||||
|
|
||||||
export { router }
|
export const auth = router
|
1
typescript/multiplayer-backend/src/routes/auth/index.ts
Normal file
1
typescript/multiplayer-backend/src/routes/auth/index.ts
Normal file
|
@ -0,0 +1 @@
|
||||||
|
export * from "./auth"
|
8
typescript/multiplayer-backend/src/routes/index.ts
Normal file
8
typescript/multiplayer-backend/src/routes/index.ts
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
import { auth } from "./auth"
|
||||||
|
import { logs } from "./logging"
|
||||||
|
import { Router } from "express";
|
||||||
|
|
||||||
|
export const routes:{[key:string]:Router} = {
|
||||||
|
auth,
|
||||||
|
logs
|
||||||
|
}
|
|
@ -0,0 +1 @@
|
||||||
|
export * from "./logs"
|
|
@ -1,7 +1,6 @@
|
||||||
import { Router, Response, Request } from "express"
|
import { Router, Response, Request } from "express"
|
||||||
import { shortLogger } from "./shortLog";
|
import { shortLogger } from "./shortLog";
|
||||||
import { reddirect } from "../../middleware/reddirect";
|
import { reddirect } from "../../middleware/reddirect";
|
||||||
import { allowWhitelist } from "../../middleware/corsErrorMiddleware";
|
|
||||||
|
|
||||||
const router = Router()
|
const router = Router()
|
||||||
|
|
||||||
|
@ -9,8 +8,7 @@ const getShortLogs = (req: Request, res: Response) => {
|
||||||
res.json(shortLogger.logs)
|
res.json(shortLogger.logs)
|
||||||
}
|
}
|
||||||
|
|
||||||
router.use(...allowWhitelist())
|
|
||||||
router.get("/", getShortLogs)
|
router.get("/", getShortLogs)
|
||||||
router.use("/*", reddirect("/logs"))
|
router.use("/*", reddirect("/logs"))
|
||||||
|
|
||||||
export { router }
|
export const logs = router
|
45
typescript/multiplayer-backend/src/services/auth/signup.ts
Normal file
45
typescript/multiplayer-backend/src/services/auth/signup.ts
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
import * as bcrypt from "bcryptjs"
|
||||||
|
import { promisify } from "util";
|
||||||
|
import { randomBytes } from "crypto";
|
||||||
|
import { database } from "../db/firestore";
|
||||||
|
import { Passsord, PasswordDoc } from "../../models/Password";
|
||||||
|
import { User } from "../../models/User";
|
||||||
|
|
||||||
|
//promisify functions
|
||||||
|
const hash = promisify(bcrypt.hash)
|
||||||
|
|
||||||
|
|
||||||
|
export async function generateUid(): Promise<string> {
|
||||||
|
//generate uid
|
||||||
|
const uid = randomBytes(16).toString("hex")
|
||||||
|
|
||||||
|
//check if document exists
|
||||||
|
const doc = await User.findOne({ uid })
|
||||||
|
|
||||||
|
//if theres already an user with the same id, regenerate
|
||||||
|
if (doc)
|
||||||
|
return generateUid()
|
||||||
|
|
||||||
|
//then return the uid
|
||||||
|
return uid
|
||||||
|
}
|
||||||
|
|
||||||
|
export function encodePassword(password: string): Promise<string> {
|
||||||
|
return hash(password, 10)
|
||||||
|
}
|
||||||
|
|
||||||
|
export function savePassword(uid: string, password: string) {
|
||||||
|
const passwordInstance = new Passsord({
|
||||||
|
password, uid
|
||||||
|
} as PasswordDoc)
|
||||||
|
|
||||||
|
return passwordInstance.save()
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function getPassword(uid: string) {
|
||||||
|
//get doc
|
||||||
|
const doc = await database.doc(`passwords/${uid}`).get()
|
||||||
|
|
||||||
|
//return result
|
||||||
|
return doc.data()
|
||||||
|
}
|
|
@ -0,0 +1,8 @@
|
||||||
|
import * as admin from "firebase-admin"
|
||||||
|
|
||||||
|
export const firebase = admin.initializeApp({
|
||||||
|
credential: admin.credential.cert('firebase-admin.json'),
|
||||||
|
databaseURL: 'https://planets-io.firebaseio.com'
|
||||||
|
});
|
||||||
|
|
||||||
|
export const database = firebase.firestore()
|
|
@ -0,0 +1 @@
|
||||||
|
export * from "./mongo"
|
|
@ -0,0 +1,16 @@
|
||||||
|
import { config } from "dotenv"
|
||||||
|
import { connect, model, connection } from "mongoose"
|
||||||
|
|
||||||
|
config()
|
||||||
|
connect(process.env.DATABASE, { useNewUrlParser: true })
|
||||||
|
|
||||||
|
export const connected = new Promise((res, rej) => {
|
||||||
|
connection.on("open", (...args: any[]) => {
|
||||||
|
res(...args)
|
||||||
|
})
|
||||||
|
connection.on("error", (...args: any[]) => {
|
||||||
|
rej(...args)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
export { connection }
|
|
@ -19,13 +19,15 @@
|
||||||
"experimentalDecorators": true,
|
"experimentalDecorators": true,
|
||||||
"downlevelIteration": true,
|
"downlevelIteration": true,
|
||||||
"target": "ESNext",
|
"target": "ESNext",
|
||||||
"resolveJsonModule": true
|
"resolveJsonModule": true,
|
||||||
|
"jsx": "preserve"
|
||||||
},
|
},
|
||||||
"include": [
|
"include": [
|
||||||
"src"
|
"src"
|
||||||
],
|
],
|
||||||
"exclude": [
|
"exclude": [
|
||||||
"node_modules",
|
"node_modules",
|
||||||
"dist"
|
"dist",
|
||||||
|
"old_client"
|
||||||
]
|
]
|
||||||
}
|
}
|
Loading…
Reference in a new issue