Skip to content

Commit

Permalink
Merge(hyunsoo/chat): 프론트 테스트를 위한 cors 설정 변경 #92
Browse files Browse the repository at this point in the history
Refactor(hyunsoo/chat): 프론트 테스트를 위한 cors 설정 변경 #92
  • Loading branch information
Kimsoo0119 authored Feb 20, 2023
2 parents d1267b3 + cc83b22 commit 2188d3b
Show file tree
Hide file tree
Showing 75 changed files with 1,637 additions and 620 deletions.
14 changes: 14 additions & 0 deletions default.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
upstream app {
server nest-prod1:3000;
server nest-prod2:3002;
server nest-prod3:3003;
}

server {
listen 80;

location / {
proxy_pass http://app;
}

}
16 changes: 11 additions & 5 deletions docker-compose.yml
Original file line number Diff line number Diff line change
@@ -1,18 +1,24 @@
version: '3.8'

services:
nginx:
container_name: nginx
image: nginx:latest
ports:
- 80:80
redis:
image: redis:latest
command: redis-server --requirepass redispw --port 55001
command: redis-server --requirepass redispw --port 6379
env_file: .env
container_name: redis_prod
hostname: redis_prod
ports:
- 55000:55000
- 6379:6379
restart: always
nest1:
build:
context: .
dockerfile: ./dockerfile
dockerfile: ./dockerfilecd
env_file: .env
image: ghcr.io/klaus9267/summer-auto-deploy
ports:
Expand All @@ -28,7 +34,7 @@ services:
env_file: .env
image: ghcr.io/klaus9267/summer-auto-deploy
ports:
- 4000:3000
- 3002:3000
container_name: nest-prod2
depends_on:
- redis
Expand All @@ -40,7 +46,7 @@ services:
env_file: .env
image: ghcr.io/klaus9267/summer-auto-deploy
ports:
- 5000:3000
- 3003:3000
container_name: nest-prod3
depends_on:
- redis
Expand Down
5 changes: 3 additions & 2 deletions dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,9 @@ FROM node:16.15.1 AS builder
WORKDIR /home/app

COPY ./main-project .
COPY default.conf /etc/nginx/conf.d/default.conf

RUN npm install --force [email protected]
RUN npm run build
RUN npm run build

CMD ["npm", "run", "start:prod"]
CMD ["npm", "run", "start:prod"]
13 changes: 8 additions & 5 deletions main-project/src/announces/announces.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ export class AnnouncesService {
private readonly configService: ConfigService,
) {}

ADMIN_USER: number = Number(this.configService.get<number>('ADMIN_USER'));
ADMIN_USER: number = this.configService.get<number>('ADMIN_USER');

// 생성 관련
async createAnnounce(
Expand Down Expand Up @@ -57,7 +57,7 @@ export class AnnouncesService {
imageUrls: string[],
announceNo: number,
): Promise<void> {
const images: AnnounceImage<string>[] = await this.convertImageArray(
const images: AnnounceImage<string>[] = this.convertImageArray(
announceNo,
imageUrls,
);
Expand Down Expand Up @@ -180,10 +180,10 @@ export class AnnouncesService {
}

// functions
private async convertImageArray(
private convertImageArray(
announceNo: number,
imageUrls: string[],
): Promise<AnnounceImage<string>[]> {
): AnnounceImage<string>[] {
const images: AnnounceImage<string>[] = imageUrls.map(
(imageUrl: string) => {
return { announceNo, imageUrl };
Expand All @@ -193,7 +193,10 @@ export class AnnouncesService {
return images;
}

private async validateAdmin(manager: EntityManager, userNo: number) {
private async validateAdmin(
manager: EntityManager,
userNo: number,
): Promise<void> {
const { no }: Users = await manager
.getCustomRepository(UsersRepository)
.getUserByNo(userNo);
Expand Down
1 change: 1 addition & 0 deletions main-project/src/app.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ import * as Joi from 'joi';
EXPIRES_IN: Joi.number().required(),
REFRESH_TOKEN_EXPIRATION: Joi.number().required(),
TOKEN_EXPIRATION: Joi.number().required(),
ADMIN_USER: Joi.number().required(),
}),
}),
CacheModule.register(),
Expand Down
29 changes: 23 additions & 6 deletions main-project/src/boards/boards.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import { ApiTags } from '@nestjs/swagger';
import { BoardsService } from './boards.service';
import { CreateGuestTeamDto } from './dto/create-guest-team.dto';
import { CreateBoardDto } from './dto/create-board.dto';
import { Board } from './interface/boards.interface';
import { Board, GuestTeam, BoardPagenation } from './interface/boards.interface';
import { BoardFilterDto } from './dto/board-filter.dto';
import { Cron, CronExpression } from '@nestjs/schedule/dist';
import { APIResponse } from 'src/common/interface/interface';
Expand All @@ -38,6 +38,8 @@ import { GuestInviteDto } from './dto/guest-invite.dto';
import { ApiDeleteBoard } from './swagger-decorator/delete-board.decorator';
import { ApiDeleteBookmark } from './swagger-decorator/delete-bookmark.decorator';
import { ApiGetBoardsByUser } from './swagger-decorator/get- boards-by-user.decorator';
import { GetBoardByUserDto } from './dto/get-board-by-user.dto';
import { ApiGetGuestTemasByBoardNo } from './swagger-decorator/get-guest-teams-by-board-no.decorator';

@Controller('boards')
@ApiTags('게시글 API')
Expand All @@ -46,7 +48,7 @@ export class BoardsController {
//Cron
@Cron(CronExpression.EVERY_HOUR)
@Patch()
async closeBoard(): Promise<APIResponse> {
async closeBoard(): Promise <APIResponse> {
await this.boardService.closeBoard();

return { msg: 'cron : closeBoard' };
Expand All @@ -61,12 +63,12 @@ export class BoardsController {
@TransactionDecorator() manager: EntityManager,
@Query() boardFilterDto: BoardFilterDto,
): Promise<APIResponse> {
const boards: Board<void>[] = await this.boardService.getBoards(
const boardPagenation: BoardPagenation = await this.boardService.getBoards(
manager,
boardFilterDto,
);

return { msg: '게시글 필터/전체 조회 성공', response: { boards } };
return { msg: '게시글 필터/전체 조회 성공', response: { boardPagenation } };
}

@Get('/:boardNo')
Expand All @@ -90,7 +92,7 @@ export class BoardsController {
@UseInterceptors(TransactionInterceptor)
@ApiGetBoardsByUser()
async getBoardByUser(
@Param('type') type: number,
@Param('type') { type }: GetBoardByUserDto,
@GetUser() userNo: number,
@TransactionDecorator() manager: EntityManager,
): Promise<APIResponse> {
Expand All @@ -103,6 +105,21 @@ export class BoardsController {
return { msg: '유저별 게시글 조회 성공', response: { boards } };
}

@Get('/guest-team/:boardNo')
@UseGuards(JwtAuthGuard)
@UseInterceptors(TransactionInterceptor)
@ApiGetGuestTemasByBoardNo()
async getGuestTeamsByBoardNo(
@Param('boardNo') boardNo: number,
@GetUser() userNo: number,
@TransactionDecorator() manager: EntityManager,
): Promise<APIResponse> {
const guestTeams: GuestTeam<number[]>[] =
await this.boardService.getGuestTeamsByBoardNo(manager, userNo, boardNo);

return { msg: '여름 신청내역 조회 성공', response: { guestTeams } };
}

// Post Methods
@Post()
@UseGuards(JwtAuthGuard)
Expand Down Expand Up @@ -205,7 +222,7 @@ export class BoardsController {
isAccepted,
);

return { msg: '게시글 수락/거절 처리 성공' };
return { msg: '게스트 수락/거절 처리 성공' };
}

// Delete Methods
Expand Down
70 changes: 59 additions & 11 deletions main-project/src/boards/boards.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,13 @@ import { NoticeBoardsRepository } from 'src/notices/repository/notices-board.rep
import { NoticesRepository } from 'src/notices/repository/notices.repository';
import { CreateGuestTeamDto } from './dto/create-guest-team.dto';
import { CreateBoardDto } from './dto/create-board.dto';
import { Guest, Board, Host, GuestTeam } from './interface/boards.interface';
import {
Guest,
Board,
Host,
GuestTeam,
BoardPagenation,
} from './interface/boards.interface';
import { BoardBookmarksRepository } from './repository/board-bookmark.repository';
import { BoardGuestsRepository as BoardGuestsRepository } from './repository/board-guest.repository';
import { BoardHostsRepository } from './repository/board-host.repository';
Expand Down Expand Up @@ -58,18 +64,18 @@ export class BoardsService {
async getBoards(
manager: EntityManager,
filter: BoardFilterDto,
): Promise<Board<void>[]> {
const boards: Board<void>[] = await manager
): Promise<BoardPagenation> {
const boardPagenation: BoardPagenation = await manager
.getCustomRepository(BoardsRepository)
.getBoards(filter);

if (!boards.length) {
if (!boardPagenation.boards.length) {
throw new NotFoundException(
`게시글 전체 조회(getAllBoards-service): 조건에 맞는 게시글이 없습니다.`,
);
}

return boards;
return boardPagenation;
}

async getBoardsByUser(
Expand Down Expand Up @@ -134,6 +140,37 @@ export class BoardsService {
return info;
}

async getGuestTeamsByBoardNo(
manager: EntityManager,
userNo: number,
boardNo: number,
): Promise<GuestTeam<number[]>[]> {
await this.getBoard(manager, boardNo);
await this.validateHost(manager, boardNo, userNo);

const guestTeams: GuestTeam<number[]>[] =
await this.readGuestTeamsByBoardNo(manager, boardNo);

if (!guestTeams.length) {
throw new BadRequestException(
`여름 신청내역 조회(getGuestTeamsByBoardNo-service): 신청내역이 없습니다.`,
);
}

return guestTeams;
}

async readGuestTeamsByBoardNo(
manager: EntityManager,
boardNo: number,
): Promise<GuestTeam<number[]>[]> {
const guestTeams: GuestTeam<number[]>[] = await manager
.getCustomRepository(BoardGuestTeamsRepository)
.getGuestTeamsByBoardNo(boardNo);

return guestTeams;
}

private async getAllGuestsByBoardNo(
manager: EntityManager,
boardNo: number,
Expand Down Expand Up @@ -402,7 +439,7 @@ export class BoardsService {
manager,
boardNo,
);
await this.validateHost(hostUserNo, userNo);
this.validateWriter(hostUserNo, userNo);
await this.removeBoard(manager, boardNo);
}

Expand Down Expand Up @@ -560,7 +597,7 @@ export class BoardsService {
guests: number[],
): Promise<void> {
const type = NoticeType.GUEST_REQUEST_REJECTED;
// TODO:

const notices: SavedNotice[] = guests.map((userNo) => {
return { userNo, targetUserNo, type };
});
Expand Down Expand Up @@ -626,13 +663,24 @@ export class BoardsService {
}
}

private validateWriter(hostUserNo: number, userNo: number): void {
if (userNo != hostUserNo) {
throw new BadRequestException(
`작성자 검증 (validateHost-service): 작성자와 사용자가 일치하지 않습니다.`,
);
}
}

private async validateHost(
hostUserNo: number,
manager: EntityManager,
boardNo: number,
userNo: number,
): Promise<void> {
if (userNo != hostUserNo) {
const { users }: Host<number[]> = await this.getHosts(manager, boardNo);

if (!users.includes(userNo)) {
throw new BadRequestException(
`작성자 검증 (validateHost-service): 작성자와 사용자가 일치하지 않습니다.`,
'호스트 확인(validateHost-service): 해당 게시글의 호스트멤버가 아닙니다.',
);
}
}
Expand Down Expand Up @@ -789,7 +837,7 @@ export class BoardsService {
): Promise<void> {
const board: Board<number[]> = await this.getBoard(manager, boardNo);

await this.validateHost(board.hostUserNo, userNo);
this.validateWriter(board.hostUserNo, userNo);
await this.validateRecruits(manager, board, updateBoardDto);
}
}
9 changes: 8 additions & 1 deletion main-project/src/boards/dto/board-filter.dto.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,12 @@
import { ApiProperty } from '@nestjs/swagger';
import { Type } from 'class-transformer';
import { IsBoolean, IsNumber, IsOptional, IsString } from 'class-validator';
import {
IsBoolean,
IsNumber,
IsOptional,
IsString,
Min,
} from 'class-validator';
import { ValidateGender } from 'src/common/decorator/validateGender.decorator';
import { ToBoolean } from 'src/common/decorator/validateValue.decorator';

Expand Down Expand Up @@ -50,6 +56,7 @@ export class BoardFilterDto {
description: '번개글 :1 or true, 일반 과팅이면 작성 안해도됨',
required: false,
})
@Min(1)
@IsBoolean()
@ToBoolean()
@IsOptional()
Expand Down
17 changes: 17 additions & 0 deletions main-project/src/boards/dto/get-board-by-user.dto.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import { ApiProperty } from '@nestjs/swagger';
import { Type } from 'class-transformer';
import { IsNumber, IsOptional, IsString } from 'class-validator';
import { ValidateGender } from 'src/common/decorator/validateGender.decorator';

export class GetBoardByUserDto {
@ApiProperty({
example: 1,
description:
'게시글 조회 시 유저가 포함된 항목에 따른 조회시를 수행. 1: 작성자로 등록된 게시글, 2: 호스트멤버로 등록된 게시글, 3: 게스트로 등록된 게시글',
required: true,
})
@IsNumber()
@Type(() => Number)
@IsOptional()
readonly type: number;
}
3 changes: 2 additions & 1 deletion main-project/src/boards/dto/guest-invite.dto.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,10 @@ export class GuestInviteDto {
@ApiProperty({
example: true,
description: '여름 참가 시 게스트멤버로 초대받는 것에 대한 수락/거절',
required: true,
})
@IsBoolean()
@ToBoolean()
@IsNotEmpty()
isAccepted: boolean;
readonly isAccepted: boolean;
}
Loading

0 comments on commit 2188d3b

Please sign in to comment.