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
|