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 {
diff --git a/util/src/entities/Channel.ts b/util/src/entities/Channel.ts
index b1f75f33..74611eea 100644
--- a/util/src/entities/Channel.ts
+++ b/util/src/entities/Channel.ts
@@ -1,14 +1,4 @@
-import {
- Column,
- Entity,
- FindConditions,
- JoinColumn,
- ManyToOne,
- ObjectID,
- OneToMany,
- RelationId,
- RemoveOptions,
-} from "typeorm";
+import { Column, Entity, JoinColumn, ManyToOne, OneToMany, RelationId } from "typeorm";
import { BaseClass } from "./BaseClass";
import { Guild } from "./Guild";
import { PublicUserProjection, User } from "./User";
diff --git a/util/src/util/Database.ts b/util/src/util/Database.ts
index d3844cd9..c22d8abd 100644
--- a/util/src/util/Database.ts
+++ b/util/src/util/Database.ts
@@ -21,7 +21,7 @@ export function initDatabase() {
//
entities: Object.values(Models).filter((x) => x.constructor.name !== "Object"),
synchronize: true,
- logging: false,
+ logging: true,
cache: {
duration: 1000 * 3, // cache all find queries for 3 seconds
},
|