summary refs log tree commit diff
diff options
context:
space:
mode:
authorFlam3rboy <34555296+Flam3rboy@users.noreply.github.com>2022-07-18 19:22:48 +0200
committerTheArcaneBrony <myrainbowdash949@gmail.com>2022-08-09 23:28:27 +0200
commit14e0842dfbc7bc67fb50be0b8dbf6443e5413687 (patch)
tree8dd696a04025a84e203055d899eacfb22c87a398
parentUpdate FindConditions => FindOptionsWhere in BaseClass (diff)
downloadserver-14e0842dfbc7bc67fb50be0b8dbf6443e5413687.tar.xz
fix ts errors
-rw-r--r--api/package-lock.json496
-rw-r--r--api/package.json2
-rw-r--r--api/src/routes/channels/#channel_id/messages/bulk-delete.ts8
-rw-r--r--api/src/routes/channels/#channel_id/purge.ts107
-rw-r--r--api/src/routes/discoverable-guilds.ts19
-rw-r--r--bundle/package-lock.json8
-rw-r--r--util/package-lock.json435
-rw-r--r--util/package.json4
-rw-r--r--util/src/entities/BaseClass.ts12
-rw-r--r--util/src/entities/User.ts27
10 files changed, 577 insertions, 541 deletions
diff --git a/api/package-lock.json b/api/package-lock.json
index de889188..4e65e886 100644
--- a/api/package-lock.json
+++ b/api/package-lock.json
@@ -8,7 +8,7 @@
 			"name": "@fosscord/api",
 			"version": "1.0.0",
 			"hasInstallScript": true,
-			"license": "GPLV3",
+			"license": "AGPL-3.0-only",
 			"dependencies": {
 				"@babel/preset-env": "^7.15.8",
 				"@babel/preset-typescript": "^7.15.0",
@@ -34,12 +34,13 @@
 				"missing-native-js-functions": "^1.2.18",
 				"morgan": "^1.10.0",
 				"multer": "^1.4.2",
+				"node-2fa": "^2.0.3",
 				"node-fetch": "^2.6.2",
 				"patch-package": "^6.4.7",
 				"picocolors": "^1.0.0",
 				"proxy-agent": "^5.0.0",
 				"supertest": "^6.1.6",
-				"typeorm": "^0.2.37"
+				"typeorm": "^0.3.7"
 			},
 			"devDependencies": {
 				"@babel/core": "^7.15.5",
@@ -54,7 +55,7 @@
 				"@types/jsonwebtoken": "^8.5.0",
 				"@types/morgan": "^1.9.3",
 				"@types/multer": "^1.4.5",
-				"@types/node": "^14.17.9",
+				"@types/node": "^14.18.22",
 				"@types/node-fetch": "^2.5.5",
 				"@types/supertest": "^2.0.11",
 				"@zerollup/ts-transform-paths": "^1.7.18",
@@ -72,7 +73,7 @@
 			"name": "@fosscord/util",
 			"version": "1.0.0",
 			"hasInstallScript": true,
-			"license": "GPLV3",
+			"license": "AGPL-3.0-only",
 			"dependencies": {
 				"amqplib": "^0.8.0",
 				"form-data": "^4.0.0",
@@ -86,7 +87,7 @@
 				"picocolors": "^1.0.0",
 				"proxy-agent": "^5.0.0",
 				"reflect-metadata": "^0.1.13",
-				"typeorm": "^0.2.38",
+				"typeorm": "^0.3.7",
 				"typescript": "^4.4.2",
 				"typescript-json-schema": "^0.50.1"
 			},
@@ -94,7 +95,7 @@
 				"@types/amqplib": "^0.8.1",
 				"@types/jsonwebtoken": "^8.5.0",
 				"@types/multer": "^1.4.7",
-				"@types/node": "^14.17.9",
+				"@types/node": "^14.18.22",
 				"@types/node-fetch": "^2.5.12",
 				"jest": "^27.0.6",
 				"ts-node": "^10.2.1"
@@ -9718,9 +9719,9 @@
 			}
 		},
 		"node_modules/@types/node": {
-			"version": "14.17.16",
-			"dev": true,
-			"license": "MIT"
+			"version": "14.18.22",
+			"resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.22.tgz",
+			"integrity": "sha512-qzaYbXVzin6EPjghf/hTdIbnVW1ErMx8rPzwRNJhlbyJhu2SyqlvjGOY/tbUt6VFyzg56lROcOeSQRInpt63Yw=="
 		},
 		"node_modules/@types/node-fetch": {
 			"version": "2.5.12",
@@ -9731,6 +9732,14 @@
 				"form-data": "^3.0.0"
 			}
 		},
+		"node_modules/@types/notp": {
+			"version": "2.0.2",
+			"resolved": "https://registry.npmjs.org/@types/notp/-/notp-2.0.2.tgz",
+			"integrity": "sha512-JUcVYN9Tmw0AjoAfvjslS4hbv39fPBbZdftBK3b50g5z/DmhLsu6cd0UOEBiQuMwy2FirshF2Gk9gAvfWjshMw==",
+			"dependencies": {
+				"@types/node": "*"
+			}
+		},
 		"node_modules/@types/prettier": {
 			"version": "2.4.1",
 			"dev": true,
@@ -9800,10 +9809,6 @@
 			"dev": true,
 			"license": "MIT"
 		},
-		"node_modules/@types/zen-observable": {
-			"version": "0.8.3",
-			"license": "MIT"
-		},
 		"node_modules/@yarnpkg/lockfile": {
 			"version": "1.1.0",
 			"license": "BSD-2-Clause"
@@ -10045,7 +10050,7 @@
 		},
 		"node_modules/arg": {
 			"version": "4.1.3",
-			"dev": true,
+			"devOptional": true,
 			"license": "MIT"
 		},
 		"node_modules/argparse": {
@@ -10821,7 +10826,7 @@
 		},
 		"node_modules/create-require": {
 			"version": "1.1.1",
-			"dev": true,
+			"devOptional": true,
 			"license": "MIT"
 		},
 		"node_modules/cross-spawn": {
@@ -10916,9 +10921,22 @@
 				"node": ">=10"
 			}
 		},
+		"node_modules/date-fns": {
+			"version": "2.28.0",
+			"resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.28.0.tgz",
+			"integrity": "sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw==",
+			"engines": {
+				"node": ">=0.11"
+			},
+			"funding": {
+				"type": "opencollective",
+				"url": "https://opencollective.com/date-fns"
+			}
+		},
 		"node_modules/debug": {
-			"version": "4.3.2",
-			"license": "MIT",
+			"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"
 			},
@@ -11064,7 +11082,7 @@
 		},
 		"node_modules/diff": {
 			"version": "4.0.2",
-			"dev": true,
+			"devOptional": true,
 			"license": "BSD-3-Clause",
 			"engines": {
 				"node": ">=0.3.1"
@@ -11427,13 +11445,6 @@
 				"bser": "2.1.1"
 			}
 		},
-		"node_modules/figlet": {
-			"version": "1.5.2",
-			"license": "MIT",
-			"engines": {
-				"node": ">= 0.4.0"
-			}
-		},
 		"node_modules/file-uri-to-path": {
 			"version": "2.0.0",
 			"license": "MIT",
@@ -11663,13 +11674,14 @@
 			}
 		},
 		"node_modules/glob": {
-			"version": "7.1.7",
-			"license": "ISC",
+			"version": "7.2.3",
+			"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+			"integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
 			"dependencies": {
 				"fs.realpath": "^1.0.0",
 				"inflight": "^1.0.4",
 				"inherits": "2",
-				"minimatch": "^3.0.4",
+				"minimatch": "^3.1.1",
 				"once": "^1.3.0",
 				"path-is-absolute": "^1.0.0"
 			},
@@ -11733,23 +11745,6 @@
 				"node": ">= 0.4.0"
 			}
 		},
-		"node_modules/has-ansi": {
-			"version": "2.0.0",
-			"license": "MIT",
-			"dependencies": {
-				"ansi-regex": "^2.0.0"
-			},
-			"engines": {
-				"node": ">=0.10.0"
-			}
-		},
-		"node_modules/has-ansi/node_modules/ansi-regex": {
-			"version": "2.1.1",
-			"license": "MIT",
-			"engines": {
-				"node": ">=0.10.0"
-			}
-		},
 		"node_modules/has-flag": {
 			"version": "4.0.0",
 			"license": "MIT",
@@ -13106,7 +13101,7 @@
 		},
 		"node_modules/make-error": {
 			"version": "1.3.6",
-			"dev": true,
+			"devOptional": true,
 			"license": "ISC"
 		},
 		"node_modules/makeerror": {
@@ -13187,8 +13182,9 @@
 			}
 		},
 		"node_modules/minimatch": {
-			"version": "3.0.4",
-			"license": "ISC",
+			"version": "3.1.2",
+			"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+			"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
 			"dependencies": {
 				"brace-expansion": "^1.1.7"
 			},
@@ -13321,6 +13317,17 @@
 			"version": "1.0.5",
 			"license": "MIT"
 		},
+		"node_modules/node-2fa": {
+			"version": "2.0.3",
+			"resolved": "https://registry.npmjs.org/node-2fa/-/node-2fa-2.0.3.tgz",
+			"integrity": "sha512-PQldrOhjuoZyoydMvMSctllPN1ZPZ1/NwkEcgYwY9faVqE/OymxR+3awPpbWZxm6acLKqvmNqQmdqTsqYyflFw==",
+			"dependencies": {
+				"@types/notp": "^2.0.0",
+				"notp": "^2.0.3",
+				"thirty-two": "1.0.2",
+				"tslib": "^2.1.0"
+			}
+		},
 		"node_modules/node-addon-api": {
 			"version": "3.2.1",
 			"license": "MIT"
@@ -13449,6 +13456,14 @@
 				"node": ">=0.10.0"
 			}
 		},
+		"node_modules/notp": {
+			"version": "2.0.3",
+			"resolved": "https://registry.npmjs.org/notp/-/notp-2.0.3.tgz",
+			"integrity": "sha512-oBig/2uqkjQ5AkBuw4QJYwkEWa/q+zHxI5/I5z6IeP2NT0alpJFsP/trrfCC+9xOAgQSZXssNi962kp5KBmypQ==",
+			"engines": {
+				"node": "> v0.6.0"
+			}
+		},
 		"node_modules/npm-run-path": {
 			"version": "4.0.1",
 			"dev": true,
@@ -13668,12 +13683,6 @@
 				"node": ">= 8"
 			}
 		},
-		"node_modules/parent-require": {
-			"version": "1.0.0",
-			"engines": {
-				"node": ">= 0.4.0"
-			}
-		},
 		"node_modules/parse5": {
 			"version": "6.0.1",
 			"license": "MIT"
@@ -14441,7 +14450,7 @@
 		},
 		"node_modules/source-map-support": {
 			"version": "0.5.20",
-			"dev": true,
+			"devOptional": true,
 			"license": "MIT",
 			"dependencies": {
 				"buffer-from": "^1.0.0",
@@ -14450,7 +14459,7 @@
 		},
 		"node_modules/source-map-support/node_modules/source-map": {
 			"version": "0.6.1",
-			"dev": true,
+			"devOptional": true,
 			"license": "BSD-3-Clause",
 			"engines": {
 				"node": ">=0.10.0"
@@ -14751,6 +14760,14 @@
 				"node": ">=0.8"
 			}
 		},
+		"node_modules/thirty-two": {
+			"version": "1.0.2",
+			"resolved": "https://registry.npmjs.org/thirty-two/-/thirty-two-1.0.2.tgz",
+			"integrity": "sha512-OEI0IWCe+Dw46019YLl6V10Us5bi574EvlJEOcAkB29IzQ/mYD1A6RyNHLjZPiHCmuodxvgF6U+vZO1L15lxVA==",
+			"engines": {
+				"node": ">=0.2.6"
+			}
+		},
 		"node_modules/throat": {
 			"version": "6.0.1",
 			"dev": true,
@@ -14830,7 +14847,7 @@
 		},
 		"node_modules/ts-node": {
 			"version": "9.1.1",
-			"dev": true,
+			"devOptional": true,
 			"license": "MIT",
 			"dependencies": {
 				"arg": "^4.1.0",
@@ -15004,51 +15021,62 @@
 			}
 		},
 		"node_modules/typeorm": {
-			"version": "0.2.37",
-			"license": "MIT",
+			"version": "0.3.7",
+			"resolved": "https://registry.npmjs.org/typeorm/-/typeorm-0.3.7.tgz",
+			"integrity": "sha512-MsPJeP6Zuwfe64c++l80+VRqpGEGxf0CkztIEnehQ+CMmQPSHjOnFbFxwBuZ2jiLqZTjLk2ZqQdVF0RmvxNF3Q==",
 			"dependencies": {
 				"@sqltools/formatter": "^1.2.2",
 				"app-root-path": "^3.0.0",
 				"buffer": "^6.0.3",
 				"chalk": "^4.1.0",
 				"cli-highlight": "^2.1.11",
-				"debug": "^4.3.1",
-				"dotenv": "^8.2.0",
-				"glob": "^7.1.6",
-				"js-yaml": "^4.0.0",
+				"date-fns": "^2.28.0",
+				"debug": "^4.3.3",
+				"dotenv": "^16.0.0",
+				"glob": "^7.2.0",
+				"js-yaml": "^4.1.0",
 				"mkdirp": "^1.0.4",
 				"reflect-metadata": "^0.1.13",
 				"sha.js": "^2.4.11",
-				"tslib": "^2.1.0",
+				"tslib": "^2.3.1",
+				"uuid": "^8.3.2",
 				"xml2js": "^0.4.23",
-				"yargonaut": "^1.1.4",
-				"yargs": "^17.0.1",
-				"zen-observable-ts": "^1.0.0"
+				"yargs": "^17.3.1"
 			},
 			"bin": {
-				"typeorm": "cli.js"
+				"typeorm": "cli.js",
+				"typeorm-ts-node-commonjs": "cli-ts-node-commonjs.js",
+				"typeorm-ts-node-esm": "cli-ts-node-esm.js"
+			},
+			"engines": {
+				"node": ">= 12.9.0"
 			},
 			"funding": {
 				"url": "https://opencollective.com/typeorm"
 			},
 			"peerDependencies": {
-				"@sap/hana-client": "*",
-				"better-sqlite3": "*",
-				"hdb-pool": "*",
-				"ioredis": "*",
+				"@google-cloud/spanner": "^5.18.0",
+				"@sap/hana-client": "^2.12.25",
+				"better-sqlite3": "^7.1.2",
+				"hdb-pool": "^0.1.6",
+				"ioredis": "^5.0.4",
 				"mongodb": "^3.6.0",
-				"mssql": "*",
-				"mysql2": "*",
-				"oracledb": "*",
-				"pg": "*",
-				"pg-native": "*",
-				"pg-query-stream": "*",
-				"redis": "*",
-				"sql.js": "*",
-				"sqlite3": "*",
-				"typeorm-aurora-data-api-driver": "*"
+				"mssql": "^7.3.0",
+				"mysql2": "^2.2.5",
+				"oracledb": "^5.1.0",
+				"pg": "^8.5.1",
+				"pg-native": "^3.0.0",
+				"pg-query-stream": "^4.0.0",
+				"redis": "^3.1.1 || ^4.0.0",
+				"sql.js": "^1.4.0",
+				"sqlite3": "^5.0.3",
+				"ts-node": "^10.7.0",
+				"typeorm-aurora-data-api-driver": "^2.0.0"
 			},
 			"peerDependenciesMeta": {
+				"@google-cloud/spanner": {
+					"optional": true
+				},
 				"@sap/hana-client": {
 					"optional": true
 				},
@@ -15091,6 +15119,9 @@
 				"sqlite3": {
 					"optional": true
 				},
+				"ts-node": {
+					"optional": true
+				},
 				"typeorm-aurora-data-api-driver": {
 					"optional": true
 				}
@@ -15122,9 +15153,18 @@
 				"ieee754": "^1.2.1"
 			}
 		},
+		"node_modules/typeorm/node_modules/dotenv": {
+			"version": "16.0.1",
+			"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.1.tgz",
+			"integrity": "sha512-1K6hR6wtk2FviQ4kEiSjFiH5rpzEVi8WW0x96aztHVMhEspNpc4DVOUTEHtEva5VThQ8IaBX1Pe4gSzpVVUsKQ==",
+			"engines": {
+				"node": ">=12"
+			}
+		},
 		"node_modules/typeorm/node_modules/is-fullwidth-code-point": {
 			"version": "3.0.0",
-			"license": "MIT",
+			"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+			"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
 			"engines": {
 				"node": ">=8"
 			}
@@ -15150,36 +15190,46 @@
 			}
 		},
 		"node_modules/typeorm/node_modules/string-width": {
-			"version": "4.2.2",
-			"license": "MIT",
+			"version": "4.2.3",
+			"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+			"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
 			"dependencies": {
 				"emoji-regex": "^8.0.0",
 				"is-fullwidth-code-point": "^3.0.0",
-				"strip-ansi": "^6.0.0"
+				"strip-ansi": "^6.0.1"
 			},
 			"engines": {
 				"node": ">=8"
 			}
 		},
 		"node_modules/typeorm/node_modules/yargs": {
-			"version": "17.1.1",
-			"license": "MIT",
+			"version": "17.5.1",
+			"resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz",
+			"integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==",
 			"dependencies": {
 				"cliui": "^7.0.2",
 				"escalade": "^3.1.1",
 				"get-caller-file": "^2.0.5",
 				"require-directory": "^2.1.1",
-				"string-width": "^4.2.0",
+				"string-width": "^4.2.3",
 				"y18n": "^5.0.5",
-				"yargs-parser": "^20.2.2"
+				"yargs-parser": "^21.0.0"
 			},
 			"engines": {
 				"node": ">=12"
 			}
 		},
+		"node_modules/typeorm/node_modules/yargs-parser": {
+			"version": "21.0.1",
+			"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz",
+			"integrity": "sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==",
+			"engines": {
+				"node": ">=12"
+			}
+		},
 		"node_modules/typescript": {
 			"version": "4.4.3",
-			"dev": true,
+			"devOptional": true,
 			"license": "Apache-2.0",
 			"bin": {
 				"tsc": "bin/tsc",
@@ -15314,10 +15364,7 @@
 		},
 		"node_modules/uuid": {
 			"version": "8.3.2",
-			"dev": true,
 			"license": "MIT",
-			"optional": true,
-			"peer": true,
 			"bin": {
 				"uuid": "dist/bin/uuid"
 			}
@@ -15575,60 +15622,6 @@
 			"version": "4.0.0",
 			"license": "ISC"
 		},
-		"node_modules/yargonaut": {
-			"version": "1.1.4",
-			"license": "Apache-2.0",
-			"dependencies": {
-				"chalk": "^1.1.1",
-				"figlet": "^1.1.1",
-				"parent-require": "^1.0.0"
-			}
-		},
-		"node_modules/yargonaut/node_modules/ansi-regex": {
-			"version": "2.1.1",
-			"license": "MIT",
-			"engines": {
-				"node": ">=0.10.0"
-			}
-		},
-		"node_modules/yargonaut/node_modules/ansi-styles": {
-			"version": "2.2.1",
-			"license": "MIT",
-			"engines": {
-				"node": ">=0.10.0"
-			}
-		},
-		"node_modules/yargonaut/node_modules/chalk": {
-			"version": "1.1.3",
-			"license": "MIT",
-			"dependencies": {
-				"ansi-styles": "^2.2.1",
-				"escape-string-regexp": "^1.0.2",
-				"has-ansi": "^2.0.0",
-				"strip-ansi": "^3.0.0",
-				"supports-color": "^2.0.0"
-			},
-			"engines": {
-				"node": ">=0.10.0"
-			}
-		},
-		"node_modules/yargonaut/node_modules/strip-ansi": {
-			"version": "3.0.1",
-			"license": "MIT",
-			"dependencies": {
-				"ansi-regex": "^2.0.0"
-			},
-			"engines": {
-				"node": ">=0.10.0"
-			}
-		},
-		"node_modules/yargonaut/node_modules/supports-color": {
-			"version": "2.0.0",
-			"license": "MIT",
-			"engines": {
-				"node": ">=0.8.0"
-			}
-		},
 		"node_modules/yargs": {
 			"version": "16.2.0",
 			"license": "MIT",
@@ -15673,23 +15666,11 @@
 		},
 		"node_modules/yn": {
 			"version": "3.1.1",
-			"dev": true,
+			"devOptional": true,
 			"license": "MIT",
 			"engines": {
 				"node": ">=6"
 			}
-		},
-		"node_modules/zen-observable": {
-			"version": "0.8.15",
-			"license": "MIT"
-		},
-		"node_modules/zen-observable-ts": {
-			"version": "1.1.0",
-			"license": "MIT",
-			"dependencies": {
-				"@types/zen-observable": "0.8.3",
-				"zen-observable": "0.8.15"
-			}
 		}
 	},
 	"dependencies": {
@@ -16673,7 +16654,7 @@
 				"@types/amqplib": "^0.8.1",
 				"@types/jsonwebtoken": "^8.5.0",
 				"@types/multer": "^1.4.7",
-				"@types/node": "^14.17.9",
+				"@types/node": "^14.18.22",
 				"@types/node-fetch": "^2.5.12",
 				"amqplib": "^0.8.0",
 				"form-data": "^4.0.0",
@@ -16689,7 +16670,7 @@
 				"proxy-agent": "^5.0.0",
 				"reflect-metadata": "^0.1.13",
 				"ts-node": "^10.2.1",
-				"typeorm": "^0.2.38",
+				"typeorm": "^0.3.7",
 				"typescript": "^4.4.2",
 				"typescript-json-schema": "^0.50.1"
 			},
@@ -22091,8 +22072,9 @@
 			}
 		},
 		"@types/node": {
-			"version": "14.17.16",
-			"dev": true
+			"version": "14.18.22",
+			"resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.22.tgz",
+			"integrity": "sha512-qzaYbXVzin6EPjghf/hTdIbnVW1ErMx8rPzwRNJhlbyJhu2SyqlvjGOY/tbUt6VFyzg56lROcOeSQRInpt63Yw=="
 		},
 		"@types/node-fetch": {
 			"version": "2.5.12",
@@ -22102,6 +22084,14 @@
 				"form-data": "^3.0.0"
 			}
 		},
+		"@types/notp": {
+			"version": "2.0.2",
+			"resolved": "https://registry.npmjs.org/@types/notp/-/notp-2.0.2.tgz",
+			"integrity": "sha512-JUcVYN9Tmw0AjoAfvjslS4hbv39fPBbZdftBK3b50g5z/DmhLsu6cd0UOEBiQuMwy2FirshF2Gk9gAvfWjshMw==",
+			"requires": {
+				"@types/node": "*"
+			}
+		},
 		"@types/prettier": {
 			"version": "2.4.1",
 			"dev": true
@@ -22160,9 +22150,6 @@
 			"version": "20.2.1",
 			"dev": true
 		},
-		"@types/zen-observable": {
-			"version": "0.8.3"
-		},
 		"@yarnpkg/lockfile": {
 			"version": "1.1.0"
 		},
@@ -22318,7 +22305,7 @@
 		},
 		"arg": {
 			"version": "4.1.3",
-			"dev": true
+			"devOptional": true
 		},
 		"argparse": {
 			"version": "1.0.10",
@@ -22844,7 +22831,7 @@
 		},
 		"create-require": {
 			"version": "1.1.1",
-			"dev": true
+			"devOptional": true
 		},
 		"cross-spawn": {
 			"version": "7.0.3",
@@ -22906,8 +22893,15 @@
 				"whatwg-url": "^8.0.0"
 			}
 		},
+		"date-fns": {
+			"version": "2.28.0",
+			"resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.28.0.tgz",
+			"integrity": "sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw=="
+		},
 		"debug": {
-			"version": "4.3.2",
+			"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"
 			}
@@ -22990,7 +22984,7 @@
 		},
 		"diff": {
 			"version": "4.0.2",
-			"dev": true
+			"devOptional": true
 		},
 		"diff-sequences": {
 			"version": "27.0.6",
@@ -23220,9 +23214,6 @@
 				"bser": "2.1.1"
 			}
 		},
-		"figlet": {
-			"version": "1.5.2"
-		},
 		"file-uri-to-path": {
 			"version": "2.0.0"
 		},
@@ -23372,12 +23363,14 @@
 			}
 		},
 		"glob": {
-			"version": "7.1.7",
+			"version": "7.2.3",
+			"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+			"integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
 			"requires": {
 				"fs.realpath": "^1.0.0",
 				"inflight": "^1.0.4",
 				"inherits": "2",
-				"minimatch": "^3.0.4",
+				"minimatch": "^3.1.1",
 				"once": "^1.3.0",
 				"path-is-absolute": "^1.0.0"
 			}
@@ -23417,17 +23410,6 @@
 				"function-bind": "^1.1.1"
 			}
 		},
-		"has-ansi": {
-			"version": "2.0.0",
-			"requires": {
-				"ansi-regex": "^2.0.0"
-			},
-			"dependencies": {
-				"ansi-regex": {
-					"version": "2.1.1"
-				}
-			}
-		},
 		"has-flag": {
 			"version": "4.0.0"
 		},
@@ -24340,7 +24322,7 @@
 		},
 		"make-error": {
 			"version": "1.3.6",
-			"dev": true
+			"devOptional": true
 		},
 		"makeerror": {
 			"version": "1.0.11",
@@ -24386,7 +24368,9 @@
 			"dev": true
 		},
 		"minimatch": {
-			"version": "3.0.4",
+			"version": "3.1.2",
+			"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+			"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
 			"requires": {
 				"brace-expansion": "^1.1.7"
 			}
@@ -24479,6 +24463,17 @@
 		"nice-try": {
 			"version": "1.0.5"
 		},
+		"node-2fa": {
+			"version": "2.0.3",
+			"resolved": "https://registry.npmjs.org/node-2fa/-/node-2fa-2.0.3.tgz",
+			"integrity": "sha512-PQldrOhjuoZyoydMvMSctllPN1ZPZ1/NwkEcgYwY9faVqE/OymxR+3awPpbWZxm6acLKqvmNqQmdqTsqYyflFw==",
+			"requires": {
+				"@types/notp": "^2.0.0",
+				"notp": "^2.0.3",
+				"thirty-two": "1.0.2",
+				"tslib": "^2.1.0"
+			}
+		},
 		"node-addon-api": {
 			"version": "3.2.1"
 		},
@@ -24567,6 +24562,11 @@
 			"version": "3.0.0",
 			"dev": true
 		},
+		"notp": {
+			"version": "2.0.3",
+			"resolved": "https://registry.npmjs.org/notp/-/notp-2.0.3.tgz",
+			"integrity": "sha512-oBig/2uqkjQ5AkBuw4QJYwkEWa/q+zHxI5/I5z6IeP2NT0alpJFsP/trrfCC+9xOAgQSZXssNi962kp5KBmypQ=="
+		},
 		"npm-run-path": {
 			"version": "4.0.1",
 			"dev": true,
@@ -24699,9 +24699,6 @@
 				"netmask": "^2.0.1"
 			}
 		},
-		"parent-require": {
-			"version": "1.0.0"
-		},
 		"parse5": {
 			"version": "6.0.1"
 		},
@@ -25201,7 +25198,7 @@
 		},
 		"source-map-support": {
 			"version": "0.5.20",
-			"dev": true,
+			"devOptional": true,
 			"requires": {
 				"buffer-from": "^1.0.0",
 				"source-map": "^0.6.0"
@@ -25209,7 +25206,7 @@
 			"dependencies": {
 				"source-map": {
 					"version": "0.6.1",
-					"dev": true
+					"devOptional": true
 				}
 			}
 		},
@@ -25398,6 +25395,11 @@
 				"thenify": ">= 3.1.0 < 4"
 			}
 		},
+		"thirty-two": {
+			"version": "1.0.2",
+			"resolved": "https://registry.npmjs.org/thirty-two/-/thirty-two-1.0.2.tgz",
+			"integrity": "sha512-OEI0IWCe+Dw46019YLl6V10Us5bi574EvlJEOcAkB29IzQ/mYD1A6RyNHLjZPiHCmuodxvgF6U+vZO1L15lxVA=="
+		},
 		"throat": {
 			"version": "6.0.1",
 			"dev": true
@@ -25447,7 +25449,7 @@
 		},
 		"ts-node": {
 			"version": "9.1.1",
-			"dev": true,
+			"devOptional": true,
 			"requires": {
 				"arg": "^4.1.0",
 				"create-require": "^1.1.0",
@@ -25550,25 +25552,27 @@
 			}
 		},
 		"typeorm": {
-			"version": "0.2.37",
+			"version": "0.3.7",
+			"resolved": "https://registry.npmjs.org/typeorm/-/typeorm-0.3.7.tgz",
+			"integrity": "sha512-MsPJeP6Zuwfe64c++l80+VRqpGEGxf0CkztIEnehQ+CMmQPSHjOnFbFxwBuZ2jiLqZTjLk2ZqQdVF0RmvxNF3Q==",
 			"requires": {
 				"@sqltools/formatter": "^1.2.2",
 				"app-root-path": "^3.0.0",
 				"buffer": "^6.0.3",
 				"chalk": "^4.1.0",
 				"cli-highlight": "^2.1.11",
-				"debug": "^4.3.1",
-				"dotenv": "^8.2.0",
-				"glob": "^7.1.6",
-				"js-yaml": "^4.0.0",
+				"date-fns": "^2.28.0",
+				"debug": "^4.3.3",
+				"dotenv": "^16.0.0",
+				"glob": "^7.2.0",
+				"js-yaml": "^4.1.0",
 				"mkdirp": "^1.0.4",
 				"reflect-metadata": "^0.1.13",
 				"sha.js": "^2.4.11",
-				"tslib": "^2.1.0",
+				"tslib": "^2.3.1",
+				"uuid": "^8.3.2",
 				"xml2js": "^0.4.23",
-				"yargonaut": "^1.1.4",
-				"yargs": "^17.0.1",
-				"zen-observable-ts": "^1.0.0"
+				"yargs": "^17.3.1"
 			},
 			"dependencies": {
 				"argparse": {
@@ -25581,8 +25585,15 @@
 						"ieee754": "^1.2.1"
 					}
 				},
+				"dotenv": {
+					"version": "16.0.1",
+					"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.1.tgz",
+					"integrity": "sha512-1K6hR6wtk2FviQ4kEiSjFiH5rpzEVi8WW0x96aztHVMhEspNpc4DVOUTEHtEva5VThQ8IaBX1Pe4gSzpVVUsKQ=="
+				},
 				"is-fullwidth-code-point": {
-					"version": "3.0.0"
+					"version": "3.0.0",
+					"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+					"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="
 				},
 				"js-yaml": {
 					"version": "4.1.0",
@@ -25594,30 +25605,39 @@
 					"version": "1.0.4"
 				},
 				"string-width": {
-					"version": "4.2.2",
+					"version": "4.2.3",
+					"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+					"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
 					"requires": {
 						"emoji-regex": "^8.0.0",
 						"is-fullwidth-code-point": "^3.0.0",
-						"strip-ansi": "^6.0.0"
+						"strip-ansi": "^6.0.1"
 					}
 				},
 				"yargs": {
-					"version": "17.1.1",
+					"version": "17.5.1",
+					"resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz",
+					"integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==",
 					"requires": {
 						"cliui": "^7.0.2",
 						"escalade": "^3.1.1",
 						"get-caller-file": "^2.0.5",
 						"require-directory": "^2.1.1",
-						"string-width": "^4.2.0",
+						"string-width": "^4.2.3",
 						"y18n": "^5.0.5",
-						"yargs-parser": "^20.2.2"
+						"yargs-parser": "^21.0.0"
 					}
+				},
+				"yargs-parser": {
+					"version": "21.0.1",
+					"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz",
+					"integrity": "sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg=="
 				}
 			}
 		},
 		"typescript": {
 			"version": "4.4.3",
-			"dev": true
+			"devOptional": true
 		},
 		"typescript-json-schema": {
 			"version": "0.50.1",
@@ -25702,10 +25722,7 @@
 			"version": "1.0.1"
 		},
 		"uuid": {
-			"version": "8.3.2",
-			"dev": true,
-			"optional": true,
-			"peer": true
+			"version": "8.3.2"
 		},
 		"v8-to-istanbul": {
 			"version": "8.1.0",
@@ -25866,41 +25883,6 @@
 		"yallist": {
 			"version": "4.0.0"
 		},
-		"yargonaut": {
-			"version": "1.1.4",
-			"requires": {
-				"chalk": "^1.1.1",
-				"figlet": "^1.1.1",
-				"parent-require": "^1.0.0"
-			},
-			"dependencies": {
-				"ansi-regex": {
-					"version": "2.1.1"
-				},
-				"ansi-styles": {
-					"version": "2.2.1"
-				},
-				"chalk": {
-					"version": "1.1.3",
-					"requires": {
-						"ansi-styles": "^2.2.1",
-						"escape-string-regexp": "^1.0.2",
-						"has-ansi": "^2.0.0",
-						"strip-ansi": "^3.0.0",
-						"supports-color": "^2.0.0"
-					}
-				},
-				"strip-ansi": {
-					"version": "3.0.1",
-					"requires": {
-						"ansi-regex": "^2.0.0"
-					}
-				},
-				"supports-color": {
-					"version": "2.0.0"
-				}
-			}
-		},
 		"yargs": {
 			"version": "16.2.0",
 			"requires": {
@@ -25931,17 +25913,7 @@
 		},
 		"yn": {
 			"version": "3.1.1",
-			"dev": true
-		},
-		"zen-observable": {
-			"version": "0.8.15"
-		},
-		"zen-observable-ts": {
-			"version": "1.1.0",
-			"requires": {
-				"@types/zen-observable": "0.8.3",
-				"zen-observable": "0.8.15"
-			}
+			"devOptional": true
 		}
 	}
 }
diff --git a/api/package.json b/api/package.json
index b34f1b30..48a857b1 100644
--- a/api/package.json
+++ b/api/package.json
@@ -93,7 +93,7 @@
 		"picocolors": "^1.0.0",
 		"proxy-agent": "^5.0.0",
 		"supertest": "^6.1.6",
-		"typeorm": "^0.2.45"
+		"typeorm": "^0.3.7"
 	},
 	"jest": {
 		"setupFiles": [
diff --git a/api/src/routes/channels/#channel_id/messages/bulk-delete.ts b/api/src/routes/channels/#channel_id/messages/bulk-delete.ts
index 6eacf249..9e8cad23 100644
--- a/api/src/routes/channels/#channel_id/messages/bulk-delete.ts
+++ b/api/src/routes/channels/#channel_id/messages/bulk-delete.ts
@@ -17,15 +17,15 @@ export interface BulkDeleteSchema {
 // https://discord.com/developers/docs/resources/channel#bulk-delete-messages
 router.post("/", route({ body: "BulkDeleteSchema" }), async (req: Request, res: Response) => {
 	const { channel_id } = req.params;
-	const channel = await Channel.findOneOrFail({ id: channel_id });
+	const channel = await Channel.findOneByOrFail({ id: channel_id });
 	if (!channel.guild_id) throw new HTTPError("Can't bulk delete dm channel messages", 400);
 
 	const rights = await getRights(req.user_id);
 	rights.hasThrow("SELF_DELETE_MESSAGES");
-	
+
 	let superuser = rights.has("MANAGE_MESSAGES");
 	const permission = await getPermission(req.user_id, channel?.guild_id, channel_id);
-		
+
 	const { maxBulkDelete } = Config.get().limits.message;
 
 	const { messages } = req.body as { messages: string[] };
@@ -35,7 +35,7 @@ router.post("/", route({ body: "BulkDeleteSchema" }), async (req: Request, res:
 		if (messages.length > maxBulkDelete) throw new HTTPError(`You cannot delete more than ${maxBulkDelete} messages`);
 	}
 
-	await Message.delete(messages.map((x) => ({ id: x })));
+	await Message.delete({ id: In(messages) });
 
 	await emitEvent({
 		event: "MESSAGE_DELETE_BULK",
diff --git a/api/src/routes/channels/#channel_id/purge.ts b/api/src/routes/channels/#channel_id/purge.ts
index 622e06e5..3a6997b2 100644
--- a/api/src/routes/channels/#channel_id/purge.ts
+++ b/api/src/routes/channels/#channel_id/purge.ts
@@ -2,24 +2,9 @@ import { HTTPError } from "lambert-server";
 import { route } from "@fosscord/api";
 import { isTextChannel } from "./messages";
 import { FindManyOptions, Between, Not } from "typeorm";
-import {
-	Attachment,
-	Channel,
-	Config,
-	Embed,
-	DiscordApiErrors,
-	emitEvent,
-	FosscordApiErrors,
-	getPermission,
-	getRights,
- 	Message,
-	MessageDeleteBulkEvent,
-	Snowflake,
-	uploadFile 
-} from "@fosscord/util";
+import { Channel, Config, emitEvent, getPermission, getRights, Message, MessageDeleteBulkEvent } from "@fosscord/util";
 import { Router, Response, Request } from "express";
-import multer from "multer";
-import { handleMessage, postHandleMessage } from "@fosscord/api";
+import { In } from "typeorm";
 
 const router: Router = Router();
 
@@ -27,58 +12,58 @@ export default router;
 
 export interface PurgeSchema {
 	before: string;
-	after: string
+	after: string;
 }
 
 /**
 TODO: apply the delete bit by bit to prevent client and database stress
 **/
-router.post("/", route({ /*body: "PurgeSchema",*/ }), async (req: Request, res: Response) => {
-	const { channel_id } = req.params;
-	const channel = await Channel.findOneOrFail({ id: channel_id });
-	
-	if (!channel.guild_id) throw new HTTPError("Can't purge dm channels", 400);
-	isTextChannel(channel.type);
+router.post("/",route({ /*body: "PurgeSchema",*/ }), async (req: Request, res: Response) => {
+		const { channel_id } = req.params;
+		const channel = await Channel.findOneOrFail({ where: { id: channel_id } });
 
-	const rights = await getRights(req.user_id);
-	if (!rights.has("MANAGE_MESSAGES")) {
-		const permissions = await getPermission(req.user_id, channel.guild_id, channel_id);
-		permissions.hasThrow("MANAGE_MESSAGES");
-		permissions.hasThrow("MANAGE_CHANNELS");
-	}
-	
-	const { before, after } = req.body as PurgeSchema;
+		if (!channel.guild_id) throw new HTTPError("Can't purge dm channels", 400);
+		isTextChannel(channel.type);
 
-	// TODO: send the deletion event bite-by-bite to prevent client stress
+		const rights = await getRights(req.user_id);
+		if (!rights.has("MANAGE_MESSAGES")) {
+			const permissions = await getPermission(req.user_id, channel.guild_id, channel_id);
+			permissions.hasThrow("MANAGE_MESSAGES");
+			permissions.hasThrow("MANAGE_CHANNELS");
+		}
 
-	let query: FindManyOptions<Message> & { where: { id?: any; }; } = {
-		order: { id: "ASC" },
-		// take: limit,
-		where: {
-		 channel_id,
-		 id: Between(after, before), // the right way around
-		 author_id: rights.has("SELF_DELETE_MESSAGES") ? undefined : Not(req.user_id)
-		 // if you lack the right of self-deletion, you can't delete your own messages, even in purges
-		 },
-		relations: ["author", "webhook", "application", "mentions", "mention_roles", "mention_channels", "sticker_items", "attachments"]
-	};
-	
+		const { before, after } = req.body as PurgeSchema;
 
-	const messages = await Message.find(query);
-	const endpoint = Config.get().cdn.endpointPublic;
-			
-	if (messages.length == 0) { 
-		res.sendStatus(304);
-		return;
-	}
+		// TODO: send the deletion event bite-by-bite to prevent client stress
+
+		let query: FindManyOptions<Message> & { where: { id?: any } } = {
+			order: { id: "ASC" },
+			// take: limit,
+			where: {
+				channel_id,
+				id: Between(after, before), // the right way around
+				author_id: rights.has("SELF_DELETE_MESSAGES") ? undefined : Not(req.user_id)
+				// if you lack the right of self-deletion, you can't delete your own messages, even in purges
+			},
+			relations: ["author", "webhook", "application", "mentions", "mention_roles", "mention_channels", "sticker_items", "attachments"]
+		};
+
+		const messages = await Message.find(query);
+		const endpoint = Config.get().cdn.endpointPublic;
 
-	await Message.delete(messages.map((x) => ({ id: x })));
-	
-	await emitEvent({
-		event: "MESSAGE_DELETE_BULK",
-		channel_id,
-		data: { ids: messages.map(x => x.id), channel_id, guild_id: channel.guild_id }
-	} as MessageDeleteBulkEvent);
+		if (messages.length == 0) {
+			res.sendStatus(304);
+			return;
+		}
 
-	res.sendStatus(204);
-});
+		await Message.delete({ id: In(messages) });
+
+		await emitEvent({
+			event: "MESSAGE_DELETE_BULK",
+			channel_id,
+			data: { ids: messages.map((x) => x.id), channel_id, guild_id: channel.guild_id }
+		} as MessageDeleteBulkEvent);
+
+		res.sendStatus(204);
+	}
+);
diff --git a/api/src/routes/discoverable-guilds.ts b/api/src/routes/discoverable-guilds.ts
index 984916f4..fb7b844f 100644
--- a/api/src/routes/discoverable-guilds.ts
+++ b/api/src/routes/discoverable-guilds.ts
@@ -16,19 +16,24 @@ router.get("/", route({}), async (req: Request, res: Response) => {
 	if (categories == undefined) {
 		guilds = showAllGuilds
 			? await Guild.find({ take: Math.abs(Number(limit || configLimit)) })
-			: await Guild.find({ where: `"features" LIKE '%DISCOVERABLE%'`, take: Math.abs(Number(limit || configLimit)) });
+			: await Guild.find({ where: { features: Like("%DISCOVERABLE%") }, take: Math.abs(Number(limit || configLimit)) });
 	} else {
 		guilds = showAllGuilds
-				? await Guild.find({ where: `"primary_category_id" = ${categories}`, take: Math.abs(Number(limit || configLimit)) })
-				: await Guild.find({
-						where: `"primary_category_id" = ${categories} AND "features" LIKE '%DISCOVERABLE%'`,
-						take: Math.abs(Number(limit || configLimit))
-				  });
+			? await Guild.find({ where: { primary_category_id: Number(categories) }, take: Math.abs(Number(limit || configLimit)) })
+			: await Guild.find({
+					where: { primary_category_id: Number(categories), features: Like("%DISCOVERABLE%") },
+					take: Math.abs(Number(limit || configLimit))
+			  });
 	}
 
 	const total = guilds ? guilds.length : undefined;
 
-	res.send({ total: total, guilds: guilds, offset: Number(offset || Config.get().guild.discovery.offset), limit: Number(limit || configLimit) });
+	res.send({
+		total: total,
+		guilds: guilds,
+		offset: Number(offset || Config.get().guild.discovery.offset),
+		limit: Number(limit || configLimit)
+	});
 });
 
 export default router;
diff --git a/bundle/package-lock.json b/bundle/package-lock.json
index 3f2d85ba..b9277e0b 100644
--- a/bundle/package-lock.json
+++ b/bundle/package-lock.json
@@ -132,7 +132,7 @@
 				"picocolors": "^1.0.0",
 				"proxy-agent": "^5.0.0",
 				"supertest": "^6.1.6",
-				"typeorm": "^0.2.37"
+				"typeorm": "^0.2.45"
 			},
 			"devDependencies": {
 				"@babel/core": "^7.15.5",
@@ -218,7 +218,7 @@
 				"missing-native-js-functions": "^1.2.18",
 				"node-fetch": "^2.6.2",
 				"proxy-agent": "^5.0.0",
-				"typeorm": "^0.2.37",
+				"typeorm": "^0.2.45",
 				"ws": "^7.4.2"
 			},
 			"devDependencies": {
@@ -13019,7 +13019,7 @@
 				"ts-node": "^9.1.1",
 				"ts-node-dev": "^1.1.6",
 				"ts-patch": "^1.4.4",
-				"typeorm": "^0.2.37",
+				"typeorm": "^0.2.45",
 				"typescript": "^4.4.2",
 				"typescript-json-schema": "0.50.1"
 			}
@@ -13083,7 +13083,7 @@
 				"proxy-agent": "^5.0.0",
 				"ts-node-dev": "^1.1.6",
 				"ts-patch": "^1.4.4",
-				"typeorm": "^0.2.37",
+				"typeorm": "^0.2.45",
 				"typescript": "^4.2.3",
 				"ws": "^7.4.2"
 			}
diff --git a/util/package-lock.json b/util/package-lock.json
index a566836e..2405456e 100644
--- a/util/package-lock.json
+++ b/util/package-lock.json
@@ -22,7 +22,7 @@
 				"picocolors": "^1.0.0",
 				"proxy-agent": "^5.0.0",
 				"reflect-metadata": "^0.1.13",
-				"typeorm": "^0.2.38",
+				"typeorm": "^0.3.7",
 				"typescript": "^4.4.2",
 				"typescript-json-schema": "^0.50.1"
 			},
@@ -30,7 +30,7 @@
 				"@types/amqplib": "^0.8.1",
 				"@types/jsonwebtoken": "^8.5.0",
 				"@types/multer": "^1.4.7",
-				"@types/node": "^14.17.9",
+				"@types/node": "^14.18.22",
 				"@types/node-fetch": "^2.5.12",
 				"jest": "^27.0.6",
 				"ts-node": "^10.2.1"
@@ -668,22 +668,13 @@
 			"integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==",
 			"dev": true
 		},
-		"node_modules/@cspotcode/source-map-consumer": {
-			"version": "0.8.0",
-			"resolved": "https://registry.npmjs.org/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz",
-			"integrity": "sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==",
-			"dev": true,
-			"engines": {
-				"node": ">= 12"
-			}
-		},
 		"node_modules/@cspotcode/source-map-support": {
-			"version": "0.6.1",
-			"resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.6.1.tgz",
-			"integrity": "sha512-DX3Z+T5dt1ockmPdobJS/FAsQPW4V4SrWEhD2iYQT2Cb2tQsiMnYxrcUH9By/Z3B+v0S5LMBkQtV/XOBbpLEOg==",
-			"dev": true,
+			"version": "0.8.1",
+			"resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz",
+			"integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==",
+			"devOptional": true,
 			"dependencies": {
-				"@cspotcode/source-map-consumer": "0.8.0"
+				"@jridgewell/trace-mapping": "0.3.9"
 			},
 			"engines": {
 				"node": ">=12"
@@ -1001,6 +992,31 @@
 				"node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
 			}
 		},
+		"node_modules/@jridgewell/resolve-uri": {
+			"version": "3.1.0",
+			"resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
+			"integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==",
+			"devOptional": true,
+			"engines": {
+				"node": ">=6.0.0"
+			}
+		},
+		"node_modules/@jridgewell/sourcemap-codec": {
+			"version": "1.4.14",
+			"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
+			"integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==",
+			"devOptional": true
+		},
+		"node_modules/@jridgewell/trace-mapping": {
+			"version": "0.3.9",
+			"resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz",
+			"integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==",
+			"devOptional": true,
+			"dependencies": {
+				"@jridgewell/resolve-uri": "^3.0.3",
+				"@jridgewell/sourcemap-codec": "^1.4.10"
+			}
+		},
 		"node_modules/@mapbox/node-pre-gyp": {
 			"version": "1.0.9",
 			"resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.9.tgz",
@@ -1235,25 +1251,25 @@
 			"version": "1.0.8",
 			"resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz",
 			"integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==",
-			"dev": true
+			"devOptional": true
 		},
 		"node_modules/@tsconfig/node12": {
 			"version": "1.0.9",
 			"resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz",
 			"integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==",
-			"dev": true
+			"devOptional": true
 		},
 		"node_modules/@tsconfig/node14": {
 			"version": "1.0.1",
 			"resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz",
 			"integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==",
-			"dev": true
+			"devOptional": true
 		},
 		"node_modules/@tsconfig/node16": {
 			"version": "1.0.2",
 			"resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz",
 			"integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==",
-			"dev": true
+			"devOptional": true
 		},
 		"node_modules/@types/amqplib": {
 			"version": "0.8.2",
@@ -1417,9 +1433,9 @@
 			}
 		},
 		"node_modules/@types/node": {
-			"version": "14.17.17",
-			"resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.17.tgz",
-			"integrity": "sha512-niAjcewgEYvSPCZm3OaM9y6YQrL2SEPH9PymtE6fuZAvFiP6ereCcvApGl2jKTq7copTIguX3PBvfP08LN4LvQ=="
+			"version": "14.18.22",
+			"resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.22.tgz",
+			"integrity": "sha512-qzaYbXVzin6EPjghf/hTdIbnVW1ErMx8rPzwRNJhlbyJhu2SyqlvjGOY/tbUt6VFyzg56lROcOeSQRInpt63Yw=="
 		},
 		"node_modules/@types/node-fetch": {
 			"version": "2.5.12",
@@ -1494,11 +1510,6 @@
 			"integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==",
 			"dev": true
 		},
-		"node_modules/@types/zen-observable": {
-			"version": "0.8.3",
-			"resolved": "https://registry.npmjs.org/@types/zen-observable/-/zen-observable-0.8.3.tgz",
-			"integrity": "sha512-fbF6oTd4sGGy0xjHPKAt+eS2CrxJ3+6gQ3FGcBoIJR2TLAyCkCyI8JqZNy+FeON0AhVgNJoUumVoZQjBFUqHkw=="
-		},
 		"node_modules/@yarnpkg/lockfile": {
 			"version": "1.1.0",
 			"resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz",
@@ -2162,7 +2173,7 @@
 		"node_modules/busboy": {
 			"version": "0.2.14",
 			"resolved": "https://registry.npmjs.org/busboy/-/busboy-0.2.14.tgz",
-			"integrity": "sha1-bCpiLvz0fFe7vh4qnDetNseSVFM=",
+			"integrity": "sha512-InWFDomvlkEj+xWLBfU3AvnbVYqeTWmQopiW0tWWEy5yehYm2YkGEc59sUmw/4ty5Zj/b0WHGs1LgecuBSBGrg==",
 			"dependencies": {
 				"dicer": "0.2.5",
 				"readable-stream": "1.1.x"
@@ -2618,6 +2629,18 @@
 				"node": ">=10"
 			}
 		},
+		"node_modules/date-fns": {
+			"version": "2.28.0",
+			"resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.28.0.tgz",
+			"integrity": "sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw==",
+			"engines": {
+				"node": ">=0.11"
+			},
+			"funding": {
+				"type": "opencollective",
+				"url": "https://opencollective.com/date-fns"
+			}
+		},
 		"node_modules/debug": {
 			"version": "2.6.9",
 			"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
@@ -2771,7 +2794,7 @@
 		"node_modules/dicer": {
 			"version": "0.2.5",
 			"resolved": "https://registry.npmjs.org/dicer/-/dicer-0.2.5.tgz",
-			"integrity": "sha1-WZbAhrszIYyBLAkL3cCc0S+stw8=",
+			"integrity": "sha512-FDvbtnq7dzlPz0wyYlOExifDEZcu8h+rErEXgfxqmLfRfC/kJidEFh4+effJRO3P0xmfqyPbSMG0LveNRfTKVg==",
 			"dependencies": {
 				"readable-stream": "1.1.x",
 				"streamsearch": "0.1.2"
@@ -2819,11 +2842,11 @@
 			}
 		},
 		"node_modules/dotenv": {
-			"version": "8.6.0",
-			"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz",
-			"integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==",
+			"version": "16.0.1",
+			"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.1.tgz",
+			"integrity": "sha512-1K6hR6wtk2FviQ4kEiSjFiH5rpzEVi8WW0x96aztHVMhEspNpc4DVOUTEHtEva5VThQ8IaBX1Pe4gSzpVVUsKQ==",
 			"engines": {
-				"node": ">=10"
+				"node": ">=12"
 			}
 		},
 		"node_modules/ecdsa-sig-formatter": {
@@ -3452,14 +3475,14 @@
 			"peer": true
 		},
 		"node_modules/glob": {
-			"version": "7.1.7",
-			"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz",
-			"integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==",
+			"version": "7.2.3",
+			"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+			"integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
 			"dependencies": {
 				"fs.realpath": "^1.0.0",
 				"inflight": "^1.0.4",
 				"inherits": "2",
-				"minimatch": "^3.0.4",
+				"minimatch": "^3.1.1",
 				"once": "^1.3.0",
 				"path-is-absolute": "^1.0.0"
 			},
@@ -5113,9 +5136,9 @@
 			}
 		},
 		"node_modules/minimatch": {
-			"version": "3.0.4",
-			"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
-			"integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+			"version": "3.1.2",
+			"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+			"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
 			"dependencies": {
 				"brace-expansion": "^1.1.7"
 			},
@@ -5254,9 +5277,10 @@
 			"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
 		},
 		"node_modules/multer": {
-			"version": "1.4.3",
-			"resolved": "https://registry.npmjs.org/multer/-/multer-1.4.3.tgz",
-			"integrity": "sha512-np0YLKncuZoTzufbkM6wEKp68EhWJXcU6fq6QqrSwkckd2LlMgd1UqhUJLj6NS/5sZ8dE8LYDWslsltJznnXlg==",
+			"version": "1.4.4",
+			"resolved": "https://registry.npmjs.org/multer/-/multer-1.4.4.tgz",
+			"integrity": "sha512-2wY2+xD4udX612aMqMcB8Ws2Voq6NIUPEtD1be6m411T4uDH/VtL9i//xvcyFlTVfRdaBsk7hV5tgrGQqhuBiw==",
+			"deprecated": "Multer 1.x is affected by CVE-2022-24434. This is fixed in v1.4.4-lts.1 which drops support for versions of Node.js before 6. Please upgrade to at least Node.js 6 and version 1.4.4-lts.1 of Multer. If you need support for older versions of Node.js, we are open to accepting patches that would fix the CVE on the main 1.x release line, whilst maintaining compatibility with Node.js 0.10.",
 			"dependencies": {
 				"append-field": "^1.0.0",
 				"busboy": "^0.2.11",
@@ -7266,12 +7290,12 @@
 			}
 		},
 		"node_modules/ts-node": {
-			"version": "10.2.1",
-			"resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.2.1.tgz",
-			"integrity": "sha512-hCnyOyuGmD5wHleOQX6NIjJtYVIO8bPP8F2acWkB4W06wdlkgyvJtubO/I9NkI88hCFECbsEgoLc0VNkYmcSfw==",
-			"dev": true,
+			"version": "10.9.1",
+			"resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz",
+			"integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==",
+			"devOptional": true,
 			"dependencies": {
-				"@cspotcode/source-map-support": "0.6.1",
+				"@cspotcode/source-map-support": "^0.8.0",
 				"@tsconfig/node10": "^1.0.7",
 				"@tsconfig/node12": "^1.0.7",
 				"@tsconfig/node14": "^1.0.0",
@@ -7282,18 +7306,17 @@
 				"create-require": "^1.1.0",
 				"diff": "^4.0.1",
 				"make-error": "^1.1.1",
+				"v8-compile-cache-lib": "^3.0.1",
 				"yn": "3.1.1"
 			},
 			"bin": {
 				"ts-node": "dist/bin.js",
 				"ts-node-cwd": "dist/bin-cwd.js",
+				"ts-node-esm": "dist/bin-esm.js",
 				"ts-node-script": "dist/bin-script.js",
 				"ts-node-transpile-only": "dist/bin-transpile.js",
 				"ts-script": "dist/bin-script-deprecated.js"
 			},
-			"engines": {
-				"node": ">=12.0.0"
-			},
 			"peerDependencies": {
 				"@swc/core": ">=1.2.50",
 				"@swc/wasm": ">=1.2.50",
@@ -7313,7 +7336,7 @@
 			"version": "8.2.0",
 			"resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz",
 			"integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==",
-			"dev": true,
+			"devOptional": true,
 			"engines": {
 				"node": ">=0.4.0"
 			}
@@ -7395,52 +7418,62 @@
 			}
 		},
 		"node_modules/typeorm": {
-			"version": "0.2.38",
-			"resolved": "https://registry.npmjs.org/typeorm/-/typeorm-0.2.38.tgz",
-			"integrity": "sha512-M6Y3KQcAREQcphOVJciywf4mv6+A0I/SeR+lWNjKsjnQ+a3XcMwGYMGL0Jonsx3H0Cqlf/3yYqVki1jIXSK/xg==",
+			"version": "0.3.7",
+			"resolved": "https://registry.npmjs.org/typeorm/-/typeorm-0.3.7.tgz",
+			"integrity": "sha512-MsPJeP6Zuwfe64c++l80+VRqpGEGxf0CkztIEnehQ+CMmQPSHjOnFbFxwBuZ2jiLqZTjLk2ZqQdVF0RmvxNF3Q==",
 			"dependencies": {
 				"@sqltools/formatter": "^1.2.2",
 				"app-root-path": "^3.0.0",
 				"buffer": "^6.0.3",
 				"chalk": "^4.1.0",
 				"cli-highlight": "^2.1.11",
-				"debug": "^4.3.1",
-				"dotenv": "^8.2.0",
-				"glob": "^7.1.6",
-				"js-yaml": "^4.0.0",
+				"date-fns": "^2.28.0",
+				"debug": "^4.3.3",
+				"dotenv": "^16.0.0",
+				"glob": "^7.2.0",
+				"js-yaml": "^4.1.0",
 				"mkdirp": "^1.0.4",
 				"reflect-metadata": "^0.1.13",
 				"sha.js": "^2.4.11",
-				"tslib": "^2.1.0",
+				"tslib": "^2.3.1",
+				"uuid": "^8.3.2",
 				"xml2js": "^0.4.23",
-				"yargonaut": "^1.1.4",
-				"yargs": "^17.0.1",
-				"zen-observable-ts": "^1.0.0"
+				"yargs": "^17.3.1"
 			},
 			"bin": {
-				"typeorm": "cli.js"
+				"typeorm": "cli.js",
+				"typeorm-ts-node-commonjs": "cli-ts-node-commonjs.js",
+				"typeorm-ts-node-esm": "cli-ts-node-esm.js"
+			},
+			"engines": {
+				"node": ">= 12.9.0"
 			},
 			"funding": {
 				"url": "https://opencollective.com/typeorm"
 			},
 			"peerDependencies": {
-				"@sap/hana-client": "*",
-				"better-sqlite3": "*",
-				"hdb-pool": "*",
-				"ioredis": "*",
+				"@google-cloud/spanner": "^5.18.0",
+				"@sap/hana-client": "^2.12.25",
+				"better-sqlite3": "^7.1.2",
+				"hdb-pool": "^0.1.6",
+				"ioredis": "^5.0.4",
 				"mongodb": "^3.6.0",
-				"mssql": "*",
-				"mysql2": "*",
-				"oracledb": "*",
-				"pg": "*",
-				"pg-native": "*",
-				"pg-query-stream": "*",
-				"redis": "*",
-				"sql.js": "*",
-				"sqlite3": "*",
-				"typeorm-aurora-data-api-driver": "*"
+				"mssql": "^7.3.0",
+				"mysql2": "^2.2.5",
+				"oracledb": "^5.1.0",
+				"pg": "^8.5.1",
+				"pg-native": "^3.0.0",
+				"pg-query-stream": "^4.0.0",
+				"redis": "^3.1.1 || ^4.0.0",
+				"sql.js": "^1.4.0",
+				"sqlite3": "^5.0.3",
+				"ts-node": "^10.7.0",
+				"typeorm-aurora-data-api-driver": "^2.0.0"
 			},
 			"peerDependenciesMeta": {
+				"@google-cloud/spanner": {
+					"optional": true
+				},
 				"@sap/hana-client": {
 					"optional": true
 				},
@@ -7483,6 +7516,9 @@
 				"sqlite3": {
 					"optional": true
 				},
+				"ts-node": {
+					"optional": true
+				},
 				"typeorm-aurora-data-api-driver": {
 					"optional": true
 				}
@@ -7517,9 +7553,9 @@
 			}
 		},
 		"node_modules/typeorm/node_modules/debug": {
-			"version": "4.3.2",
-			"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
-			"integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
+			"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"
 			},
@@ -7568,35 +7604,43 @@
 			"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
 		},
 		"node_modules/typeorm/node_modules/string-width": {
-			"version": "4.2.2",
-			"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz",
-			"integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==",
+			"version": "4.2.3",
+			"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+			"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
 			"dependencies": {
 				"emoji-regex": "^8.0.0",
 				"is-fullwidth-code-point": "^3.0.0",
-				"strip-ansi": "^6.0.0"
+				"strip-ansi": "^6.0.1"
 			},
 			"engines": {
 				"node": ">=8"
 			}
 		},
 		"node_modules/typeorm/node_modules/yargs": {
-			"version": "17.1.1",
-			"resolved": "https://registry.npmjs.org/yargs/-/yargs-17.1.1.tgz",
-			"integrity": "sha512-c2k48R0PwKIqKhPMWjeiF6y2xY/gPMUlro0sgxqXpbOIohWiLNXWslsootttv7E1e73QPAMQSg5FeySbVcpsPQ==",
+			"version": "17.5.1",
+			"resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz",
+			"integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==",
 			"dependencies": {
 				"cliui": "^7.0.2",
 				"escalade": "^3.1.1",
 				"get-caller-file": "^2.0.5",
 				"require-directory": "^2.1.1",
-				"string-width": "^4.2.0",
+				"string-width": "^4.2.3",
 				"y18n": "^5.0.5",
-				"yargs-parser": "^20.2.2"
+				"yargs-parser": "^21.0.0"
 			},
 			"engines": {
 				"node": ">=12"
 			}
 		},
+		"node_modules/typeorm/node_modules/yargs-parser": {
+			"version": "21.0.1",
+			"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz",
+			"integrity": "sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==",
+			"engines": {
+				"node": ">=12"
+			}
+		},
 		"node_modules/typescript": {
 			"version": "4.4.3",
 			"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.3.tgz",
@@ -7721,6 +7765,20 @@
 				"node": ">= 0.4.0"
 			}
 		},
+		"node_modules/uuid": {
+			"version": "8.3.2",
+			"resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
+			"integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+			"bin": {
+				"uuid": "dist/bin/uuid"
+			}
+		},
+		"node_modules/v8-compile-cache-lib": {
+			"version": "3.0.1",
+			"resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz",
+			"integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==",
+			"devOptional": true
+		},
 		"node_modules/v8-to-istanbul": {
 			"version": "8.0.0",
 			"resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.0.0.tgz",
@@ -8134,20 +8192,6 @@
 			"engines": {
 				"node": ">=6"
 			}
-		},
-		"node_modules/zen-observable": {
-			"version": "0.8.15",
-			"resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.15.tgz",
-			"integrity": "sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ=="
-		},
-		"node_modules/zen-observable-ts": {
-			"version": "1.1.0",
-			"resolved": "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-1.1.0.tgz",
-			"integrity": "sha512-1h4zlLSqI2cRLPJUHJFL8bCWHhkpuXkF+dbGkRaWjgDIG26DmzyshUMrdV/rL3UnR+mhaX4fRq8LPouq0MYYIA==",
-			"dependencies": {
-				"@types/zen-observable": "0.8.3",
-				"zen-observable": "0.8.15"
-			}
 		}
 	},
 	"dependencies": {
@@ -8627,19 +8671,13 @@
 			"integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==",
 			"dev": true
 		},
-		"@cspotcode/source-map-consumer": {
-			"version": "0.8.0",
-			"resolved": "https://registry.npmjs.org/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz",
-			"integrity": "sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==",
-			"dev": true
-		},
 		"@cspotcode/source-map-support": {
-			"version": "0.6.1",
-			"resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.6.1.tgz",
-			"integrity": "sha512-DX3Z+T5dt1ockmPdobJS/FAsQPW4V4SrWEhD2iYQT2Cb2tQsiMnYxrcUH9By/Z3B+v0S5LMBkQtV/XOBbpLEOg==",
-			"dev": true,
+			"version": "0.8.1",
+			"resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz",
+			"integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==",
+			"devOptional": true,
 			"requires": {
-				"@cspotcode/source-map-consumer": "0.8.0"
+				"@jridgewell/trace-mapping": "0.3.9"
 			}
 		},
 		"@gar/promisify": {
@@ -8890,6 +8928,28 @@
 				"chalk": "^4.0.0"
 			}
 		},
+		"@jridgewell/resolve-uri": {
+			"version": "3.1.0",
+			"resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
+			"integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==",
+			"devOptional": true
+		},
+		"@jridgewell/sourcemap-codec": {
+			"version": "1.4.14",
+			"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
+			"integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==",
+			"devOptional": true
+		},
+		"@jridgewell/trace-mapping": {
+			"version": "0.3.9",
+			"resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz",
+			"integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==",
+			"devOptional": true,
+			"requires": {
+				"@jridgewell/resolve-uri": "^3.0.3",
+				"@jridgewell/sourcemap-codec": "^1.4.10"
+			}
+		},
 		"@mapbox/node-pre-gyp": {
 			"version": "1.0.9",
 			"resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.9.tgz",
@@ -9085,25 +9145,25 @@
 			"version": "1.0.8",
 			"resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz",
 			"integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==",
-			"dev": true
+			"devOptional": true
 		},
 		"@tsconfig/node12": {
 			"version": "1.0.9",
 			"resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz",
 			"integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==",
-			"dev": true
+			"devOptional": true
 		},
 		"@tsconfig/node14": {
 			"version": "1.0.1",
 			"resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz",
 			"integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==",
-			"dev": true
+			"devOptional": true
 		},
 		"@tsconfig/node16": {
 			"version": "1.0.2",
 			"resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz",
 			"integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==",
-			"dev": true
+			"devOptional": true
 		},
 		"@types/amqplib": {
 			"version": "0.8.2",
@@ -9267,9 +9327,9 @@
 			}
 		},
 		"@types/node": {
-			"version": "14.17.17",
-			"resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.17.tgz",
-			"integrity": "sha512-niAjcewgEYvSPCZm3OaM9y6YQrL2SEPH9PymtE6fuZAvFiP6ereCcvApGl2jKTq7copTIguX3PBvfP08LN4LvQ=="
+			"version": "14.18.22",
+			"resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.22.tgz",
+			"integrity": "sha512-qzaYbXVzin6EPjghf/hTdIbnVW1ErMx8rPzwRNJhlbyJhu2SyqlvjGOY/tbUt6VFyzg56lROcOeSQRInpt63Yw=="
 		},
 		"@types/node-fetch": {
 			"version": "2.5.12",
@@ -9343,11 +9403,6 @@
 			"integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==",
 			"dev": true
 		},
-		"@types/zen-observable": {
-			"version": "0.8.3",
-			"resolved": "https://registry.npmjs.org/@types/zen-observable/-/zen-observable-0.8.3.tgz",
-			"integrity": "sha512-fbF6oTd4sGGy0xjHPKAt+eS2CrxJ3+6gQ3FGcBoIJR2TLAyCkCyI8JqZNy+FeON0AhVgNJoUumVoZQjBFUqHkw=="
-		},
 		"@yarnpkg/lockfile": {
 			"version": "1.1.0",
 			"resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz",
@@ -9878,7 +9933,7 @@
 		"busboy": {
 			"version": "0.2.14",
 			"resolved": "https://registry.npmjs.org/busboy/-/busboy-0.2.14.tgz",
-			"integrity": "sha1-bCpiLvz0fFe7vh4qnDetNseSVFM=",
+			"integrity": "sha512-InWFDomvlkEj+xWLBfU3AvnbVYqeTWmQopiW0tWWEy5yehYm2YkGEc59sUmw/4ty5Zj/b0WHGs1LgecuBSBGrg==",
 			"requires": {
 				"dicer": "0.2.5",
 				"readable-stream": "1.1.x"
@@ -10255,6 +10310,11 @@
 				"whatwg-url": "^8.0.0"
 			}
 		},
+		"date-fns": {
+			"version": "2.28.0",
+			"resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.28.0.tgz",
+			"integrity": "sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw=="
+		},
 		"debug": {
 			"version": "2.6.9",
 			"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
@@ -10371,7 +10431,7 @@
 		"dicer": {
 			"version": "0.2.5",
 			"resolved": "https://registry.npmjs.org/dicer/-/dicer-0.2.5.tgz",
-			"integrity": "sha1-WZbAhrszIYyBLAkL3cCc0S+stw8=",
+			"integrity": "sha512-FDvbtnq7dzlPz0wyYlOExifDEZcu8h+rErEXgfxqmLfRfC/kJidEFh4+effJRO3P0xmfqyPbSMG0LveNRfTKVg==",
 			"requires": {
 				"readable-stream": "1.1.x",
 				"streamsearch": "0.1.2"
@@ -10406,9 +10466,9 @@
 			}
 		},
 		"dotenv": {
-			"version": "8.6.0",
-			"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz",
-			"integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g=="
+			"version": "16.0.1",
+			"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.1.tgz",
+			"integrity": "sha512-1K6hR6wtk2FviQ4kEiSjFiH5rpzEVi8WW0x96aztHVMhEspNpc4DVOUTEHtEva5VThQ8IaBX1Pe4gSzpVVUsKQ=="
 		},
 		"ecdsa-sig-formatter": {
 			"version": "1.0.11",
@@ -10899,14 +10959,14 @@
 			"peer": true
 		},
 		"glob": {
-			"version": "7.1.7",
-			"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz",
-			"integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==",
+			"version": "7.2.3",
+			"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+			"integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
 			"requires": {
 				"fs.realpath": "^1.0.0",
 				"inflight": "^1.0.4",
 				"inherits": "2",
-				"minimatch": "^3.0.4",
+				"minimatch": "^3.1.1",
 				"once": "^1.3.0",
 				"path-is-absolute": "^1.0.0"
 			}
@@ -12190,9 +12250,9 @@
 			"peer": true
 		},
 		"minimatch": {
-			"version": "3.0.4",
-			"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
-			"integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+			"version": "3.1.2",
+			"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+			"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
 			"requires": {
 				"brace-expansion": "^1.1.7"
 			}
@@ -12302,9 +12362,9 @@
 			"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
 		},
 		"multer": {
-			"version": "1.4.3",
-			"resolved": "https://registry.npmjs.org/multer/-/multer-1.4.3.tgz",
-			"integrity": "sha512-np0YLKncuZoTzufbkM6wEKp68EhWJXcU6fq6QqrSwkckd2LlMgd1UqhUJLj6NS/5sZ8dE8LYDWslsltJznnXlg==",
+			"version": "1.4.4",
+			"resolved": "https://registry.npmjs.org/multer/-/multer-1.4.4.tgz",
+			"integrity": "sha512-2wY2+xD4udX612aMqMcB8Ws2Voq6NIUPEtD1be6m411T4uDH/VtL9i//xvcyFlTVfRdaBsk7hV5tgrGQqhuBiw==",
 			"requires": {
 				"append-field": "^1.0.0",
 				"busboy": "^0.2.11",
@@ -13849,12 +13909,12 @@
 			}
 		},
 		"ts-node": {
-			"version": "10.2.1",
-			"resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.2.1.tgz",
-			"integrity": "sha512-hCnyOyuGmD5wHleOQX6NIjJtYVIO8bPP8F2acWkB4W06wdlkgyvJtubO/I9NkI88hCFECbsEgoLc0VNkYmcSfw==",
-			"dev": true,
+			"version": "10.9.1",
+			"resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz",
+			"integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==",
+			"devOptional": true,
 			"requires": {
-				"@cspotcode/source-map-support": "0.6.1",
+				"@cspotcode/source-map-support": "^0.8.0",
 				"@tsconfig/node10": "^1.0.7",
 				"@tsconfig/node12": "^1.0.7",
 				"@tsconfig/node14": "^1.0.0",
@@ -13865,6 +13925,7 @@
 				"create-require": "^1.1.0",
 				"diff": "^4.0.1",
 				"make-error": "^1.1.1",
+				"v8-compile-cache-lib": "^3.0.1",
 				"yn": "3.1.1"
 			},
 			"dependencies": {
@@ -13872,7 +13933,7 @@
 					"version": "8.2.0",
 					"resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz",
 					"integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==",
-					"dev": true
+					"devOptional": true
 				}
 			}
 		},
@@ -13935,27 +13996,27 @@
 			}
 		},
 		"typeorm": {
-			"version": "0.2.38",
-			"resolved": "https://registry.npmjs.org/typeorm/-/typeorm-0.2.38.tgz",
-			"integrity": "sha512-M6Y3KQcAREQcphOVJciywf4mv6+A0I/SeR+lWNjKsjnQ+a3XcMwGYMGL0Jonsx3H0Cqlf/3yYqVki1jIXSK/xg==",
+			"version": "0.3.7",
+			"resolved": "https://registry.npmjs.org/typeorm/-/typeorm-0.3.7.tgz",
+			"integrity": "sha512-MsPJeP6Zuwfe64c++l80+VRqpGEGxf0CkztIEnehQ+CMmQPSHjOnFbFxwBuZ2jiLqZTjLk2ZqQdVF0RmvxNF3Q==",
 			"requires": {
 				"@sqltools/formatter": "^1.2.2",
 				"app-root-path": "^3.0.0",
 				"buffer": "^6.0.3",
 				"chalk": "^4.1.0",
 				"cli-highlight": "^2.1.11",
-				"debug": "^4.3.1",
-				"dotenv": "^8.2.0",
-				"glob": "^7.1.6",
-				"js-yaml": "^4.0.0",
+				"date-fns": "^2.28.0",
+				"debug": "^4.3.3",
+				"dotenv": "^16.0.0",
+				"glob": "^7.2.0",
+				"js-yaml": "^4.1.0",
 				"mkdirp": "^1.0.4",
 				"reflect-metadata": "^0.1.13",
 				"sha.js": "^2.4.11",
-				"tslib": "^2.1.0",
+				"tslib": "^2.3.1",
+				"uuid": "^8.3.2",
 				"xml2js": "^0.4.23",
-				"yargonaut": "^1.1.4",
-				"yargs": "^17.0.1",
-				"zen-observable-ts": "^1.0.0"
+				"yargs": "^17.3.1"
 			},
 			"dependencies": {
 				"argparse": {
@@ -13973,9 +14034,9 @@
 					}
 				},
 				"debug": {
-					"version": "4.3.2",
-					"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
-					"integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
+					"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"
 					}
@@ -14004,28 +14065,33 @@
 					"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
 				},
 				"string-width": {
-					"version": "4.2.2",
-					"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz",
-					"integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==",
+					"version": "4.2.3",
+					"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+					"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
 					"requires": {
 						"emoji-regex": "^8.0.0",
 						"is-fullwidth-code-point": "^3.0.0",
-						"strip-ansi": "^6.0.0"
+						"strip-ansi": "^6.0.1"
 					}
 				},
 				"yargs": {
-					"version": "17.1.1",
-					"resolved": "https://registry.npmjs.org/yargs/-/yargs-17.1.1.tgz",
-					"integrity": "sha512-c2k48R0PwKIqKhPMWjeiF6y2xY/gPMUlro0sgxqXpbOIohWiLNXWslsootttv7E1e73QPAMQSg5FeySbVcpsPQ==",
+					"version": "17.5.1",
+					"resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz",
+					"integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==",
 					"requires": {
 						"cliui": "^7.0.2",
 						"escalade": "^3.1.1",
 						"get-caller-file": "^2.0.5",
 						"require-directory": "^2.1.1",
-						"string-width": "^4.2.0",
+						"string-width": "^4.2.3",
 						"y18n": "^5.0.5",
-						"yargs-parser": "^20.2.2"
+						"yargs-parser": "^21.0.0"
 					}
+				},
+				"yargs-parser": {
+					"version": "21.0.1",
+					"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz",
+					"integrity": "sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg=="
 				}
 			}
 		},
@@ -14117,6 +14183,17 @@
 			"resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
 			"integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
 		},
+		"uuid": {
+			"version": "8.3.2",
+			"resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
+			"integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="
+		},
+		"v8-compile-cache-lib": {
+			"version": "3.0.1",
+			"resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz",
+			"integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==",
+			"devOptional": true
+		},
 		"v8-to-istanbul": {
 			"version": "8.0.0",
 			"resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.0.0.tgz",
@@ -14430,20 +14507,6 @@
 			"version": "3.1.1",
 			"resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
 			"integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q=="
-		},
-		"zen-observable": {
-			"version": "0.8.15",
-			"resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.15.tgz",
-			"integrity": "sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ=="
-		},
-		"zen-observable-ts": {
-			"version": "1.1.0",
-			"resolved": "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-1.1.0.tgz",
-			"integrity": "sha512-1h4zlLSqI2cRLPJUHJFL8bCWHhkpuXkF+dbGkRaWjgDIG26DmzyshUMrdV/rL3UnR+mhaX4fRq8LPouq0MYYIA==",
-			"requires": {
-				"@types/zen-observable": "0.8.3",
-				"zen-observable": "0.8.15"
-			}
 		}
 	}
 }
diff --git a/util/package.json b/util/package.json
index 246ec6b6..e6dc8e2d 100644
--- a/util/package.json
+++ b/util/package.json
@@ -32,7 +32,7 @@
 		"@types/amqplib": "^0.8.1",
 		"@types/jsonwebtoken": "^8.5.0",
 		"@types/multer": "^1.4.7",
-		"@types/node": "^14.17.9",
+		"@types/node": "^14.18.22",
 		"@types/node-fetch": "^2.5.12",
 		"jest": "^27.0.6",
 		"ts-node": "^10.2.1"
@@ -50,7 +50,7 @@
 		"picocolors": "^1.0.0",
 		"proxy-agent": "^5.0.0",
 		"reflect-metadata": "^0.1.13",
-		"typeorm": "^0.2.45",
+		"typeorm": "^0.3.7",
 		"typescript": "^4.4.2",
 		"typescript-json-schema": "^0.50.1"
 	},
diff --git a/util/src/entities/BaseClass.ts b/util/src/entities/BaseClass.ts
index 9f23de7c..7ee27e30 100644
--- a/util/src/entities/BaseClass.ts
+++ b/util/src/entities/BaseClass.ts
@@ -50,12 +50,20 @@ export class BaseClassWithoutId extends BaseEntity {
 		);
 	}
 
-	static increment<T extends BaseClass>(conditions: FindOptionsWhere<T>, propertyPath: string, value: number | string) {
+	static increment<T extends BaseClass>(
+		conditions: FindOptionsWhere<T>,
+		propertyPath: string,
+		value: number | string
+	) {
 		const repository = this.getRepository();
 		return repository.increment(conditions, propertyPath, value);
 	}
 
-	static decrement<T extends BaseClass>(conditions: FindOptionsWhere<T>, propertyPath: string, value: number | string) {
+	static decrement<T extends BaseClass>(
+		conditions: FindOptionsWhere<T>,
+		propertyPath: string,
+		value: number | string
+	) {
 		const repository = this.getRepository();
 		return repository.decrement(conditions, propertyPath, value);
 	}
diff --git a/util/src/entities/User.ts b/util/src/entities/User.ts
index bd70780d..7d5dc5a6 100644
--- a/util/src/entities/User.ts
+++ b/util/src/entities/User.ts
@@ -1,4 +1,4 @@
-import { Column, Entity, FindOneOptions, JoinColumn, OneToMany } from "typeorm";
+import { Column, Entity, FindOneOptions, FindOptionsSelectByString, JoinColumn, ManyToMany, OneToMany, RelationId } from "typeorm";
 import { BaseClass } from "./BaseClass";
 import { BitField } from "../util/BitField";
 import { Relationship } from "./Relationship";
@@ -90,7 +90,7 @@ export class User extends BaseClass {
 
 	@Column()
 	premium: boolean; // if user bought individual premium
-	
+
 	@Column()
 	premium_type: number; // individual premium level
 
@@ -105,7 +105,7 @@ export class User extends BaseClass {
 
 	@Column({ select: false })
 	nsfw_allowed: boolean; // if the user can do age-restricted actions (NSFW channels/guilds/commands)
-	
+
 	@Column({ select: false })
 	mfa_enabled: boolean; // if multi factor authentication is enabled
 
@@ -170,11 +170,14 @@ export class User extends BaseClass {
 
 	@Column({ type: "simple-json", select: false })
 	settings: UserSettings;
-		
+
 	// workaround to prevent fossord-unaware clients from deleting settings not used by them
 	@Column({ type: "simple-json", select: false })
 	extended_settings: string;
 
+	@Column({ type: "simple-json" })
+	notes: { [key: string]: string }; //key is ID of user
+
 	toPublicUser() {
 		const user: any = {};
 		PublicUserProjection.forEach((x) => {
@@ -184,19 +187,17 @@ export class User extends BaseClass {
 	}
 
 	static async getPublicUser(user_id: string, opts?: FindOneOptions<User>) {
-		return await User.findOneOrFail(
-			{ id: user_id },
-			{
-				...opts,
-				select: [...PublicUserProjection, ...(opts?.select || [])],
-			}
-		);
+		return await User.findOneOrFail({
+			where: { id: user_id },
+			select: [...PublicUserProjection, ...((opts?.select as FindOptionsSelectByString<User>) || [])],
+			...opts,
+		});
 	}
 
 	private static async generateDiscriminator(username: string): Promise<string | undefined> {
 		if (Config.get().register.incrementingDiscriminators) {
 			// discriminator will be incrementally generated
-			
+
 			// First we need to figure out the currently highest discrimnator for the given username and then increment it
 			const users = await User.find({ where: { username }, select: ["discriminator"] });
 			const highestDiscriminator = Math.max(0, ...users.map((u) => Number(u.discriminator)));
@@ -268,6 +269,8 @@ export class User extends BaseClass {
 			premium_type: 2,
 			bio: "",
 			mfa_enabled: false,
+			totp_secret: "",
+			totp_backup_codes: [],
 			verified: true,
 			disabled: false,
 			deleted: false,