From f24b23e47ee40548c05a7746b61e58cbfcf78478 Mon Sep 17 00:00:00 2001 From: hobiJeong Date: Thu, 9 Nov 2023 11:06:27 +0900 Subject: [PATCH 1/7] =?UTF-8?q?refactor(#46):=20controller=EC=97=90=20ApiT?= =?UTF-8?q?ags=EC=B6=94=EA=B0=80,=20=EA=B2=80=EC=83=89=20=EC=8B=9C=20limit?= =?UTF-8?q?=EA=B0=92=2030=EC=9C=BC=EB=A1=9C=20=EA=B3=A0=EC=A0=95,=20?= =?UTF-8?q?=EC=B9=B4=ED=85=8C=EA=B3=A0=EB=A6=AC=EA=B9=8C=EC=A7=80=20?= =?UTF-8?q?=EA=B3=A0=EB=A0=A4=ED=95=98=EC=97=AC=20=EA=B2=80=EC=83=89?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/search/controllers/search.controller.ts | 15 +++++---- src/search/repositories/search.repository.ts | 16 ++++++++-- src/search/services/search.service.ts | 32 +++++++++++++++---- .../search-boards-by-body.decorator.ts | 4 +-- .../search-boards-by-head.decorator.ts | 6 ++-- 5 files changed, 53 insertions(+), 20 deletions(-) diff --git a/src/search/controllers/search.controller.ts b/src/search/controllers/search.controller.ts index 5e2fe91..bb158fe 100644 --- a/src/search/controllers/search.controller.ts +++ b/src/search/controllers/search.controller.ts @@ -1,6 +1,7 @@ import { Controller, Get, + Param, ParseIntPipe, Query, UsePipes, @@ -9,30 +10,32 @@ import { import { SearchService } from '../services/search.service'; import { ApiSearchBoardsByHead } from '../swagger-decorators/search-boards-by-head.decorator'; import { ApiSearchBoardsByBody } from '../swagger-decorators/search-boards-by-body.decorator'; +import { ApiTags } from '@nestjs/swagger'; +@ApiTags('SEARCH') @UsePipes(ValidationPipe) @Controller('search') export class SearchController { constructor(private searchService: SearchService) {} @ApiSearchBoardsByHead() - @Get('boards/head') + @Get('boards/:category/head') async searchBoardsByHead( + @Param('category') category: string, @Query('searchQuery') searchQuery: string, @Query('page', ParseIntPipe) page: number, - @Query('limit', ParseIntPipe) limit: number, ) { - return this.searchService.searchBoardsByHead(searchQuery, page, limit); + return this.searchService.searchBoardsByHead(category, searchQuery, page); } @ApiSearchBoardsByBody() - @Get('boards/body') + @Get('boards/:category/body') async searchBoardsByBody( + @Param('category') category: string, @Query('searchQuery') searchQuery: string, @Query('page', ParseIntPipe) page: number, - @Query('limit', ParseIntPipe) limit: number, ) { - return this.searchService.searchBoardsByBody(searchQuery, page, limit); + return this.searchService.searchBoardsByBody(category, searchQuery, page); } @Get('users') diff --git a/src/search/repositories/search.repository.ts b/src/search/repositories/search.repository.ts index 5c6d94c..05fecb3 100644 --- a/src/search/repositories/search.repository.ts +++ b/src/search/repositories/search.repository.ts @@ -6,7 +6,12 @@ import { EntityManager } from 'typeorm'; @Injectable() export class SearchRepository { constructor(private entityManager: EntityManager) {} - async searchBoardsByHead(searchQuery: string, skip: number, take: number) { + async searchBoardsByHead( + category: string, + searchQuery: string, + skip: number, + take: number, + ) { const boardRepository = this.entityManager.getRepository(Board); return boardRepository @@ -18,12 +23,18 @@ export class SearchRepository { .where(`MATCH(head) AGAINST (:searchQuery IN BOOLEAN MODE)`, { searchQuery, }) + .andWhere('board.main_category = :category', { category }) .skip(skip) .take(take) .getManyAndCount(); } - async searchBoardsByBody(searchQuery: string, skip: number, take: number) { + async searchBoardsByBody( + category: string, + searchQuery: string, + skip: number, + take: number, + ) { const boardRepository = this.entityManager.getRepository(Board); return boardRepository @@ -35,6 +46,7 @@ export class SearchRepository { .where(`MATCH(body) AGAINST (:searchQuery IN BOOLEAN MODE)`, { searchQuery, }) + .andWhere('board.main_category = :category', { category }) .skip(skip) .take(take) .getManyAndCount(); diff --git a/src/search/services/search.service.ts b/src/search/services/search.service.ts index c3df90a..fcaaa42 100644 --- a/src/search/services/search.service.ts +++ b/src/search/services/search.service.ts @@ -9,12 +9,21 @@ export class SearchService { private searchRepository: SearchRepository, private boardLikesRepository: BoardsLikeRepository, ) {} - async searchBoardsByHead(searchQuery: string, page: number, limit: number) { - const take = limit; + async searchBoardsByHead( + category: string, + searchQuery: string, + page: number, + ) { + const take = 30; const skip = page <= 0 ? (page = 0) : (page - 1) * take; const [returnedBoards, total] = - await this.searchRepository.searchBoardsByHead(searchQuery, skip, take); + await this.searchRepository.searchBoardsByHead( + category, + searchQuery, + skip, + take, + ); const last_page = Math.ceil(total / take); @@ -58,14 +67,23 @@ export class SearchService { } } - async searchBoardsByBody(searchQuery: string, page: number, limit: number) { - const take = limit; + async searchBoardsByBody( + category: string, + searchQuery: string, + page: number, + ) { + const take = 30; const skip = page <= 0 ? (page = 0) : (page - 1) * take; const [returnedBoards, total] = - await this.searchRepository.searchBoardsByBody(searchQuery, skip, take); + await this.searchRepository.searchBoardsByBody( + category, + searchQuery, + skip, + take, + ); - const last_page = Math.ceil(total / limit); + const last_page = Math.ceil(total / take); const boardResponse: BoardResponseDTO[] = await Promise.all( returnedBoards.map(async (board) => { diff --git a/src/search/swagger-decorators/search-boards-by-body.decorator.ts b/src/search/swagger-decorators/search-boards-by-body.decorator.ts index c087539..f63576b 100644 --- a/src/search/swagger-decorators/search-boards-by-body.decorator.ts +++ b/src/search/swagger-decorators/search-boards-by-body.decorator.ts @@ -5,8 +5,8 @@ export function ApiSearchBoardsByBody() { return applyDecorators( ApiOperation({ summary: '게시글 검색 API', - description: `Query String으로 입력된 값을 토대로 게시글의 본문에 일치하는 값을 조회합니다. - ex)'흑돼지고기' 검색 - '흑돼', '돼지', '지고', '고기'로 검색 (정확성 순으로 정렬됨)`, + description: `Query String의 내용과 Param으로 입력된 카테고리를 토대로 게시글의 본문에 일치하는 값을 조회합니다. + ex)'흑돼지 고기' 검색 - '흑돼지', '고기' 라는 단어 단위로 검색. (정확성 순으로 정렬됨)`, }), ApiResponse({ status: 200, diff --git a/src/search/swagger-decorators/search-boards-by-head.decorator.ts b/src/search/swagger-decorators/search-boards-by-head.decorator.ts index 488bee1..f82fcbe 100644 --- a/src/search/swagger-decorators/search-boards-by-head.decorator.ts +++ b/src/search/swagger-decorators/search-boards-by-head.decorator.ts @@ -5,12 +5,12 @@ export function ApiSearchBoardsByHead() { return applyDecorators( ApiOperation({ summary: '게시글 검색 API', - description: `Query String으로 입력된 값을 토대로 게시글의 제목에 일치하는 값을 조회합니다. - ex)'흑돼지고기' 검색 - '흑돼', '돼지', '지고', '고기'로 검색 (정확성 순으로 정렬됨)`, + description: `Query String의 내용과 Param으로 입력된 카테고리를 토대로 게시글의 제목에 일치하는 값을 조회합니다. + ex)'흑돼지 고기' 검색 - '흑돼지', '고기' 라는 단어 단위로 검색. (정확성 순으로 정렬됨)`, }), ApiResponse({ status: 200, - description: '성공적으로 검색한 게시글(제목 기준) 조회', + description: '성공적으로 검색한 게시글(제목, 카테고리 기준) 조회', content: { JSON: { example: { From 425f7881f826c86b82df50721dd74a238945ac01 Mon Sep 17 00:00:00 2001 From: hobiJeong Date: Thu, 9 Nov 2023 11:06:51 +0900 Subject: [PATCH 2/7] =?UTF-8?q?modify(#46):=20take=EA=B0=92=2016=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EB=B3=80=EA=B2=BD=ED=95=B4=EC=84=9C=20=EA=B3=A0?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/search/services/search.service.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/search/services/search.service.ts b/src/search/services/search.service.ts index fcaaa42..7dd8e13 100644 --- a/src/search/services/search.service.ts +++ b/src/search/services/search.service.ts @@ -14,7 +14,7 @@ export class SearchService { searchQuery: string, page: number, ) { - const take = 30; + const take = 16; const skip = page <= 0 ? (page = 0) : (page - 1) * take; const [returnedBoards, total] = @@ -72,7 +72,7 @@ export class SearchService { searchQuery: string, page: number, ) { - const take = 30; + const take = 16; const skip = page <= 0 ? (page = 0) : (page - 1) * take; const [returnedBoards, total] = From 02de1f16af4faefa792d0964c41a23c453b84ea8 Mon Sep 17 00:00:00 2001 From: hobiJeong Date: Thu, 9 Nov 2023 11:50:38 +0900 Subject: [PATCH 3/7] =?UTF-8?q?modify(#46):=20=EC=86=8C=EC=BC=93=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=EC=9A=A9=20client.js=EC=82=AD?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/client.js | 36 ------------------------------------ 1 file changed, 36 deletions(-) delete mode 100644 src/client.js diff --git a/src/client.js b/src/client.js deleted file mode 100644 index 1bf440f..0000000 --- a/src/client.js +++ /dev/null @@ -1,36 +0,0 @@ -const namespaceURL = 'http://localhost:3000/ch-653383a4468680bc4e9f8491'; -const socket = io(namespaceURL); - -socket.on('connect', () => { - console.log('Connected to WebSocket server'); - - // 예제로 'login' 이벤트를 보내는 방법 - socket.emit('login', { - userId: 1, - rooms: ['653383a4468680bc4e9f8491'], - }); - // socket.emit('messages', { - // roomId: '650bde3798dd4c34439c30dc', - // message: 'asdf', - // }); - // console.log(socket); - - // 해당 네임스페이스의 이벤트를 수신 -}); - -socket.on('hello', (data) => { - console.log('Received hello message:', data); -}); - -socket.on('msgNoti', (data) => { - console.log('Received message notification:', data); -}); - -socket.on('disconnect', () => { - console.log('Disconnected from WebSocket server'); -}); - -socket.on('message', (data) => { - console.log('Received message:', data); - // 여기에서 메시지를 처리하거나 화면에 표시하는 로직을 추가하세요.. -}); From 44b9c55c86abba6e3596e84fc8738b8d16c75f91 Mon Sep 17 00:00:00 2001 From: hobiJeong Date: Thu, 9 Nov 2023 12:01:19 +0900 Subject: [PATCH 4/7] =?UTF-8?q?feat(#46):=20=EC=A0=84=EC=B2=B4=20=EA=B2=8C?= =?UTF-8?q?=EC=8B=9C=ED=8C=90=20=EA=B2=80=EC=83=89=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/search/repositories/search.repository.ts | 29 +++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/src/search/repositories/search.repository.ts b/src/search/repositories/search.repository.ts index 05fecb3..7807ef3 100644 --- a/src/search/repositories/search.repository.ts +++ b/src/search/repositories/search.repository.ts @@ -13,7 +13,20 @@ export class SearchRepository { take: number, ) { const boardRepository = this.entityManager.getRepository(Board); - + if (category === '전체') { + return boardRepository + .createQueryBuilder('board') + .select() + .leftJoinAndSelect('board.user', 'user') + .leftJoinAndSelect('user.userImage', 'userImage') + .leftJoinAndSelect('board.boardImages', 'boardImages') + .where(`MATCH(head) AGAINST (:searchQuery IN BOOLEAN MODE)`, { + searchQuery, + }) + .skip(skip) + .take(take) + .getManyAndCount(); + } return boardRepository .createQueryBuilder('board') .select() @@ -37,6 +50,20 @@ export class SearchRepository { ) { const boardRepository = this.entityManager.getRepository(Board); + if (category === '전체') { + return boardRepository + .createQueryBuilder('board') + .select() + .leftJoinAndSelect('board.user', 'user') + .leftJoinAndSelect('user.userImage', 'userImage') + .leftJoinAndSelect('board.boardImages', 'boardImages') + .where(`MATCH(body) AGAINST (:searchQuery IN BOOLEAN MODE)`, { + searchQuery, + }) + .skip(skip) + .take(take) + .getManyAndCount(); + } return boardRepository .createQueryBuilder('board') .select() From bbe3665b4b7536e48d52e7354ee8cd278a3f6890 Mon Sep 17 00:00:00 2001 From: hobiJeong Date: Thu, 9 Nov 2023 13:17:14 +0900 Subject: [PATCH 5/7] =?UTF-8?q?modify(#46):=20swagger=20=EB=AC=B8=EC=84=9C?= =?UTF-8?q?=20=EB=82=B4=EC=9A=A9=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../swagger-decorators/search-boards-by-body.decorator.ts | 2 +- .../swagger-decorators/search-boards-by-head.decorator.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/search/swagger-decorators/search-boards-by-body.decorator.ts b/src/search/swagger-decorators/search-boards-by-body.decorator.ts index f63576b..9e14feb 100644 --- a/src/search/swagger-decorators/search-boards-by-body.decorator.ts +++ b/src/search/swagger-decorators/search-boards-by-body.decorator.ts @@ -5,7 +5,7 @@ export function ApiSearchBoardsByBody() { return applyDecorators( ApiOperation({ summary: '게시글 검색 API', - description: `Query String의 내용과 Param으로 입력된 카테고리를 토대로 게시글의 본문에 일치하는 값을 조회합니다. + description: `Query String의 내용과 Param으로 입력된 카테고리를 토대로 게시글의 본문에 일치하는 값을 조회합니다(카테고리에 "전체" 입력 시 전체 게시판 검색). ex)'흑돼지 고기' 검색 - '흑돼지', '고기' 라는 단어 단위로 검색. (정확성 순으로 정렬됨)`, }), ApiResponse({ diff --git a/src/search/swagger-decorators/search-boards-by-head.decorator.ts b/src/search/swagger-decorators/search-boards-by-head.decorator.ts index f82fcbe..762ec06 100644 --- a/src/search/swagger-decorators/search-boards-by-head.decorator.ts +++ b/src/search/swagger-decorators/search-boards-by-head.decorator.ts @@ -5,7 +5,7 @@ export function ApiSearchBoardsByHead() { return applyDecorators( ApiOperation({ summary: '게시글 검색 API', - description: `Query String의 내용과 Param으로 입력된 카테고리를 토대로 게시글의 제목에 일치하는 값을 조회합니다. + description: `Query String의 내용과 Param으로 입력된 카테고리를 토대로 게시글의 제목에 일치하는 값을 조회합니다(카테고리에 "전체" 입력 시 전체 게시판 검색). ex)'흑돼지 고기' 검색 - '흑돼지', '고기' 라는 단어 단위로 검색. (정확성 순으로 정렬됨)`, }), ApiResponse({ From 7a2d21d9e56be025b875a55cdf99e78511b83a29 Mon Sep 17 00:00:00 2001 From: hobiJeong Date: Thu, 9 Nov 2023 17:06:26 +0900 Subject: [PATCH 6/7] =?UTF-8?q?feat(#46):=20=EC=BF=BC=EB=A6=AC=EB=B9=8C?= =?UTF-8?q?=EB=8D=94=20=EC=84=B1=EB=8A=A5=20=EC=B5=9C=EC=A0=81=ED=99=94=20?= =?UTF-8?q?=EB=B0=8F=20=EA=B7=B8=EC=97=90=20=EB=A7=9E=EC=B6=B0=20map?= =?UTF-8?q?=ED=95=A8=EC=88=98=20=EC=95=BD=EA=B0=84=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/boards/entities/board.entity.ts | 2 +- src/config/typeorm.config.ts | 3 +- src/search/repositories/search.repository.ts | 120 ++++++++++++++++--- src/search/services/search.service.ts | 8 +- 4 files changed, 111 insertions(+), 22 deletions(-) diff --git a/src/boards/entities/board.entity.ts b/src/boards/entities/board.entity.ts index 9a76c24..1a6cca8 100644 --- a/src/boards/entities/board.entity.ts +++ b/src/boards/entities/board.entity.ts @@ -28,7 +28,7 @@ export class Board { @JoinColumn({ name: 'user_id' }) user: User; - @OneToMany(() => BoardImage, (boardImage) => boardImage.board, { + @OneToMany(() => BoardImage, (boardImages) => boardImages.board, { onDelete: 'CASCADE', }) boardImages: BoardImage[]; diff --git a/src/config/typeorm.config.ts b/src/config/typeorm.config.ts index 865deda..098655e 100644 --- a/src/config/typeorm.config.ts +++ b/src/config/typeorm.config.ts @@ -38,5 +38,6 @@ export const TypeORMconfig: TypeOrmModuleOptions = { BoardNotification, // BoardRepository, ], // 여기에 엔티티들을 추가해야 합니다. - synchronize: process.env.NODE_ENV === 'false', + synchronize: process.env.NODE_ENV === 'true', + logging: true, }; diff --git a/src/search/repositories/search.repository.ts b/src/search/repositories/search.repository.ts index 7807ef3..bc5e8ed 100644 --- a/src/search/repositories/search.repository.ts +++ b/src/search/repositories/search.repository.ts @@ -1,4 +1,5 @@ import { Injectable } from '@nestjs/common'; +import { BoardImage } from 'src/boards/entities/board-image.entity'; import { Board } from 'src/boards/entities/board.entity'; import { User } from 'src/users/entities/user.entity'; import { EntityManager } from 'typeorm'; @@ -13,30 +14,74 @@ export class SearchRepository { take: number, ) { const boardRepository = this.entityManager.getRepository(Board); + if (category === '전체') { return boardRepository .createQueryBuilder('board') - .select() - .leftJoinAndSelect('board.user', 'user') - .leftJoinAndSelect('user.userImage', 'userImage') - .leftJoinAndSelect('board.boardImages', 'boardImages') .where(`MATCH(head) AGAINST (:searchQuery IN BOOLEAN MODE)`, { searchQuery, }) + .leftJoinAndMapMany( + 'board.user', + User, + 'user', + 'user.id = board.userId', + ) + .leftJoinAndSelect('user.userImage', 'userImage') + .leftJoinAndMapMany( + 'board.boardImages', + BoardImage, + 'boardImages', + 'boardImages.boardId = board.id', + ) + .select([ + 'board.id', + 'board.head', + 'board.body', + 'board.main_category', + 'board.sub_category', + 'board.createAt', + 'board.updateAt', + 'user.name', + 'userImage.id', + 'userImage.userId', + 'userImage.imageUrl', + 'boardImages.id', + 'boardImages.imageUrl', + ]) .skip(skip) .take(take) .getManyAndCount(); } return boardRepository .createQueryBuilder('board') - .select() - .leftJoinAndSelect('board.user', 'user') - .leftJoinAndSelect('user.userImage', 'userImage') - .leftJoinAndSelect('board.boardImages', 'boardImages') .where(`MATCH(head) AGAINST (:searchQuery IN BOOLEAN MODE)`, { searchQuery, }) .andWhere('board.main_category = :category', { category }) + .leftJoinAndMapMany('board.user', User, 'user', 'user.id = board.userId') + .leftJoinAndSelect('user.userImage', 'userImage') + .leftJoinAndMapMany( + 'board.boardImages', + BoardImage, + 'boardImages', + 'boardImages.boardId = board.id', + ) + .select([ + 'board.id', + 'board.head', + 'board.body', + 'board.main_category', + 'board.sub_category', + 'board.createAt', + 'board.updateAt', + 'user.name', + 'userImage.id', + 'userImage.userId', + 'userImage.imageUrl', + 'boardImages.id', + 'boardImages.imageUrl', + ]) .skip(skip) .take(take) .getManyAndCount(); @@ -53,27 +98,70 @@ export class SearchRepository { if (category === '전체') { return boardRepository .createQueryBuilder('board') - .select() - .leftJoinAndSelect('board.user', 'user') - .leftJoinAndSelect('user.userImage', 'userImage') - .leftJoinAndSelect('board.boardImages', 'boardImages') .where(`MATCH(body) AGAINST (:searchQuery IN BOOLEAN MODE)`, { searchQuery, }) + .leftJoinAndMapMany( + 'board.user', + User, + 'user', + 'user.id = board.userId', + ) + .leftJoinAndSelect('user.userImage', 'userImage') + .leftJoinAndMapMany( + 'board.boardImages', + BoardImage, + 'boardImages', + 'boardImages.boardId = board.id', + ) + .select([ + 'board.id', + 'board.head', + 'board.body', + 'board.main_category', + 'board.sub_category', + 'board.createAt', + 'board.updateAt', + 'user.name', + 'userImage.id', + 'userImage.userId', + 'userImage.imageUrl', + 'boardImages.id', + 'boardImages.imageUrl', + ]) .skip(skip) .take(take) .getManyAndCount(); } return boardRepository .createQueryBuilder('board') - .select() - .leftJoinAndSelect('board.user', 'user') - .leftJoinAndSelect('user.userImage', 'userImage') - .leftJoinAndSelect('board.boardImages', 'boardImages') .where(`MATCH(body) AGAINST (:searchQuery IN BOOLEAN MODE)`, { searchQuery, }) .andWhere('board.main_category = :category', { category }) + .leftJoinAndMapMany('board.user', User, 'user', 'user.id = board.userId') + .leftJoinAndSelect('user.userImage', 'userImage') + .leftJoinAndMapMany( + 'board.boardImages', + BoardImage, + 'boardImages', + 'boardImages.boardId = board.id', + ) + .select([ + 'board.id', + 'board.head', + 'board.body', + 'board.main_category', + 'board.sub_category', + 'board.createAt', + 'board.updateAt', + 'user.name', + 'userImage.id', + 'userImage.userId', + 'userImage.imageUrl', + 'boardImages.id', + 'boardImages.imageUrl', + ]) .skip(skip) .take(take) .getManyAndCount(); diff --git a/src/search/services/search.service.ts b/src/search/services/search.service.ts index 7dd8e13..e193e5d 100644 --- a/src/search/services/search.service.ts +++ b/src/search/services/search.service.ts @@ -42,8 +42,8 @@ export class SearchService { createAt: board.createAt, updateAt: board.updateAt, userId: { - name: board.user.name, - userImage: board.user.userImage ? board.user.userImage : [], + name: board.user[0].name, + userImage: board.user[0].userImage ? board.user[0].userImage : [], }, boardLike: like, boardImages: board.boardImages.map((image) => ({ @@ -100,8 +100,8 @@ export class SearchService { createAt: board.createAt, updateAt: board.updateAt, userId: { - name: board.user.name, - userImage: board.user.userImage ? board.user.userImage : [], + name: board.user[0].name, + userImage: board.user[0].userImage ? board.user[0].userImage : [], }, boardLike: like, boardImages: board.boardImages.map((image) => ({ From 6b9f30158dab146e8f7ab06987f70d20bf206863 Mon Sep 17 00:00:00 2001 From: hobiJeong Date: Thu, 9 Nov 2023 17:06:54 +0900 Subject: [PATCH 7/7] =?UTF-8?q?feat(#46):=20limit=20=ED=81=B4=EB=9D=BC?= =?UTF-8?q?=EC=9D=B4=EC=96=B8=ED=8A=B8=20=EC=B8=A1=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=EC=88=98=EC=B9=98=20=EC=A0=95=ED=95=98=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app.module.ts | 2 +- src/config/typeorm.config.ts | 3 +-- src/search/controllers/search.controller.ts | 16 ++++++++++++++-- src/search/services/search.service.ts | 6 ++++-- 4 files changed, 20 insertions(+), 7 deletions(-) diff --git a/src/app.module.ts b/src/app.module.ts index 1e59f1e..b3b3b5d 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -25,7 +25,7 @@ import { SearchModule } from './search/search.module'; UserModule, TypeOrmModule.forRoot({ ...TypeORMconfig, // TypeORM 설정 객체 확장 - synchronize: true, // DB 동기화 여부 설정 + synchronize: false, // DB 동기화 여부 설정 }), // TypeOrmModule.forFeature([Image]), ConfigModule.forRoot({ diff --git a/src/config/typeorm.config.ts b/src/config/typeorm.config.ts index 098655e..865deda 100644 --- a/src/config/typeorm.config.ts +++ b/src/config/typeorm.config.ts @@ -38,6 +38,5 @@ export const TypeORMconfig: TypeOrmModuleOptions = { BoardNotification, // BoardRepository, ], // 여기에 엔티티들을 추가해야 합니다. - synchronize: process.env.NODE_ENV === 'true', - logging: true, + synchronize: process.env.NODE_ENV === 'false', }; diff --git a/src/search/controllers/search.controller.ts b/src/search/controllers/search.controller.ts index bb158fe..acad5b4 100644 --- a/src/search/controllers/search.controller.ts +++ b/src/search/controllers/search.controller.ts @@ -24,8 +24,14 @@ export class SearchController { @Param('category') category: string, @Query('searchQuery') searchQuery: string, @Query('page', ParseIntPipe) page: number, + @Query('limit', ParseIntPipe) limit: number, ) { - return this.searchService.searchBoardsByHead(category, searchQuery, page); + return this.searchService.searchBoardsByHead( + category, + searchQuery, + page, + limit, + ); } @ApiSearchBoardsByBody() @@ -34,8 +40,14 @@ export class SearchController { @Param('category') category: string, @Query('searchQuery') searchQuery: string, @Query('page', ParseIntPipe) page: number, + @Query('limit', ParseIntPipe) limit: number, ) { - return this.searchService.searchBoardsByBody(category, searchQuery, page); + return this.searchService.searchBoardsByBody( + category, + searchQuery, + page, + limit, + ); } @Get('users') diff --git a/src/search/services/search.service.ts b/src/search/services/search.service.ts index e193e5d..84e3797 100644 --- a/src/search/services/search.service.ts +++ b/src/search/services/search.service.ts @@ -13,8 +13,9 @@ export class SearchService { category: string, searchQuery: string, page: number, + limit: number, ) { - const take = 16; + const take = limit; const skip = page <= 0 ? (page = 0) : (page - 1) * take; const [returnedBoards, total] = @@ -71,8 +72,9 @@ export class SearchService { category: string, searchQuery: string, page: number, + limit: number, ) { - const take = 16; + const take = limit; const skip = page <= 0 ? (page = 0) : (page - 1) * take; const [returnedBoards, total] =