Skip to content

Commit 890594c

Browse files
committed
refactor: api-server admin db manager 삭제에 따른 리팩토링
1 parent a5f1cbd commit 890594c

File tree

15 files changed

+116
-214
lines changed

15 files changed

+116
-214
lines changed

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

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

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

Lines changed: 0 additions & 9 deletions
This file was deleted.
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.service.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ export class QueryService {
5656
};
5757
return await this.shellService.replace(shellId, updateData);
5858
}
59-
await this.usageService.updateRowCount(sessionId);
59+
await this.usageService.updateRowCount(connection, sessionId);
6060
return await this.shellService.replace(shellId, updateData);
6161
}
6262

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;

BE/src/record/record.controller.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,10 @@ export class RecordController {
2323
@Req() req: any,
2424
@Body() randomRecordInsertDto: CreateRandomRecordDto,
2525
) {
26-
await this.recordService.validateDto(
27-
randomRecordInsertDto,
26+
return this.recordService.insertRandomRecord(
2827
req.dbConnection,
28+
req.sessionID,
29+
randomRecordInsertDto,
2930
);
30-
return this.recordService.insertRandomRecord(req, randomRecordInsertDto);
3131
}
3232
}

BE/src/record/record.module.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@ import { Module } from '@nestjs/common';
22
import { RecordController } from './record.controller';
33
import { RecordService } from './record.service';
44
import { RedisModule } from '../config/redis/redis.module';
5-
import { QueryDBModule } from '../config/query-database/query-db.moudle';
5+
import { UserDBModule } from '../config/query-database/user-db.moudle';
66
import { UsageModule } from '../usage/usage.module';
77
import { TableModule } from 'src/table/table.module';
88
import { FileService } from './file.service';
99

1010
@Module({
11-
imports: [RedisModule, QueryDBModule, UsageModule, TableModule],
11+
imports: [RedisModule, UserDBModule, UsageModule, TableModule],
1212
controllers: [RecordController],
1313
providers: [RecordService, FileService],
1414
})

BE/src/record/record.service.ts

Lines changed: 48 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ import {
1515
import { UsageService } from '../usage/usage.service';
1616
import { FileService } from './file.service';
1717
import { TableService } from '../table/table.service';
18-
import { ResTableDto } from '../table/dto/res-table.dto';
1918
import { Connection } from 'mysql2/promise';
2019

2120
@Injectable()
@@ -26,51 +25,13 @@ export class RecordService {
2625
private readonly fileService: FileService,
2726
) {}
2827

29-
async validateDto(
30-
createRandomRecordDto: CreateRandomRecordDto,
31-
connection: Connection,
32-
) {
33-
const tableInfo = await this.tableService.find(
34-
connection,
35-
createRandomRecordDto.tableName,
36-
);
37-
38-
if (!tableInfo?.tableName)
39-
throw new BadRequestException(
40-
`${createRandomRecordDto.tableName} 테이블이 존재하지 않습니다.`,
41-
);
42-
43-
const baseColumns = tableInfo.columns;
44-
const columnInfos: RandomColumnInfo[] = createRandomRecordDto.columns;
45-
46-
columnInfos.forEach((columnInfo) => {
47-
const targetName = columnInfo.name;
48-
const targetDomain = columnInfo.type;
49-
const baseColumn = baseColumns.find(
50-
(column) => column.name === columnInfo.name,
51-
);
52-
53-
if (!baseColumn)
54-
throw new BadRequestException(
55-
`${targetName} 컬럼이 ${createRandomRecordDto.tableName} 에 존재하지 않습니다.`,
56-
);
57-
58-
if (!this.checkDomainAvailability(baseColumn.type, targetDomain))
59-
throw new BadRequestException(
60-
`${targetName}(${baseColumn.type}) 컬럼에 ${targetDomain} 랜덤 값을 넣을 수 없습니다.`,
61-
);
62-
});
63-
}
64-
65-
checkDomainAvailability(mysqlType: string, targetDomain: string) {
66-
const baseType = mysqlToJsType(mysqlType);
67-
const targetType = DomainToTypes[targetDomain];
68-
return !(baseType === 'number' && targetType === 'string');
69-
}
7028
async insertRandomRecord(
71-
req: any,
29+
connection: Connection,
30+
sessionId: string,
7231
createRandomRecordDto: CreateRandomRecordDto,
7332
): Promise<ResRecordDto> {
33+
await this.validateDto(createRandomRecordDto, connection);
34+
7435
const columnEntities: RandomColumnModel[] = createRandomRecordDto.columns
7536
.filter((column) => column.type !== 'default')
7637
.map((column) => this.toEntity(column));
@@ -81,22 +42,28 @@ export class RecordService {
8142
createRandomRecordDto.count,
8243
);
8344
const affectedRows = await this.fileService.loadCsvToDB(
84-
req,
45+
connection,
8546
csvFilePath,
8647
createRandomRecordDto.tableName,
8748
columnNames,
8849
);
8950

9051
await this.fileService.deleteFile(csvFilePath);
9152

92-
await this.usageService.updateRowCount(req);
53+
await this.usageService.updateRowCount(connection, sessionId);
9354

9455
return new ResRecordDto({
9556
status: affectedRows === createRandomRecordDto.count,
9657
text: `${createRandomRecordDto.tableName} 에 랜덤 레코드 ${affectedRows}개 삽입되었습니다.`,
9758
});
9859
}
9960

61+
private checkDomainAvailability(mysqlType: string, targetDomain: string) {
62+
const baseType = mysqlToJsType(mysqlType);
63+
const targetType = DomainToTypes[targetDomain];
64+
return !(baseType === 'number' && targetType === 'string');
65+
}
66+
10067
private toEntity(randomColumnInfo: RandomColumnInfo): RandomColumnModel {
10168
let generator: RandomValueGenerator<any>;
10269
if (generalDomain.includes(randomColumnInfo.type))
@@ -116,4 +83,40 @@ export class RecordService {
11683
blank: randomColumnInfo.blank,
11784
};
11885
}
86+
87+
private async validateDto(
88+
createRandomRecordDto: CreateRandomRecordDto,
89+
connection: Connection,
90+
) {
91+
const tableInfo = await this.tableService.find(
92+
connection,
93+
createRandomRecordDto.tableName,
94+
);
95+
96+
if (!tableInfo?.tableName)
97+
throw new BadRequestException(
98+
`${createRandomRecordDto.tableName} 테이블이 존재하지 않습니다.`,
99+
);
100+
101+
const baseColumns = tableInfo.columns;
102+
const columnInfos: RandomColumnInfo[] = createRandomRecordDto.columns;
103+
104+
columnInfos.forEach((columnInfo) => {
105+
const targetName = columnInfo.name;
106+
const targetDomain = columnInfo.type;
107+
const baseColumn = baseColumns.find(
108+
(column) => column.name === columnInfo.name,
109+
);
110+
111+
if (!baseColumn)
112+
throw new BadRequestException(
113+
`${targetName} 컬럼이 ${createRandomRecordDto.tableName} 에 존재하지 않습니다.`,
114+
);
115+
116+
if (!this.checkDomainAvailability(baseColumn.type, targetDomain))
117+
throw new BadRequestException(
118+
`${targetName}(${baseColumn.type}) 컬럼에 ${targetDomain} 랜덤 값을 넣을 수 없습니다.`,
119+
);
120+
});
121+
}
119122
}

0 commit comments

Comments
 (0)