summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--api/src/routes/channels/#channel_id/invites.ts3
-rw-r--r--api/src/routes/guilds/#guild_id/index.ts3
-rw-r--r--api/src/util/handlers/Instance.ts3
-rw-r--r--api/src/util/handlers/Message.ts3
-rw-r--r--api/src/util/index.ts10
-rw-r--r--bundle/package-lock.json292
-rw-r--r--bundle/package.json3
-rw-r--r--util/ormconfig.json9
-rw-r--r--util/src/entities/BackupCodes.ts16
-rw-r--r--util/src/entities/BaseClass.ts26
-rw-r--r--util/src/entities/Member.ts11
-rw-r--r--util/src/index.ts1
-rw-r--r--util/src/migrations/1633864260873-EmojiRoles.ts13
-rw-r--r--util/src/migrations/1633864669243-EmojiUser.ts23
-rw-r--r--util/src/migrations/1633881705509-VanityInvite.ts19
-rw-r--r--util/src/migrations/1634308884591-Stickers.ts66
-rw-r--r--util/src/migrations/1634424361103-Presence.ts11
-rw-r--r--util/src/migrations/1634426540271-MigrationTimestamp.ts15
-rw-r--r--util/src/migrations/1648643945733-ReleaseTypo.ts16
-rw-r--r--util/src/migrations/postgres/1659833042721-test.ts3539
-rw-r--r--util/src/util/Database.ts106
-rw-r--r--util/src/util/Database.ts.torm272
-rw-r--r--util/src/util/MFA.ts17
23 files changed, 3937 insertions, 340 deletions
diff --git a/api/src/routes/channels/#channel_id/invites.ts b/api/src/routes/channels/#channel_id/invites.ts
index 5fef136d..6155ef7d 100644
--- a/api/src/routes/channels/#channel_id/invites.ts
+++ b/api/src/routes/channels/#channel_id/invites.ts
@@ -45,7 +45,8 @@ router.post("/", route({ body: "InviteCreateSchema", permission: "CREATE_INSTANT
 		channel_id: channel_id,
 		inviter_id: user_id
 	}).save();
-	const data = invite.toJSON();
+	//TODO: check this, removed toJSON call
+	const data = JSON.parse(JSON.stringify(invite));
 	data.inviter = await User.getPublicUser(req.user_id);
 	data.guild = await Guild.findOne({ where: { id: guild_id } });
 	data.channel = channel;
diff --git a/api/src/routes/guilds/#guild_id/index.ts b/api/src/routes/guilds/#guild_id/index.ts
index 2d748d61..263579e7 100644
--- a/api/src/routes/guilds/#guild_id/index.ts
+++ b/api/src/routes/guilds/#guild_id/index.ts
@@ -61,7 +61,8 @@ router.patch("/", route({ body: "GuildUpdateSchema"}), async (req: Request, res:
 	// TODO: check if body ids are valid
 	guild.assign(body);
 
-	const data = guild.toJSON();
+	//TODO: check this, removed toJSON call
+	const data = JSON.parse(JSON.stringify(guild));
 	// TODO: guild hashes
 	// TODO: fix vanity_url_code, template_id
 	delete data.vanity_url_code;
diff --git a/api/src/util/handlers/Instance.ts b/api/src/util/handlers/Instance.ts
index 6bddfa98..7c337270 100644
--- a/api/src/util/handlers/Instance.ts
+++ b/api/src/util/handlers/Instance.ts
@@ -1,4 +1,5 @@
 import { Config, Guild, Session } from "@fosscord/util";
+import { createQueryBuilder } from "typeorm";
 
 export async function initInstance() {
 	// TODO: clean up database and delete tombstone data
@@ -9,7 +10,7 @@ export async function initInstance() {
 	const { autoJoin } = Config.get().guild;
 
 	if (autoJoin.enabled && !autoJoin.guilds?.length) {
-		let guild = await Guild.findOne({});
+		let guild = await Guild.findOne({where: {}, order: {id: "ASC"}});
 		if (guild) {
 			// @ts-ignore
 			await Config.set({ guild: { autoJoin: { guilds: [guild.id] } } });
diff --git a/api/src/util/handlers/Message.ts b/api/src/util/handlers/Message.ts
index 80012260..7035bc5c 100644
--- a/api/src/util/handlers/Message.ts
+++ b/api/src/util/handlers/Message.ts
@@ -201,9 +201,10 @@ export async function postHandleMessage(message: Message) {
 export async function sendMessage(opts: MessageOptions) {
 	const message = await handleMessage({ ...opts, timestamp: new Date() });
 
+	//TODO: check this, removed toJSON call
 	await Promise.all([
 		Message.insert(message),
-		emitEvent({ event: "MESSAGE_CREATE", channel_id: opts.channel_id, data: message.toJSON() } as MessageCreateEvent)
+		emitEvent({ event: "MESSAGE_CREATE", channel_id: opts.channel_id, data: message } as MessageCreateEvent)
 	]);
 
 	postHandleMessage(message).catch((e) => {}); // no await as it should catch error non-blockingly
diff --git a/api/src/util/index.ts b/api/src/util/index.ts
index ac439371..b3c7559f 100644
--- a/api/src/util/index.ts
+++ b/api/src/util/index.ts
@@ -1,9 +1,9 @@
+export * from "./entities/AssetCacheItem";
+export * from "./handlers/Message";
+export * from "./handlers/route";
+export * from "./handlers/Voice";
 export * from "./utility/Base64";
 export * from "./utility/ipAddress";
-export * from "./handlers/Message";
 export * from "./utility/passwordStrength";
 export * from "./utility/RandomInviteID";
-export * from "./handlers/route";
-export * from "./utility/String";
-export * from "./handlers/Voice";
-export * from "./entities/AssetCacheItem";
\ No newline at end of file
+export * from "./utility/String";
\ No newline at end of file
diff --git a/bundle/package-lock.json b/bundle/package-lock.json
index 3653e700..0ab7c5da 100644
--- a/bundle/package-lock.json
+++ b/bundle/package-lock.json
@@ -44,6 +44,7 @@
 				"node-fetch": "^2.6.7",
 				"node-os-utils": "^1.3.7",
 				"patch-package": "^6.4.7",
+				"pg": "^8.7.3",
 				"picocolors": "^1.0.0",
 				"proxy-agent": "^5.0.0",
 				"reflect-metadata": "^0.1.13",
@@ -4732,6 +4733,14 @@
 			"resolved": "https://registry.npmjs.org/buffer-more-ints/-/buffer-more-ints-1.0.0.tgz",
 			"integrity": "sha512-EMetuGFz5SLsT0QTnXzINh4Ksr+oo4i+UGTXEshiGCQWnsgSs7ZhJ8fzlwQ+OzEMs0MpDAMr1hxnblp5a4vcHg=="
 		},
+		"node_modules/buffer-writer": {
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz",
+			"integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==",
+			"engines": {
+				"node": ">=4"
+			}
+		},
 		"node_modules/busboy": {
 			"version": "1.6.0",
 			"resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz",
@@ -7797,15 +7806,18 @@
 			"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
 			"integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==",
 			"dependencies": {
-				"semver": "^5.4.1"
-			}
-		},
-		"node_modules/node-fetch/node_modules/semver": {
-			"version": "5.7.1",
-			"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
-			"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
-			"bin": {
-				"semver": "bin/semver"
+				"whatwg-url": "^5.0.0"
+			},
+			"engines": {
+				"node": "4.x || >=6.0.0"
+			},
+			"peerDependencies": {
+				"encoding": "^0.1.0"
+			},
+			"peerDependenciesMeta": {
+				"encoding": {
+					"optional": true
+				}
 			}
 		},
 		"node_modules/node-int64": {
@@ -8125,6 +8137,11 @@
 				"node": ">= 8"
 			}
 		},
+		"node_modules/packet-reader": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz",
+			"integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ=="
+		},
 		"node_modules/parse-json": {
 			"version": "5.2.0",
 			"resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
@@ -8400,6 +8417,80 @@
 				"url": "https://github.com/sponsors/Borewit"
 			}
 		},
+		"node_modules/pg": {
+			"version": "8.7.3",
+			"resolved": "https://registry.npmjs.org/pg/-/pg-8.7.3.tgz",
+			"integrity": "sha512-HPmH4GH4H3AOprDJOazoIcpI49XFsHCe8xlrjHkWiapdbHK+HLtbm/GQzXYAZwmPju/kzKhjaSfMACG+8cgJcw==",
+			"dependencies": {
+				"buffer-writer": "2.0.0",
+				"packet-reader": "1.0.0",
+				"pg-connection-string": "^2.5.0",
+				"pg-pool": "^3.5.1",
+				"pg-protocol": "^1.5.0",
+				"pg-types": "^2.1.0",
+				"pgpass": "1.x"
+			},
+			"engines": {
+				"node": ">= 8.0.0"
+			},
+			"peerDependencies": {
+				"pg-native": ">=2.0.0"
+			},
+			"peerDependenciesMeta": {
+				"pg-native": {
+					"optional": true
+				}
+			}
+		},
+		"node_modules/pg-connection-string": {
+			"version": "2.5.0",
+			"resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz",
+			"integrity": "sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ=="
+		},
+		"node_modules/pg-int8": {
+			"version": "1.0.1",
+			"resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz",
+			"integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==",
+			"engines": {
+				"node": ">=4.0.0"
+			}
+		},
+		"node_modules/pg-pool": {
+			"version": "3.5.1",
+			"resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.5.1.tgz",
+			"integrity": "sha512-6iCR0wVrro6OOHFsyavV+i6KYL4lVNyYAB9RD18w66xSzN+d8b66HiwuP30Gp1SH5O9T82fckkzsRjlrhD0ioQ==",
+			"peerDependencies": {
+				"pg": ">=8.0"
+			}
+		},
+		"node_modules/pg-protocol": {
+			"version": "1.5.0",
+			"resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.5.0.tgz",
+			"integrity": "sha512-muRttij7H8TqRNu/DxrAJQITO4Ac7RmX3Klyr/9mJEOBeIpgnF8f9jAfRz5d3XwQZl5qBjF9gLsUtMPJE0vezQ=="
+		},
+		"node_modules/pg-types": {
+			"version": "2.2.0",
+			"resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz",
+			"integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==",
+			"dependencies": {
+				"pg-int8": "1.0.1",
+				"postgres-array": "~2.0.0",
+				"postgres-bytea": "~1.0.0",
+				"postgres-date": "~1.0.4",
+				"postgres-interval": "^1.1.0"
+			},
+			"engines": {
+				"node": ">=4"
+			}
+		},
+		"node_modules/pgpass": {
+			"version": "1.0.5",
+			"resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz",
+			"integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==",
+			"dependencies": {
+				"split2": "^4.1.0"
+			}
+		},
 		"node_modules/picocolors": {
 			"version": "1.0.0",
 			"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
@@ -8436,6 +8527,41 @@
 				"node": ">=8"
 			}
 		},
+		"node_modules/postgres-array": {
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz",
+			"integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==",
+			"engines": {
+				"node": ">=4"
+			}
+		},
+		"node_modules/postgres-bytea": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz",
+			"integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==",
+			"engines": {
+				"node": ">=0.10.0"
+			}
+		},
+		"node_modules/postgres-date": {
+			"version": "1.0.7",
+			"resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz",
+			"integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==",
+			"engines": {
+				"node": ">=0.10.0"
+			}
+		},
+		"node_modules/postgres-interval": {
+			"version": "1.2.0",
+			"resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz",
+			"integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==",
+			"dependencies": {
+				"xtend": "^4.0.0"
+			},
+			"engines": {
+				"node": ">=0.10.0"
+			}
+		},
 		"node_modules/prelude-ls": {
 			"version": "1.1.2",
 			"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
@@ -9123,6 +9249,14 @@
 				"source-map": "^0.6.0"
 			}
 		},
+		"node_modules/split2": {
+			"version": "4.1.0",
+			"resolved": "https://registry.npmjs.org/split2/-/split2-4.1.0.tgz",
+			"integrity": "sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ==",
+			"engines": {
+				"node": ">= 10.x"
+			}
+		},
 		"node_modules/sprintf-js": {
 			"version": "1.0.3",
 			"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
@@ -9540,6 +9674,11 @@
 				"url": "https://github.com/sponsors/Borewit"
 			}
 		},
+		"node_modules/tr46": {
+			"version": "0.0.3",
+			"resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
+			"integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
+		},
 		"node_modules/tree-kill": {
 			"version": "1.2.2",
 			"resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz",
@@ -10144,6 +10283,20 @@
 				"makeerror": "1.0.12"
 			}
 		},
+		"node_modules/webidl-conversions": {
+			"version": "3.0.1",
+			"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
+			"integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
+		},
+		"node_modules/whatwg-url": {
+			"version": "5.0.0",
+			"resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
+			"integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
+			"dependencies": {
+				"tr46": "~0.0.3",
+				"webidl-conversions": "^3.0.0"
+			}
+		},
 		"node_modules/which": {
 			"version": "1.3.1",
 			"integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
@@ -13963,6 +14116,11 @@
 			"resolved": "https://registry.npmjs.org/buffer-more-ints/-/buffer-more-ints-1.0.0.tgz",
 			"integrity": "sha512-EMetuGFz5SLsT0QTnXzINh4Ksr+oo4i+UGTXEshiGCQWnsgSs7ZhJ8fzlwQ+OzEMs0MpDAMr1hxnblp5a4vcHg=="
 		},
+		"buffer-writer": {
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz",
+			"integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw=="
+		},
 		"busboy": {
 			"version": "1.6.0",
 			"resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz",
@@ -16267,14 +16425,7 @@
 			"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
 			"integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==",
 			"requires": {
-				"semver": "^5.4.1"
-			},
-			"dependencies": {
-				"semver": {
-					"version": "5.7.1",
-					"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
-					"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
-				}
+				"whatwg-url": "^5.0.0"
 			}
 		},
 		"node-int64": {
@@ -16508,6 +16659,11 @@
 				"netmask": "^2.0.2"
 			}
 		},
+		"packet-reader": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz",
+			"integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ=="
+		},
 		"parse-json": {
 			"version": "5.2.0",
 			"resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
@@ -16704,6 +16860,61 @@
 			"resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-4.1.0.tgz",
 			"integrity": "sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg=="
 		},
+		"pg": {
+			"version": "8.7.3",
+			"resolved": "https://registry.npmjs.org/pg/-/pg-8.7.3.tgz",
+			"integrity": "sha512-HPmH4GH4H3AOprDJOazoIcpI49XFsHCe8xlrjHkWiapdbHK+HLtbm/GQzXYAZwmPju/kzKhjaSfMACG+8cgJcw==",
+			"requires": {
+				"buffer-writer": "2.0.0",
+				"packet-reader": "1.0.0",
+				"pg-connection-string": "^2.5.0",
+				"pg-pool": "^3.5.1",
+				"pg-protocol": "^1.5.0",
+				"pg-types": "^2.1.0",
+				"pgpass": "1.x"
+			}
+		},
+		"pg-connection-string": {
+			"version": "2.5.0",
+			"resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz",
+			"integrity": "sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ=="
+		},
+		"pg-int8": {
+			"version": "1.0.1",
+			"resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz",
+			"integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw=="
+		},
+		"pg-pool": {
+			"version": "3.5.1",
+			"resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.5.1.tgz",
+			"integrity": "sha512-6iCR0wVrro6OOHFsyavV+i6KYL4lVNyYAB9RD18w66xSzN+d8b66HiwuP30Gp1SH5O9T82fckkzsRjlrhD0ioQ==",
+			"requires": {}
+		},
+		"pg-protocol": {
+			"version": "1.5.0",
+			"resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.5.0.tgz",
+			"integrity": "sha512-muRttij7H8TqRNu/DxrAJQITO4Ac7RmX3Klyr/9mJEOBeIpgnF8f9jAfRz5d3XwQZl5qBjF9gLsUtMPJE0vezQ=="
+		},
+		"pg-types": {
+			"version": "2.2.0",
+			"resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz",
+			"integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==",
+			"requires": {
+				"pg-int8": "1.0.1",
+				"postgres-array": "~2.0.0",
+				"postgres-bytea": "~1.0.0",
+				"postgres-date": "~1.0.4",
+				"postgres-interval": "^1.1.0"
+			}
+		},
+		"pgpass": {
+			"version": "1.0.5",
+			"resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz",
+			"integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==",
+			"requires": {
+				"split2": "^4.1.0"
+			}
+		},
 		"picocolors": {
 			"version": "1.0.0",
 			"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
@@ -16728,6 +16939,29 @@
 				"find-up": "^4.0.0"
 			}
 		},
+		"postgres-array": {
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz",
+			"integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA=="
+		},
+		"postgres-bytea": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz",
+			"integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w=="
+		},
+		"postgres-date": {
+			"version": "1.0.7",
+			"resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz",
+			"integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q=="
+		},
+		"postgres-interval": {
+			"version": "1.2.0",
+			"resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz",
+			"integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==",
+			"requires": {
+				"xtend": "^4.0.0"
+			}
+		},
 		"prelude-ls": {
 			"version": "1.1.2",
 			"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
@@ -17250,6 +17484,11 @@
 				"source-map": "^0.6.0"
 			}
 		},
+		"split2": {
+			"version": "4.1.0",
+			"resolved": "https://registry.npmjs.org/split2/-/split2-4.1.0.tgz",
+			"integrity": "sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ=="
+		},
 		"sprintf-js": {
 			"version": "1.0.3",
 			"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
@@ -17552,6 +17791,11 @@
 				"ieee754": "^1.2.1"
 			}
 		},
+		"tr46": {
+			"version": "0.0.3",
+			"resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
+			"integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
+		},
 		"tree-kill": {
 			"version": "1.2.2",
 			"resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz",
@@ -17920,6 +18164,20 @@
 				"makeerror": "1.0.12"
 			}
 		},
+		"webidl-conversions": {
+			"version": "3.0.1",
+			"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
+			"integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
+		},
+		"whatwg-url": {
+			"version": "5.0.0",
+			"resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
+			"integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
+			"requires": {
+				"tr46": "~0.0.3",
+				"webidl-conversions": "^3.0.0"
+			}
+		},
 		"which": {
 			"version": "1.3.1",
 			"integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
diff --git a/bundle/package.json b/bundle/package.json
index 1dfdbb1c..629b77c1 100644
--- a/bundle/package.json
+++ b/bundle/package.json
@@ -86,6 +86,7 @@
 		"node-fetch": "^2.6.7",
 		"node-os-utils": "^1.3.7",
 		"patch-package": "^6.4.7",
+		"pg": "^8.7.3",
 		"picocolors": "^1.0.0",
 		"proxy-agent": "^5.0.0",
 		"reflect-metadata": "^0.1.13",
@@ -94,4 +95,4 @@
 		"typescript": "^4.1.2",
 		"ws": "^8.8.1"
 	}
-}
\ No newline at end of file
+}
diff --git a/util/ormconfig.json b/util/ormconfig.json
deleted file mode 100644
index c5587b8e..00000000
--- a/util/ormconfig.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
-	"type": "sqlite",
-	"database": "../bundle/database.db",
-	"migrations": ["src/migrations/*.ts"],
-	"entities": ["src/entities/*.ts"],
-	"cli": {
-		"migrationsDir": "src/migrations"
-	}
-}
diff --git a/util/src/entities/BackupCodes.ts b/util/src/entities/BackupCodes.ts
index d532a39a..9092c14e 100644
--- a/util/src/entities/BackupCodes.ts
+++ b/util/src/entities/BackupCodes.ts
@@ -1,7 +1,6 @@
 import { Column, Entity, JoinColumn, ManyToOne, RelationId } from "typeorm";
 import { BaseClass } from "./BaseClass";
 import { User } from "./User";
-import crypto from "crypto";
 
 @Entity("backup_codes")
 export class BackupCode extends BaseClass {
@@ -17,19 +16,4 @@ export class BackupCode extends BaseClass {
 
 	@Column()
 	expired: boolean;
-}
-
-export function generateMfaBackupCodes(user_id: string) {
-	let backup_codes: BackupCode[] = [];
-	for (let i = 0; i < 10; i++) {
-		const code = BackupCode.create({
-			user: { id: user_id },
-			code: crypto.randomBytes(4).toString("hex"),	// 8 characters
-			consumed: false,
-			expired: false,
-		});
-		backup_codes.push(code);
-	}
-
-	return backup_codes;
 }
\ No newline at end of file
diff --git a/util/src/entities/BaseClass.ts b/util/src/entities/BaseClass.ts
index 770824ba..e72d09e9 100644
--- a/util/src/entities/BaseClass.ts
+++ b/util/src/entities/BaseClass.ts
@@ -8,27 +8,30 @@ export class BaseClassWithoutId extends BaseEntity {
 		this.assign(props);
 	}
 
-	private get construct(): any {
+	/*private get construct(): any {
 		return this.constructor;
-	}
+	}*/
 
-	private get metadata() {
-		return this.construct.getRepository().metadata as EntityMetadata;
-	}
+	/*private get metadata() {
+		console.log("getMetadata")
+		return dataSource.getRepository(this.constructor).metadata as EntityMetadata;
+		//return this.construct.getRepository().metadata as EntityMetadata;
+	}*/
 
 	assign(props: any = {}) {
+		//console.log(`assign (${typeof this})...`)
 		delete props.opts;
 		delete props.props;
 
-		const properties = new Set(
+		/*const properties = new Set(
 			this.metadata.columns
 				.map((x: any) => x.propertyName)
 				.concat(this.metadata.relations.map((x) => x.propertyName))
-		);
+		);*/
 		// will not include relational properties
 
 		for (const key in props) {
-			if (!properties.has(key)) continue;
+			//if (!properties.has(key)) continue;
 			// @ts-ignore
 			const setter = this[`set${key.capitalize()}`]; // use setter function if it exists
 
@@ -41,7 +44,8 @@ export class BaseClassWithoutId extends BaseEntity {
 		}
 	}
 
-	toJSON(): any {
+	/*toJSON(): any {
+		console.log("toJSON...")
 		return Object.fromEntries(
 			this.metadata.columns // @ts-ignore
 				.map((x) => [x.propertyName, this[x.propertyName]]) // @ts-ignore
@@ -54,6 +58,7 @@ export class BaseClassWithoutId extends BaseEntity {
 		propertyPath: string,
 		value: number | string
 	) {
+		console.log("increment...")
 		const repository = this.getRepository();
 		return repository.increment(conditions, propertyPath, value);
 	}
@@ -63,9 +68,10 @@ export class BaseClassWithoutId extends BaseEntity {
 		propertyPath: string,
 		value: number | string
 	) {
+		console.log("increment...")
 		const repository = this.getRepository();
 		return repository.decrement(conditions, propertyPath, value);
-	}
+	}*/
 }
 
 export const PrimaryIdColumn = process.env.DATABASE?.startsWith("mongodb") ? ObjectIdColumn : PrimaryColumn;
diff --git a/util/src/entities/Member.ts b/util/src/entities/Member.ts
index e7e97b7c..7ca50992 100644
--- a/util/src/entities/Member.ts
+++ b/util/src/entities/Member.ts
@@ -122,17 +122,19 @@ export class Member extends BaseClassWithoutId {
 	}
 
 	static async removeFromGuild(user_id: string, guild_id: string) {
-		const guild = await Guild.findOneOrFail({ select: ["owner_id"], where: { id: guild_id } });
+		const guild = await Guild.findOneOrFail({ select: ["owner_id", "member_count"], where: { id: guild_id } });
 		if (guild.owner_id === user_id) throw new Error("The owner cannot be removed of the guild");
 		const member = await Member.findOneOrFail({ where: { id: user_id, guild_id }, relations: ["user"] });
 
 		// use promise all to execute all promises at the same time -> save time
+		//TODO: check for bugs
+		if(guild.member_count) guild.member_count--;
 		return Promise.all([
 			Member.delete({
 				id: user_id,
 				guild_id,
 			}),
-			Guild.decrement({ id: guild_id }, "member_count", -1),
+			//Guild.decrement({ id: guild_id }, "member_count", -1),
 
 			emitEvent({
 				event: "GUILD_DELETE",
@@ -259,7 +261,8 @@ export class Member extends BaseClassWithoutId {
 			mute: false,
 			pending: false,
 		};
-
+		//TODO: check for bugs
+		if(guild.member_count) guild.member_count++;
 		await Promise.all([
 			new Member({
 				...member,
@@ -276,7 +279,7 @@ export class Member extends BaseClassWithoutId {
 				},
 				// Member.save is needed because else the roles relations wouldn't be updated
 			}).save(),
-			Guild.increment({ id: guild_id }, "member_count", 1),
+			//Guild.increment({ id: guild_id }, "member_count", 1),
 			emitEvent({
 				event: "GUILD_MEMBER_ADD",
 				data: {
diff --git a/util/src/index.ts b/util/src/index.ts
index ae0f7e54..259d1c97 100644
--- a/util/src/index.ts
+++ b/util/src/index.ts
@@ -4,3 +4,4 @@ export * from "./util/index";
 export * from "./interfaces/index";
 export * from "./entities/index";
 export * from "./dtos/index";
+export * from "./util/MFA";
\ No newline at end of file
diff --git a/util/src/migrations/1633864260873-EmojiRoles.ts b/util/src/migrations/1633864260873-EmojiRoles.ts
deleted file mode 100644
index f0d709f2..00000000
--- a/util/src/migrations/1633864260873-EmojiRoles.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-import { MigrationInterface, QueryRunner } from "typeorm";
-
-export class EmojiRoles1633864260873 implements MigrationInterface {
-	name = "EmojiRoles1633864260873";
-
-	public async up(queryRunner: QueryRunner): Promise<void> {
-		await queryRunner.query(`ALTER TABLE "emojis" ADD "roles" text NOT NULL DEFAULT ''`);
-	}
-
-	public async down(queryRunner: QueryRunner): Promise<void> {
-		await queryRunner.query(`ALTER TABLE "emojis" DROP COLUMN column_name "roles"`);
-	}
-}
diff --git a/util/src/migrations/1633864669243-EmojiUser.ts b/util/src/migrations/1633864669243-EmojiUser.ts
deleted file mode 100644
index 982405d7..00000000
--- a/util/src/migrations/1633864669243-EmojiUser.ts
+++ /dev/null
@@ -1,23 +0,0 @@
-import { MigrationInterface, QueryRunner } from "typeorm";
-
-export class EmojiUser1633864669243 implements MigrationInterface {
-	name = "EmojiUser1633864669243";
-
-	public async up(queryRunner: QueryRunner): Promise<void> {
-		await queryRunner.query(`ALTER TABLE "emojis" ADD "user_id" varchar`);
-		try {
-			await queryRunner.query(
-				`ALTER TABLE "emojis" ADD CONSTRAINT FK_fa7ddd5f9a214e28ce596548421 FOREIGN KEY (user_id) REFERENCES users(id)`
-			);
-		} catch (error) {
-			console.error(
-				"sqlite doesn't support altering foreign keys: https://stackoverflow.com/questions/1884818/how-do-i-add-a-foreign-key-to-an-existing-sqlite-table"
-			);
-		}
-	}
-
-	public async down(queryRunner: QueryRunner): Promise<void> {
-		await queryRunner.query(`ALTER TABLE "emojis" DROP COLUMN column_name "user_id"`);
-		await queryRunner.query(`ALTER TABLE "emojis" DROP CONSTRAINT FK_fa7ddd5f9a214e28ce596548421`);
-	}
-}
diff --git a/util/src/migrations/1633881705509-VanityInvite.ts b/util/src/migrations/1633881705509-VanityInvite.ts
deleted file mode 100644
index 45485310..00000000
--- a/util/src/migrations/1633881705509-VanityInvite.ts
+++ /dev/null
@@ -1,19 +0,0 @@
-import { MigrationInterface, QueryRunner } from "typeorm";
-
-export class VanityInvite1633881705509 implements MigrationInterface {
-	name = "VanityInvite1633881705509";
-
-	public async up(queryRunner: QueryRunner): Promise<void> {
-		try {
-			await queryRunner.query(`ALTER TABLE "emojis" DROP COLUMN vanity_url_code`);
-			await queryRunner.query(`ALTER TABLE "emojis" DROP CONSTRAINT FK_c2c1809d79eb120ea0cb8d342ad`);
-		} catch (error) {}
-	}
-
-	public async down(queryRunner: QueryRunner): Promise<void> {
-		await queryRunner.query(`ALTER TABLE "emojis" ADD vanity_url_code varchar`);
-		await queryRunner.query(
-			`ALTER TABLE "emojis" ADD CONSTRAINT FK_c2c1809d79eb120ea0cb8d342ad FOREIGN KEY ("vanity_url_code") REFERENCES "invites"("code") ON DELETE NO ACTION ON UPDATE NO ACTION`
-		);
-	}
-}
diff --git a/util/src/migrations/1634308884591-Stickers.ts b/util/src/migrations/1634308884591-Stickers.ts
deleted file mode 100644
index fbc4649f..00000000
--- a/util/src/migrations/1634308884591-Stickers.ts
+++ /dev/null
@@ -1,66 +0,0 @@
-import { MigrationInterface, QueryRunner, Table, TableColumn, TableForeignKey } from "typeorm";
-
-export class Stickers1634308884591 implements MigrationInterface {
-	name = "Stickers1634308884591";
-
-	public async up(queryRunner: QueryRunner): Promise<void> {
-		await queryRunner.dropForeignKey("read_states", "FK_6f255d873cfbfd7a93849b7ff74");
-		await queryRunner.changeColumn(
-			"stickers",
-			"tags",
-			new TableColumn({ name: "tags", type: "varchar", isNullable: true })
-		);
-		await queryRunner.changeColumn(
-			"stickers",
-			"pack_id",
-			new TableColumn({ name: "pack_id", type: "varchar", isNullable: true })
-		);
-		await queryRunner.changeColumn("stickers", "type", new TableColumn({ name: "type", type: "integer" }));
-		await queryRunner.changeColumn(
-			"stickers",
-			"format_type",
-			new TableColumn({ name: "format_type", type: "integer" })
-		);
-		await queryRunner.changeColumn(
-			"stickers",
-			"available",
-			new TableColumn({ name: "available", type: "boolean", isNullable: true })
-		);
-		await queryRunner.changeColumn(
-			"stickers",
-			"user_id",
-			new TableColumn({ name: "user_id", type: "boolean", isNullable: true })
-		);
-		await queryRunner.createForeignKey(
-			"stickers",
-			new TableForeignKey({
-				name: "FK_8f4ee73f2bb2325ff980502e158",
-				columnNames: ["user_id"],
-				referencedColumnNames: ["id"],
-				referencedTableName: "users",
-				onDelete: "CASCADE",
-			})
-		);
-		await queryRunner.createTable(
-			new Table({
-				name: "sticker_packs",
-				columns: [
-					new TableColumn({ name: "id", type: "varchar", isPrimary: true }),
-					new TableColumn({ name: "name", type: "varchar" }),
-					new TableColumn({ name: "description", type: "varchar", isNullable: true }),
-					new TableColumn({ name: "banner_asset_id", type: "varchar", isNullable: true }),
-					new TableColumn({ name: "cover_sticker_id", type: "varchar", isNullable: true }),
-				],
-				foreignKeys: [
-					new TableForeignKey({
-						columnNames: ["cover_sticker_id"],
-						referencedColumnNames: ["id"],
-						referencedTableName: "stickers",
-					}),
-				],
-			})
-		);
-	}
-
-	public async down(queryRunner: QueryRunner): Promise<void> {}
-}
diff --git a/util/src/migrations/1634424361103-Presence.ts b/util/src/migrations/1634424361103-Presence.ts
deleted file mode 100644
index 729955b8..00000000
--- a/util/src/migrations/1634424361103-Presence.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-import { MigrationInterface, QueryRunner, TableColumn } from "typeorm";
-
-export class Presence1634424361103 implements MigrationInterface {
-	name = "Presence1634424361103";
-
-	public async up(queryRunner: QueryRunner): Promise<void> {
-		queryRunner.addColumn("sessions", new TableColumn({ name: "activites", type: "text" }));
-	}
-
-	public async down(queryRunner: QueryRunner): Promise<void> {}
-}
diff --git a/util/src/migrations/1634426540271-MigrationTimestamp.ts b/util/src/migrations/1634426540271-MigrationTimestamp.ts
deleted file mode 100644
index 3208b25b..00000000
--- a/util/src/migrations/1634426540271-MigrationTimestamp.ts
+++ /dev/null
@@ -1,15 +0,0 @@
-import { MigrationInterface, QueryRunner, TableColumn } from "typeorm";
-
-export class MigrationTimestamp1634426540271 implements MigrationInterface {
-	name = "MigrationTimestamp1634426540271";
-
-	public async up(queryRunner: QueryRunner): Promise<void> {
-		await queryRunner.changeColumn(
-			"migrations",
-			"timestamp",
-			new TableColumn({ name: "timestampe", type: "bigint", isNullable: false })
-		);
-	}
-
-	public async down(queryRunner: QueryRunner): Promise<void> {}
-}
diff --git a/util/src/migrations/1648643945733-ReleaseTypo.ts b/util/src/migrations/1648643945733-ReleaseTypo.ts
deleted file mode 100644
index 944b9dd9..00000000
--- a/util/src/migrations/1648643945733-ReleaseTypo.ts
+++ /dev/null
@@ -1,16 +0,0 @@
-import { MigrationInterface, QueryRunner } from "typeorm";
-
-export class ReleaseTypo1648643945733 implements MigrationInterface {
-	name = "ReleaseTypo1648643945733";
-
-	public async up(queryRunner: QueryRunner): Promise<void> {
-		//drop table first because typeorm creates it before migrations run
-		await queryRunner.dropTable("client_release", true);
-		await queryRunner.renameTable("client_relase", "client_release");
-	}
-
-	public async down(queryRunner: QueryRunner): Promise<void> {
-		await queryRunner.dropTable("client_relase", true);
-		await queryRunner.renameTable("client_release", "client_relase");
-	}
-}
diff --git a/util/src/migrations/postgres/1659833042721-test.ts b/util/src/migrations/postgres/1659833042721-test.ts
new file mode 100644
index 00000000..0820cca7
--- /dev/null
+++ b/util/src/migrations/postgres/1659833042721-test.ts
@@ -0,0 +1,3539 @@
+import { MigrationInterface, QueryRunner } from "typeorm";
+
+export class test1659833042721 implements MigrationInterface {
+    name = 'test1659833042721'
+
+    public async up(queryRunner: QueryRunner): Promise<void> {
+        await queryRunner.query(`
+            CREATE TABLE "config" ("key" varchar PRIMARY KEY NOT NULL, "value" text)
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "relationships" (
+                "id" varchar PRIMARY KEY NOT NULL,
+                "from_id" varchar NOT NULL,
+                "to_id" varchar NOT NULL,
+                "nickname" varchar,
+                "type" integer NOT NULL
+            )
+        `);
+        await queryRunner.query(`
+            CREATE UNIQUE INDEX "IDX_a0b2ff0a598df0b0d055934a17" ON "relationships" ("from_id", "to_id")
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "connected_accounts" (
+                "id" varchar PRIMARY KEY NOT NULL,
+                "user_id" varchar,
+                "access_token" varchar NOT NULL,
+                "friend_sync" boolean NOT NULL,
+                "name" varchar NOT NULL,
+                "revoked" boolean NOT NULL,
+                "show_activity" boolean NOT NULL,
+                "type" varchar NOT NULL,
+                "verified" boolean NOT NULL,
+                "visibility" integer NOT NULL
+            )
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "users" (
+                "id" varchar PRIMARY KEY NOT NULL,
+                "username" varchar NOT NULL,
+                "discriminator" varchar NOT NULL,
+                "avatar" varchar,
+                "accent_color" integer,
+                "banner" varchar,
+                "phone" varchar,
+                "desktop" boolean NOT NULL,
+                "mobile" boolean NOT NULL,
+                "premium" boolean NOT NULL,
+                "premium_type" integer NOT NULL,
+                "bot" boolean NOT NULL,
+                "bio" varchar NOT NULL,
+                "system" boolean NOT NULL,
+                "nsfw_allowed" boolean NOT NULL,
+                "mfa_enabled" boolean NOT NULL,
+                "totp_secret" varchar,
+                "totp_last_ticket" varchar,
+                "created_at" datetime NOT NULL,
+                "premium_since" datetime,
+                "verified" boolean NOT NULL,
+                "disabled" boolean NOT NULL,
+                "deleted" boolean NOT NULL,
+                "email" varchar,
+                "flags" varchar NOT NULL,
+                "public_flags" integer NOT NULL,
+                "rights" bigint NOT NULL,
+                "data" text NOT NULL,
+                "fingerprints" text NOT NULL,
+                "settings" text NOT NULL,
+                "extended_settings" text NOT NULL,
+                "notes" text NOT NULL
+            )
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "backup_codes" (
+                "id" varchar PRIMARY KEY NOT NULL,
+                "code" varchar NOT NULL,
+                "consumed" boolean NOT NULL,
+                "expired" boolean NOT NULL,
+                "user_id" varchar
+            )
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "bans" (
+                "id" varchar PRIMARY KEY NOT NULL,
+                "user_id" varchar,
+                "guild_id" varchar,
+                "executor_id" varchar,
+                "ip" varchar NOT NULL,
+                "reason" varchar
+            )
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "recipients" (
+                "id" varchar PRIMARY KEY NOT NULL,
+                "channel_id" varchar NOT NULL,
+                "user_id" varchar NOT NULL,
+                "closed" boolean NOT NULL DEFAULT (0)
+            )
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "roles" (
+                "id" varchar PRIMARY KEY NOT NULL,
+                "guild_id" varchar,
+                "color" integer NOT NULL,
+                "hoist" boolean NOT NULL,
+                "managed" boolean NOT NULL,
+                "mentionable" boolean NOT NULL,
+                "name" varchar NOT NULL,
+                "permissions" varchar NOT NULL,
+                "position" integer NOT NULL,
+                "icon" varchar,
+                "unicode_emoji" varchar,
+                "tags" text
+            )
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "members" (
+                "index" integer PRIMARY KEY AUTOINCREMENT NOT NULL,
+                "id" varchar NOT NULL,
+                "guild_id" varchar NOT NULL,
+                "nick" varchar,
+                "joined_at" datetime NOT NULL,
+                "premium_since" bigint,
+                "deaf" boolean NOT NULL,
+                "mute" boolean NOT NULL,
+                "pending" boolean NOT NULL,
+                "settings" text NOT NULL,
+                "last_message_id" varchar,
+                "joined_by" varchar
+            )
+        `);
+        await queryRunner.query(`
+            CREATE UNIQUE INDEX "IDX_bb2bf9386ac443afbbbf9f12d3" ON "members" ("id", "guild_id")
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "webhooks" (
+                "id" varchar PRIMARY KEY NOT NULL,
+                "type" integer NOT NULL,
+                "name" varchar,
+                "avatar" varchar,
+                "token" varchar,
+                "guild_id" varchar,
+                "channel_id" varchar,
+                "application_id" varchar,
+                "user_id" varchar,
+                "source_guild_id" varchar
+            )
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "stickers" (
+                "id" varchar PRIMARY KEY NOT NULL,
+                "name" varchar NOT NULL,
+                "description" varchar,
+                "available" boolean,
+                "tags" varchar,
+                "pack_id" varchar,
+                "guild_id" varchar,
+                "user_id" varchar,
+                "type" integer NOT NULL,
+                "format_type" integer NOT NULL
+            )
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "attachments" (
+                "id" varchar PRIMARY KEY NOT NULL,
+                "filename" varchar NOT NULL,
+                "size" integer NOT NULL,
+                "url" varchar NOT NULL,
+                "proxy_url" varchar NOT NULL,
+                "height" integer,
+                "width" integer,
+                "content_type" varchar,
+                "message_id" varchar
+            )
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "messages" (
+                "id" varchar PRIMARY KEY NOT NULL,
+                "channel_id" varchar,
+                "guild_id" varchar,
+                "author_id" varchar,
+                "member_id" varchar,
+                "webhook_id" varchar,
+                "application_id" varchar,
+                "content" varchar,
+                "timestamp" datetime NOT NULL DEFAULT (datetime('now')),
+                "edited_timestamp" datetime,
+                "tts" boolean,
+                "mention_everyone" boolean,
+                "embeds" text NOT NULL,
+                "reactions" text NOT NULL,
+                "nonce" text,
+                "pinned" boolean,
+                "type" integer NOT NULL,
+                "activity" text,
+                "flags" varchar,
+                "message_reference" text,
+                "interaction" text,
+                "components" text,
+                "message_reference_id" varchar
+            )
+        `);
+        await queryRunner.query(`
+            CREATE INDEX "IDX_86b9109b155eb70c0a2ca3b4b6" ON "messages" ("channel_id")
+        `);
+        await queryRunner.query(`
+            CREATE INDEX "IDX_05535bc695e9f7ee104616459d" ON "messages" ("author_id")
+        `);
+        await queryRunner.query(`
+            CREATE UNIQUE INDEX "IDX_3ed7a60fb7dbe04e1ba9332a8b" ON "messages" ("channel_id", "id")
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "read_states" (
+                "id" varchar PRIMARY KEY NOT NULL,
+                "channel_id" varchar NOT NULL,
+                "user_id" varchar NOT NULL,
+                "last_message_id" varchar,
+                "public_ack" varchar,
+                "notifications_cursor" varchar,
+                "last_pin_timestamp" datetime,
+                "mention_count" integer
+            )
+        `);
+        await queryRunner.query(`
+            CREATE UNIQUE INDEX "IDX_0abf8b443321bd3cf7f81ee17a" ON "read_states" ("channel_id", "user_id")
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "invites" (
+                "code" varchar PRIMARY KEY NOT NULL,
+                "temporary" boolean NOT NULL,
+                "uses" integer NOT NULL,
+                "max_uses" integer NOT NULL,
+                "max_age" integer NOT NULL,
+                "created_at" datetime NOT NULL,
+                "expires_at" datetime NOT NULL,
+                "guild_id" varchar,
+                "channel_id" varchar,
+                "inviter_id" varchar,
+                "target_user_id" varchar,
+                "target_user_type" integer,
+                "vanity_url" boolean
+            )
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "voice_states" (
+                "id" varchar PRIMARY KEY NOT NULL,
+                "guild_id" varchar,
+                "channel_id" varchar,
+                "user_id" varchar,
+                "session_id" varchar NOT NULL,
+                "token" varchar,
+                "deaf" boolean NOT NULL,
+                "mute" boolean NOT NULL,
+                "self_deaf" boolean NOT NULL,
+                "self_mute" boolean NOT NULL,
+                "self_stream" boolean,
+                "self_video" boolean NOT NULL,
+                "suppress" boolean NOT NULL,
+                "request_to_speak_timestamp" datetime
+            )
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "channels" (
+                "id" varchar PRIMARY KEY NOT NULL,
+                "created_at" datetime NOT NULL,
+                "name" varchar,
+                "icon" text,
+                "type" integer NOT NULL,
+                "last_message_id" varchar,
+                "guild_id" varchar,
+                "parent_id" varchar,
+                "owner_id" varchar,
+                "last_pin_timestamp" integer,
+                "default_auto_archive_duration" integer,
+                "position" integer,
+                "permission_overwrites" text,
+                "video_quality_mode" integer,
+                "bitrate" integer,
+                "user_limit" integer,
+                "nsfw" boolean,
+                "rate_limit_per_user" integer,
+                "topic" varchar,
+                "retention_policy_id" varchar
+            )
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "emojis" (
+                "id" varchar PRIMARY KEY NOT NULL,
+                "animated" boolean NOT NULL,
+                "available" boolean NOT NULL,
+                "guild_id" varchar NOT NULL,
+                "user_id" varchar,
+                "managed" boolean NOT NULL,
+                "name" varchar NOT NULL,
+                "require_colons" boolean NOT NULL,
+                "roles" text NOT NULL,
+                "groups" text
+            )
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "templates" (
+                "id" varchar PRIMARY KEY NOT NULL,
+                "code" varchar NOT NULL,
+                "name" varchar NOT NULL,
+                "description" varchar,
+                "usage_count" integer,
+                "creator_id" varchar,
+                "created_at" datetime NOT NULL,
+                "updated_at" datetime NOT NULL,
+                "source_guild_id" varchar,
+                "serialized_source_guild" text NOT NULL,
+                CONSTRAINT "UQ_be38737bf339baf63b1daeffb55" UNIQUE ("code")
+            )
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "guilds" (
+                "id" varchar PRIMARY KEY NOT NULL,
+                "afk_channel_id" varchar,
+                "afk_timeout" integer,
+                "banner" varchar,
+                "default_message_notifications" integer,
+                "description" varchar,
+                "discovery_splash" varchar,
+                "explicit_content_filter" integer,
+                "features" text NOT NULL,
+                "primary_category_id" integer,
+                "icon" varchar,
+                "large" boolean,
+                "max_members" integer,
+                "max_presences" integer,
+                "max_video_channel_users" integer,
+                "member_count" integer,
+                "presence_count" integer,
+                "template_id" varchar,
+                "mfa_level" integer,
+                "name" varchar NOT NULL,
+                "owner_id" varchar,
+                "preferred_locale" varchar,
+                "premium_subscription_count" integer,
+                "premium_tier" integer,
+                "public_updates_channel_id" varchar,
+                "rules_channel_id" varchar,
+                "region" varchar,
+                "splash" varchar,
+                "system_channel_id" varchar,
+                "system_channel_flags" integer,
+                "unavailable" boolean,
+                "verification_level" integer,
+                "welcome_screen" text NOT NULL,
+                "widget_channel_id" varchar,
+                "widget_enabled" boolean,
+                "nsfw_level" integer,
+                "nsfw" boolean,
+                "parent" varchar
+            )
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "team_members" (
+                "id" varchar PRIMARY KEY NOT NULL,
+                "membership_state" integer NOT NULL,
+                "permissions" text NOT NULL,
+                "team_id" varchar,
+                "user_id" varchar
+            )
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "teams" (
+                "id" varchar PRIMARY KEY NOT NULL,
+                "icon" varchar,
+                "name" varchar NOT NULL,
+                "owner_user_id" varchar
+            )
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "applications" (
+                "id" varchar PRIMARY KEY NOT NULL,
+                "name" varchar NOT NULL,
+                "icon" varchar,
+                "description" varchar NOT NULL,
+                "rpc_origins" text,
+                "bot_public" boolean NOT NULL,
+                "bot_require_code_grant" boolean NOT NULL,
+                "terms_of_service_url" varchar,
+                "privacy_policy_url" varchar,
+                "summary" varchar,
+                "verify_key" varchar NOT NULL,
+                "primary_sku_id" varchar,
+                "slug" varchar,
+                "cover_image" varchar,
+                "flags" varchar NOT NULL,
+                "owner_id" varchar,
+                "team_id" varchar,
+                "guild_id" varchar
+            )
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "audit_logs" (
+                "id" varchar PRIMARY KEY NOT NULL,
+                "user_id" varchar,
+                "action_type" integer NOT NULL,
+                "options" text,
+                "changes" text NOT NULL,
+                "reason" varchar,
+                "target_id" varchar
+            )
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "categories" (
+                "id" integer PRIMARY KEY NOT NULL,
+                "name" varchar,
+                "localizations" text NOT NULL,
+                "is_primary" boolean
+            )
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "migrations" (
+                "id" integer PRIMARY KEY AUTOINCREMENT NOT NULL,
+                "timestamp" bigint NOT NULL,
+                "name" varchar NOT NULL
+            )
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "rate_limits" (
+                "id" varchar PRIMARY KEY NOT NULL,
+                "executor_id" varchar NOT NULL,
+                "hits" integer NOT NULL,
+                "blocked" boolean NOT NULL,
+                "expires_at" datetime NOT NULL
+            )
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "sessions" (
+                "id" varchar PRIMARY KEY NOT NULL,
+                "user_id" varchar,
+                "session_id" varchar NOT NULL,
+                "activities" text,
+                "client_info" text NOT NULL,
+                "status" varchar NOT NULL
+            )
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "sticker_packs" (
+                "id" varchar PRIMARY KEY NOT NULL,
+                "name" varchar NOT NULL,
+                "description" varchar,
+                "banner_asset_id" varchar,
+                "cover_sticker_id" varchar,
+                "coverStickerId" varchar
+            )
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "client_release" (
+                "id" varchar PRIMARY KEY NOT NULL,
+                "name" varchar NOT NULL,
+                "pub_date" varchar NOT NULL,
+                "url" varchar NOT NULL,
+                "deb_url" varchar NOT NULL,
+                "osx_url" varchar NOT NULL,
+                "win_url" varchar NOT NULL,
+                "notes" varchar
+            )
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "notes" (
+                "id" varchar PRIMARY KEY NOT NULL,
+                "content" varchar NOT NULL,
+                "owner_id" varchar,
+                "target_id" varchar,
+                CONSTRAINT "UQ_74e6689b9568cc965b8bfc9150b" UNIQUE ("owner_id", "target_id")
+            )
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "member_roles" (
+                "index" integer NOT NULL,
+                "role_id" varchar NOT NULL,
+                PRIMARY KEY ("index", "role_id")
+            )
+        `);
+        await queryRunner.query(`
+            CREATE INDEX "IDX_5d7ddc8a5f9c167f548625e772" ON "member_roles" ("index")
+        `);
+        await queryRunner.query(`
+            CREATE INDEX "IDX_e9080e7a7997a0170026d5139c" ON "member_roles" ("role_id")
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "message_user_mentions" (
+                "messagesId" varchar NOT NULL,
+                "usersId" varchar NOT NULL,
+                PRIMARY KEY ("messagesId", "usersId")
+            )
+        `);
+        await queryRunner.query(`
+            CREATE INDEX "IDX_a343387fc560ef378760681c23" ON "message_user_mentions" ("messagesId")
+        `);
+        await queryRunner.query(`
+            CREATE INDEX "IDX_b831eb18ceebd28976239b1e2f" ON "message_user_mentions" ("usersId")
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "message_role_mentions" (
+                "messagesId" varchar NOT NULL,
+                "rolesId" varchar NOT NULL,
+                PRIMARY KEY ("messagesId", "rolesId")
+            )
+        `);
+        await queryRunner.query(`
+            CREATE INDEX "IDX_a8242cf535337a490b0feaea0b" ON "message_role_mentions" ("messagesId")
+        `);
+        await queryRunner.query(`
+            CREATE INDEX "IDX_29d63eb1a458200851bc37d074" ON "message_role_mentions" ("rolesId")
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "message_channel_mentions" (
+                "messagesId" varchar NOT NULL,
+                "channelsId" varchar NOT NULL,
+                PRIMARY KEY ("messagesId", "channelsId")
+            )
+        `);
+        await queryRunner.query(`
+            CREATE INDEX "IDX_2a27102ecd1d81b4582a436092" ON "message_channel_mentions" ("messagesId")
+        `);
+        await queryRunner.query(`
+            CREATE INDEX "IDX_bdb8c09e1464cabf62105bf4b9" ON "message_channel_mentions" ("channelsId")
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "message_stickers" (
+                "messagesId" varchar NOT NULL,
+                "stickersId" varchar NOT NULL,
+                PRIMARY KEY ("messagesId", "stickersId")
+            )
+        `);
+        await queryRunner.query(`
+            CREATE INDEX "IDX_40bb6f23e7cc133292e92829d2" ON "message_stickers" ("messagesId")
+        `);
+        await queryRunner.query(`
+            CREATE INDEX "IDX_e22a70819d07659c7a71c112a1" ON "message_stickers" ("stickersId")
+        `);
+        await queryRunner.query(`
+            DROP INDEX "IDX_a0b2ff0a598df0b0d055934a17"
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "temporary_relationships" (
+                "id" varchar PRIMARY KEY NOT NULL,
+                "from_id" varchar NOT NULL,
+                "to_id" varchar NOT NULL,
+                "nickname" varchar,
+                "type" integer NOT NULL,
+                CONSTRAINT "FK_9af4194bab1250b1c584ae4f1d7" FOREIGN KEY ("from_id") REFERENCES "users" ("id") ON DELETE CASCADE ON UPDATE NO ACTION,
+                CONSTRAINT "FK_9c7f6b98a9843b76dce1b0c878b" FOREIGN KEY ("to_id") REFERENCES "users" ("id") ON DELETE CASCADE ON UPDATE NO ACTION
+            )
+        `);
+        await queryRunner.query(`
+            INSERT INTO "temporary_relationships"("id", "from_id", "to_id", "nickname", "type")
+            SELECT "id",
+                "from_id",
+                "to_id",
+                "nickname",
+                "type"
+            FROM "relationships"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "relationships"
+        `);
+        await queryRunner.query(`
+            ALTER TABLE "temporary_relationships"
+                RENAME TO "relationships"
+        `);
+        await queryRunner.query(`
+            CREATE UNIQUE INDEX "IDX_a0b2ff0a598df0b0d055934a17" ON "relationships" ("from_id", "to_id")
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "temporary_connected_accounts" (
+                "id" varchar PRIMARY KEY NOT NULL,
+                "user_id" varchar,
+                "access_token" varchar NOT NULL,
+                "friend_sync" boolean NOT NULL,
+                "name" varchar NOT NULL,
+                "revoked" boolean NOT NULL,
+                "show_activity" boolean NOT NULL,
+                "type" varchar NOT NULL,
+                "verified" boolean NOT NULL,
+                "visibility" integer NOT NULL,
+                CONSTRAINT "FK_f47244225a6a1eac04a3463dd90" FOREIGN KEY ("user_id") REFERENCES "users" ("id") ON DELETE CASCADE ON UPDATE NO ACTION
+            )
+        `);
+        await queryRunner.query(`
+            INSERT INTO "temporary_connected_accounts"(
+                    "id",
+                    "user_id",
+                    "access_token",
+                    "friend_sync",
+                    "name",
+                    "revoked",
+                    "show_activity",
+                    "type",
+                    "verified",
+                    "visibility"
+                )
+            SELECT "id",
+                "user_id",
+                "access_token",
+                "friend_sync",
+                "name",
+                "revoked",
+                "show_activity",
+                "type",
+                "verified",
+                "visibility"
+            FROM "connected_accounts"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "connected_accounts"
+        `);
+        await queryRunner.query(`
+            ALTER TABLE "temporary_connected_accounts"
+                RENAME TO "connected_accounts"
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "temporary_backup_codes" (
+                "id" varchar PRIMARY KEY NOT NULL,
+                "code" varchar NOT NULL,
+                "consumed" boolean NOT NULL,
+                "expired" boolean NOT NULL,
+                "user_id" varchar,
+                CONSTRAINT "FK_70066ea80d2f4b871beda32633b" FOREIGN KEY ("user_id") REFERENCES "users" ("id") ON DELETE CASCADE ON UPDATE NO ACTION
+            )
+        `);
+        await queryRunner.query(`
+            INSERT INTO "temporary_backup_codes"("id", "code", "consumed", "expired", "user_id")
+            SELECT "id",
+                "code",
+                "consumed",
+                "expired",
+                "user_id"
+            FROM "backup_codes"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "backup_codes"
+        `);
+        await queryRunner.query(`
+            ALTER TABLE "temporary_backup_codes"
+                RENAME TO "backup_codes"
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "temporary_bans" (
+                "id" varchar PRIMARY KEY NOT NULL,
+                "user_id" varchar,
+                "guild_id" varchar,
+                "executor_id" varchar,
+                "ip" varchar NOT NULL,
+                "reason" varchar,
+                CONSTRAINT "FK_5999e8e449f80a236ff72023559" FOREIGN KEY ("user_id") REFERENCES "users" ("id") ON DELETE CASCADE ON UPDATE NO ACTION,
+                CONSTRAINT "FK_9d3ab7dd180ebdd245cdb66ecad" FOREIGN KEY ("guild_id") REFERENCES "guilds" ("id") ON DELETE CASCADE ON UPDATE NO ACTION,
+                CONSTRAINT "FK_07ad88c86d1f290d46748410d58" FOREIGN KEY ("executor_id") REFERENCES "users" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION
+            )
+        `);
+        await queryRunner.query(`
+            INSERT INTO "temporary_bans"(
+                    "id",
+                    "user_id",
+                    "guild_id",
+                    "executor_id",
+                    "ip",
+                    "reason"
+                )
+            SELECT "id",
+                "user_id",
+                "guild_id",
+                "executor_id",
+                "ip",
+                "reason"
+            FROM "bans"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "bans"
+        `);
+        await queryRunner.query(`
+            ALTER TABLE "temporary_bans"
+                RENAME TO "bans"
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "temporary_recipients" (
+                "id" varchar PRIMARY KEY NOT NULL,
+                "channel_id" varchar NOT NULL,
+                "user_id" varchar NOT NULL,
+                "closed" boolean NOT NULL DEFAULT (0),
+                CONSTRAINT "FK_2f18ee1ba667f233ae86c0ea60e" FOREIGN KEY ("channel_id") REFERENCES "channels" ("id") ON DELETE CASCADE ON UPDATE NO ACTION,
+                CONSTRAINT "FK_6157e8b6ba4e6e3089616481fe2" FOREIGN KEY ("user_id") REFERENCES "users" ("id") ON DELETE CASCADE ON UPDATE NO ACTION
+            )
+        `);
+        await queryRunner.query(`
+            INSERT INTO "temporary_recipients"("id", "channel_id", "user_id", "closed")
+            SELECT "id",
+                "channel_id",
+                "user_id",
+                "closed"
+            FROM "recipients"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "recipients"
+        `);
+        await queryRunner.query(`
+            ALTER TABLE "temporary_recipients"
+                RENAME TO "recipients"
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "temporary_roles" (
+                "id" varchar PRIMARY KEY NOT NULL,
+                "guild_id" varchar,
+                "color" integer NOT NULL,
+                "hoist" boolean NOT NULL,
+                "managed" boolean NOT NULL,
+                "mentionable" boolean NOT NULL,
+                "name" varchar NOT NULL,
+                "permissions" varchar NOT NULL,
+                "position" integer NOT NULL,
+                "icon" varchar,
+                "unicode_emoji" varchar,
+                "tags" text,
+                CONSTRAINT "FK_c32c1ab1c4dc7dcb0278c4b1b8b" FOREIGN KEY ("guild_id") REFERENCES "guilds" ("id") ON DELETE CASCADE ON UPDATE NO ACTION
+            )
+        `);
+        await queryRunner.query(`
+            INSERT INTO "temporary_roles"(
+                    "id",
+                    "guild_id",
+                    "color",
+                    "hoist",
+                    "managed",
+                    "mentionable",
+                    "name",
+                    "permissions",
+                    "position",
+                    "icon",
+                    "unicode_emoji",
+                    "tags"
+                )
+            SELECT "id",
+                "guild_id",
+                "color",
+                "hoist",
+                "managed",
+                "mentionable",
+                "name",
+                "permissions",
+                "position",
+                "icon",
+                "unicode_emoji",
+                "tags"
+            FROM "roles"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "roles"
+        `);
+        await queryRunner.query(`
+            ALTER TABLE "temporary_roles"
+                RENAME TO "roles"
+        `);
+        await queryRunner.query(`
+            DROP INDEX "IDX_bb2bf9386ac443afbbbf9f12d3"
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "temporary_members" (
+                "index" integer PRIMARY KEY AUTOINCREMENT NOT NULL,
+                "id" varchar NOT NULL,
+                "guild_id" varchar NOT NULL,
+                "nick" varchar,
+                "joined_at" datetime NOT NULL,
+                "premium_since" bigint,
+                "deaf" boolean NOT NULL,
+                "mute" boolean NOT NULL,
+                "pending" boolean NOT NULL,
+                "settings" text NOT NULL,
+                "last_message_id" varchar,
+                "joined_by" varchar,
+                CONSTRAINT "FK_28b53062261b996d9c99fa12404" FOREIGN KEY ("id") REFERENCES "users" ("id") ON DELETE CASCADE ON UPDATE NO ACTION,
+                CONSTRAINT "FK_16aceddd5b89825b8ed6029ad1c" FOREIGN KEY ("guild_id") REFERENCES "guilds" ("id") ON DELETE CASCADE ON UPDATE NO ACTION
+            )
+        `);
+        await queryRunner.query(`
+            INSERT INTO "temporary_members"(
+                    "index",
+                    "id",
+                    "guild_id",
+                    "nick",
+                    "joined_at",
+                    "premium_since",
+                    "deaf",
+                    "mute",
+                    "pending",
+                    "settings",
+                    "last_message_id",
+                    "joined_by"
+                )
+            SELECT "index",
+                "id",
+                "guild_id",
+                "nick",
+                "joined_at",
+                "premium_since",
+                "deaf",
+                "mute",
+                "pending",
+                "settings",
+                "last_message_id",
+                "joined_by"
+            FROM "members"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "members"
+        `);
+        await queryRunner.query(`
+            ALTER TABLE "temporary_members"
+                RENAME TO "members"
+        `);
+        await queryRunner.query(`
+            CREATE UNIQUE INDEX "IDX_bb2bf9386ac443afbbbf9f12d3" ON "members" ("id", "guild_id")
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "temporary_webhooks" (
+                "id" varchar PRIMARY KEY NOT NULL,
+                "type" integer NOT NULL,
+                "name" varchar,
+                "avatar" varchar,
+                "token" varchar,
+                "guild_id" varchar,
+                "channel_id" varchar,
+                "application_id" varchar,
+                "user_id" varchar,
+                "source_guild_id" varchar,
+                CONSTRAINT "FK_487a7af59d189f744fe394368fc" FOREIGN KEY ("guild_id") REFERENCES "guilds" ("id") ON DELETE CASCADE ON UPDATE NO ACTION,
+                CONSTRAINT "FK_df528cf77e82f8032230e7e37d8" FOREIGN KEY ("channel_id") REFERENCES "channels" ("id") ON DELETE CASCADE ON UPDATE NO ACTION,
+                CONSTRAINT "FK_c3e5305461931763b56aa905f1c" FOREIGN KEY ("application_id") REFERENCES "applications" ("id") ON DELETE CASCADE ON UPDATE NO ACTION,
+                CONSTRAINT "FK_0d523f6f997c86e052c49b1455f" FOREIGN KEY ("user_id") REFERENCES "users" ("id") ON DELETE CASCADE ON UPDATE NO ACTION,
+                CONSTRAINT "FK_3a285f4f49c40e0706d3018bc9f" FOREIGN KEY ("source_guild_id") REFERENCES "guilds" ("id") ON DELETE CASCADE ON UPDATE NO ACTION
+            )
+        `);
+        await queryRunner.query(`
+            INSERT INTO "temporary_webhooks"(
+                    "id",
+                    "type",
+                    "name",
+                    "avatar",
+                    "token",
+                    "guild_id",
+                    "channel_id",
+                    "application_id",
+                    "user_id",
+                    "source_guild_id"
+                )
+            SELECT "id",
+                "type",
+                "name",
+                "avatar",
+                "token",
+                "guild_id",
+                "channel_id",
+                "application_id",
+                "user_id",
+                "source_guild_id"
+            FROM "webhooks"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "webhooks"
+        `);
+        await queryRunner.query(`
+            ALTER TABLE "temporary_webhooks"
+                RENAME TO "webhooks"
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "temporary_stickers" (
+                "id" varchar PRIMARY KEY NOT NULL,
+                "name" varchar NOT NULL,
+                "description" varchar,
+                "available" boolean,
+                "tags" varchar,
+                "pack_id" varchar,
+                "guild_id" varchar,
+                "user_id" varchar,
+                "type" integer NOT NULL,
+                "format_type" integer NOT NULL,
+                CONSTRAINT "FK_e7cfa5cefa6661b3fb8fda8ce69" FOREIGN KEY ("pack_id") REFERENCES "sticker_packs" ("id") ON DELETE CASCADE ON UPDATE NO ACTION,
+                CONSTRAINT "FK_193d551d852aca5347ef5c9f205" FOREIGN KEY ("guild_id") REFERENCES "guilds" ("id") ON DELETE CASCADE ON UPDATE NO ACTION,
+                CONSTRAINT "FK_8f4ee73f2bb2325ff980502e158" FOREIGN KEY ("user_id") REFERENCES "users" ("id") ON DELETE CASCADE ON UPDATE NO ACTION
+            )
+        `);
+        await queryRunner.query(`
+            INSERT INTO "temporary_stickers"(
+                    "id",
+                    "name",
+                    "description",
+                    "available",
+                    "tags",
+                    "pack_id",
+                    "guild_id",
+                    "user_id",
+                    "type",
+                    "format_type"
+                )
+            SELECT "id",
+                "name",
+                "description",
+                "available",
+                "tags",
+                "pack_id",
+                "guild_id",
+                "user_id",
+                "type",
+                "format_type"
+            FROM "stickers"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "stickers"
+        `);
+        await queryRunner.query(`
+            ALTER TABLE "temporary_stickers"
+                RENAME TO "stickers"
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "temporary_attachments" (
+                "id" varchar PRIMARY KEY NOT NULL,
+                "filename" varchar NOT NULL,
+                "size" integer NOT NULL,
+                "url" varchar NOT NULL,
+                "proxy_url" varchar NOT NULL,
+                "height" integer,
+                "width" integer,
+                "content_type" varchar,
+                "message_id" varchar,
+                CONSTRAINT "FK_623e10eec51ada466c5038979e3" FOREIGN KEY ("message_id") REFERENCES "messages" ("id") ON DELETE CASCADE ON UPDATE NO ACTION
+            )
+        `);
+        await queryRunner.query(`
+            INSERT INTO "temporary_attachments"(
+                    "id",
+                    "filename",
+                    "size",
+                    "url",
+                    "proxy_url",
+                    "height",
+                    "width",
+                    "content_type",
+                    "message_id"
+                )
+            SELECT "id",
+                "filename",
+                "size",
+                "url",
+                "proxy_url",
+                "height",
+                "width",
+                "content_type",
+                "message_id"
+            FROM "attachments"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "attachments"
+        `);
+        await queryRunner.query(`
+            ALTER TABLE "temporary_attachments"
+                RENAME TO "attachments"
+        `);
+        await queryRunner.query(`
+            DROP INDEX "IDX_86b9109b155eb70c0a2ca3b4b6"
+        `);
+        await queryRunner.query(`
+            DROP INDEX "IDX_05535bc695e9f7ee104616459d"
+        `);
+        await queryRunner.query(`
+            DROP INDEX "IDX_3ed7a60fb7dbe04e1ba9332a8b"
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "temporary_messages" (
+                "id" varchar PRIMARY KEY NOT NULL,
+                "channel_id" varchar,
+                "guild_id" varchar,
+                "author_id" varchar,
+                "member_id" varchar,
+                "webhook_id" varchar,
+                "application_id" varchar,
+                "content" varchar,
+                "timestamp" datetime NOT NULL DEFAULT (datetime('now')),
+                "edited_timestamp" datetime,
+                "tts" boolean,
+                "mention_everyone" boolean,
+                "embeds" text NOT NULL,
+                "reactions" text NOT NULL,
+                "nonce" text,
+                "pinned" boolean,
+                "type" integer NOT NULL,
+                "activity" text,
+                "flags" varchar,
+                "message_reference" text,
+                "interaction" text,
+                "components" text,
+                "message_reference_id" varchar,
+                CONSTRAINT "FK_86b9109b155eb70c0a2ca3b4b6d" FOREIGN KEY ("channel_id") REFERENCES "channels" ("id") ON DELETE CASCADE ON UPDATE NO ACTION,
+                CONSTRAINT "FK_b193588441b085352a4c0109423" FOREIGN KEY ("guild_id") REFERENCES "guilds" ("id") ON DELETE CASCADE ON UPDATE NO ACTION,
+                CONSTRAINT "FK_05535bc695e9f7ee104616459d3" FOREIGN KEY ("author_id") REFERENCES "users" ("id") ON DELETE CASCADE ON UPDATE NO ACTION,
+                CONSTRAINT "FK_b0525304f2262b7014245351c76" FOREIGN KEY ("member_id") REFERENCES "users" ("id") ON DELETE CASCADE ON UPDATE NO ACTION,
+                CONSTRAINT "FK_f83c04bcf1df4e5c0e7a52ed348" FOREIGN KEY ("webhook_id") REFERENCES "webhooks" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION,
+                CONSTRAINT "FK_5d3ec1cb962de6488637fd779d6" FOREIGN KEY ("application_id") REFERENCES "applications" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION,
+                CONSTRAINT "FK_61a92bb65b302a76d9c1fcd3174" FOREIGN KEY ("message_reference_id") REFERENCES "messages" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION
+            )
+        `);
+        await queryRunner.query(`
+            INSERT INTO "temporary_messages"(
+                    "id",
+                    "channel_id",
+                    "guild_id",
+                    "author_id",
+                    "member_id",
+                    "webhook_id",
+                    "application_id",
+                    "content",
+                    "timestamp",
+                    "edited_timestamp",
+                    "tts",
+                    "mention_everyone",
+                    "embeds",
+                    "reactions",
+                    "nonce",
+                    "pinned",
+                    "type",
+                    "activity",
+                    "flags",
+                    "message_reference",
+                    "interaction",
+                    "components",
+                    "message_reference_id"
+                )
+            SELECT "id",
+                "channel_id",
+                "guild_id",
+                "author_id",
+                "member_id",
+                "webhook_id",
+                "application_id",
+                "content",
+                "timestamp",
+                "edited_timestamp",
+                "tts",
+                "mention_everyone",
+                "embeds",
+                "reactions",
+                "nonce",
+                "pinned",
+                "type",
+                "activity",
+                "flags",
+                "message_reference",
+                "interaction",
+                "components",
+                "message_reference_id"
+            FROM "messages"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "messages"
+        `);
+        await queryRunner.query(`
+            ALTER TABLE "temporary_messages"
+                RENAME TO "messages"
+        `);
+        await queryRunner.query(`
+            CREATE INDEX "IDX_86b9109b155eb70c0a2ca3b4b6" ON "messages" ("channel_id")
+        `);
+        await queryRunner.query(`
+            CREATE INDEX "IDX_05535bc695e9f7ee104616459d" ON "messages" ("author_id")
+        `);
+        await queryRunner.query(`
+            CREATE UNIQUE INDEX "IDX_3ed7a60fb7dbe04e1ba9332a8b" ON "messages" ("channel_id", "id")
+        `);
+        await queryRunner.query(`
+            DROP INDEX "IDX_0abf8b443321bd3cf7f81ee17a"
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "temporary_read_states" (
+                "id" varchar PRIMARY KEY NOT NULL,
+                "channel_id" varchar NOT NULL,
+                "user_id" varchar NOT NULL,
+                "last_message_id" varchar,
+                "public_ack" varchar,
+                "notifications_cursor" varchar,
+                "last_pin_timestamp" datetime,
+                "mention_count" integer,
+                CONSTRAINT "FK_40da2fca4e0eaf7a23b5bfc5d34" FOREIGN KEY ("channel_id") REFERENCES "channels" ("id") ON DELETE CASCADE ON UPDATE NO ACTION,
+                CONSTRAINT "FK_195f92e4dd1254a4e348c043763" FOREIGN KEY ("user_id") REFERENCES "users" ("id") ON DELETE CASCADE ON UPDATE NO ACTION
+            )
+        `);
+        await queryRunner.query(`
+            INSERT INTO "temporary_read_states"(
+                    "id",
+                    "channel_id",
+                    "user_id",
+                    "last_message_id",
+                    "public_ack",
+                    "notifications_cursor",
+                    "last_pin_timestamp",
+                    "mention_count"
+                )
+            SELECT "id",
+                "channel_id",
+                "user_id",
+                "last_message_id",
+                "public_ack",
+                "notifications_cursor",
+                "last_pin_timestamp",
+                "mention_count"
+            FROM "read_states"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "read_states"
+        `);
+        await queryRunner.query(`
+            ALTER TABLE "temporary_read_states"
+                RENAME TO "read_states"
+        `);
+        await queryRunner.query(`
+            CREATE UNIQUE INDEX "IDX_0abf8b443321bd3cf7f81ee17a" ON "read_states" ("channel_id", "user_id")
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "temporary_invites" (
+                "code" varchar PRIMARY KEY NOT NULL,
+                "temporary" boolean NOT NULL,
+                "uses" integer NOT NULL,
+                "max_uses" integer NOT NULL,
+                "max_age" integer NOT NULL,
+                "created_at" datetime NOT NULL,
+                "expires_at" datetime NOT NULL,
+                "guild_id" varchar,
+                "channel_id" varchar,
+                "inviter_id" varchar,
+                "target_user_id" varchar,
+                "target_user_type" integer,
+                "vanity_url" boolean,
+                CONSTRAINT "FK_3f4939aa1461e8af57fea3fb05d" FOREIGN KEY ("guild_id") REFERENCES "guilds" ("id") ON DELETE CASCADE ON UPDATE NO ACTION,
+                CONSTRAINT "FK_6a15b051fe5050aa00a4b9ff0f6" FOREIGN KEY ("channel_id") REFERENCES "channels" ("id") ON DELETE CASCADE ON UPDATE NO ACTION,
+                CONSTRAINT "FK_15c35422032e0b22b4ada95f48f" FOREIGN KEY ("inviter_id") REFERENCES "users" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION,
+                CONSTRAINT "FK_11a0d394f8fc649c19ce5f16b59" FOREIGN KEY ("target_user_id") REFERENCES "users" ("id") ON DELETE CASCADE ON UPDATE NO ACTION
+            )
+        `);
+        await queryRunner.query(`
+            INSERT INTO "temporary_invites"(
+                    "code",
+                    "temporary",
+                    "uses",
+                    "max_uses",
+                    "max_age",
+                    "created_at",
+                    "expires_at",
+                    "guild_id",
+                    "channel_id",
+                    "inviter_id",
+                    "target_user_id",
+                    "target_user_type",
+                    "vanity_url"
+                )
+            SELECT "code",
+                "temporary",
+                "uses",
+                "max_uses",
+                "max_age",
+                "created_at",
+                "expires_at",
+                "guild_id",
+                "channel_id",
+                "inviter_id",
+                "target_user_id",
+                "target_user_type",
+                "vanity_url"
+            FROM "invites"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "invites"
+        `);
+        await queryRunner.query(`
+            ALTER TABLE "temporary_invites"
+                RENAME TO "invites"
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "temporary_voice_states" (
+                "id" varchar PRIMARY KEY NOT NULL,
+                "guild_id" varchar,
+                "channel_id" varchar,
+                "user_id" varchar,
+                "session_id" varchar NOT NULL,
+                "token" varchar,
+                "deaf" boolean NOT NULL,
+                "mute" boolean NOT NULL,
+                "self_deaf" boolean NOT NULL,
+                "self_mute" boolean NOT NULL,
+                "self_stream" boolean,
+                "self_video" boolean NOT NULL,
+                "suppress" boolean NOT NULL,
+                "request_to_speak_timestamp" datetime,
+                CONSTRAINT "FK_03779ef216d4b0358470d9cb748" FOREIGN KEY ("guild_id") REFERENCES "guilds" ("id") ON DELETE CASCADE ON UPDATE NO ACTION,
+                CONSTRAINT "FK_9f8d389866b40b6657edd026dd4" FOREIGN KEY ("channel_id") REFERENCES "channels" ("id") ON DELETE CASCADE ON UPDATE NO ACTION,
+                CONSTRAINT "FK_5fe1d5f931a67e85039c640001b" FOREIGN KEY ("user_id") REFERENCES "users" ("id") ON DELETE CASCADE ON UPDATE NO ACTION
+            )
+        `);
+        await queryRunner.query(`
+            INSERT INTO "temporary_voice_states"(
+                    "id",
+                    "guild_id",
+                    "channel_id",
+                    "user_id",
+                    "session_id",
+                    "token",
+                    "deaf",
+                    "mute",
+                    "self_deaf",
+                    "self_mute",
+                    "self_stream",
+                    "self_video",
+                    "suppress",
+                    "request_to_speak_timestamp"
+                )
+            SELECT "id",
+                "guild_id",
+                "channel_id",
+                "user_id",
+                "session_id",
+                "token",
+                "deaf",
+                "mute",
+                "self_deaf",
+                "self_mute",
+                "self_stream",
+                "self_video",
+                "suppress",
+                "request_to_speak_timestamp"
+            FROM "voice_states"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "voice_states"
+        `);
+        await queryRunner.query(`
+            ALTER TABLE "temporary_voice_states"
+                RENAME TO "voice_states"
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "temporary_channels" (
+                "id" varchar PRIMARY KEY NOT NULL,
+                "created_at" datetime NOT NULL,
+                "name" varchar,
+                "icon" text,
+                "type" integer NOT NULL,
+                "last_message_id" varchar,
+                "guild_id" varchar,
+                "parent_id" varchar,
+                "owner_id" varchar,
+                "last_pin_timestamp" integer,
+                "default_auto_archive_duration" integer,
+                "position" integer,
+                "permission_overwrites" text,
+                "video_quality_mode" integer,
+                "bitrate" integer,
+                "user_limit" integer,
+                "nsfw" boolean,
+                "rate_limit_per_user" integer,
+                "topic" varchar,
+                "retention_policy_id" varchar,
+                CONSTRAINT "FK_c253dafe5f3a03ec00cd8fb4581" FOREIGN KEY ("guild_id") REFERENCES "guilds" ("id") ON DELETE CASCADE ON UPDATE NO ACTION,
+                CONSTRAINT "FK_3274522d14af40540b1a883fc80" FOREIGN KEY ("parent_id") REFERENCES "channels" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION,
+                CONSTRAINT "FK_3873ed438575cce703ecff4fc7b" FOREIGN KEY ("owner_id") REFERENCES "users" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION
+            )
+        `);
+        await queryRunner.query(`
+            INSERT INTO "temporary_channels"(
+                    "id",
+                    "created_at",
+                    "name",
+                    "icon",
+                    "type",
+                    "last_message_id",
+                    "guild_id",
+                    "parent_id",
+                    "owner_id",
+                    "last_pin_timestamp",
+                    "default_auto_archive_duration",
+                    "position",
+                    "permission_overwrites",
+                    "video_quality_mode",
+                    "bitrate",
+                    "user_limit",
+                    "nsfw",
+                    "rate_limit_per_user",
+                    "topic",
+                    "retention_policy_id"
+                )
+            SELECT "id",
+                "created_at",
+                "name",
+                "icon",
+                "type",
+                "last_message_id",
+                "guild_id",
+                "parent_id",
+                "owner_id",
+                "last_pin_timestamp",
+                "default_auto_archive_duration",
+                "position",
+                "permission_overwrites",
+                "video_quality_mode",
+                "bitrate",
+                "user_limit",
+                "nsfw",
+                "rate_limit_per_user",
+                "topic",
+                "retention_policy_id"
+            FROM "channels"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "channels"
+        `);
+        await queryRunner.query(`
+            ALTER TABLE "temporary_channels"
+                RENAME TO "channels"
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "temporary_emojis" (
+                "id" varchar PRIMARY KEY NOT NULL,
+                "animated" boolean NOT NULL,
+                "available" boolean NOT NULL,
+                "guild_id" varchar NOT NULL,
+                "user_id" varchar,
+                "managed" boolean NOT NULL,
+                "name" varchar NOT NULL,
+                "require_colons" boolean NOT NULL,
+                "roles" text NOT NULL,
+                "groups" text,
+                CONSTRAINT "FK_4b988e0db89d94cebcf07f598cc" FOREIGN KEY ("guild_id") REFERENCES "guilds" ("id") ON DELETE CASCADE ON UPDATE NO ACTION,
+                CONSTRAINT "FK_fa7ddd5f9a214e28ce596548421" FOREIGN KEY ("user_id") REFERENCES "users" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION
+            )
+        `);
+        await queryRunner.query(`
+            INSERT INTO "temporary_emojis"(
+                    "id",
+                    "animated",
+                    "available",
+                    "guild_id",
+                    "user_id",
+                    "managed",
+                    "name",
+                    "require_colons",
+                    "roles",
+                    "groups"
+                )
+            SELECT "id",
+                "animated",
+                "available",
+                "guild_id",
+                "user_id",
+                "managed",
+                "name",
+                "require_colons",
+                "roles",
+                "groups"
+            FROM "emojis"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "emojis"
+        `);
+        await queryRunner.query(`
+            ALTER TABLE "temporary_emojis"
+                RENAME TO "emojis"
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "temporary_templates" (
+                "id" varchar PRIMARY KEY NOT NULL,
+                "code" varchar NOT NULL,
+                "name" varchar NOT NULL,
+                "description" varchar,
+                "usage_count" integer,
+                "creator_id" varchar,
+                "created_at" datetime NOT NULL,
+                "updated_at" datetime NOT NULL,
+                "source_guild_id" varchar,
+                "serialized_source_guild" text NOT NULL,
+                CONSTRAINT "UQ_be38737bf339baf63b1daeffb55" UNIQUE ("code"),
+                CONSTRAINT "FK_d7374b7f8f5fbfdececa4fb62e1" FOREIGN KEY ("creator_id") REFERENCES "users" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION,
+                CONSTRAINT "FK_445d00eaaea0e60a017a5ed0c11" FOREIGN KEY ("source_guild_id") REFERENCES "guilds" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION
+            )
+        `);
+        await queryRunner.query(`
+            INSERT INTO "temporary_templates"(
+                    "id",
+                    "code",
+                    "name",
+                    "description",
+                    "usage_count",
+                    "creator_id",
+                    "created_at",
+                    "updated_at",
+                    "source_guild_id",
+                    "serialized_source_guild"
+                )
+            SELECT "id",
+                "code",
+                "name",
+                "description",
+                "usage_count",
+                "creator_id",
+                "created_at",
+                "updated_at",
+                "source_guild_id",
+                "serialized_source_guild"
+            FROM "templates"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "templates"
+        `);
+        await queryRunner.query(`
+            ALTER TABLE "temporary_templates"
+                RENAME TO "templates"
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "temporary_guilds" (
+                "id" varchar PRIMARY KEY NOT NULL,
+                "afk_channel_id" varchar,
+                "afk_timeout" integer,
+                "banner" varchar,
+                "default_message_notifications" integer,
+                "description" varchar,
+                "discovery_splash" varchar,
+                "explicit_content_filter" integer,
+                "features" text NOT NULL,
+                "primary_category_id" integer,
+                "icon" varchar,
+                "large" boolean,
+                "max_members" integer,
+                "max_presences" integer,
+                "max_video_channel_users" integer,
+                "member_count" integer,
+                "presence_count" integer,
+                "template_id" varchar,
+                "mfa_level" integer,
+                "name" varchar NOT NULL,
+                "owner_id" varchar,
+                "preferred_locale" varchar,
+                "premium_subscription_count" integer,
+                "premium_tier" integer,
+                "public_updates_channel_id" varchar,
+                "rules_channel_id" varchar,
+                "region" varchar,
+                "splash" varchar,
+                "system_channel_id" varchar,
+                "system_channel_flags" integer,
+                "unavailable" boolean,
+                "verification_level" integer,
+                "welcome_screen" text NOT NULL,
+                "widget_channel_id" varchar,
+                "widget_enabled" boolean,
+                "nsfw_level" integer,
+                "nsfw" boolean,
+                "parent" varchar,
+                CONSTRAINT "FK_f591a66b8019d87b0fe6c12dad6" FOREIGN KEY ("afk_channel_id") REFERENCES "channels" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION,
+                CONSTRAINT "FK_e2a2f873a64a5cf62526de42325" FOREIGN KEY ("template_id") REFERENCES "templates" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION,
+                CONSTRAINT "FK_fc1a451727e3643ca572a3bb394" FOREIGN KEY ("owner_id") REFERENCES "users" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION,
+                CONSTRAINT "FK_8d450b016dc8bec35f36729e4b0" FOREIGN KEY ("public_updates_channel_id") REFERENCES "channels" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION,
+                CONSTRAINT "FK_95828668aa333460582e0ca6396" FOREIGN KEY ("rules_channel_id") REFERENCES "channels" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION,
+                CONSTRAINT "FK_cfc3d3ad260f8121c95b31a1fce" FOREIGN KEY ("system_channel_id") REFERENCES "channels" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION,
+                CONSTRAINT "FK_9d1d665379eefde7876a17afa99" FOREIGN KEY ("widget_channel_id") REFERENCES "channels" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION
+            )
+        `);
+        await queryRunner.query(`
+            INSERT INTO "temporary_guilds"(
+                    "id",
+                    "afk_channel_id",
+                    "afk_timeout",
+                    "banner",
+                    "default_message_notifications",
+                    "description",
+                    "discovery_splash",
+                    "explicit_content_filter",
+                    "features",
+                    "primary_category_id",
+                    "icon",
+                    "large",
+                    "max_members",
+                    "max_presences",
+                    "max_video_channel_users",
+                    "member_count",
+                    "presence_count",
+                    "template_id",
+                    "mfa_level",
+                    "name",
+                    "owner_id",
+                    "preferred_locale",
+                    "premium_subscription_count",
+                    "premium_tier",
+                    "public_updates_channel_id",
+                    "rules_channel_id",
+                    "region",
+                    "splash",
+                    "system_channel_id",
+                    "system_channel_flags",
+                    "unavailable",
+                    "verification_level",
+                    "welcome_screen",
+                    "widget_channel_id",
+                    "widget_enabled",
+                    "nsfw_level",
+                    "nsfw",
+                    "parent"
+                )
+            SELECT "id",
+                "afk_channel_id",
+                "afk_timeout",
+                "banner",
+                "default_message_notifications",
+                "description",
+                "discovery_splash",
+                "explicit_content_filter",
+                "features",
+                "primary_category_id",
+                "icon",
+                "large",
+                "max_members",
+                "max_presences",
+                "max_video_channel_users",
+                "member_count",
+                "presence_count",
+                "template_id",
+                "mfa_level",
+                "name",
+                "owner_id",
+                "preferred_locale",
+                "premium_subscription_count",
+                "premium_tier",
+                "public_updates_channel_id",
+                "rules_channel_id",
+                "region",
+                "splash",
+                "system_channel_id",
+                "system_channel_flags",
+                "unavailable",
+                "verification_level",
+                "welcome_screen",
+                "widget_channel_id",
+                "widget_enabled",
+                "nsfw_level",
+                "nsfw",
+                "parent"
+            FROM "guilds"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "guilds"
+        `);
+        await queryRunner.query(`
+            ALTER TABLE "temporary_guilds"
+                RENAME TO "guilds"
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "temporary_team_members" (
+                "id" varchar PRIMARY KEY NOT NULL,
+                "membership_state" integer NOT NULL,
+                "permissions" text NOT NULL,
+                "team_id" varchar,
+                "user_id" varchar,
+                CONSTRAINT "FK_fdad7d5768277e60c40e01cdcea" FOREIGN KEY ("team_id") REFERENCES "teams" ("id") ON DELETE CASCADE ON UPDATE NO ACTION,
+                CONSTRAINT "FK_c2bf4967c8c2a6b845dadfbf3d4" FOREIGN KEY ("user_id") REFERENCES "users" ("id") ON DELETE CASCADE ON UPDATE NO ACTION
+            )
+        `);
+        await queryRunner.query(`
+            INSERT INTO "temporary_team_members"(
+                    "id",
+                    "membership_state",
+                    "permissions",
+                    "team_id",
+                    "user_id"
+                )
+            SELECT "id",
+                "membership_state",
+                "permissions",
+                "team_id",
+                "user_id"
+            FROM "team_members"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "team_members"
+        `);
+        await queryRunner.query(`
+            ALTER TABLE "temporary_team_members"
+                RENAME TO "team_members"
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "temporary_teams" (
+                "id" varchar PRIMARY KEY NOT NULL,
+                "icon" varchar,
+                "name" varchar NOT NULL,
+                "owner_user_id" varchar,
+                CONSTRAINT "FK_13f00abf7cb6096c43ecaf8c108" FOREIGN KEY ("owner_user_id") REFERENCES "users" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION
+            )
+        `);
+        await queryRunner.query(`
+            INSERT INTO "temporary_teams"("id", "icon", "name", "owner_user_id")
+            SELECT "id",
+                "icon",
+                "name",
+                "owner_user_id"
+            FROM "teams"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "teams"
+        `);
+        await queryRunner.query(`
+            ALTER TABLE "temporary_teams"
+                RENAME TO "teams"
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "temporary_applications" (
+                "id" varchar PRIMARY KEY NOT NULL,
+                "name" varchar NOT NULL,
+                "icon" varchar,
+                "description" varchar NOT NULL,
+                "rpc_origins" text,
+                "bot_public" boolean NOT NULL,
+                "bot_require_code_grant" boolean NOT NULL,
+                "terms_of_service_url" varchar,
+                "privacy_policy_url" varchar,
+                "summary" varchar,
+                "verify_key" varchar NOT NULL,
+                "primary_sku_id" varchar,
+                "slug" varchar,
+                "cover_image" varchar,
+                "flags" varchar NOT NULL,
+                "owner_id" varchar,
+                "team_id" varchar,
+                "guild_id" varchar,
+                CONSTRAINT "FK_e57508958bf92b9d9d25231b5e8" FOREIGN KEY ("owner_id") REFERENCES "users" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION,
+                CONSTRAINT "FK_a36ed02953077f408d0f3ebc424" FOREIGN KEY ("team_id") REFERENCES "teams" ("id") ON DELETE CASCADE ON UPDATE NO ACTION,
+                CONSTRAINT "FK_e5bf78cdbbe9ba91062d74c5aba" FOREIGN KEY ("guild_id") REFERENCES "guilds" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION
+            )
+        `);
+        await queryRunner.query(`
+            INSERT INTO "temporary_applications"(
+                    "id",
+                    "name",
+                    "icon",
+                    "description",
+                    "rpc_origins",
+                    "bot_public",
+                    "bot_require_code_grant",
+                    "terms_of_service_url",
+                    "privacy_policy_url",
+                    "summary",
+                    "verify_key",
+                    "primary_sku_id",
+                    "slug",
+                    "cover_image",
+                    "flags",
+                    "owner_id",
+                    "team_id",
+                    "guild_id"
+                )
+            SELECT "id",
+                "name",
+                "icon",
+                "description",
+                "rpc_origins",
+                "bot_public",
+                "bot_require_code_grant",
+                "terms_of_service_url",
+                "privacy_policy_url",
+                "summary",
+                "verify_key",
+                "primary_sku_id",
+                "slug",
+                "cover_image",
+                "flags",
+                "owner_id",
+                "team_id",
+                "guild_id"
+            FROM "applications"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "applications"
+        `);
+        await queryRunner.query(`
+            ALTER TABLE "temporary_applications"
+                RENAME TO "applications"
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "temporary_audit_logs" (
+                "id" varchar PRIMARY KEY NOT NULL,
+                "user_id" varchar,
+                "action_type" integer NOT NULL,
+                "options" text,
+                "changes" text NOT NULL,
+                "reason" varchar,
+                "target_id" varchar,
+                CONSTRAINT "FK_3cd01cd3ae7aab010310d96ac8e" FOREIGN KEY ("target_id") REFERENCES "users" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION,
+                CONSTRAINT "FK_bd2726fd31b35443f2245b93ba0" FOREIGN KEY ("user_id") REFERENCES "users" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION
+            )
+        `);
+        await queryRunner.query(`
+            INSERT INTO "temporary_audit_logs"(
+                    "id",
+                    "user_id",
+                    "action_type",
+                    "options",
+                    "changes",
+                    "reason",
+                    "target_id"
+                )
+            SELECT "id",
+                "user_id",
+                "action_type",
+                "options",
+                "changes",
+                "reason",
+                "target_id"
+            FROM "audit_logs"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "audit_logs"
+        `);
+        await queryRunner.query(`
+            ALTER TABLE "temporary_audit_logs"
+                RENAME TO "audit_logs"
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "temporary_sessions" (
+                "id" varchar PRIMARY KEY NOT NULL,
+                "user_id" varchar,
+                "session_id" varchar NOT NULL,
+                "activities" text,
+                "client_info" text NOT NULL,
+                "status" varchar NOT NULL,
+                CONSTRAINT "FK_085d540d9f418cfbdc7bd55bb19" FOREIGN KEY ("user_id") REFERENCES "users" ("id") ON DELETE CASCADE ON UPDATE NO ACTION
+            )
+        `);
+        await queryRunner.query(`
+            INSERT INTO "temporary_sessions"(
+                    "id",
+                    "user_id",
+                    "session_id",
+                    "activities",
+                    "client_info",
+                    "status"
+                )
+            SELECT "id",
+                "user_id",
+                "session_id",
+                "activities",
+                "client_info",
+                "status"
+            FROM "sessions"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "sessions"
+        `);
+        await queryRunner.query(`
+            ALTER TABLE "temporary_sessions"
+                RENAME TO "sessions"
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "temporary_sticker_packs" (
+                "id" varchar PRIMARY KEY NOT NULL,
+                "name" varchar NOT NULL,
+                "description" varchar,
+                "banner_asset_id" varchar,
+                "cover_sticker_id" varchar,
+                "coverStickerId" varchar,
+                CONSTRAINT "FK_448fafba4355ee1c837bbc865f1" FOREIGN KEY ("coverStickerId") REFERENCES "stickers" ("id") ON DELETE NO ACTION ON UPDATE NO ACTION
+            )
+        `);
+        await queryRunner.query(`
+            INSERT INTO "temporary_sticker_packs"(
+                    "id",
+                    "name",
+                    "description",
+                    "banner_asset_id",
+                    "cover_sticker_id",
+                    "coverStickerId"
+                )
+            SELECT "id",
+                "name",
+                "description",
+                "banner_asset_id",
+                "cover_sticker_id",
+                "coverStickerId"
+            FROM "sticker_packs"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "sticker_packs"
+        `);
+        await queryRunner.query(`
+            ALTER TABLE "temporary_sticker_packs"
+                RENAME TO "sticker_packs"
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "temporary_notes" (
+                "id" varchar PRIMARY KEY NOT NULL,
+                "content" varchar NOT NULL,
+                "owner_id" varchar,
+                "target_id" varchar,
+                CONSTRAINT "UQ_74e6689b9568cc965b8bfc9150b" UNIQUE ("owner_id", "target_id"),
+                CONSTRAINT "FK_f9e103f8ae67cb1787063597925" FOREIGN KEY ("owner_id") REFERENCES "users" ("id") ON DELETE CASCADE ON UPDATE NO ACTION,
+                CONSTRAINT "FK_23e08e5b4481711d573e1abecdc" FOREIGN KEY ("target_id") REFERENCES "users" ("id") ON DELETE CASCADE ON UPDATE NO ACTION
+            )
+        `);
+        await queryRunner.query(`
+            INSERT INTO "temporary_notes"("id", "content", "owner_id", "target_id")
+            SELECT "id",
+                "content",
+                "owner_id",
+                "target_id"
+            FROM "notes"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "notes"
+        `);
+        await queryRunner.query(`
+            ALTER TABLE "temporary_notes"
+                RENAME TO "notes"
+        `);
+        await queryRunner.query(`
+            DROP INDEX "IDX_5d7ddc8a5f9c167f548625e772"
+        `);
+        await queryRunner.query(`
+            DROP INDEX "IDX_e9080e7a7997a0170026d5139c"
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "temporary_member_roles" (
+                "index" integer NOT NULL,
+                "role_id" varchar NOT NULL,
+                CONSTRAINT "FK_5d7ddc8a5f9c167f548625e772e" FOREIGN KEY ("index") REFERENCES "members" ("index") ON DELETE CASCADE ON UPDATE CASCADE,
+                CONSTRAINT "FK_e9080e7a7997a0170026d5139c1" FOREIGN KEY ("role_id") REFERENCES "roles" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
+                PRIMARY KEY ("index", "role_id")
+            )
+        `);
+        await queryRunner.query(`
+            INSERT INTO "temporary_member_roles"("index", "role_id")
+            SELECT "index",
+                "role_id"
+            FROM "member_roles"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "member_roles"
+        `);
+        await queryRunner.query(`
+            ALTER TABLE "temporary_member_roles"
+                RENAME TO "member_roles"
+        `);
+        await queryRunner.query(`
+            CREATE INDEX "IDX_5d7ddc8a5f9c167f548625e772" ON "member_roles" ("index")
+        `);
+        await queryRunner.query(`
+            CREATE INDEX "IDX_e9080e7a7997a0170026d5139c" ON "member_roles" ("role_id")
+        `);
+        await queryRunner.query(`
+            DROP INDEX "IDX_a343387fc560ef378760681c23"
+        `);
+        await queryRunner.query(`
+            DROP INDEX "IDX_b831eb18ceebd28976239b1e2f"
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "temporary_message_user_mentions" (
+                "messagesId" varchar NOT NULL,
+                "usersId" varchar NOT NULL,
+                CONSTRAINT "FK_a343387fc560ef378760681c236" FOREIGN KEY ("messagesId") REFERENCES "messages" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
+                CONSTRAINT "FK_b831eb18ceebd28976239b1e2f8" FOREIGN KEY ("usersId") REFERENCES "users" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
+                PRIMARY KEY ("messagesId", "usersId")
+            )
+        `);
+        await queryRunner.query(`
+            INSERT INTO "temporary_message_user_mentions"("messagesId", "usersId")
+            SELECT "messagesId",
+                "usersId"
+            FROM "message_user_mentions"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "message_user_mentions"
+        `);
+        await queryRunner.query(`
+            ALTER TABLE "temporary_message_user_mentions"
+                RENAME TO "message_user_mentions"
+        `);
+        await queryRunner.query(`
+            CREATE INDEX "IDX_a343387fc560ef378760681c23" ON "message_user_mentions" ("messagesId")
+        `);
+        await queryRunner.query(`
+            CREATE INDEX "IDX_b831eb18ceebd28976239b1e2f" ON "message_user_mentions" ("usersId")
+        `);
+        await queryRunner.query(`
+            DROP INDEX "IDX_a8242cf535337a490b0feaea0b"
+        `);
+        await queryRunner.query(`
+            DROP INDEX "IDX_29d63eb1a458200851bc37d074"
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "temporary_message_role_mentions" (
+                "messagesId" varchar NOT NULL,
+                "rolesId" varchar NOT NULL,
+                CONSTRAINT "FK_a8242cf535337a490b0feaea0b4" FOREIGN KEY ("messagesId") REFERENCES "messages" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
+                CONSTRAINT "FK_29d63eb1a458200851bc37d074b" FOREIGN KEY ("rolesId") REFERENCES "roles" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
+                PRIMARY KEY ("messagesId", "rolesId")
+            )
+        `);
+        await queryRunner.query(`
+            INSERT INTO "temporary_message_role_mentions"("messagesId", "rolesId")
+            SELECT "messagesId",
+                "rolesId"
+            FROM "message_role_mentions"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "message_role_mentions"
+        `);
+        await queryRunner.query(`
+            ALTER TABLE "temporary_message_role_mentions"
+                RENAME TO "message_role_mentions"
+        `);
+        await queryRunner.query(`
+            CREATE INDEX "IDX_a8242cf535337a490b0feaea0b" ON "message_role_mentions" ("messagesId")
+        `);
+        await queryRunner.query(`
+            CREATE INDEX "IDX_29d63eb1a458200851bc37d074" ON "message_role_mentions" ("rolesId")
+        `);
+        await queryRunner.query(`
+            DROP INDEX "IDX_2a27102ecd1d81b4582a436092"
+        `);
+        await queryRunner.query(`
+            DROP INDEX "IDX_bdb8c09e1464cabf62105bf4b9"
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "temporary_message_channel_mentions" (
+                "messagesId" varchar NOT NULL,
+                "channelsId" varchar NOT NULL,
+                CONSTRAINT "FK_2a27102ecd1d81b4582a4360921" FOREIGN KEY ("messagesId") REFERENCES "messages" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
+                CONSTRAINT "FK_bdb8c09e1464cabf62105bf4b9d" FOREIGN KEY ("channelsId") REFERENCES "channels" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
+                PRIMARY KEY ("messagesId", "channelsId")
+            )
+        `);
+        await queryRunner.query(`
+            INSERT INTO "temporary_message_channel_mentions"("messagesId", "channelsId")
+            SELECT "messagesId",
+                "channelsId"
+            FROM "message_channel_mentions"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "message_channel_mentions"
+        `);
+        await queryRunner.query(`
+            ALTER TABLE "temporary_message_channel_mentions"
+                RENAME TO "message_channel_mentions"
+        `);
+        await queryRunner.query(`
+            CREATE INDEX "IDX_2a27102ecd1d81b4582a436092" ON "message_channel_mentions" ("messagesId")
+        `);
+        await queryRunner.query(`
+            CREATE INDEX "IDX_bdb8c09e1464cabf62105bf4b9" ON "message_channel_mentions" ("channelsId")
+        `);
+        await queryRunner.query(`
+            DROP INDEX "IDX_40bb6f23e7cc133292e92829d2"
+        `);
+        await queryRunner.query(`
+            DROP INDEX "IDX_e22a70819d07659c7a71c112a1"
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "temporary_message_stickers" (
+                "messagesId" varchar NOT NULL,
+                "stickersId" varchar NOT NULL,
+                CONSTRAINT "FK_40bb6f23e7cc133292e92829d28" FOREIGN KEY ("messagesId") REFERENCES "messages" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
+                CONSTRAINT "FK_e22a70819d07659c7a71c112a1f" FOREIGN KEY ("stickersId") REFERENCES "stickers" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
+                PRIMARY KEY ("messagesId", "stickersId")
+            )
+        `);
+        await queryRunner.query(`
+            INSERT INTO "temporary_message_stickers"("messagesId", "stickersId")
+            SELECT "messagesId",
+                "stickersId"
+            FROM "message_stickers"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "message_stickers"
+        `);
+        await queryRunner.query(`
+            ALTER TABLE "temporary_message_stickers"
+                RENAME TO "message_stickers"
+        `);
+        await queryRunner.query(`
+            CREATE INDEX "IDX_40bb6f23e7cc133292e92829d2" ON "message_stickers" ("messagesId")
+        `);
+        await queryRunner.query(`
+            CREATE INDEX "IDX_e22a70819d07659c7a71c112a1" ON "message_stickers" ("stickersId")
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "query-result-cache" (
+                "id" integer PRIMARY KEY AUTOINCREMENT NOT NULL,
+                "identifier" varchar,
+                "time" bigint NOT NULL,
+                "duration" integer NOT NULL,
+                "query" text NOT NULL,
+                "result" text NOT NULL
+            )
+        `);
+    }
+
+    public async down(queryRunner: QueryRunner): Promise<void> {
+        await queryRunner.query(`
+            DROP TABLE "query-result-cache"
+        `);
+        await queryRunner.query(`
+            DROP INDEX "IDX_e22a70819d07659c7a71c112a1"
+        `);
+        await queryRunner.query(`
+            DROP INDEX "IDX_40bb6f23e7cc133292e92829d2"
+        `);
+        await queryRunner.query(`
+            ALTER TABLE "message_stickers"
+                RENAME TO "temporary_message_stickers"
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "message_stickers" (
+                "messagesId" varchar NOT NULL,
+                "stickersId" varchar NOT NULL,
+                PRIMARY KEY ("messagesId", "stickersId")
+            )
+        `);
+        await queryRunner.query(`
+            INSERT INTO "message_stickers"("messagesId", "stickersId")
+            SELECT "messagesId",
+                "stickersId"
+            FROM "temporary_message_stickers"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "temporary_message_stickers"
+        `);
+        await queryRunner.query(`
+            CREATE INDEX "IDX_e22a70819d07659c7a71c112a1" ON "message_stickers" ("stickersId")
+        `);
+        await queryRunner.query(`
+            CREATE INDEX "IDX_40bb6f23e7cc133292e92829d2" ON "message_stickers" ("messagesId")
+        `);
+        await queryRunner.query(`
+            DROP INDEX "IDX_bdb8c09e1464cabf62105bf4b9"
+        `);
+        await queryRunner.query(`
+            DROP INDEX "IDX_2a27102ecd1d81b4582a436092"
+        `);
+        await queryRunner.query(`
+            ALTER TABLE "message_channel_mentions"
+                RENAME TO "temporary_message_channel_mentions"
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "message_channel_mentions" (
+                "messagesId" varchar NOT NULL,
+                "channelsId" varchar NOT NULL,
+                PRIMARY KEY ("messagesId", "channelsId")
+            )
+        `);
+        await queryRunner.query(`
+            INSERT INTO "message_channel_mentions"("messagesId", "channelsId")
+            SELECT "messagesId",
+                "channelsId"
+            FROM "temporary_message_channel_mentions"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "temporary_message_channel_mentions"
+        `);
+        await queryRunner.query(`
+            CREATE INDEX "IDX_bdb8c09e1464cabf62105bf4b9" ON "message_channel_mentions" ("channelsId")
+        `);
+        await queryRunner.query(`
+            CREATE INDEX "IDX_2a27102ecd1d81b4582a436092" ON "message_channel_mentions" ("messagesId")
+        `);
+        await queryRunner.query(`
+            DROP INDEX "IDX_29d63eb1a458200851bc37d074"
+        `);
+        await queryRunner.query(`
+            DROP INDEX "IDX_a8242cf535337a490b0feaea0b"
+        `);
+        await queryRunner.query(`
+            ALTER TABLE "message_role_mentions"
+                RENAME TO "temporary_message_role_mentions"
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "message_role_mentions" (
+                "messagesId" varchar NOT NULL,
+                "rolesId" varchar NOT NULL,
+                PRIMARY KEY ("messagesId", "rolesId")
+            )
+        `);
+        await queryRunner.query(`
+            INSERT INTO "message_role_mentions"("messagesId", "rolesId")
+            SELECT "messagesId",
+                "rolesId"
+            FROM "temporary_message_role_mentions"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "temporary_message_role_mentions"
+        `);
+        await queryRunner.query(`
+            CREATE INDEX "IDX_29d63eb1a458200851bc37d074" ON "message_role_mentions" ("rolesId")
+        `);
+        await queryRunner.query(`
+            CREATE INDEX "IDX_a8242cf535337a490b0feaea0b" ON "message_role_mentions" ("messagesId")
+        `);
+        await queryRunner.query(`
+            DROP INDEX "IDX_b831eb18ceebd28976239b1e2f"
+        `);
+        await queryRunner.query(`
+            DROP INDEX "IDX_a343387fc560ef378760681c23"
+        `);
+        await queryRunner.query(`
+            ALTER TABLE "message_user_mentions"
+                RENAME TO "temporary_message_user_mentions"
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "message_user_mentions" (
+                "messagesId" varchar NOT NULL,
+                "usersId" varchar NOT NULL,
+                PRIMARY KEY ("messagesId", "usersId")
+            )
+        `);
+        await queryRunner.query(`
+            INSERT INTO "message_user_mentions"("messagesId", "usersId")
+            SELECT "messagesId",
+                "usersId"
+            FROM "temporary_message_user_mentions"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "temporary_message_user_mentions"
+        `);
+        await queryRunner.query(`
+            CREATE INDEX "IDX_b831eb18ceebd28976239b1e2f" ON "message_user_mentions" ("usersId")
+        `);
+        await queryRunner.query(`
+            CREATE INDEX "IDX_a343387fc560ef378760681c23" ON "message_user_mentions" ("messagesId")
+        `);
+        await queryRunner.query(`
+            DROP INDEX "IDX_e9080e7a7997a0170026d5139c"
+        `);
+        await queryRunner.query(`
+            DROP INDEX "IDX_5d7ddc8a5f9c167f548625e772"
+        `);
+        await queryRunner.query(`
+            ALTER TABLE "member_roles"
+                RENAME TO "temporary_member_roles"
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "member_roles" (
+                "index" integer NOT NULL,
+                "role_id" varchar NOT NULL,
+                PRIMARY KEY ("index", "role_id")
+            )
+        `);
+        await queryRunner.query(`
+            INSERT INTO "member_roles"("index", "role_id")
+            SELECT "index",
+                "role_id"
+            FROM "temporary_member_roles"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "temporary_member_roles"
+        `);
+        await queryRunner.query(`
+            CREATE INDEX "IDX_e9080e7a7997a0170026d5139c" ON "member_roles" ("role_id")
+        `);
+        await queryRunner.query(`
+            CREATE INDEX "IDX_5d7ddc8a5f9c167f548625e772" ON "member_roles" ("index")
+        `);
+        await queryRunner.query(`
+            ALTER TABLE "notes"
+                RENAME TO "temporary_notes"
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "notes" (
+                "id" varchar PRIMARY KEY NOT NULL,
+                "content" varchar NOT NULL,
+                "owner_id" varchar,
+                "target_id" varchar,
+                CONSTRAINT "UQ_74e6689b9568cc965b8bfc9150b" UNIQUE ("owner_id", "target_id")
+            )
+        `);
+        await queryRunner.query(`
+            INSERT INTO "notes"("id", "content", "owner_id", "target_id")
+            SELECT "id",
+                "content",
+                "owner_id",
+                "target_id"
+            FROM "temporary_notes"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "temporary_notes"
+        `);
+        await queryRunner.query(`
+            ALTER TABLE "sticker_packs"
+                RENAME TO "temporary_sticker_packs"
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "sticker_packs" (
+                "id" varchar PRIMARY KEY NOT NULL,
+                "name" varchar NOT NULL,
+                "description" varchar,
+                "banner_asset_id" varchar,
+                "cover_sticker_id" varchar,
+                "coverStickerId" varchar
+            )
+        `);
+        await queryRunner.query(`
+            INSERT INTO "sticker_packs"(
+                    "id",
+                    "name",
+                    "description",
+                    "banner_asset_id",
+                    "cover_sticker_id",
+                    "coverStickerId"
+                )
+            SELECT "id",
+                "name",
+                "description",
+                "banner_asset_id",
+                "cover_sticker_id",
+                "coverStickerId"
+            FROM "temporary_sticker_packs"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "temporary_sticker_packs"
+        `);
+        await queryRunner.query(`
+            ALTER TABLE "sessions"
+                RENAME TO "temporary_sessions"
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "sessions" (
+                "id" varchar PRIMARY KEY NOT NULL,
+                "user_id" varchar,
+                "session_id" varchar NOT NULL,
+                "activities" text,
+                "client_info" text NOT NULL,
+                "status" varchar NOT NULL
+            )
+        `);
+        await queryRunner.query(`
+            INSERT INTO "sessions"(
+                    "id",
+                    "user_id",
+                    "session_id",
+                    "activities",
+                    "client_info",
+                    "status"
+                )
+            SELECT "id",
+                "user_id",
+                "session_id",
+                "activities",
+                "client_info",
+                "status"
+            FROM "temporary_sessions"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "temporary_sessions"
+        `);
+        await queryRunner.query(`
+            ALTER TABLE "audit_logs"
+                RENAME TO "temporary_audit_logs"
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "audit_logs" (
+                "id" varchar PRIMARY KEY NOT NULL,
+                "user_id" varchar,
+                "action_type" integer NOT NULL,
+                "options" text,
+                "changes" text NOT NULL,
+                "reason" varchar,
+                "target_id" varchar
+            )
+        `);
+        await queryRunner.query(`
+            INSERT INTO "audit_logs"(
+                    "id",
+                    "user_id",
+                    "action_type",
+                    "options",
+                    "changes",
+                    "reason",
+                    "target_id"
+                )
+            SELECT "id",
+                "user_id",
+                "action_type",
+                "options",
+                "changes",
+                "reason",
+                "target_id"
+            FROM "temporary_audit_logs"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "temporary_audit_logs"
+        `);
+        await queryRunner.query(`
+            ALTER TABLE "applications"
+                RENAME TO "temporary_applications"
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "applications" (
+                "id" varchar PRIMARY KEY NOT NULL,
+                "name" varchar NOT NULL,
+                "icon" varchar,
+                "description" varchar NOT NULL,
+                "rpc_origins" text,
+                "bot_public" boolean NOT NULL,
+                "bot_require_code_grant" boolean NOT NULL,
+                "terms_of_service_url" varchar,
+                "privacy_policy_url" varchar,
+                "summary" varchar,
+                "verify_key" varchar NOT NULL,
+                "primary_sku_id" varchar,
+                "slug" varchar,
+                "cover_image" varchar,
+                "flags" varchar NOT NULL,
+                "owner_id" varchar,
+                "team_id" varchar,
+                "guild_id" varchar
+            )
+        `);
+        await queryRunner.query(`
+            INSERT INTO "applications"(
+                    "id",
+                    "name",
+                    "icon",
+                    "description",
+                    "rpc_origins",
+                    "bot_public",
+                    "bot_require_code_grant",
+                    "terms_of_service_url",
+                    "privacy_policy_url",
+                    "summary",
+                    "verify_key",
+                    "primary_sku_id",
+                    "slug",
+                    "cover_image",
+                    "flags",
+                    "owner_id",
+                    "team_id",
+                    "guild_id"
+                )
+            SELECT "id",
+                "name",
+                "icon",
+                "description",
+                "rpc_origins",
+                "bot_public",
+                "bot_require_code_grant",
+                "terms_of_service_url",
+                "privacy_policy_url",
+                "summary",
+                "verify_key",
+                "primary_sku_id",
+                "slug",
+                "cover_image",
+                "flags",
+                "owner_id",
+                "team_id",
+                "guild_id"
+            FROM "temporary_applications"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "temporary_applications"
+        `);
+        await queryRunner.query(`
+            ALTER TABLE "teams"
+                RENAME TO "temporary_teams"
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "teams" (
+                "id" varchar PRIMARY KEY NOT NULL,
+                "icon" varchar,
+                "name" varchar NOT NULL,
+                "owner_user_id" varchar
+            )
+        `);
+        await queryRunner.query(`
+            INSERT INTO "teams"("id", "icon", "name", "owner_user_id")
+            SELECT "id",
+                "icon",
+                "name",
+                "owner_user_id"
+            FROM "temporary_teams"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "temporary_teams"
+        `);
+        await queryRunner.query(`
+            ALTER TABLE "team_members"
+                RENAME TO "temporary_team_members"
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "team_members" (
+                "id" varchar PRIMARY KEY NOT NULL,
+                "membership_state" integer NOT NULL,
+                "permissions" text NOT NULL,
+                "team_id" varchar,
+                "user_id" varchar
+            )
+        `);
+        await queryRunner.query(`
+            INSERT INTO "team_members"(
+                    "id",
+                    "membership_state",
+                    "permissions",
+                    "team_id",
+                    "user_id"
+                )
+            SELECT "id",
+                "membership_state",
+                "permissions",
+                "team_id",
+                "user_id"
+            FROM "temporary_team_members"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "temporary_team_members"
+        `);
+        await queryRunner.query(`
+            ALTER TABLE "guilds"
+                RENAME TO "temporary_guilds"
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "guilds" (
+                "id" varchar PRIMARY KEY NOT NULL,
+                "afk_channel_id" varchar,
+                "afk_timeout" integer,
+                "banner" varchar,
+                "default_message_notifications" integer,
+                "description" varchar,
+                "discovery_splash" varchar,
+                "explicit_content_filter" integer,
+                "features" text NOT NULL,
+                "primary_category_id" integer,
+                "icon" varchar,
+                "large" boolean,
+                "max_members" integer,
+                "max_presences" integer,
+                "max_video_channel_users" integer,
+                "member_count" integer,
+                "presence_count" integer,
+                "template_id" varchar,
+                "mfa_level" integer,
+                "name" varchar NOT NULL,
+                "owner_id" varchar,
+                "preferred_locale" varchar,
+                "premium_subscription_count" integer,
+                "premium_tier" integer,
+                "public_updates_channel_id" varchar,
+                "rules_channel_id" varchar,
+                "region" varchar,
+                "splash" varchar,
+                "system_channel_id" varchar,
+                "system_channel_flags" integer,
+                "unavailable" boolean,
+                "verification_level" integer,
+                "welcome_screen" text NOT NULL,
+                "widget_channel_id" varchar,
+                "widget_enabled" boolean,
+                "nsfw_level" integer,
+                "nsfw" boolean,
+                "parent" varchar
+            )
+        `);
+        await queryRunner.query(`
+            INSERT INTO "guilds"(
+                    "id",
+                    "afk_channel_id",
+                    "afk_timeout",
+                    "banner",
+                    "default_message_notifications",
+                    "description",
+                    "discovery_splash",
+                    "explicit_content_filter",
+                    "features",
+                    "primary_category_id",
+                    "icon",
+                    "large",
+                    "max_members",
+                    "max_presences",
+                    "max_video_channel_users",
+                    "member_count",
+                    "presence_count",
+                    "template_id",
+                    "mfa_level",
+                    "name",
+                    "owner_id",
+                    "preferred_locale",
+                    "premium_subscription_count",
+                    "premium_tier",
+                    "public_updates_channel_id",
+                    "rules_channel_id",
+                    "region",
+                    "splash",
+                    "system_channel_id",
+                    "system_channel_flags",
+                    "unavailable",
+                    "verification_level",
+                    "welcome_screen",
+                    "widget_channel_id",
+                    "widget_enabled",
+                    "nsfw_level",
+                    "nsfw",
+                    "parent"
+                )
+            SELECT "id",
+                "afk_channel_id",
+                "afk_timeout",
+                "banner",
+                "default_message_notifications",
+                "description",
+                "discovery_splash",
+                "explicit_content_filter",
+                "features",
+                "primary_category_id",
+                "icon",
+                "large",
+                "max_members",
+                "max_presences",
+                "max_video_channel_users",
+                "member_count",
+                "presence_count",
+                "template_id",
+                "mfa_level",
+                "name",
+                "owner_id",
+                "preferred_locale",
+                "premium_subscription_count",
+                "premium_tier",
+                "public_updates_channel_id",
+                "rules_channel_id",
+                "region",
+                "splash",
+                "system_channel_id",
+                "system_channel_flags",
+                "unavailable",
+                "verification_level",
+                "welcome_screen",
+                "widget_channel_id",
+                "widget_enabled",
+                "nsfw_level",
+                "nsfw",
+                "parent"
+            FROM "temporary_guilds"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "temporary_guilds"
+        `);
+        await queryRunner.query(`
+            ALTER TABLE "templates"
+                RENAME TO "temporary_templates"
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "templates" (
+                "id" varchar PRIMARY KEY NOT NULL,
+                "code" varchar NOT NULL,
+                "name" varchar NOT NULL,
+                "description" varchar,
+                "usage_count" integer,
+                "creator_id" varchar,
+                "created_at" datetime NOT NULL,
+                "updated_at" datetime NOT NULL,
+                "source_guild_id" varchar,
+                "serialized_source_guild" text NOT NULL,
+                CONSTRAINT "UQ_be38737bf339baf63b1daeffb55" UNIQUE ("code")
+            )
+        `);
+        await queryRunner.query(`
+            INSERT INTO "templates"(
+                    "id",
+                    "code",
+                    "name",
+                    "description",
+                    "usage_count",
+                    "creator_id",
+                    "created_at",
+                    "updated_at",
+                    "source_guild_id",
+                    "serialized_source_guild"
+                )
+            SELECT "id",
+                "code",
+                "name",
+                "description",
+                "usage_count",
+                "creator_id",
+                "created_at",
+                "updated_at",
+                "source_guild_id",
+                "serialized_source_guild"
+            FROM "temporary_templates"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "temporary_templates"
+        `);
+        await queryRunner.query(`
+            ALTER TABLE "emojis"
+                RENAME TO "temporary_emojis"
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "emojis" (
+                "id" varchar PRIMARY KEY NOT NULL,
+                "animated" boolean NOT NULL,
+                "available" boolean NOT NULL,
+                "guild_id" varchar NOT NULL,
+                "user_id" varchar,
+                "managed" boolean NOT NULL,
+                "name" varchar NOT NULL,
+                "require_colons" boolean NOT NULL,
+                "roles" text NOT NULL,
+                "groups" text
+            )
+        `);
+        await queryRunner.query(`
+            INSERT INTO "emojis"(
+                    "id",
+                    "animated",
+                    "available",
+                    "guild_id",
+                    "user_id",
+                    "managed",
+                    "name",
+                    "require_colons",
+                    "roles",
+                    "groups"
+                )
+            SELECT "id",
+                "animated",
+                "available",
+                "guild_id",
+                "user_id",
+                "managed",
+                "name",
+                "require_colons",
+                "roles",
+                "groups"
+            FROM "temporary_emojis"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "temporary_emojis"
+        `);
+        await queryRunner.query(`
+            ALTER TABLE "channels"
+                RENAME TO "temporary_channels"
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "channels" (
+                "id" varchar PRIMARY KEY NOT NULL,
+                "created_at" datetime NOT NULL,
+                "name" varchar,
+                "icon" text,
+                "type" integer NOT NULL,
+                "last_message_id" varchar,
+                "guild_id" varchar,
+                "parent_id" varchar,
+                "owner_id" varchar,
+                "last_pin_timestamp" integer,
+                "default_auto_archive_duration" integer,
+                "position" integer,
+                "permission_overwrites" text,
+                "video_quality_mode" integer,
+                "bitrate" integer,
+                "user_limit" integer,
+                "nsfw" boolean,
+                "rate_limit_per_user" integer,
+                "topic" varchar,
+                "retention_policy_id" varchar
+            )
+        `);
+        await queryRunner.query(`
+            INSERT INTO "channels"(
+                    "id",
+                    "created_at",
+                    "name",
+                    "icon",
+                    "type",
+                    "last_message_id",
+                    "guild_id",
+                    "parent_id",
+                    "owner_id",
+                    "last_pin_timestamp",
+                    "default_auto_archive_duration",
+                    "position",
+                    "permission_overwrites",
+                    "video_quality_mode",
+                    "bitrate",
+                    "user_limit",
+                    "nsfw",
+                    "rate_limit_per_user",
+                    "topic",
+                    "retention_policy_id"
+                )
+            SELECT "id",
+                "created_at",
+                "name",
+                "icon",
+                "type",
+                "last_message_id",
+                "guild_id",
+                "parent_id",
+                "owner_id",
+                "last_pin_timestamp",
+                "default_auto_archive_duration",
+                "position",
+                "permission_overwrites",
+                "video_quality_mode",
+                "bitrate",
+                "user_limit",
+                "nsfw",
+                "rate_limit_per_user",
+                "topic",
+                "retention_policy_id"
+            FROM "temporary_channels"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "temporary_channels"
+        `);
+        await queryRunner.query(`
+            ALTER TABLE "voice_states"
+                RENAME TO "temporary_voice_states"
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "voice_states" (
+                "id" varchar PRIMARY KEY NOT NULL,
+                "guild_id" varchar,
+                "channel_id" varchar,
+                "user_id" varchar,
+                "session_id" varchar NOT NULL,
+                "token" varchar,
+                "deaf" boolean NOT NULL,
+                "mute" boolean NOT NULL,
+                "self_deaf" boolean NOT NULL,
+                "self_mute" boolean NOT NULL,
+                "self_stream" boolean,
+                "self_video" boolean NOT NULL,
+                "suppress" boolean NOT NULL,
+                "request_to_speak_timestamp" datetime
+            )
+        `);
+        await queryRunner.query(`
+            INSERT INTO "voice_states"(
+                    "id",
+                    "guild_id",
+                    "channel_id",
+                    "user_id",
+                    "session_id",
+                    "token",
+                    "deaf",
+                    "mute",
+                    "self_deaf",
+                    "self_mute",
+                    "self_stream",
+                    "self_video",
+                    "suppress",
+                    "request_to_speak_timestamp"
+                )
+            SELECT "id",
+                "guild_id",
+                "channel_id",
+                "user_id",
+                "session_id",
+                "token",
+                "deaf",
+                "mute",
+                "self_deaf",
+                "self_mute",
+                "self_stream",
+                "self_video",
+                "suppress",
+                "request_to_speak_timestamp"
+            FROM "temporary_voice_states"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "temporary_voice_states"
+        `);
+        await queryRunner.query(`
+            ALTER TABLE "invites"
+                RENAME TO "temporary_invites"
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "invites" (
+                "code" varchar PRIMARY KEY NOT NULL,
+                "temporary" boolean NOT NULL,
+                "uses" integer NOT NULL,
+                "max_uses" integer NOT NULL,
+                "max_age" integer NOT NULL,
+                "created_at" datetime NOT NULL,
+                "expires_at" datetime NOT NULL,
+                "guild_id" varchar,
+                "channel_id" varchar,
+                "inviter_id" varchar,
+                "target_user_id" varchar,
+                "target_user_type" integer,
+                "vanity_url" boolean
+            )
+        `);
+        await queryRunner.query(`
+            INSERT INTO "invites"(
+                    "code",
+                    "temporary",
+                    "uses",
+                    "max_uses",
+                    "max_age",
+                    "created_at",
+                    "expires_at",
+                    "guild_id",
+                    "channel_id",
+                    "inviter_id",
+                    "target_user_id",
+                    "target_user_type",
+                    "vanity_url"
+                )
+            SELECT "code",
+                "temporary",
+                "uses",
+                "max_uses",
+                "max_age",
+                "created_at",
+                "expires_at",
+                "guild_id",
+                "channel_id",
+                "inviter_id",
+                "target_user_id",
+                "target_user_type",
+                "vanity_url"
+            FROM "temporary_invites"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "temporary_invites"
+        `);
+        await queryRunner.query(`
+            DROP INDEX "IDX_0abf8b443321bd3cf7f81ee17a"
+        `);
+        await queryRunner.query(`
+            ALTER TABLE "read_states"
+                RENAME TO "temporary_read_states"
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "read_states" (
+                "id" varchar PRIMARY KEY NOT NULL,
+                "channel_id" varchar NOT NULL,
+                "user_id" varchar NOT NULL,
+                "last_message_id" varchar,
+                "public_ack" varchar,
+                "notifications_cursor" varchar,
+                "last_pin_timestamp" datetime,
+                "mention_count" integer
+            )
+        `);
+        await queryRunner.query(`
+            INSERT INTO "read_states"(
+                    "id",
+                    "channel_id",
+                    "user_id",
+                    "last_message_id",
+                    "public_ack",
+                    "notifications_cursor",
+                    "last_pin_timestamp",
+                    "mention_count"
+                )
+            SELECT "id",
+                "channel_id",
+                "user_id",
+                "last_message_id",
+                "public_ack",
+                "notifications_cursor",
+                "last_pin_timestamp",
+                "mention_count"
+            FROM "temporary_read_states"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "temporary_read_states"
+        `);
+        await queryRunner.query(`
+            CREATE UNIQUE INDEX "IDX_0abf8b443321bd3cf7f81ee17a" ON "read_states" ("channel_id", "user_id")
+        `);
+        await queryRunner.query(`
+            DROP INDEX "IDX_3ed7a60fb7dbe04e1ba9332a8b"
+        `);
+        await queryRunner.query(`
+            DROP INDEX "IDX_05535bc695e9f7ee104616459d"
+        `);
+        await queryRunner.query(`
+            DROP INDEX "IDX_86b9109b155eb70c0a2ca3b4b6"
+        `);
+        await queryRunner.query(`
+            ALTER TABLE "messages"
+                RENAME TO "temporary_messages"
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "messages" (
+                "id" varchar PRIMARY KEY NOT NULL,
+                "channel_id" varchar,
+                "guild_id" varchar,
+                "author_id" varchar,
+                "member_id" varchar,
+                "webhook_id" varchar,
+                "application_id" varchar,
+                "content" varchar,
+                "timestamp" datetime NOT NULL DEFAULT (datetime('now')),
+                "edited_timestamp" datetime,
+                "tts" boolean,
+                "mention_everyone" boolean,
+                "embeds" text NOT NULL,
+                "reactions" text NOT NULL,
+                "nonce" text,
+                "pinned" boolean,
+                "type" integer NOT NULL,
+                "activity" text,
+                "flags" varchar,
+                "message_reference" text,
+                "interaction" text,
+                "components" text,
+                "message_reference_id" varchar
+            )
+        `);
+        await queryRunner.query(`
+            INSERT INTO "messages"(
+                    "id",
+                    "channel_id",
+                    "guild_id",
+                    "author_id",
+                    "member_id",
+                    "webhook_id",
+                    "application_id",
+                    "content",
+                    "timestamp",
+                    "edited_timestamp",
+                    "tts",
+                    "mention_everyone",
+                    "embeds",
+                    "reactions",
+                    "nonce",
+                    "pinned",
+                    "type",
+                    "activity",
+                    "flags",
+                    "message_reference",
+                    "interaction",
+                    "components",
+                    "message_reference_id"
+                )
+            SELECT "id",
+                "channel_id",
+                "guild_id",
+                "author_id",
+                "member_id",
+                "webhook_id",
+                "application_id",
+                "content",
+                "timestamp",
+                "edited_timestamp",
+                "tts",
+                "mention_everyone",
+                "embeds",
+                "reactions",
+                "nonce",
+                "pinned",
+                "type",
+                "activity",
+                "flags",
+                "message_reference",
+                "interaction",
+                "components",
+                "message_reference_id"
+            FROM "temporary_messages"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "temporary_messages"
+        `);
+        await queryRunner.query(`
+            CREATE UNIQUE INDEX "IDX_3ed7a60fb7dbe04e1ba9332a8b" ON "messages" ("channel_id", "id")
+        `);
+        await queryRunner.query(`
+            CREATE INDEX "IDX_05535bc695e9f7ee104616459d" ON "messages" ("author_id")
+        `);
+        await queryRunner.query(`
+            CREATE INDEX "IDX_86b9109b155eb70c0a2ca3b4b6" ON "messages" ("channel_id")
+        `);
+        await queryRunner.query(`
+            ALTER TABLE "attachments"
+                RENAME TO "temporary_attachments"
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "attachments" (
+                "id" varchar PRIMARY KEY NOT NULL,
+                "filename" varchar NOT NULL,
+                "size" integer NOT NULL,
+                "url" varchar NOT NULL,
+                "proxy_url" varchar NOT NULL,
+                "height" integer,
+                "width" integer,
+                "content_type" varchar,
+                "message_id" varchar
+            )
+        `);
+        await queryRunner.query(`
+            INSERT INTO "attachments"(
+                    "id",
+                    "filename",
+                    "size",
+                    "url",
+                    "proxy_url",
+                    "height",
+                    "width",
+                    "content_type",
+                    "message_id"
+                )
+            SELECT "id",
+                "filename",
+                "size",
+                "url",
+                "proxy_url",
+                "height",
+                "width",
+                "content_type",
+                "message_id"
+            FROM "temporary_attachments"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "temporary_attachments"
+        `);
+        await queryRunner.query(`
+            ALTER TABLE "stickers"
+                RENAME TO "temporary_stickers"
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "stickers" (
+                "id" varchar PRIMARY KEY NOT NULL,
+                "name" varchar NOT NULL,
+                "description" varchar,
+                "available" boolean,
+                "tags" varchar,
+                "pack_id" varchar,
+                "guild_id" varchar,
+                "user_id" varchar,
+                "type" integer NOT NULL,
+                "format_type" integer NOT NULL
+            )
+        `);
+        await queryRunner.query(`
+            INSERT INTO "stickers"(
+                    "id",
+                    "name",
+                    "description",
+                    "available",
+                    "tags",
+                    "pack_id",
+                    "guild_id",
+                    "user_id",
+                    "type",
+                    "format_type"
+                )
+            SELECT "id",
+                "name",
+                "description",
+                "available",
+                "tags",
+                "pack_id",
+                "guild_id",
+                "user_id",
+                "type",
+                "format_type"
+            FROM "temporary_stickers"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "temporary_stickers"
+        `);
+        await queryRunner.query(`
+            ALTER TABLE "webhooks"
+                RENAME TO "temporary_webhooks"
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "webhooks" (
+                "id" varchar PRIMARY KEY NOT NULL,
+                "type" integer NOT NULL,
+                "name" varchar,
+                "avatar" varchar,
+                "token" varchar,
+                "guild_id" varchar,
+                "channel_id" varchar,
+                "application_id" varchar,
+                "user_id" varchar,
+                "source_guild_id" varchar
+            )
+        `);
+        await queryRunner.query(`
+            INSERT INTO "webhooks"(
+                    "id",
+                    "type",
+                    "name",
+                    "avatar",
+                    "token",
+                    "guild_id",
+                    "channel_id",
+                    "application_id",
+                    "user_id",
+                    "source_guild_id"
+                )
+            SELECT "id",
+                "type",
+                "name",
+                "avatar",
+                "token",
+                "guild_id",
+                "channel_id",
+                "application_id",
+                "user_id",
+                "source_guild_id"
+            FROM "temporary_webhooks"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "temporary_webhooks"
+        `);
+        await queryRunner.query(`
+            DROP INDEX "IDX_bb2bf9386ac443afbbbf9f12d3"
+        `);
+        await queryRunner.query(`
+            ALTER TABLE "members"
+                RENAME TO "temporary_members"
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "members" (
+                "index" integer PRIMARY KEY AUTOINCREMENT NOT NULL,
+                "id" varchar NOT NULL,
+                "guild_id" varchar NOT NULL,
+                "nick" varchar,
+                "joined_at" datetime NOT NULL,
+                "premium_since" bigint,
+                "deaf" boolean NOT NULL,
+                "mute" boolean NOT NULL,
+                "pending" boolean NOT NULL,
+                "settings" text NOT NULL,
+                "last_message_id" varchar,
+                "joined_by" varchar
+            )
+        `);
+        await queryRunner.query(`
+            INSERT INTO "members"(
+                    "index",
+                    "id",
+                    "guild_id",
+                    "nick",
+                    "joined_at",
+                    "premium_since",
+                    "deaf",
+                    "mute",
+                    "pending",
+                    "settings",
+                    "last_message_id",
+                    "joined_by"
+                )
+            SELECT "index",
+                "id",
+                "guild_id",
+                "nick",
+                "joined_at",
+                "premium_since",
+                "deaf",
+                "mute",
+                "pending",
+                "settings",
+                "last_message_id",
+                "joined_by"
+            FROM "temporary_members"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "temporary_members"
+        `);
+        await queryRunner.query(`
+            CREATE UNIQUE INDEX "IDX_bb2bf9386ac443afbbbf9f12d3" ON "members" ("id", "guild_id")
+        `);
+        await queryRunner.query(`
+            ALTER TABLE "roles"
+                RENAME TO "temporary_roles"
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "roles" (
+                "id" varchar PRIMARY KEY NOT NULL,
+                "guild_id" varchar,
+                "color" integer NOT NULL,
+                "hoist" boolean NOT NULL,
+                "managed" boolean NOT NULL,
+                "mentionable" boolean NOT NULL,
+                "name" varchar NOT NULL,
+                "permissions" varchar NOT NULL,
+                "position" integer NOT NULL,
+                "icon" varchar,
+                "unicode_emoji" varchar,
+                "tags" text
+            )
+        `);
+        await queryRunner.query(`
+            INSERT INTO "roles"(
+                    "id",
+                    "guild_id",
+                    "color",
+                    "hoist",
+                    "managed",
+                    "mentionable",
+                    "name",
+                    "permissions",
+                    "position",
+                    "icon",
+                    "unicode_emoji",
+                    "tags"
+                )
+            SELECT "id",
+                "guild_id",
+                "color",
+                "hoist",
+                "managed",
+                "mentionable",
+                "name",
+                "permissions",
+                "position",
+                "icon",
+                "unicode_emoji",
+                "tags"
+            FROM "temporary_roles"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "temporary_roles"
+        `);
+        await queryRunner.query(`
+            ALTER TABLE "recipients"
+                RENAME TO "temporary_recipients"
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "recipients" (
+                "id" varchar PRIMARY KEY NOT NULL,
+                "channel_id" varchar NOT NULL,
+                "user_id" varchar NOT NULL,
+                "closed" boolean NOT NULL DEFAULT (0)
+            )
+        `);
+        await queryRunner.query(`
+            INSERT INTO "recipients"("id", "channel_id", "user_id", "closed")
+            SELECT "id",
+                "channel_id",
+                "user_id",
+                "closed"
+            FROM "temporary_recipients"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "temporary_recipients"
+        `);
+        await queryRunner.query(`
+            ALTER TABLE "bans"
+                RENAME TO "temporary_bans"
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "bans" (
+                "id" varchar PRIMARY KEY NOT NULL,
+                "user_id" varchar,
+                "guild_id" varchar,
+                "executor_id" varchar,
+                "ip" varchar NOT NULL,
+                "reason" varchar
+            )
+        `);
+        await queryRunner.query(`
+            INSERT INTO "bans"(
+                    "id",
+                    "user_id",
+                    "guild_id",
+                    "executor_id",
+                    "ip",
+                    "reason"
+                )
+            SELECT "id",
+                "user_id",
+                "guild_id",
+                "executor_id",
+                "ip",
+                "reason"
+            FROM "temporary_bans"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "temporary_bans"
+        `);
+        await queryRunner.query(`
+            ALTER TABLE "backup_codes"
+                RENAME TO "temporary_backup_codes"
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "backup_codes" (
+                "id" varchar PRIMARY KEY NOT NULL,
+                "code" varchar NOT NULL,
+                "consumed" boolean NOT NULL,
+                "expired" boolean NOT NULL,
+                "user_id" varchar
+            )
+        `);
+        await queryRunner.query(`
+            INSERT INTO "backup_codes"("id", "code", "consumed", "expired", "user_id")
+            SELECT "id",
+                "code",
+                "consumed",
+                "expired",
+                "user_id"
+            FROM "temporary_backup_codes"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "temporary_backup_codes"
+        `);
+        await queryRunner.query(`
+            ALTER TABLE "connected_accounts"
+                RENAME TO "temporary_connected_accounts"
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "connected_accounts" (
+                "id" varchar PRIMARY KEY NOT NULL,
+                "user_id" varchar,
+                "access_token" varchar NOT NULL,
+                "friend_sync" boolean NOT NULL,
+                "name" varchar NOT NULL,
+                "revoked" boolean NOT NULL,
+                "show_activity" boolean NOT NULL,
+                "type" varchar NOT NULL,
+                "verified" boolean NOT NULL,
+                "visibility" integer NOT NULL
+            )
+        `);
+        await queryRunner.query(`
+            INSERT INTO "connected_accounts"(
+                    "id",
+                    "user_id",
+                    "access_token",
+                    "friend_sync",
+                    "name",
+                    "revoked",
+                    "show_activity",
+                    "type",
+                    "verified",
+                    "visibility"
+                )
+            SELECT "id",
+                "user_id",
+                "access_token",
+                "friend_sync",
+                "name",
+                "revoked",
+                "show_activity",
+                "type",
+                "verified",
+                "visibility"
+            FROM "temporary_connected_accounts"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "temporary_connected_accounts"
+        `);
+        await queryRunner.query(`
+            DROP INDEX "IDX_a0b2ff0a598df0b0d055934a17"
+        `);
+        await queryRunner.query(`
+            ALTER TABLE "relationships"
+                RENAME TO "temporary_relationships"
+        `);
+        await queryRunner.query(`
+            CREATE TABLE "relationships" (
+                "id" varchar PRIMARY KEY NOT NULL,
+                "from_id" varchar NOT NULL,
+                "to_id" varchar NOT NULL,
+                "nickname" varchar,
+                "type" integer NOT NULL
+            )
+        `);
+        await queryRunner.query(`
+            INSERT INTO "relationships"("id", "from_id", "to_id", "nickname", "type")
+            SELECT "id",
+                "from_id",
+                "to_id",
+                "nickname",
+                "type"
+            FROM "temporary_relationships"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "temporary_relationships"
+        `);
+        await queryRunner.query(`
+            CREATE UNIQUE INDEX "IDX_a0b2ff0a598df0b0d055934a17" ON "relationships" ("from_id", "to_id")
+        `);
+        await queryRunner.query(`
+            DROP INDEX "IDX_e22a70819d07659c7a71c112a1"
+        `);
+        await queryRunner.query(`
+            DROP INDEX "IDX_40bb6f23e7cc133292e92829d2"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "message_stickers"
+        `);
+        await queryRunner.query(`
+            DROP INDEX "IDX_bdb8c09e1464cabf62105bf4b9"
+        `);
+        await queryRunner.query(`
+            DROP INDEX "IDX_2a27102ecd1d81b4582a436092"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "message_channel_mentions"
+        `);
+        await queryRunner.query(`
+            DROP INDEX "IDX_29d63eb1a458200851bc37d074"
+        `);
+        await queryRunner.query(`
+            DROP INDEX "IDX_a8242cf535337a490b0feaea0b"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "message_role_mentions"
+        `);
+        await queryRunner.query(`
+            DROP INDEX "IDX_b831eb18ceebd28976239b1e2f"
+        `);
+        await queryRunner.query(`
+            DROP INDEX "IDX_a343387fc560ef378760681c23"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "message_user_mentions"
+        `);
+        await queryRunner.query(`
+            DROP INDEX "IDX_e9080e7a7997a0170026d5139c"
+        `);
+        await queryRunner.query(`
+            DROP INDEX "IDX_5d7ddc8a5f9c167f548625e772"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "member_roles"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "notes"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "client_release"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "sticker_packs"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "sessions"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "rate_limits"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "migrations"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "categories"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "audit_logs"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "applications"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "teams"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "team_members"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "guilds"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "templates"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "emojis"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "channels"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "voice_states"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "invites"
+        `);
+        await queryRunner.query(`
+            DROP INDEX "IDX_0abf8b443321bd3cf7f81ee17a"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "read_states"
+        `);
+        await queryRunner.query(`
+            DROP INDEX "IDX_3ed7a60fb7dbe04e1ba9332a8b"
+        `);
+        await queryRunner.query(`
+            DROP INDEX "IDX_05535bc695e9f7ee104616459d"
+        `);
+        await queryRunner.query(`
+            DROP INDEX "IDX_86b9109b155eb70c0a2ca3b4b6"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "messages"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "attachments"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "stickers"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "webhooks"
+        `);
+        await queryRunner.query(`
+            DROP INDEX "IDX_bb2bf9386ac443afbbbf9f12d3"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "members"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "roles"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "recipients"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "bans"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "backup_codes"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "users"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "connected_accounts"
+        `);
+        await queryRunner.query(`
+            DROP INDEX "IDX_a0b2ff0a598df0b0d055934a17"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "relationships"
+        `);
+        await queryRunner.query(`
+            DROP TABLE "config"
+        `);
+    }
+
+}
diff --git a/util/src/util/Database.ts b/util/src/util/Database.ts
index 31a30561..c4693108 100644
--- a/util/src/util/Database.ts
+++ b/util/src/util/Database.ts
@@ -1,72 +1,100 @@
 import path from "path";
 import "reflect-metadata";
-import { DataSource, createConnection } from "typeorm";
+import { DataSource, createConnection, DataSourceOptions, PrimaryColumn, PrimaryGeneratedColumn } from "typeorm";
 import * as Models from "../entities";
 import { Migration } from "../entities/Migration";
 import { yellow, green, red } from "picocolors";
+import fs from "fs";
+import { exit } from "process";
+import { BaseClass, BaseClassWithoutId } from "../entities";
 
 // UUID extension option is only supported with postgres
 // We want to generate all id's with Snowflakes that's why we have our own BaseEntity class
 
 let promise: Promise<any>;
-let dataSource: DataSource | undefined;
-let dbConnectionString = process.env.DATABASE || path.join(process.cwd(), "database.db");
-let verbose_db = false;
+let dataSource: DataSource;
+
+
 
 export async function initDatabase(): Promise<DataSource> {
 	if (dataSource) return dataSource; // prevent initalizing multiple times
 
+	let dso = getDataSourceOptions();
+	console.log(`[Database] ${yellow(`Connecting to ${dso.type} database...`)}`);
+
+	//promise = dataSource.initialize();
+	//await promise;
+
+	console.log(`[Database] ${green("Connected!")}`);
+
+	return promise;
+}
+
+
+export function closeDatabase() {
+	dataSource?.destroy();
+}
+
+function getDataSourceOptions(): DataSourceOptions {
+	//get connection string and check for migrations
+	const dbConnectionString = process.env.DATABASE || path.join(process.cwd(), "database.db");
 	const type = dbConnectionString.includes("://") ? dbConnectionString.split(":")[0]?.replace("+srv", "") : "sqlite" as any;
 	const isSqlite = type.includes("sqlite");
-	if(process.env.DB_VERBOSE) verbose_db = true;
-
-	console.log(`[Database] ${yellow(`connecting to ${type} db`)}`);
+	const migrationsExist = fs.existsSync(path.join(__dirname, "..", "migrations", type));
+	//read env vars
+	const synchronizeInsteadOfMigrations = "DB_UNSAFE" in process.env;
+	const verboseDb = "DB_VERBOSE" in process.env;
+	
 	if(isSqlite)
 		console.log(`[Database] ${red(`You are running sqlite! Please keep in mind that we recommend setting up a dedicated database!`)}`);
-	if(verbose_db)
-		console.log(`[Database] ${red(`Verbose database logging is enabled, this might impact performance! Unset VERBOSE_DB to disable.`)}`);
-	// @ts-ignore
-	dataSource = new DataSource({
+	if(verboseDb)
+		console.log(`[Database] ${red(`Verbose database logging is enabled, this might impact performance! Unset DB_VERBOSE to disable.`)}`);
+
+	if(synchronizeInsteadOfMigrations){
+		console.log(`[Database] ${red(`Unsafe database upgrades are enabled! We are not responsible for broken databases! Unset DB_UNSAFE to disable.`)}`);
+	}
+	else if(!migrationsExist) {
+		console.log(`[Database] ${red(`Database engine not supported! Set UNSAFE_DB to bypass.`)}`);
+		console.log(`[Database] ${red(`Please mention this to Fosscord developers, and provide this info:`)}`);
+		console.log(`[Database]\n${red(JSON.stringify({
+			db_type: type,
+			migrations_exist: migrationsExist
+		}, null, 4))}`);
+
+		//exit(1);
+	}
+	
+	return {
 		type,
         charset: 'utf8mb4',
 		url: isSqlite ? undefined : dbConnectionString,
 		database: isSqlite ? dbConnectionString : undefined,
 		// @ts-ignore
-		entities: Object.values(Models).filter((x) => x.constructor.name !== "Object" && x.name),
-		synchronize: type !== "mongodb",
-		logging: verbose_db,
+		//entities: Object.values(Models).filter((x) => x.constructor.name !== "Object" && x.constructor.name !== "Array" && x.constructor.name !== "BigInt" && x).map(x=>x.name),
+		entities: Object.values(Models).filter((x) => x.constructor.name == "Function" && shouldIncludeEntity(x.name)),
+		synchronize: synchronizeInsteadOfMigrations,
+		logging: verboseDb,
 		cache: {
 			duration: 1000 * 3, // cache all find queries for 3 seconds
 		},
 		bigNumberStrings: false,
 		supportBigNumbers: true,
 		name: "default",
-		migrations: [path.join(__dirname, "..", "migrations", "*.js")],
-	});
-	promise = dataSource.initialize();
-	await promise;
-	// run migrations, and if it is a new fresh database, set it to the last migration
-	if (dataSource.migrations.length) {
-		if (!(await Migration.findOne({}))) {
-			let i = 0;
-
-			await Migration.insert(
-				dataSource.migrations.map((x) => ({
-					id: i++,
-					name: x.name,
-					timestamp: Date.now(),
-				}))
-			);
+		migrations: synchronizeInsteadOfMigrations ? [] : [path.join(__dirname, "..", "migrations", type, "*.js")],
+		migrationsRun: !synchronizeInsteadOfMigrations,
+		cli: {
+			migrationsDir: `src/migrations/${type}`
 		}
-	}
-	await dataSource.runMigrations();
-	console.log(`[Database] ${green("connected")}`);
-
-	return promise;
+	} as DataSourceOptions;
 }
 
-export { dataSource };
-
-export function closeDatabase() {
-	dataSource?.destroy();
+function shouldIncludeEntity(name: string): boolean {
+	return ![ 
+		BaseClassWithoutId,
+		PrimaryColumn,
+		BaseClass,
+		PrimaryGeneratedColumn
+	].map(x=>x.name).includes(name);
 }
+
+export default dataSource = new DataSource(getDataSourceOptions());
\ No newline at end of file
diff --git a/util/src/util/Database.ts.torm2 b/util/src/util/Database.ts.torm2
deleted file mode 100644
index f0540bdf..00000000
--- a/util/src/util/Database.ts.torm2
+++ /dev/null
@@ -1,72 +0,0 @@
-import path from "path";
-import "reflect-metadata";
-import { Connection, createConnection } from "typeorm";
-import * as Models from "../entities";
-import { Migration } from "../entities/Migration";
-import { yellow, green, red } from "picocolors";
-
-// UUID extension option is only supported with postgres
-// We want to generate all id's with Snowflakes that's why we have our own BaseEntity class
-
-let promise: Promise<any>;
-let dbConnection: Connection | undefined;
-let dbConnectionString = process.env.DATABASE || path.join(process.cwd(), "database.db");
-
-export function initDatabase(): Promise<Connection> {
-	if (promise) return promise; // prevent initalizing multiple times
-
-	const type = dbConnectionString.includes("://") ? dbConnectionString.split(":")[0]?.replace("+srv", "") : "sqlite";
-	const isSqlite = type.includes("sqlite");
-
-	console.log(`[Database] ${yellow(`connecting to ${type} db`)}`);
-	if(isSqlite) {
-		console.log(`[Database] ${red(`You are running sqlite! Please keep in mind that we recommend setting up a dedicated database!`)}`);
-	}
-	// @ts-ignore
-	promise = createConnection({
-		type,
-        charset: 'utf8mb4',
-		url: isSqlite ? undefined : dbConnectionString,
-		database: isSqlite ? dbConnectionString : undefined,
-		// @ts-ignore
-		entities: Object.values(Models).filter((x) => x.constructor.name !== "Object" && x.name),
-		synchronize: type !== "mongodb",
-		logging: false,
-		cache: {
-			duration: 1000 * 3, // cache all find queries for 3 seconds
-		},
-		bigNumberStrings: false,
-		supportBigNumbers: true,
-		name: "default",
-		migrations: [path.join(__dirname, "..", "migrations", "*.js")],
-	});
-
-	promise.then(async (connection: Connection) => {
-		dbConnection = connection;
-
-		// run migrations, and if it is a new fresh database, set it to the last migration
-		if (connection.migrations.length) {
-			if (!(await Migration.findOne({}))) {
-				let i = 0;
-
-				await Migration.insert(
-					connection.migrations.map((x) => ({
-						id: i++,
-						name: x.name,
-						timestamp: Date.now(),
-					}))
-				);
-			}
-		}
-		await connection.runMigrations();
-		console.log(`[Database] ${green("connected")}`);
-	});
-
-	return promise;
-}
-
-export { dbConnection };
-
-export function closeDatabase() {
-	dbConnection?.close();
-}
diff --git a/util/src/util/MFA.ts b/util/src/util/MFA.ts
new file mode 100644
index 00000000..2e47b2fc
--- /dev/null
+++ b/util/src/util/MFA.ts
@@ -0,0 +1,17 @@
+import crypto from "crypto";
+import { BackupCode } from "../entities/BackupCodes";
+
+export function generateMfaBackupCodes(user_id: string) {
+	let backup_codes: BackupCode[] = [];
+	for (let i = 0; i < 10; i++) {
+		const code = BackupCode.create({
+			user: { id: user_id },
+			code: crypto.randomBytes(4).toString("hex"),	// 8 characters
+			consumed: false,
+			expired: false,
+		});
+		backup_codes.push(code);
+	}
+
+	return backup_codes;
+}
\ No newline at end of file