From 45db65cec8066e392adbf17c88112c6a23cdf544 Mon Sep 17 00:00:00 2001 From: lborv Date: Thu, 9 Oct 2025 19:57:17 +0300 Subject: [PATCH] feat: create RedisNode migration and update Project and RedisNode entities to use JoinTable for many-to-many relationship --- src/migrations/1760028994511-redisNode.ts | 55 +++++++++++++++++++ src/project/entities/project.entity.ts | 3 +- .../entities/redis.node.entity.ts | 4 +- 3 files changed, 59 insertions(+), 3 deletions(-) create mode 100644 src/migrations/1760028994511-redisNode.ts diff --git a/src/migrations/1760028994511-redisNode.ts b/src/migrations/1760028994511-redisNode.ts new file mode 100644 index 0000000..7a40863 --- /dev/null +++ b/src/migrations/1760028994511-redisNode.ts @@ -0,0 +1,55 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class RedisNode1760028994511 implements MigrationInterface { + name = "RedisNode1760028994511"; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `CREATE TABLE \`project_redis_nodes_redis_node\` (\`projectId\` varchar(36) NOT NULL, \`redisNodeId\` varchar(36) NOT NULL, INDEX \`IDX_1b5acdd3dc2843538be4a7589d\` (\`projectId\`), INDEX \`IDX_71d51ca25e0ff1c17926fc1676\` (\`redisNodeId\`), PRIMARY KEY (\`projectId\`, \`redisNodeId\`)) ENGINE=InnoDB` + ); + await queryRunner.query( + `CREATE TABLE \`redis_node_projects_project\` (\`redisNodeId\` varchar(36) NOT NULL, \`projectId\` varchar(36) NOT NULL, INDEX \`IDX_ebe30bc9d29b5ce861f487dc95\` (\`redisNodeId\`), INDEX \`IDX_34313ecc91fa7073bd82a86011\` (\`projectId\`), PRIMARY KEY (\`redisNodeId\`, \`projectId\`)) ENGINE=InnoDB` + ); + await queryRunner.query( + `ALTER TABLE \`project_redis_nodes_redis_node\` ADD CONSTRAINT \`FK_1b5acdd3dc2843538be4a7589d4\` FOREIGN KEY (\`projectId\`) REFERENCES \`project\`(\`id\`) ON DELETE CASCADE ON UPDATE CASCADE` + ); + await queryRunner.query( + `ALTER TABLE \`project_redis_nodes_redis_node\` ADD CONSTRAINT \`FK_71d51ca25e0ff1c17926fc16762\` FOREIGN KEY (\`redisNodeId\`) REFERENCES \`redisNode\`(\`id\`) ON DELETE NO ACTION ON UPDATE NO ACTION` + ); + await queryRunner.query( + `ALTER TABLE \`redis_node_projects_project\` ADD CONSTRAINT \`FK_ebe30bc9d29b5ce861f487dc950\` FOREIGN KEY (\`redisNodeId\`) REFERENCES \`redisNode\`(\`id\`) ON DELETE CASCADE ON UPDATE CASCADE` + ); + await queryRunner.query( + `ALTER TABLE \`redis_node_projects_project\` ADD CONSTRAINT \`FK_34313ecc91fa7073bd82a86011d\` FOREIGN KEY (\`projectId\`) REFERENCES \`project\`(\`id\`) ON DELETE NO ACTION ON UPDATE NO ACTION` + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE \`redis_node_projects_project\` DROP FOREIGN KEY \`FK_34313ecc91fa7073bd82a86011d\`` + ); + await queryRunner.query( + `ALTER TABLE \`redis_node_projects_project\` DROP FOREIGN KEY \`FK_ebe30bc9d29b5ce861f487dc950\`` + ); + await queryRunner.query( + `ALTER TABLE \`project_redis_nodes_redis_node\` DROP FOREIGN KEY \`FK_71d51ca25e0ff1c17926fc16762\`` + ); + await queryRunner.query( + `ALTER TABLE \`project_redis_nodes_redis_node\` DROP FOREIGN KEY \`FK_1b5acdd3dc2843538be4a7589d4\`` + ); + await queryRunner.query( + `DROP INDEX \`IDX_34313ecc91fa7073bd82a86011\` ON \`redis_node_projects_project\`` + ); + await queryRunner.query( + `DROP INDEX \`IDX_ebe30bc9d29b5ce861f487dc95\` ON \`redis_node_projects_project\`` + ); + await queryRunner.query(`DROP TABLE \`redis_node_projects_project\``); + await queryRunner.query( + `DROP INDEX \`IDX_71d51ca25e0ff1c17926fc1676\` ON \`project_redis_nodes_redis_node\`` + ); + await queryRunner.query( + `DROP INDEX \`IDX_1b5acdd3dc2843538be4a7589d\` ON \`project_redis_nodes_redis_node\`` + ); + await queryRunner.query(`DROP TABLE \`project_redis_nodes_redis_node\``); + } +} diff --git a/src/project/entities/project.entity.ts b/src/project/entities/project.entity.ts index 2b2893c..2d02b1c 100644 --- a/src/project/entities/project.entity.ts +++ b/src/project/entities/project.entity.ts @@ -4,6 +4,7 @@ import { Column, Entity, JoinColumn, + JoinTable, ManyToMany, OneToMany, OneToOne, @@ -35,6 +36,6 @@ export class Project { functions: FunctionEntity[]; @ManyToMany(() => RedisNode, (redisNode) => redisNode.projects) - @JoinColumn() + @JoinTable() redisNodes: RedisNode[]; } diff --git a/src/redisManager/entities/redis.node.entity.ts b/src/redisManager/entities/redis.node.entity.ts index b8cf757..9beb3dc 100644 --- a/src/redisManager/entities/redis.node.entity.ts +++ b/src/redisManager/entities/redis.node.entity.ts @@ -2,7 +2,7 @@ import { Project } from "../../project/entities/project.entity"; import { Column, Entity, - JoinColumn, + JoinTable, ManyToMany, PrimaryGeneratedColumn, } from "typeorm"; @@ -25,6 +25,6 @@ export class RedisNode { password: string | null; @ManyToMany(() => Project, (project) => project.redisNodes) - @JoinColumn() + @JoinTable() projects: Project[]; }