diff --git a/src/databaseManager/database/database.manager.controller.ts b/src/databaseManager/database/database.manager.controller.ts index c2b685f..e81141d 100644 --- a/src/databaseManager/database/database.manager.controller.ts +++ b/src/databaseManager/database/database.manager.controller.ts @@ -14,11 +14,8 @@ export class DatabaseManagerController { ) {} @Post("create") - createDatabase(@Body() body: { projectId: string; databaseNodeId: string }) { - return this.databaseManagerService.createDatabase( - body.databaseNodeId, - body.projectId - ); + createDatabase(@Body() body: { projectId: string }) { + return this.databaseManagerService.createDatabase(body.projectId); } @Post("node/create") diff --git a/src/databaseManager/database/database.manager.service.ts b/src/databaseManager/database/database.manager.service.ts index d5509d7..62466ce 100644 --- a/src/databaseManager/database/database.manager.service.ts +++ b/src/databaseManager/database/database.manager.service.ts @@ -84,11 +84,8 @@ export class DatabaseManagerService extends DatabaseEncryptionService { }; } - async createDatabase( - databaseNodeId: string, - projectId: string - ): Promise { - const node = await this.databaseNodeService.findById(databaseNodeId); + async createDatabase(projectId: string): Promise { + const node = await this.databaseNodeService.findOptimalNode(); if (!node) { throw new Error("Database node not found"); @@ -114,7 +111,7 @@ export class DatabaseManagerService extends DatabaseEncryptionService { q_username, password: this.decryptPassword(password), }, - databaseNodeId + node.id ); const database = this.databaseRepository.create({ diff --git a/src/databaseManager/databaseNode/database.node.service.ts b/src/databaseManager/databaseNode/database.node.service.ts index 087bb05..c0ec4e9 100644 --- a/src/databaseManager/databaseNode/database.node.service.ts +++ b/src/databaseManager/databaseNode/database.node.service.ts @@ -18,6 +18,22 @@ export class DatabaseNodeService extends DatabaseEncryptionService { return this.databaseNodeRepository.findOne({ where: { id } }); } + async findOptimalNode(): Promise { + const nodes = await this.databaseNodeRepository.find({ + relations: ["databases"], + }); + + if (nodes.length === 0) { + return null; + } + + return nodes.reduce((optimalNode, currentNode) => { + const currentCount = currentNode.databases?.length || 0; + const optimalCount = optimalNode.databases?.length || 0; + return currentCount < optimalCount ? currentNode : optimalNode; + }); + } + async initDatabase( data: { database: string;