summary refs log tree commit diff
path: root/util/src
diff options
context:
space:
mode:
authorFlam3rboy <34555296+Flam3rboy@users.noreply.github.com>2021-10-05 17:00:58 +0200
committerFlam3rboy <34555296+Flam3rboy@users.noreply.github.com>2021-10-05 17:00:58 +0200
commit9fa6c3a3dbed16ba655646f917ba6761b1269a0d (patch)
tree9864c463c839700e0912d0bc94a42baf97a2f2d1 /util/src
parent:bug: fix guild create with client template (diff)
downloadserver-9fa6c3a3dbed16ba655646f917ba6761b1269a0d.tar.xz
:art: improve migration script
Diffstat (limited to 'util/src')
-rw-r--r--util/src/migrations/migrate_db_engine.ts124
1 files changed, 103 insertions, 21 deletions
diff --git a/util/src/migrations/migrate_db_engine.ts b/util/src/migrations/migrate_db_engine.ts
index b2e71f94..33024a8d 100644
--- a/util/src/migrations/migrate_db_engine.ts
+++ b/util/src/migrations/migrate_db_engine.ts
@@ -1,16 +1,61 @@
 import { config } from "dotenv";
 config();
-import * as Models from "../entities";
-import { User } from "../entities/User";
-import { createConnection, Connection } from "typeorm";
+import { BaseEntity, createConnection, EntityTarget } from "typeorm";
 import { initDatabase } from "../util/Database";
 import "missing-native-js-functions";
+import {
+	Application,
+	Attachment,
+	Ban,
+	Channel,
+	ConnectedAccount,
+	defaultSettings,
+	Emoji,
+	Guild,
+	Invite,
+	Member,
+	Message,
+	RateLimit,
+	ReadState,
+	Recipient,
+	Relationship,
+	Role,
+	Sticker,
+	Team,
+	TeamMember,
+	Template,
+	User,
+	VoiceState,
+	Webhook,
+} from "..";
 
 async function main() {
 	if (!process.env.FROM) throw new Error("FROM database env connection string not set");
 
-	// @ts-ignore
-	const entities = Object.values(Models).filter((x) => x.constructor.name !== "Object" && x.name);
+	// manually arrange them because of foreign key
+	const entities = [
+		User,
+		Guild,
+		Channel,
+		Invite,
+		Role,
+		Ban,
+		Application,
+		Emoji,
+		ConnectedAccount,
+		Member,
+		ReadState,
+		Recipient,
+		Relationship,
+		Sticker,
+		Team,
+		TeamMember,
+		Template,
+		VoiceState,
+		Webhook,
+		Message,
+		Attachment,
+	];
 
 	const newDB = await initDatabase();
 
@@ -21,27 +66,64 @@ async function main() {
 		entities,
 		name: "old",
 	});
+	let i = 0;
+
+	try {
+		for (const e of entities) {
+			const entity = e as EntityTarget<any>;
+			const entries = await oldDB.manager.find(entity);
+			//@ts-ignore
+			console.log("migrated " + entries.length + " " + entity.name);
+
+			for (const entry of entries) {
+				console.log(i++);
 
-	await Promise.all(
-		entities.map(async (x) => {
-			const data = await oldDB.manager.find(User);
-
-			await Promise.all(
-				data.map(async (x) => {
-					try {
-						await newDB.manager.insert(User, x);
-					} catch (error) {
-						if (!x.id) throw new Error("object doesn't have a unique id: " + x);
-						await newDB.manager.update(User, { id: x.id }, x);
+				if (entry instanceof User) {
+					console.log("instance of User");
+					if (entry.bio == null) entry.bio = "";
+					if (entry.rights == null) entry.rights = "0";
+					if (entry.disabled == null) entry.disabled = false;
+					if (entry.fingerprints == null) entry.fingerprints = [];
+					if (entry.deleted == null) entry.deleted = false;
+					if (entry.data == null) {
+						entry.data = {
+							valid_tokens_since: new Date(0),
+							hash: undefined,
+						};
+						// @ts-ignore
+						if (entry.user_data) {
+							// TODO: relationships
+							entry.data = {
+								// @ts-ignore
+								valid_tokens_since: entry.user_data.valid_tokens_since, // @ts-ignore
+								hash: entry.user_data.hash,
+							};
+						}
 					}
-				})
-			);
+					// @ts-ignore
+					if (entry.settings == null) {
+						entry.settings = defaultSettings;
+						// @ts-ignore
+						if (entry.user_data) entry.settings = entry.user_settings;
+					}
+				}
+
+				// try {
+				await newDB.manager.insert(entity, entry);
+				// } catch (error) {
+				// 	if (!entry.id) throw new Error("object doesn't have a unique id: " + entry);
+				// 	await newDB.manager.update(entity, { id: entry.id }, entry);
+				// }
+			}
 			// @ts-ignore
-			console.log("migrated all " + x.name);
-		})
-	);
+			console.log("migrated all " + entity.name);
+		}
+	} catch (error) {
+		console.error((error as any).message);
+	}
 
 	console.log("SUCCESS migrated all data");
+	await newDB.close();
 }
 
 main().caught();