summary refs log tree commit diff
path: root/util/src/entities/BaseClass.ts
diff options
context:
space:
mode:
authorFlam3rboy <34555296+Flam3rboy@users.noreply.github.com>2021-09-20 17:11:22 +0200
committerFlam3rboy <34555296+Flam3rboy@users.noreply.github.com>2021-09-20 17:11:22 +0200
commitce09e01c2154072dfb52fceaca33a6106d2e1220 (patch)
treefb549a5de7f2dd0e5ae2a44e63a658f0123ce026 /util/src/entities/BaseClass.ts
parentMerge branch 'master' into auto-delete-relations (diff)
downloadserver-ce09e01c2154072dfb52fceaca33a6106d2e1220.tar.xz
:construction: auto delete relations
Diffstat (limited to 'util/src/entities/BaseClass.ts')
-rw-r--r--util/src/entities/BaseClass.ts49
1 files changed, 48 insertions, 1 deletions
diff --git a/util/src/entities/BaseClass.ts b/util/src/entities/BaseClass.ts
index 9b2ce058..2a621f40 100644
--- a/util/src/entities/BaseClass.ts
+++ b/util/src/entities/BaseClass.ts
@@ -1,5 +1,14 @@
 import "reflect-metadata";
-import { BaseEntity, BeforeInsert, BeforeUpdate, EntityMetadata, FindConditions, PrimaryColumn } from "typeorm";
+import {
+	BaseEntity,
+	BeforeInsert,
+	BeforeUpdate,
+	EntityMetadata,
+	FindConditions,
+	getConnection,
+	PrimaryColumn,
+	RemoveOptions,
+} from "typeorm";
 import { Snowflake } from "../util/Snowflake";
 import "missing-native-js-functions";
 
@@ -69,6 +78,44 @@ export class BaseClassWithoutId extends BaseEntity {
 		const repository = this.getRepository();
 		return repository.decrement(conditions, propertyPath, value);
 	}
+
+	static async delete<T>(criteria: FindConditions<T>, options?: RemoveOptions) {
+		if (!criteria) throw new Error("You need to specify delete criteria");
+
+		const repository = this.getRepository();
+		const promises = repository.metadata.relations.map((x) => {
+			if (x.orphanedRowAction !== "delete") return;
+			if (typeof x.type === "string") return;
+
+			const foreignKey =
+				x.foreignKeys.find((key) => key.entityMetadata === repository.metadata) ||
+				x.inverseRelation?.foreignKeys[0]; // find foreign key for this entity
+			if (!foreignKey) {
+				throw new Error(
+					`Foreign key not found for entity ${repository.metadata.name} in relation ${x.propertyName}`
+				);
+			}
+			console.log(foreignKey);
+			const id = (criteria as any)[foreignKey.referencedColumnNames[0]];
+			if (!id) throw new Error("id missing in criteria options");
+
+			if (x.relationType === "many-to-many" || x.relationType === "one-to-many") {
+				return getConnection()
+					.createQueryBuilder()
+					.relation(this, x.propertyName)
+					.of(id)
+					.remove({ [foreignKey.columnNames[0]]: id });
+			} else if (x.relationType === "one-to-one" || x.relationType === "many-to-one") {
+				return getConnection()
+					.createQueryBuilder()
+					.from(x.inverseEntityMetadata, "user")
+					.of(id)
+					.remove({ [foreignKey.name]: id });
+			}
+		});
+		await Promise.all(promises);
+		return super.delete(criteria, options);
+	}
 }
 
 export class BaseClass extends BaseClassWithoutId {