From bbd2f338b65a6df58a9b2f89f60c2c01aed4adcd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sedat=20=C3=96zt=C3=BCrk?= Date: Sun, 31 Aug 2025 22:56:51 +0300 Subject: [PATCH] =?UTF-8?q?Hata=20bulunamad=C4=B1=20Loglar=20dahil=20edild?= =?UTF-8?q?i.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Classroom/ClassroomHub.cs | 13 ++++++++++--- ui/src/services/classroom/signalr.tsx | 13 ++++++++++--- ui/src/views/classroom/RoomDetail.tsx | 7 ++++--- 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/api/src/Kurs.Platform.HttpApi.Host/Classroom/ClassroomHub.cs b/api/src/Kurs.Platform.HttpApi.Host/Classroom/ClassroomHub.cs index 72053081..2b9abbd1 100644 --- a/api/src/Kurs.Platform.HttpApi.Host/Classroom/ClassroomHub.cs +++ b/api/src/Kurs.Platform.HttpApi.Host/Classroom/ClassroomHub.cs @@ -117,6 +117,8 @@ public class ClassroomHub : Hub [HubMethodName("JoinClass")] public async Task JoinClassAsync(Guid sessionId, Guid userId, string userName, bool isTeacher, bool isActive) { + _logger.LogInformation("🔵 JoinClass çağrıldı: User={UserId}, Session={SessionId}, IsTeacher={IsTeacher}", userId, sessionId, isTeacher); + var classroom = await _classSessionRepository.GetAsync(sessionId); if (classroom == null) { @@ -398,14 +400,17 @@ public class ClassroomHub : Hub x => x.SessionId == sessionId && x.UserId == participantId ); + _logger.LogInformation("👢 KickParticipant çağrıldı: Session={SessionId}, Target={ParticipantId}", sessionId, participantId); + if (participant == null) { - _logger.LogWarning( - "KickParticipant: Session {SessionId} için participant {ParticipantId} bulunamadı", - sessionId, participantId); + _logger.LogWarning("⚠️ KickParticipant: participant bulunamadı (Session={SessionId}, Target={ParticipantId})", sessionId, participantId); return; } + _logger.LogInformation("✅ Kick öncesi durum: IsActive={IsActive}, IsKicked={IsKicked}, ConnId={ConnId}", participant.IsActive, participant.IsKicked, participant.ConnectionId); + + // ConnectionId'yi cache et (null yazmadan önce) var connectionId = participant.ConnectionId; @@ -519,6 +524,8 @@ public class ClassroomHub : Hub return; } + _logger.LogInformation("🔴 OnDisconnectedAsync: User={UserId}, ConnId={ConnId}, Exception={Exception}", userId, Context.ConnectionId, exception?.Message); + // 🔑 Aynı anda birden fazla session olabilir (tab senaryosu) var participants = await _participantRepository .GetListAsync(x => x.UserId == userId.Value && x.ConnectionId == Context.ConnectionId); diff --git a/ui/src/services/classroom/signalr.tsx b/ui/src/services/classroom/signalr.tsx index 81fd3dc9..fa8f7765 100644 --- a/ui/src/services/classroom/signalr.tsx +++ b/ui/src/services/classroom/signalr.tsx @@ -102,7 +102,8 @@ export class SignalRService { this.connection.onreconnected(async () => { this.isConnected = true - console.warn('🔄 SignalR reconnected') + console.log("🔄 SignalR reconnected. currentSessionId=", this.currentSessionId) + toast.push(, { placement: 'top-center', }) @@ -115,7 +116,7 @@ export class SignalRService { }) this.connection.onclose(async (err) => { - console.warn('🔥 onclose triggered, isKicked=', this.isKicked) + console.warn("🔥 onclose triggered", { isKicked: this.isKicked, error: err }) if (this.isKicked) { toast.push( @@ -158,7 +159,8 @@ export class SignalRService { }) this.connection.on('ForceDisconnect', async (message: string) => { - console.warn('🚨 ForceDisconnect geldi:', message) + console.warn("🚨 ForceDisconnect event alındı", message) + this.isKicked = true toast.push(, { placement: 'top-center', @@ -191,6 +193,8 @@ export class SignalRService { async start(): Promise { try { + console.log('🔌 SignalR start() çağrıldı') + const startPromise = this.connection.start() const timeout = new Promise((_, reject) => setTimeout(() => reject(new Error('Bağlantı zaman aşımına uğradı')), 10000), @@ -221,6 +225,7 @@ export class SignalRService { console.log('Error starting SignalR connection join class for', userName) return } + console.log(`📡 joinClass: sessionId=${sessionId}, userId=${userId}, isTeacher=${isTeacher}`) //Global değişkene yazılıyor. this.currentSessionId = sessionId @@ -426,6 +431,8 @@ export class SignalRService { return } + console.log(`👢 kickParticipant çağrıldı: sessionId=${sessionId}, participantId=${participantId}`) + try { await this.connection.invoke('KickParticipant', sessionId, participantId) } catch (error) { diff --git a/ui/src/views/classroom/RoomDetail.tsx b/ui/src/views/classroom/RoomDetail.tsx index f44d9f73..3000ee3f 100644 --- a/ui/src/views/classroom/RoomDetail.tsx +++ b/ui/src/views/classroom/RoomDetail.tsx @@ -364,7 +364,8 @@ const RoomDetail: React.FC = () => { }) signalRServiceRef.current.setParticipantLeaveHandler(({ userId, sessionId }) => { - console.log(`Participant left: ${userId} from session ${sessionId}`) + console.log(`👋 Participant left handler: ${userId}, sessionId=${sessionId}`) + toast.push( p.id === userId)?.name}`} type="warning" />, { placement: 'top-center', }) @@ -560,9 +561,9 @@ const RoomDetail: React.FC = () => { const handleKickParticipant = async (participantId: string) => { if (signalRServiceRef.current && user.role === 'teacher') { + console.log(`👢 handleKickParticipant UI’den çağrıldı: ${participantId}`) + await signalRServiceRef.current.kickParticipant(classSession.id, participantId) - // ❌ state’den manuel silme yok - // attendance update kısmı aynı kalabilir setAttendanceRecords((prev) => prev.map((r) => { if (r.studentId === participantId && !r.leaveTime) {