@@ -2,6 +2,8 @@ import { uploadToS3 } from "../../s3.upload.js";
22import { Server } from "socket.io" ;
33import { stringifyWithBigInt } from "../../bigintJson.js" ;
44import { PrismaClient } from '@prisma/client' ;
5+ import { verifyJwt } from '../../jwt.config.js' ;
6+ import { ChatRepository } from "../repository/chat.repository.js" ;
57
68const prisma = new PrismaClient ( ) ;
79
@@ -10,13 +12,61 @@ export default function setupSocket(server) {
1012 cors : { origin : "*" , methods : [ "GET" , "POST" ] } ,
1113 } ) ;
1214
15+ io . use ( ( socket , next ) => {
16+ try {
17+ const token = socket . handshake . auth ?. token ;
18+ if ( ! token ) {
19+ return next ( new Error ( "Authentication error: Token missing" ) ) ;
20+ }
21+ const user = verifyJwt ( token ) ;
22+ socket . user = user ; // userId, role 등 저장
23+ next ( ) ;
24+ } catch ( err ) {
25+ next ( new Error ( "Authentication error: Invalid token" ) ) ;
26+ }
27+ } ) ;
28+
1329 io . on ( "connection" , ( socket ) => {
1430 console . log ( "User connected:" , socket . id ) ;
1531
1632 // 채팅방 join
17- socket . on ( "join" , ( chatroomId ) => {
33+ socket . on ( "join" , async ( chatroomId ) => {
1834 socket . join ( chatroomId ) ;
19- console . log ( `User ${ socket . id } joined chatroom ${ chatroomId } ` ) ;
35+ console . log ( `User ${ socket . user . userId } joined chatroom ${ chatroomId } ` ) ;
36+
37+ try {
38+ console . log ( socket . user )
39+ const accountId = BigInt ( socket . user . accountId ) ;
40+
41+ // 해당 채팅방의 모든 미확인 메시지에 대해 읽음 처리
42+ const unreadMessages = await prisma . chatMessage . findMany ( {
43+ where : {
44+ chatroomId : BigInt ( chatroomId ) ,
45+ NOT : {
46+ chatMessageReads : {
47+ some : {
48+ accountId : BigInt ( accountId ) ,
49+ read : true ,
50+ } ,
51+ } ,
52+ } ,
53+ } ,
54+ } ) ;
55+
56+ // 읽음 상태 기록 업데이트
57+ await Promise . all (
58+ unreadMessages . map ( ( msg ) =>
59+ ChatRepository . markAsRead ( accountId , msg . id )
60+ )
61+ ) ;
62+
63+ // 필요하면 클라이언트에 읽음 처리 완료 알림 전송
64+ socket . emit ( "read messages success" , { chatroomId } ) ;
65+
66+ } catch ( err ) {
67+ console . error ( "Error marking messages as read:" , err ) ;
68+ socket . emit ( "error" , { message : "읽음 처리 중 오류가 발생했습니다." } ) ;
69+ }
2070 } ) ;
2171
2272 // 메시지 수신
0 commit comments