Skip to content

Commit ac64d83

Browse files
authored
Merge pull request #9 from boostcampwm-2024/refactor/response-dto
♻️ refactor: Response DTO 적용, request/response 분리
2 parents 93d781e + 384461c commit ac64d83

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+427
-215
lines changed

server/src/admin/controller/admin.controller.ts

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,10 @@ import {
1313
} from '@nestjs/common';
1414
import { Request, Response } from 'express';
1515
import { AdminService } from '../service/admin.service';
16-
import { RegisterAdminDto } from '../dto/register-admin.dto';
16+
import { RegisterAdminRequestDto } from '../dto/request/register-admin.dto';
1717
import { ApiTags } from '@nestjs/swagger';
1818
import { ApiResponse } from '../../common/response/common.response';
19-
import { LoginAdminDto } from '../dto/login-admin.dto';
19+
import { LoginAdminRequestDto } from '../dto/request/login-admin.dto';
2020
import { CookieAuthGuard } from '../../common/guard/auth.guard';
2121
import { ApiLoginAdmin } from '../api-docs/loginAdmin.api-docs';
2222
import { ApiReadSessionIdAdmin } from '../api-docs/readSessionIdAdmin.api-docs';
@@ -33,7 +33,7 @@ export class AdminController {
3333
@HttpCode(HttpStatus.OK)
3434
@UsePipes(ValidationPipe)
3535
async loginAdmin(
36-
@Body() loginAdminDto: LoginAdminDto,
36+
@Body() loginAdminDto: LoginAdminRequestDto,
3737
@Res({ passthrough: true }) response: Response,
3838
@Req() request: Request,
3939
) {
@@ -49,8 +49,7 @@ export class AdminController {
4949
@Post('/logout')
5050
async logoutAdmin(
5151
@Req() request: Request,
52-
@Res({ passthrough: true })
53-
response: Response,
52+
@Res({ passthrough: true }) response: Response,
5453
) {
5554
await this.adminService.logoutAdmin(request, response);
5655
return ApiResponse.responseWithNoContent(
@@ -62,7 +61,7 @@ export class AdminController {
6261
@UseGuards(CookieAuthGuard)
6362
@Post('/register')
6463
@UsePipes(ValidationPipe)
65-
async createAdmin(@Body() registerAdminDto: RegisterAdminDto) {
64+
async createAdmin(@Body() registerAdminDto: RegisterAdminRequestDto) {
6665
await this.adminService.createAdmin(registerAdminDto);
6766
return ApiResponse.responseWithNoContent(
6867
'성공적으로 관리자 계정이 생성되었습니다.',

server/src/admin/dto/login-admin.dto.ts renamed to server/src/admin/dto/request/login-admin.dto.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { IsNotEmpty, IsString } from 'class-validator';
22
import { ApiProperty } from '@nestjs/swagger';
33

4-
export class LoginAdminDto {
4+
export class LoginAdminRequestDto {
55
@ApiProperty({
66
example: 'minseokjo',
77
description: '관리자 로그인 아이디를 입력해주세요.',

server/src/admin/dto/register-admin.dto.ts renamed to server/src/admin/dto/request/register-admin.dto.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { ApiProperty } from '@nestjs/swagger';
33

44
const PASSWORD_REG = /^(?=.*[!@#$%^&*()_+])[A-Za-z0-9!@#$%^&*()_+]+$/;
55

6-
export class RegisterAdminDto {
6+
export class RegisterAdminRequestDto {
77
@ApiProperty({
88
example: 'minseokjo',
99
description: '관리자 로그인 아이디를 입력해주세요.',

server/src/admin/repository/admin.repository.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
import { Injectable } from '@nestjs/common';
22
import { DataSource, Repository } from 'typeorm';
33
import { Admin } from '../entity/admin.entity';
4-
import { RegisterAdminDto } from '../dto/register-admin.dto';
4+
import { RegisterAdminRequestDto } from '../dto/request/register-admin.dto';
55

66
@Injectable()
77
export class AdminRepository extends Repository<Admin> {
88
constructor(private dataSource: DataSource) {
99
super(Admin, dataSource.createEntityManager());
1010
}
1111

12-
async createAdmin(registerAdminDto: RegisterAdminDto) {
12+
async createAdmin(registerAdminDto: RegisterAdminRequestDto) {
1313
const { loginId, password } = registerAdminDto;
1414
const admin = this.create({
1515
loginId,

server/src/admin/service/admin.service.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,13 @@ import {
44
UnauthorizedException,
55
} from '@nestjs/common';
66
import { Response, Request } from 'express';
7-
import { RegisterAdminDto } from '../dto/register-admin.dto';
7+
import { RegisterAdminRequestDto } from '../dto/request/register-admin.dto';
88
import { AdminRepository } from '../repository/admin.repository';
99
import * as bcrypt from 'bcrypt';
1010
import { cookieConfig } from '../../common/cookie/cookie.config';
1111
import * as uuid from 'uuid';
1212
import { RedisService } from '../../common/redis/redis.service';
13-
import { LoginAdminDto } from '../dto/login-admin.dto';
13+
import { LoginAdminRequestDto } from '../dto/request/login-admin.dto';
1414

1515
@Injectable()
1616
export class AdminService {
@@ -23,7 +23,7 @@ export class AdminService {
2323
) {}
2424

2525
async loginAdmin(
26-
loginAdminDto: LoginAdminDto,
26+
loginAdminDto: LoginAdminRequestDto,
2727
response: Response,
2828
request: Request,
2929
) {
@@ -90,7 +90,7 @@ export class AdminService {
9090
response.clearCookie('sessionId');
9191
}
9292

93-
async createAdmin(registerAdminDto: RegisterAdminDto) {
93+
async createAdmin(registerAdminDto: RegisterAdminRequestDto) {
9494
let { loginId, password } = registerAdminDto;
9595

9696
const existingAdmin = await this.adminRepository.findOne({

server/src/feed/api-docs/searchFeedList.api-docs.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import {
55
ApiOperation,
66
ApiQuery,
77
} from '@nestjs/swagger';
8-
import { SearchType } from '../dto/search-feed.dto';
8+
import { SearchType } from '../dto/request/search-feed.dto';
99

1010
export function ApiSearchFeedList() {
1111
return applyDecorators(

server/src/feed/controller/feed.controller.ts

Lines changed: 25 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ import {
1515
ValidationPipe,
1616
} from '@nestjs/common';
1717
import { FeedService } from '../service/feed.service';
18-
import { QueryFeedDto } from '../dto/query-feed.dto';
19-
import { SearchFeedReq } from '../dto/search-feed.dto';
18+
import { FeedPaginationRequestDto } from '../dto/request/feed-pagination.dto';
19+
import { SearchFeedRequestDto } from '../dto/request/search-feed.dto';
2020
import { Response, Request } from 'express';
2121
import { Observable } from 'rxjs';
2222
import { EventEmitter2 } from '@nestjs/event-emitter';
@@ -25,7 +25,7 @@ import { ApiReadTrendFeedList } from '../api-docs/readTrendFeedList.api-docs';
2525
import { ApiSearchFeedList } from '../api-docs/searchFeedList.api-docs';
2626
import { ApiUpdateFeedViewCount } from '../api-docs/updateFeedViewCount.api-docs';
2727
import { ApiReadRecentFeedList } from '../api-docs/readRecentFeedList.api-docs';
28-
import { Feed } from '../entity/feed.entity';
28+
import { FeedTrendResponseDto } from '../dto/response/feed-pagination.dto';
2929

3030
@ApiTags('Feed')
3131
@Controller('feed')
@@ -43,7 +43,7 @@ export class FeedController {
4343
transform: true,
4444
}),
4545
)
46-
async readFeedPagination(@Query() queryFeedDto: QueryFeedDto) {
46+
async readFeedPagination(@Query() queryFeedDto: FeedPaginationRequestDto) {
4747
return ApiResponse.responseWithData(
4848
'피드 조회 완료',
4949
await this.feedService.readFeedPagination(queryFeedDto),
@@ -54,22 +54,27 @@ export class FeedController {
5454
@Sse('trend/sse')
5555
async readTrendFeedList() {
5656
return new Observable((observer) => {
57-
this.feedService.readTrendFeedList().then((trendData) => {
58-
observer.next({
59-
data: {
60-
message: '현재 트렌드 피드 수신 완료',
61-
data: trendData,
62-
},
57+
this.feedService
58+
.readTrendFeedList()
59+
.then((trendData: FeedTrendResponseDto[]) => {
60+
observer.next({
61+
data: {
62+
message: '현재 트렌드 피드 수신 완료',
63+
data: trendData,
64+
},
65+
});
6366
});
64-
});
65-
this.eventService.on('ranking-update', (trendData: Feed[]) => {
66-
observer.next({
67-
data: {
68-
message: '새로운 트렌드 피드 수신 완료',
69-
data: trendData,
70-
},
71-
});
72-
});
67+
this.eventService.on(
68+
'ranking-update',
69+
(trendData: FeedTrendResponseDto[]) => {
70+
observer.next({
71+
data: {
72+
message: '새로운 트렌드 피드 수신 완료',
73+
data: trendData,
74+
},
75+
});
76+
},
77+
);
7378
});
7479
}
7580

@@ -82,7 +87,7 @@ export class FeedController {
8287
}),
8388
new ValidationPipe(),
8489
)
85-
async searchFeedList(@Query() searchFeedReq: SearchFeedReq) {
90+
async searchFeedList(@Query() searchFeedReq: SearchFeedRequestDto) {
8691
const data = await this.feedService.searchFeedList(searchFeedReq);
8792
return ApiResponse.responseWithData('검색 결과 조회 완료', data);
8893
}

server/src/feed/dto/query-feed.dto.ts renamed to server/src/feed/dto/request/feed-pagination.dto.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { IsInt, IsOptional, Min } from 'class-validator';
22
import { Type } from 'class-transformer';
33

4-
export class QueryFeedDto {
4+
export class FeedPaginationRequestDto {
55
@IsOptional()
66
@Min(0, { message: 'lastId 값은 0 이상이어야 합니다.' })
77
@IsInt({
Lines changed: 2 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { Feed } from '../../feed/entity/feed.entity';
21
import { IsDefined, IsEnum, IsInt, IsString, Min } from 'class-validator';
32
import { Type } from 'class-transformer';
43

@@ -8,7 +7,7 @@ export enum SearchType {
87
ALL = 'all',
98
}
109

11-
export class SearchFeedReq {
10+
export class SearchFeedRequestDto {
1211
@IsDefined({
1312
message: '검색어를 입력해주세요.',
1413
})
@@ -37,38 +36,7 @@ export class SearchFeedReq {
3736
@Type(() => Number)
3837
limit?: number = 4;
3938

40-
constructor(partial: Partial<SearchFeedReq>) {
39+
constructor(partial: Partial<SearchFeedRequestDto>) {
4140
Object.assign(this, partial);
4241
}
4342
}
44-
45-
export class SearchFeedResult {
46-
constructor(
47-
private id: number,
48-
private blogName: string,
49-
private title: string,
50-
private path: string,
51-
private createdAt: Date,
52-
) {}
53-
54-
static feedsToResults(feeds: Feed[]): SearchFeedResult[] {
55-
return feeds.map((item) => {
56-
return new SearchFeedResult(
57-
item.id,
58-
item.blog.name,
59-
item.title,
60-
item.path,
61-
item.createdAt,
62-
);
63-
});
64-
}
65-
}
66-
67-
export class SearchFeedRes {
68-
constructor(
69-
private totalCount: number,
70-
private result: SearchFeedResult[],
71-
private totalPages: number,
72-
private limit: number,
73-
) {}
74-
}

server/src/feed/dto/feed-response.dto.ts renamed to server/src/feed/dto/response/feed-pagination.dto.ts

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
import { FeedView } from '../../feed/entity/feed.entity';
1+
import { FeedView } from '../../entity/feed.entity';
22

3-
export class FeedPaginationResponseDto {
3+
export class FeedResult {
44
private constructor(
55
private id: number,
66
private author: string,
@@ -13,8 +13,8 @@ export class FeedPaginationResponseDto {
1313
private isNew: boolean,
1414
) {}
1515

16-
private static toFeedPaginationResponseDto(feed: FeedPaginationResult) {
17-
return new FeedPaginationResponseDto(
16+
private static toResultDto(feed: FeedPaginationResult) {
17+
return new FeedResult(
1818
feed.feedId,
1919
feed.blogName,
2020
feed.blogPlatform,
@@ -27,10 +27,20 @@ export class FeedPaginationResponseDto {
2727
);
2828
}
2929

30-
public static mapToPaginationResponseDtoArray(
31-
FeedList: FeedPaginationResult[],
32-
) {
33-
return FeedList.map(this.toFeedPaginationResponseDto);
30+
public static toResultDtoArray(feedList: FeedPaginationResult[]) {
31+
return feedList.map(this.toResultDto);
32+
}
33+
}
34+
35+
export class FeedPaginationResponseDto {
36+
private constructor(
37+
private result: FeedResult[],
38+
private lastId: number,
39+
private hasMore: boolean,
40+
) {}
41+
42+
static toResponseDto(result: FeedResult[], lastId: number, hasMore: boolean) {
43+
return new FeedPaginationResponseDto(result, lastId, hasMore);
3444
}
3545
}
3646

@@ -48,7 +58,7 @@ export class FeedTrendResponseDto {
4858
private viewCount: number,
4959
) {}
5060

51-
private static toFeedTrendResponseDto(feed: FeedView) {
61+
private static toResponseDto(feed: FeedView) {
5262
return new FeedTrendResponseDto(
5363
feed.feedId,
5464
feed.blogName,
@@ -61,7 +71,7 @@ export class FeedTrendResponseDto {
6171
);
6272
}
6373

64-
public static toFeedTrendResponseDtoArray(FeedList: FeedView[]) {
65-
return FeedList.map(this.toFeedTrendResponseDto);
74+
public static toResponseDtoArray(FeedList: FeedView[]) {
75+
return FeedList.map(this.toResponseDto);
6676
}
6777
}

0 commit comments

Comments
 (0)