-
Notifications
You must be signed in to change notification settings - Fork 6
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #312 from boostcampwm2023/feature/socket-io
[Feat] 채팅 기능 개발
- Loading branch information
Showing
60 changed files
with
1,595 additions
and
153 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,60 @@ | ||
# Node.js 기본 이미지 | ||
FROM node:20.9.0-alpine as builder | ||
|
||
# 작업 디렉토리 설정 | ||
WORKDIR /app | ||
|
||
# 루트의 package.json 파일 복사 | ||
COPY package*.json ./ | ||
|
||
# packages 폴더의 내용 복사 | ||
# packages 폴더가 여러 개 있을 경우, 필요에 따라 추가 복사 | ||
COPY packages ./packages | ||
|
||
# # app/backend 폴더의 내용 복사 | ||
COPY app/backend ./app/backend | ||
|
||
# 의존성 설치 | ||
RUN npm ci | ||
|
||
# app/backend 폴더로 이동 | ||
WORKDIR /app/app/backend | ||
|
||
# 애플리케이션 빌드 | ||
RUN npx prisma generate | ||
RUN npm run build | ||
|
||
# .env 파일이 있으면 복사, 없으면 빈 파일 생성 | ||
RUN if [ ! -f ./.env ]; then \ | ||
touch ./.env; \ | ||
fi | ||
|
||
# 실행을 위한 최종 스테이지 | ||
FROM node:20.9.0-alpine as runner | ||
|
||
# 필요한 도구 설치 | ||
RUN apk add --no-cache netcat-openbsd | ||
|
||
WORKDIR /app | ||
|
||
# 빌더 스테이지에서 필요한 파일만 복사 | ||
COPY --from=builder /app/app/backend/dist /app/dist | ||
COPY --from=builder /app/app/backend/prisma /app/prisma | ||
COPY --from=builder /app/node_modules /app/node_modules | ||
COPY --from=builder /app/packages /app/packages | ||
COPY --from=builder /app/app/backend/.env /app/app/backend/.env | ||
|
||
# 필요한 경우, 런타임에 필요한 추가 파일 복사 | ||
# 예: 환경변수 파일, 정적 파일 등 | ||
|
||
# 애플리케이션 실행 | ||
COPY app/backend/wait-for-it.sh /wait-for-it.sh | ||
COPY app/backend/docker-entrypoint.sh /docker-entrypoint.sh | ||
RUN chmod +x /wait-for-it.sh | ||
RUN chmod +x /docker-entrypoint.sh | ||
|
||
# 윈도우 개행문자 회피 | ||
RUN sed -i 's/\r//' /wait-for-it.sh | ||
RUN sed -i 's/\r//' /docker-entrypoint.sh | ||
|
||
CMD ["/wait-for-it.sh", "db:3306", "--", "/docker-entrypoint.sh"] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,68 @@ | ||
import { WebSocketGateway, WebSocketServer, SubscribeMessage, ConnectedSocket, MessageBody } from '@nestjs/websockets'; | ||
import { Server } from 'socket.io'; | ||
import { AuthUser } from '@morak/chat/dist/server/decorator/user.decorator'; | ||
import { JoinRoom, LeaveRoom } from '@morak/chat/dist/server/decorator/room.decorator'; | ||
import { ChatMessage } from '@morak/chat/dist/server/decorator/message.decorator'; | ||
import { RequestGetPrevChatMessage, StatusCode } from '@morak/chat/dist/interface/message.interface'; | ||
import { getSecret } from '@morak/vault'; | ||
import ChatService from './chat.service'; | ||
import { User } from '@morak/chat/src/interface/user.interface'; | ||
import { Socket } from 'dgram'; | ||
import { UseGuards } from '@nestjs/common'; | ||
import { ChatGuard } from './chat.guard'; | ||
|
||
const port = parseInt(getSecret('SOCKET_PORT'), 10); | ||
|
||
@WebSocketGateway(port, { | ||
namespace: 'chat', | ||
cors: { origin: '*' }, | ||
transports: ['websocket'], | ||
}) | ||
class ChatGateway { | ||
@WebSocketServer() server: Server; | ||
constructor(private readonly chatService: ChatService) {} | ||
|
||
@UseGuards(ChatGuard) | ||
@SubscribeMessage('joinRoom') | ||
joinRoom(@ConnectedSocket() client: Socket, @AuthUser() user: User, @JoinRoom() room: string) { | ||
// 231203 ccxz84 | chat logging 유저 룸 떠나기 메시지 로깅 필요 | ||
try { | ||
// 231205 ccxz84 | chat error 유저 룸 조인 에러 체크를 위한 try catch | ||
client.emit('postJoinRoom', StatusCode.success, 'join Room Success'); | ||
} catch (error) { | ||
client.emit('postJoinRoom', StatusCode.error, 'join Room Error'); | ||
} | ||
} | ||
|
||
@SubscribeMessage('leaveRoom') | ||
leaveRoom(@AuthUser() user: User, @LeaveRoom() room: string) { | ||
// 231203 ccxz84 | chat logging 유저 룸 떠나기 메시지 로깅 필요 | ||
console.log(`${user} leave ${room}`); | ||
} | ||
|
||
@SubscribeMessage('chatMessage') | ||
handleMessage(@AuthUser() user: User, @ChatMessage() message) { | ||
this.chatService.writeMessageDB(message); | ||
this.server.to(message.room).emit('chat', StatusCode.success, message); | ||
} | ||
|
||
@SubscribeMessage('requestPrevMessage') | ||
getPrevMessages(@ConnectedSocket() client: Socket, @MessageBody() data: RequestGetPrevChatMessage) { | ||
try { | ||
if (data.room && data.cursorDate) { | ||
const messages = this.chatService.loadMessageDB(data.room, data.cursorDate); | ||
messages.then((data) => { | ||
client.emit('receivePrevMessage', StatusCode.success, data); | ||
}); | ||
} | ||
} catch (error) { | ||
client.emit('receivePrevMessage', StatusCode.error, 'Get Chat Message Error'); | ||
} | ||
} | ||
|
||
afterInit(server: Server) { | ||
console.log('웹소켓 서버 초기화 ✅'); | ||
} | ||
} | ||
|
||
export default ChatGateway; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
import { Injectable, CanActivate, ExecutionContext } from "@nestjs/common"; | ||
import ChatService from "./chat.service"; | ||
|
||
@Injectable() | ||
export class ChatGuard implements CanActivate { | ||
constructor(private chatService: ChatService) {} | ||
|
||
async canActivate(context: ExecutionContext): Promise<boolean> { | ||
const message = context.switchToWs().getData(); | ||
|
||
if (!message || !message.room || !message.user) { | ||
return false; | ||
} | ||
|
||
const { user, room } = message; | ||
|
||
return await this.chatService.isUserInGroup(room, user); | ||
} | ||
} |
Oops, something went wrong.