From 22742966f14ea4ed2700076c844ce3afb381584d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sedat=20=C3=96zt=C3=BCrk?= Date: Sun, 31 Aug 2025 02:15:49 +0300 Subject: [PATCH] =?UTF-8?q?Classroom=20g=C3=BCncellemesi?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Classroom/ClassroomHub.cs | 16 +++++----------- ui/src/services/classroom/signalr.ts | 15 ++++++++++++++- 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/api/src/Kurs.Platform.HttpApi.Host/Classroom/ClassroomHub.cs b/api/src/Kurs.Platform.HttpApi.Host/Classroom/ClassroomHub.cs index 3c89ae66..8f00fa7f 100644 --- a/api/src/Kurs.Platform.HttpApi.Host/Classroom/ClassroomHub.cs +++ b/api/src/Kurs.Platform.HttpApi.Host/Classroom/ClassroomHub.cs @@ -376,20 +376,14 @@ public class ClassroomHub : Hub x => x.SessionId == sessionId && x.UserId == participantId ); - if (participant != null) + if (participant != null && !string.IsNullOrEmpty(participant.ConnectionId)) { - // Önce SignalR grubundan çıkar - if (!string.IsNullOrEmpty(participant.ConnectionId)) - { - // Kullanıcıya "zorunlu çıkış" sinyali gönder - await Clients.Client(participant.ConnectionId) - .SendAsync("ForceDisconnect", "You have been removed from the class."); + await Clients.Client(participant.ConnectionId) + .SendAsync("ForceDisconnect", "You have been removed from the class."); - await Groups.RemoveFromGroupAsync(participant.ConnectionId, sessionId.ToString()); - } - - // DB’de pasife al + await Groups.RemoveFromGroupAsync(participant.ConnectionId, sessionId.ToString()); await DeactivateParticipantAsync(participant); + await Clients.Group(sessionId.ToString()).SendAsync("ParticipantLeft", participantId); } // 3. Diğerlerine duyur diff --git a/ui/src/services/classroom/signalr.ts b/ui/src/services/classroom/signalr.ts index 0d38490f..b6ef1f5e 100644 --- a/ui/src/services/classroom/signalr.ts +++ b/ui/src/services/classroom/signalr.ts @@ -12,6 +12,7 @@ export class SignalRService { private connection!: signalR.HubConnection private isConnected: boolean = false private currentSessionId?: string + private isKicked: boolean = false private onAttendanceUpdate?: (record: ClassroomAttendanceDto) => void private onParticipantJoined?: ( @@ -117,10 +118,22 @@ export class SignalRService { console.error('Hub error:', message) }) + this.connection.onreconnecting((err) => { + if (this.isKicked) { + console.warn('Reconnect blocked because user was kicked') + // ❌ otomatik reconnect'i iptal etmek için stop çağır + this.connection.stop() + throw new Error('Reconnect blocked after kick') + } + }) + this.connection.on('ForceDisconnect', async (message: string) => { console.warn('⚠️ ForceDisconnect received:', message) - await this.disconnect() + this.isKicked = true // ✅ kick yediğini işaretle + await this.connection.stop() + this.isConnected = false + window.location.href = ROUTES_ENUM.protected.admin.classroom.classes }) }