From b3415a42225cf28f216b357cd454c798a75d088a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sedat=20=C3=96zt=C3=BCrk?= Date: Sun, 31 Aug 2025 10:32:26 +0300 Subject: [PATCH] =?UTF-8?q?Classroom=20g=C3=BCncellemesi=20hatalar=20i?= =?UTF-8?q?=C3=A7in?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Classroom/ClassroomHub.cs | 16 +++++++++++----- .../Classroom/CustomUserIdProvider.cs | 7 +++++-- ui/src/services/classroom/signalr.ts | 6 +++++- 3 files changed, 21 insertions(+), 8 deletions(-) diff --git a/api/src/Kurs.Platform.HttpApi.Host/Classroom/ClassroomHub.cs b/api/src/Kurs.Platform.HttpApi.Host/Classroom/ClassroomHub.cs index 8f00fa7f..b4680bc9 100644 --- a/api/src/Kurs.Platform.HttpApi.Host/Classroom/ClassroomHub.cs +++ b/api/src/Kurs.Platform.HttpApi.Host/Classroom/ClassroomHub.cs @@ -129,12 +129,22 @@ public class ClassroomHub : Hub ? new ClassroomSettingsDto() : JsonSerializer.Deserialize(classroom.SettingsJson); - initialMuteState = !isTeacher && classroomSettings.AutoMuteNewParticipants ? true : classroomSettings.DefaultMicrophoneState == "muted"; + initialMuteState = !isTeacher && classroomSettings.AutoMuteNewParticipants + ? true + : classroomSettings.DefaultMicrophoneState == "muted"; var participant = await _participantRepository.FirstOrDefaultAsync( x => x.SessionId == sessionId && x.UserId == userId ); + // 🚨 Kick edilmiş kullanıcı tekrar giriş yapamaz + if (participant != null && !participant.IsActive) + { + await Clients.Caller.SendAsync("Error", "You are not allowed to rejoin this class."); + Context.Abort(); // bağlantıyı anında kapat + return; + } + if (participant == null) { participant = new ClassroomParticipant( @@ -458,10 +468,6 @@ public class ClassroomHub : Hub { try { - // Eğer bağlantı zaten iptal edilmişse boşuna uğraşma - if (Context.ConnectionAborted.IsCancellationRequested) - return; - var userId = _currentUser.Id; if (!userId.HasValue) { diff --git a/api/src/Kurs.Platform.HttpApi.Host/Classroom/CustomUserIdProvider.cs b/api/src/Kurs.Platform.HttpApi.Host/Classroom/CustomUserIdProvider.cs index 4e466d86..c143c7ba 100644 --- a/api/src/Kurs.Platform.HttpApi.Host/Classroom/CustomUserIdProvider.cs +++ b/api/src/Kurs.Platform.HttpApi.Host/Classroom/CustomUserIdProvider.cs @@ -1,11 +1,14 @@ +using System.Security.Claims; using Microsoft.AspNetCore.SignalR; namespace Kurs.Platform.Classrooms; public class CustomUserIdProvider : IUserIdProvider { - public string GetUserId(HubConnectionContext connection) + public string? GetUserId(HubConnectionContext connection) { - return connection.User?.FindFirst("sub")?.Value; + return connection.User?.FindFirst("sub")?.Value + ?? connection.User?.FindFirst(ClaimTypes.NameIdentifier)?.Value; } + } diff --git a/ui/src/services/classroom/signalr.ts b/ui/src/services/classroom/signalr.ts index b6ef1f5e..7028c59b 100644 --- a/ui/src/services/classroom/signalr.ts +++ b/ui/src/services/classroom/signalr.ts @@ -39,7 +39,7 @@ export class SignalRService { .withUrl(`${import.meta.env.VITE_API_URL}/classroomhub`, { accessTokenFactory: () => auth.session.token || '', }) - .withAutomaticReconnect() + //.withAutomaticReconnect() .configureLogging(signalR.LogLevel.Information) .build() @@ -127,6 +127,10 @@ export class SignalRService { } }) + //2. tane problem var. + //1. problem kick yapamıyorum + //2. Öğrenci veya öğretmen farklı bir sayfaya gidince ekranda donuk şekilde duruyor. + this.connection.on('ForceDisconnect', async (message: string) => { console.warn('⚠️ ForceDisconnect received:', message)