Skip to content

Commit

Permalink
feat(#60): add interceptors for set success response type in chat-con…
Browse files Browse the repository at this point in the history
…troller and socket-gateway
  • Loading branch information
hobiJeong committed Nov 21, 2023
1 parent ca59a15 commit f19b80c
Show file tree
Hide file tree
Showing 6 changed files with 55 additions and 4 deletions.
2 changes: 2 additions & 0 deletions src/chat/controllers/chat.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down
9 changes: 7 additions & 2 deletions src/chat/events/events.gateway.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,14 @@ import { AsyncApiSub } from 'nestjs-asyncapi';
import {
BadRequestException,
UseFilters,
UseGuards,
UsePipes,
ValidationPipe,
} from '@nestjs/common';
import { LoginChatRoomDto } from '../dto/login-chat-room.dto';
import { WebSocketExceptionFilter } from '../exceptions/websocket-exception.filter';
import mongoose from 'mongoose';
import { WebSocketJwtAccessTokenGuard } from 'src/config/guards/web-socket-jwt-access-token.guard';

@WebSocketGateway({ namespace: /\/ch-.+/, cors: true })
@UsePipes(ValidationPipe)
Expand Down Expand Up @@ -78,17 +80,20 @@ export class EventsGateway
payload: PostChatDto,
},
})
@UseGuards(WebSocketJwtAccessTokenGuard)
@SubscribeMessage('message')
async handleMessage(
@MessageBody() postChatDto: PostChatDto,
@ConnectedSocket() socket: Socket,
) {
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 });
}
}

Expand Down
4 changes: 2 additions & 2 deletions src/chat/services/chat.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -139,15 +139,15 @@ export class ChatService {
receiverId,
);

const chat = {
const data = {
content: returnedChat.content,
sender: returnedChat.sender,
receiver: returnedChat.receiver,
};

if (returnedChat) this.subject.next(returnedChat);

return chat;
return data;
}

async createChatImage(
Expand Down
21 changes: 21 additions & 0 deletions src/common/interceptors/success-response.interceptor.ts
Original file line number Diff line number Diff line change
@@ -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<any> {
const statusCode = context.getArgByIndex(1).statusCode;
return next.handle().pipe(
map((data) => ({
statusCode,
data,
})),
);
}
}
1 change: 1 addition & 0 deletions src/common/s3/s3.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ export class S3Service {

return { url: fileUrl, key: filename };
} catch (error) {
console.error(error);
throw new Error('S3 업로드 오류');
}
}
Expand Down
22 changes: 22 additions & 0 deletions src/config/guards/web-socket-jwt-access-token.guard.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
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;
}
}

0 comments on commit f19b80c

Please sign in to comment.