Skip to content

Commit

Permalink
feat:table 정보 가져오기 api user connection으로 리팩토링
Browse files Browse the repository at this point in the history
  • Loading branch information
mintaek22 committed Jan 15, 2025
1 parent fa1ea30 commit db79b18
Show file tree
Hide file tree
Showing 13 changed files with 165 additions and 207 deletions.
3 changes: 1 addition & 2 deletions BE/src/config/query-database/admin-db-manager.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,7 @@ export class AdminDBManager implements OnModuleInit {
constructor(private readonly configService: ConfigService) {}

async onModuleInit() {
// 서버 테스트를 위한 주석처리
//this.createAdminConnection();
this.createAdminConnection();
}

private createAdminConnection() {
Expand Down
7 changes: 2 additions & 5 deletions BE/src/config/query-database/user-db-manager.service.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,9 @@
import { Injectable } from '@nestjs/common';
import { QueryResult } from 'mysql2/promise';
import { ConfigService } from '@nestjs/config';
import { Connection, QueryResult } from 'mysql2/promise';

@Injectable()
export class UserDBManager {
constructor(private readonly configService: ConfigService) {}
async run(req: any, query: string): Promise<QueryResult> {
const connection = await req.dbConnection;
async run(connection: Connection, query: string): Promise<QueryResult> {
const [result] = await connection.query(query);
return result;
}
Expand Down
9 changes: 7 additions & 2 deletions BE/src/query/query.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,15 @@ export class QueryController {
@Post('/:shellId/execute')
@UseGuards(ShellGuard)
async executeQuery(
@Req() req: Request,
@Req() req: any,
@Param('shellId') shellId: number,
@Body() queryDto: QueryDto,
) {
return await this.queryService.execute(req, shellId, queryDto);
return await this.queryService.execute(
req.dbConnection,
req.sessionID,
shellId,
queryDto,
);
}
}
36 changes: 22 additions & 14 deletions BE/src/query/query.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { Injectable } from '@nestjs/common';
import { QueryDto } from './dto/query.dto';
import { QueryType } from '../common/enums/query-type.enum';
import { ShellService } from '../shell/shell.service';
import { ResultSetHeader, RowDataPacket } from 'mysql2/promise';
import { Connection, ResultSetHeader, RowDataPacket } from 'mysql2/promise';
import { Shell } from '../shell/shell.entity';
import { UserDBManager } from '../config/query-database/user-db-manager.service';
import { UsageService } from 'src/usage/usage.service';
Expand All @@ -17,12 +17,17 @@ export class QueryService {
private readonly redisService: RedisService,
) {}

async execute(req: any, shellId: number, queryDto: QueryDto) {
this.redisService.setActiveUser(req.sessionID);
async execute(
connection: Connection,
sessionId: string,
shellId: number,
queryDto: QueryDto,
) {
this.redisService.setActiveUser(sessionId);
await this.shellService.findShellOrThrow(shellId);

const baseUpdateData = {
sessionId: req.sessionID,
sessionId: sessionId,
query: queryDto.query,
queryType: this.detectQueryType(queryDto.query),
};
Expand All @@ -35,7 +40,11 @@ export class QueryService {
text: '지원하지 않는 쿼리입니다.',
});
}
updateData = await this.processQuery(req, baseUpdateData, queryDto.query);
updateData = await this.processQuery(
connection,
baseUpdateData,
queryDto.query,
);
} catch (e) {
const text = `ERROR ${e.errno || ''} (${e.sqlState || ''}): ${e.sqlMessage || ''}`;

Expand All @@ -47,21 +56,19 @@ export class QueryService {
};
return await this.shellService.replace(shellId, updateData);
}
await this.usageService.updateRowCount(req);
await this.usageService.updateRowCount(sessionId);
return await this.shellService.replace(shellId, updateData);
}

private async processQuery(
req: any,
connection: Connection,
baseUpdateData: any,
query: string,
): Promise<Partial<Shell>> {
const isResultTable = this.existResultTable(baseUpdateData.queryType);

const rows = await this.userDBManager.run(req, query);
const runTime = await this.measureQueryRunTime(req);

// Update usage
const rows = await this.userDBManager.run(connection, query);
const runTime = await this.measureQueryRunTime(connection);

let text: string;
let resultTable: RowDataPacket[];
Expand Down Expand Up @@ -100,11 +107,12 @@ export class QueryService {
return validTypes.includes(type);
}

async measureQueryRunTime(req: any): Promise<string> {
async measureQueryRunTime(connection: Connection): Promise<string> {
try {
const query = `SHOW PROFILES`;
const rows = (await this.userDBManager.run(
req,
'show profiles;',
connection,
query,
)) as RowDataPacket[];
let lastQueryRunTime = rows[rows.length - 1]?.Duration;
lastQueryRunTime = Math.round(lastQueryRunTime * 1000) / 1000 || 0;
Expand Down
9 changes: 6 additions & 3 deletions BE/src/record/record.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@ import { ResRecordDto } from './dto/res-record.dto';
import { ExecuteRecordSwagger } from '../config/swagger/record-swagger.decorator';
import { Serialize } from '../interceptors/serialize.interceptor';
import { UserDBConnectionInterceptor } from '../interceptors/user-db-connection.interceptor';
import { Request } from 'express';

@UseInterceptors(UserDBConnectionInterceptor)
@ApiExtraModels(ResponseDto, ResRecordDto)
@ApiTags('랜덤 데이터 생성 API')
@Controller('api/record')
Expand All @@ -20,10 +20,13 @@ export class RecordController {
@Serialize(ResRecordDto)
@Post()
async insertRandomRecord(
@Req() req: Request,
@Req() req: any,
@Body() randomRecordInsertDto: CreateRandomRecordDto,
) {
await this.recordService.validateDto(randomRecordInsertDto, req.sessionID);
await this.recordService.validateDto(
randomRecordInsertDto,
req.dbConnection,
);
return this.recordService.insertRandomRecord(req, randomRecordInsertDto);
}
}
62 changes: 31 additions & 31 deletions BE/src/record/record.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import { UsageService } from '../usage/usage.service';
import { FileService } from './file.service';
import { TableService } from '../table/table.service';
import { ResTableDto } from '../table/dto/res-table.dto';
import { Connection } from "mysql2/promise";

@Injectable()
export class RecordService {
Expand All @@ -27,38 +28,37 @@ export class RecordService {

async validateDto(
createRandomRecordDto: CreateRandomRecordDto,
identify: string,
connection: Connection,
) {
const tableInfo: ResTableDto = (await this.tableService.find(
identify,
createRandomRecordDto.tableName,
)) as ResTableDto;

if (!tableInfo?.tableName)
throw new BadRequestException(
`${createRandomRecordDto.tableName} 테이블이 존재하지 않습니다.`,
);

const baseColumns = tableInfo.columns;
const columnInfos: RandomColumnInfo[] = createRandomRecordDto.columns;

columnInfos.forEach((columnInfo) => {
const targetName = columnInfo.name;
const targetDomain = columnInfo.type;
const baseColumn = baseColumns.find(
(column) => column.name === columnInfo.name,
);

if (!baseColumn)
throw new BadRequestException(
`${targetName} 컬럼이 ${createRandomRecordDto.tableName} 에 존재하지 않습니다.`,
);

if (!this.checkDomainAvailability(baseColumn.type, targetDomain))
throw new BadRequestException(
`${targetName}(${baseColumn.type}) 컬럼에 ${targetDomain} 랜덤 값을 넣을 수 없습니다.`,
);
});
// const tableInfo: ResTableDto = (await this.tableService.find(connection
// createRandomRecordDto.tableName,
// ))
//
// if (!tableInfo?.tableName)
// throw new BadRequestException(
// `${createRandomRecordDto.tableName} 테이블이 존재하지 않습니다.`,
// );
//
// const baseColumns = tableInfo.columns;
// const columnInfos: RandomColumnInfo[] = createRandomRecordDto.columns;
//
// columnInfos.forEach((columnInfo) => {
// const targetName = columnInfo.name;
// const targetDomain = columnInfo.type;
// const baseColumn = baseColumns.find(
// (column) => column.name === columnInfo.name,
// );
//
// if (!baseColumn)
// throw new BadRequestException(
// `${targetName} 컬럼이 ${createRandomRecordDto.tableName} 에 존재하지 않습니다.`,
// );
//
// if (!this.checkDomainAvailability(baseColumn.type, targetDomain))
// throw new BadRequestException(
// `${targetName}(${baseColumn.type}) 컬럼에 ${targetDomain} 랜덤 값을 넣을 수 없습니다.`,
// );
// });
}

checkDomainAvailability(mysqlType: string, targetDomain: string) {
Expand Down
8 changes: 3 additions & 5 deletions BE/src/table/dto/res-table.dto.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,9 @@ export class ResTableDto {
@Expose()
columns: ColumnDto[];

constructor(init?: Partial<ResTableDto>) {
Object.assign(this, init);
constructor(tableName: string, columns: ColumnDto[]) {
this.tableName = tableName;
this.columns = columns;
}
}

Expand All @@ -25,9 +26,6 @@ export class ColumnDto {
@Expose()
FK: string;

@Expose()
IDX: boolean;

@Expose()
UQ: boolean;

Expand Down
18 changes: 11 additions & 7 deletions BE/src/table/table.controller.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,17 @@
import { Controller, Get, Param, Req } from '@nestjs/common';
import { Controller, Get, Param, Req, UseInterceptors } from '@nestjs/common';
import { ApiExtraModels, ApiTags } from '@nestjs/swagger';
import { Request } from 'express';
import { TableService } from './table.service';
import { Serialize } from '../interceptors/serialize.interceptor';
import { ResTableDto } from './dto/res-table.dto';
import { ResTablesDto } from './dto/res-tables.dto';
import { GetTableListSwagger, GetTableSwagger } from '../config/swagger/table-swagger.decorator';
import {
GetTableListSwagger,
GetTableSwagger,
} from '../config/swagger/table-swagger.decorator';
import { ResponseDto } from '../common/response/response.dto';
import { UserDBConnectionInterceptor } from '../interceptors/user-db-connection.interceptor';

@UseInterceptors(UserDBConnectionInterceptor)
@ApiExtraModels(ResponseDto, ResTablesDto, ResTableDto)
@ApiTags('테이블 가져오기 API')
@Controller('api')
Expand All @@ -17,14 +21,14 @@ export class TableController {
@GetTableListSwagger()
@Serialize(ResTablesDto)
@Get('/tables')
async findAll(@Req() req: Request) {
return await this.tableService.findAll(req.sessionID);
async findAll(@Req() req: any) {
return await this.tableService.findAll(req.dbConnection, req.sessionID);
}

@GetTableSwagger()
@Serialize(ResTableDto)
@Get('/tables/:tableName')
async find(@Req() req: Request, @Param('tableName') tableName: string) {
return await this.tableService.find(req.sessionID, tableName);
async find(@Req() req: any, @Param('tableName') tableName: string) {
return await this.tableService.find(req.dbConnection, tableName);
}
}
Loading

0 comments on commit db79b18

Please sign in to comment.