Skip to content

Commit f6ba1ec

Browse files
authored
Merge pull request #36 from boostcampwm-2024/feature-be-#32
[#32] Api-server Admin connection 제거 & db-manager DB 생성 삭제 로직 구현
2 parents be1d8e9 + 4e38183 commit f6ba1ec

36 files changed

+533
-404
lines changed

BE/src/config/query-database/admin-db-manager.service.ts

Lines changed: 0 additions & 71 deletions
This file was deleted.

BE/src/config/query-database/query-db.moudle.ts

Lines changed: 0 additions & 9 deletions
This file was deleted.

BE/src/config/query-database/user-db-manager.service.ts

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,9 @@
11
import { Injectable } from '@nestjs/common';
2-
import { QueryResult } from 'mysql2/promise';
3-
import { ConfigService } from '@nestjs/config';
2+
import { Connection, QueryResult } from 'mysql2/promise';
43

54
@Injectable()
65
export class UserDBManager {
7-
constructor(private readonly configService: ConfigService) {}
8-
async run(req: any, query: string): Promise<QueryResult> {
9-
const connection = await req.dbConnection;
6+
async run(connection: Connection, query: string): Promise<QueryResult> {
107
const [result] = await connection.query(query);
118
return result;
129
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import { Module } from '@nestjs/common';
2+
import { UserDBManager } from './user-db-manager.service';
3+
4+
@Module({
5+
providers: [UserDBManager],
6+
exports: [UserDBManager],
7+
})
8+
export class UserDBModule {}

BE/src/config/redis/redis.module.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import { Module } from '@nestjs/common';
22
import { RedisService } from './redis.service';
3-
import { QueryDBModule } from '../query-database/query-db.moudle';
3+
import { UserDBModule } from '../query-database/user-db.moudle';
44

55
@Module({
6-
imports: [QueryDBModule],
6+
imports: [UserDBModule],
77
providers: [RedisService],
88
exports: [RedisService],
99
})

BE/src/config/redis/redis.service.ts

Lines changed: 1 addition & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,17 @@
11
import Redis from 'ioredis';
22
import { Injectable } from '@nestjs/common';
3-
import { AdminDBManager } from '../query-database/admin-db-manager.service';
43
import { ConfigService } from '@nestjs/config';
54

65
@Injectable()
76
export class RedisService {
87
private sessionConnection: Redis;
9-
private eventConnection: Redis;
108
private activeUserConnection: Redis;
119

1210
private readonly SESSION_TTL = 60 * 30;
1311
private readonly ACTIVE_USER_TTL = 60 * 5;
1412

15-
constructor(
16-
private readonly adminDBManager: AdminDBManager,
17-
private readonly configService: ConfigService,
18-
) {
13+
constructor(private readonly configService: ConfigService) {
1914
this.setSessionConnection();
20-
this.setEventConnection();
2115
this.setActiveUserConnection();
2216
}
2317

@@ -41,17 +35,6 @@ export class RedisService {
4135
});
4236
}
4337

44-
private setEventConnection() {
45-
this.eventConnection = new Redis({
46-
host: this.configService.get<string>('REDIS_HOST'),
47-
port: this.configService.get<number>('REDIS_PORT'),
48-
});
49-
50-
this.eventConnection.on('ready', () => {
51-
this.subscribeToExpiredEvents();
52-
});
53-
}
54-
5538
public async getSession(key: string) {
5639
if (!key) {
5740
return null;
@@ -67,7 +50,6 @@ export class RedisService {
6750
const session = await this.existSession(key);
6851
if (!session) {
6952
await this.sessionConnection.hset(key, 'rowCount', 0);
70-
await this.adminDBManager.initUserDatabase(key);
7153
}
7254
await this.sessionConnection.expire(key, this.SESSION_TTL);
7355
}
@@ -76,14 +58,6 @@ export class RedisService {
7658
await this.sessionConnection.del(key);
7759
}
7860

79-
private subscribeToExpiredEvents() {
80-
this.eventConnection.subscribe('__keyevent@0__:expired');
81-
82-
this.eventConnection.on('message', (event, session) => {
83-
this.adminDBManager.removeDatabaseInfo(session);
84-
});
85-
}
86-
8761
public async getRowCount(key: string) {
8862
return this.sessionConnection.hget(key, 'rowCount');
8963
}

BE/src/query/query.controller.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import { ResponseDto } from '../common/response/response.dto';
1313
import { ApiExtraModels, ApiTags } from '@nestjs/swagger';
1414
import { ResQueryDto } from './dto/res-query.dto';
1515
import { ExecuteQuerySwagger } from '../config/swagger/query-swagger.decorator';
16-
import { Request } from 'express';
1716
import { Serialize } from '../interceptors/serialize.interceptor';
1817
import { ShellGuard } from '../guard/shell.guard';
1918
import { UserDBConnectionInterceptor } from '../interceptors/user-db-connection.interceptor';
@@ -30,10 +29,15 @@ export class QueryController {
3029
@Post('/:shellId/execute')
3130
@UseGuards(ShellGuard)
3231
async executeQuery(
33-
@Req() req: Request,
32+
@Req() req: any,
3433
@Param('shellId') shellId: number,
3534
@Body() queryDto: QueryDto,
3635
) {
37-
return await this.queryService.execute(req, shellId, queryDto);
36+
return await this.queryService.execute(
37+
req.dbConnection,
38+
req.sessionID,
39+
shellId,
40+
queryDto,
41+
);
3842
}
3943
}

BE/src/query/query.module.ts

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,20 @@ import { QueryService } from './query.service';
33
import { QueryController } from './query.controller';
44
import { TypeOrmModule } from '@nestjs/typeorm';
55
import { Shell } from '../shell/shell.entity';
6-
import { ShellService } from '../shell/shell.service';
7-
import { UserDBManager } from '../config/query-database/user-db-manager.service';
86
import { UsageModule } from '../usage/usage.module';
97
import { RedisModule } from '../config/redis/redis.module';
8+
import { UserDBModule } from '../config/query-database/user-db.moudle';
9+
import { ShellModule } from '../shell/shell.module';
1010

1111
@Module({
12-
imports: [TypeOrmModule.forFeature([Shell]), UsageModule, RedisModule],
12+
imports: [
13+
TypeOrmModule.forFeature([Shell]),
14+
UsageModule,
15+
RedisModule,
16+
UserDBModule,
17+
ShellModule,
18+
],
1319
controllers: [QueryController],
14-
providers: [QueryService, ShellService, UserDBManager],
20+
providers: [QueryService],
1521
})
1622
export class QueryModule {}

BE/src/query/query.service.ts

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { Injectable } from '@nestjs/common';
22
import { QueryDto } from './dto/query.dto';
33
import { QueryType } from '../common/enums/query-type.enum';
44
import { ShellService } from '../shell/shell.service';
5-
import { ResultSetHeader, RowDataPacket } from 'mysql2/promise';
5+
import { Connection, ResultSetHeader, RowDataPacket } from 'mysql2/promise';
66
import { Shell } from '../shell/shell.entity';
77
import { UserDBManager } from '../config/query-database/user-db-manager.service';
88
import { UsageService } from 'src/usage/usage.service';
@@ -17,12 +17,17 @@ export class QueryService {
1717
private readonly redisService: RedisService,
1818
) {}
1919

20-
async execute(req: any, shellId: number, queryDto: QueryDto) {
21-
this.redisService.setActiveUser(req.sessionID);
20+
async execute(
21+
connection: Connection,
22+
sessionId: string,
23+
shellId: number,
24+
queryDto: QueryDto,
25+
) {
26+
this.redisService.setActiveUser(sessionId);
2227
await this.shellService.findShellOrThrow(shellId);
2328

2429
const baseUpdateData = {
25-
sessionId: req.sessionID,
30+
sessionId: sessionId,
2631
query: queryDto.query,
2732
queryType: this.detectQueryType(queryDto.query),
2833
};
@@ -35,7 +40,11 @@ export class QueryService {
3540
text: '지원하지 않는 쿼리입니다.',
3641
});
3742
}
38-
updateData = await this.processQuery(req, baseUpdateData, queryDto.query);
43+
updateData = await this.processQuery(
44+
connection,
45+
baseUpdateData,
46+
queryDto.query,
47+
);
3948
} catch (e) {
4049
const text = `ERROR ${e.errno || ''} (${e.sqlState || ''}): ${e.sqlMessage || ''}`;
4150

@@ -47,21 +56,19 @@ export class QueryService {
4756
};
4857
return await this.shellService.replace(shellId, updateData);
4958
}
50-
await this.usageService.updateRowCount(req);
59+
await this.usageService.updateRowCount(connection, sessionId);
5160
return await this.shellService.replace(shellId, updateData);
5261
}
5362

5463
private async processQuery(
55-
req: any,
64+
connection: Connection,
5665
baseUpdateData: any,
5766
query: string,
5867
): Promise<Partial<Shell>> {
5968
const isResultTable = this.existResultTable(baseUpdateData.queryType);
6069

61-
const rows = await this.userDBManager.run(req, query);
62-
const runTime = await this.measureQueryRunTime(req);
63-
64-
// Update usage
70+
const rows = await this.userDBManager.run(connection, query);
71+
const runTime = await this.measureQueryRunTime(connection);
6572

6673
let text: string;
6774
let resultTable: RowDataPacket[];
@@ -100,11 +107,12 @@ export class QueryService {
100107
return validTypes.includes(type);
101108
}
102109

103-
async measureQueryRunTime(req: any): Promise<string> {
110+
async measureQueryRunTime(connection: Connection): Promise<string> {
104111
try {
112+
const query = `SHOW PROFILES`;
105113
const rows = (await this.userDBManager.run(
106-
req,
107-
'show profiles;',
114+
connection,
115+
query,
108116
)) as RowDataPacket[];
109117
let lastQueryRunTime = rows[rows.length - 1]?.Duration;
110118
lastQueryRunTime = Math.round(lastQueryRunTime * 1000) / 1000 || 0;

BE/src/record/file.service.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import {
1111
import { UserDBManager } from '../config/query-database/user-db-manager.service';
1212
import { RandomColumnModel } from './random-column.entity';
1313
import * as path from 'node:path';
14-
import { ResultSetHeader } from 'mysql2/promise';
14+
import { Connection, ResultSetHeader } from 'mysql2/promise';
1515
import * as crypto from 'node:crypto';
1616
@Injectable()
1717
export class FileService implements OnModuleInit {
@@ -55,7 +55,7 @@ export class FileService implements OnModuleInit {
5555
}
5656

5757
async loadCsvToDB(
58-
req: any,
58+
connection: Connection,
5959
csvFilePath: string,
6060
tableName: string,
6161
columnNames: string[],
@@ -71,7 +71,7 @@ export class FileService implements OnModuleInit {
7171

7272
try {
7373
queryResult = (await this.userDBManager.run(
74-
req,
74+
connection,
7575
query,
7676
)) as ResultSetHeader;
7777
return queryResult.affectedRows;

0 commit comments

Comments
 (0)