diff --git a/src/chat/controllers/chat.controller.ts b/src/chat/controllers/chat.controller.ts index e6c7551..fef9acd 100644 --- a/src/chat/controllers/chat.controller.ts +++ b/src/chat/controllers/chat.controller.ts @@ -31,9 +31,11 @@ import { JwtAccessTokenGuard } from 'src/config/guards/jwt-access-token.guard'; import { GetNotificationsResponseDto } from '../dto/get-notifications-response.dto'; import { ApiGetChatNotifications } from '../swagger-decorators/get-chat-notifications.decorator'; import { ApiCreateChatImage } from '../swagger-decorators/create-chat-image.decorators'; +import { SuccessResponseInterceptor } from 'src/common/interceptors/success-response.interceptor'; @ApiTags('CHAT') @UsePipes(ValidationPipe) +@UseInterceptors(SuccessResponseInterceptor) @Controller('chat-room') export class ChatController { constructor( diff --git a/src/chat/events/events.gateway.ts b/src/chat/events/events.gateway.ts index 031b6bb..271a33a 100644 --- a/src/chat/events/events.gateway.ts +++ b/src/chat/events/events.gateway.ts @@ -21,7 +21,6 @@ import { import { LoginChatRoomDto } from '../dto/login-chat-room.dto'; import { WebSocketExceptionFilter } from '../exceptions/websocket-exception.filter'; import mongoose from 'mongoose'; - @WebSocketGateway({ namespace: /\/ch-.+/, cors: true }) @UsePipes(ValidationPipe) @UseFilters(WebSocketExceptionFilter) @@ -85,10 +84,12 @@ export class EventsGateway ) { if (postChatDto.hasOwnProperty('content')) { const returnedChat = await this.chatService.createChat(postChatDto); - socket.to(postChatDto.roomId.toString()).emit('message', returnedChat); + const data = returnedChat; + socket.to(postChatDto.roomId.toString()).emit('message', { data }); } else { const returnedChat = await this.chatService.findChatImage(postChatDto); - socket.to(postChatDto.roomId.toString()).emit('message', returnedChat); + const data = returnedChat; + socket.to(postChatDto.roomId.toString()).emit('message', { data }); } } diff --git a/src/common/interceptors/success-response.interceptor.ts b/src/common/interceptors/success-response.interceptor.ts new file mode 100644 index 0000000..776bad4 --- /dev/null +++ b/src/common/interceptors/success-response.interceptor.ts @@ -0,0 +1,21 @@ +import { + Injectable, + NestInterceptor, + ExecutionContext, + CallHandler, +} from '@nestjs/common'; +import { Observable } from 'rxjs'; +import { map } from 'rxjs/operators'; + +@Injectable() +export class SuccessResponseInterceptor implements NestInterceptor { + intercept(context: ExecutionContext, next: CallHandler): Observable { + const statusCode = context.getArgByIndex(1).statusCode; + return next.handle().pipe( + map((data) => ({ + statusCode, + data, + })), + ); + } +} diff --git a/src/common/s3/s3.service.ts b/src/common/s3/s3.service.ts index 220992f..3a35a7f 100644 --- a/src/common/s3/s3.service.ts +++ b/src/common/s3/s3.service.ts @@ -44,6 +44,7 @@ export class S3Service { return { url: fileUrl, key: filename }; } catch (error) { + console.error(error); throw new Error('S3 업로드 오류'); } } diff --git a/src/config/guards/web-socket-jwt-access-token.guard.ts b/src/config/guards/web-socket-jwt-access-token.guard.ts new file mode 100644 index 0000000..1ddd98f --- /dev/null +++ b/src/config/guards/web-socket-jwt-access-token.guard.ts @@ -0,0 +1,35 @@ +// import { ExecutionContext, Injectable } from '@nestjs/common'; +// import { TokenService } from 'src/auth/services/token.service'; + +// @Injectable() +// export class WebSocketJwtAccessTokenGuard { +// constructor(private tokenService: TokenService) {} + +// async canActivate(context: ExecutionContext) { +// const request = context.switchToWs().getClient().handshake; +// const accessToken = request.headers['access_token']; + +// if (!accessToken) { +// return false; +// } + +// const userId = await this.tokenService.decodeToken(accessToken); +// request.user = { userId }; +// console.log(request.user); + +// return true; +// } +// } + +import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common'; +import { Observable } from 'rxjs'; + +@Injectable() +export class AuthGuard implements CanActivate { + canActivate( + context: ExecutionContext, + ): boolean | Promise | Observable { + const request = context.switchToHttp().getRequest(); + return true; + } +}