diff --git a/api/src/Kurs.Platform.Application.Contracts/Classroom/IClassroomAppService.cs b/api/src/Kurs.Platform.Application.Contracts/Classroom/IClassroomAppService.cs index 40452577..5ccec12d 100644 --- a/api/src/Kurs.Platform.Application.Contracts/Classroom/IClassroomAppService.cs +++ b/api/src/Kurs.Platform.Application.Contracts/Classroom/IClassroomAppService.cs @@ -13,8 +13,8 @@ public interface IClassroomAppService : IApplicationService Task GetAsync(Guid id); Task UpdateAsync(Guid id, ClassroomDto input); Task DeleteAsync(Guid id); - Task StartClassAsync(Guid id); - Task EndClassAsync(Guid id); + // Task StartClassAsync(Guid id); + // Task EndClassAsync(Guid id); Task JoinClassAsync(Guid id); Task LeaveClassAsync(Guid id); Task> GetAttendanceAsync(Guid sessionId); diff --git a/api/src/Kurs.Platform.Application/Classroom/ClassroomAppService.cs b/api/src/Kurs.Platform.Application/Classroom/ClassroomAppService.cs index 20a554cd..579282f9 100644 --- a/api/src/Kurs.Platform.Application/Classroom/ClassroomAppService.cs +++ b/api/src/Kurs.Platform.Application/Classroom/ClassroomAppService.cs @@ -5,6 +5,7 @@ using System.Text.Json; using System.Threading.Tasks; using Kurs.Platform.Entities; using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; using Volo.Abp.Application.Dtos; using Volo.Abp.Domain.Repositories; @@ -88,9 +89,15 @@ public class ClassroomAppService : PlatformAppService, IClassroomAppService classSession.Name = input.Name; classSession.Description = input.Description; classSession.Subject = input.Subject; + classSession.TeacherId = input.TeacherId; + classSession.TeacherName = input.TeacherName; classSession.ScheduledStartTime = input.ScheduledStartTime; + classSession.ActualStartTime = input.ActualStartTime; classSession.Duration = input.Duration; classSession.MaxParticipants = input.MaxParticipants; + classSession.IsActive = input.IsActive; + classSession.IsScheduled = input.IsScheduled; + classSession.SettingsJson = JsonSerializer.Serialize(input.SettingsDto); await _classSessionRepository.UpdateAsync(classSession); return ObjectMapper.Map(classSession); @@ -113,7 +120,8 @@ public class ClassroomAppService : PlatformAppService, IClassroomAppService await _classSessionRepository.DeleteAsync(id); } - public async Task StartClassAsync(Guid id) + [HttpPut] + public async Task StartClassroomAsync(Guid id) { var classSession = await _classSessionRepository.GetAsync(id); @@ -127,13 +135,19 @@ public class ClassroomAppService : PlatformAppService, IClassroomAppService throw new InvalidOperationException("Class cannot be started at this time"); } - classSession.StartClass(); + if (classSession.IsActive) + throw new InvalidOperationException("Class is already active"); + + classSession.IsActive = true; + classSession.ActualStartTime = DateTime.Now; + await _classSessionRepository.UpdateAsync(classSession); return ObjectMapper.Map(classSession); } - public async Task EndClassAsync(Guid id) + [HttpPut] + public async Task EndClassroomAsync(Guid id) { var classSession = await _classSessionRepository.GetAsync(id); @@ -142,7 +156,12 @@ public class ClassroomAppService : PlatformAppService, IClassroomAppService throw new UnauthorizedAccessException("Only the teacher can end this class"); } - classSession.EndClass(); + if (!classSession.IsActive) + throw new InvalidOperationException("Class is not active"); + + classSession.IsActive = false; + classSession.EndTime = DateTime.Now; + await _classSessionRepository.UpdateAsync(classSession); // Update attendance records diff --git a/api/src/Kurs.Platform.Domain/Classroom/Classroom.cs b/api/src/Kurs.Platform.Domain/Classroom/Classroom.cs index 3c3bf116..86410337 100644 --- a/api/src/Kurs.Platform.Domain/Classroom/Classroom.cs +++ b/api/src/Kurs.Platform.Domain/Classroom/Classroom.cs @@ -64,27 +64,9 @@ public class Classroom : FullAuditedEntity ChatMessages = new HashSet(); } - public void StartClass() - { - if (IsActive) - throw new InvalidOperationException("Class is already active"); - - IsActive = true; - ActualStartTime = DateTime.UtcNow; - } - - public void EndClass() - { - if (!IsActive) - throw new InvalidOperationException("Class is not active"); - - IsActive = false; - EndTime = DateTime.UtcNow; - } - public bool CanJoin() { - var now = DateTime.UtcNow; + var now = DateTime.Now; var tenMinutesBefore = ScheduledStartTime.AddMinutes(-10); var twoHoursAfter = ScheduledStartTime.AddHours(2); diff --git a/ui/src/proxy/classroom/models.ts b/ui/src/proxy/classroom/models.ts index 61abfbdc..69b1218d 100644 --- a/ui/src/proxy/classroom/models.ts +++ b/ui/src/proxy/classroom/models.ts @@ -25,7 +25,7 @@ export interface ClassroomDto { isScheduled: boolean participantCount: number canJoin: boolean - settings?: ClassroomSettingsDto + settingsDto?: ClassroomSettingsDto } export interface ClassroomSettingsDto { diff --git a/ui/src/services/classroom.service.ts b/ui/src/services/classroom.service.ts index 4dbd3e4d..80fa961a 100644 --- a/ui/src/services/classroom.service.ts +++ b/ui/src/services/classroom.service.ts @@ -35,3 +35,15 @@ export const deleteClassroom = (id: string) => method: 'DELETE', url: `/api/app/classroom/${id}`, }) + +export const startClassroom = (id: string) => + apiService.fetchData({ + method: 'PUT', + url: `/api/app/${id}/start-classroom`, + }) + +export const endClassroom = (id: string) => + apiService.fetchData({ + method: 'PUT', + url: `/api/app/${id}/end-classroom`, + }) diff --git a/ui/src/utils/dateUtils.ts b/ui/src/utils/dateUtils.ts new file mode 100644 index 00000000..586f2b79 --- /dev/null +++ b/ui/src/utils/dateUtils.ts @@ -0,0 +1,7 @@ +// Veritabanındaki tarihi olduğu gibi göstermek için yardımcı fonksiyon +export function showDbDateAsIs(dateStr: string) { + if (!dateStr) return '' + // ISO formatı veya '2025-08-27 14:15:00.0000000' gibi formatlar için + // Sadece ilk 19 karakteri (YYYY-MM-DD HH:mm:ss) al + return dateStr.replace('T', ' ').substring(0, 19) +} diff --git a/ui/src/views/classroom/ClassList.tsx b/ui/src/views/classroom/ClassList.tsx index 2ab6316c..83923ab7 100644 --- a/ui/src/views/classroom/ClassList.tsx +++ b/ui/src/views/classroom/ClassList.tsx @@ -1,4 +1,5 @@ import React, { useEffect, useState } from 'react' +import { showDbDateAsIs } from '@/utils/dateUtils' import { useNavigate } from 'react-router-dom' import { motion } from 'framer-motion' import { @@ -20,6 +21,7 @@ import { createClassroom, deleteClassroom, getClassrooms, + startClassroom, updateClassroom, } from '@/services/classroom.service' @@ -41,7 +43,7 @@ const ClassList: React.FC = () => { isScheduled: true, participantCount: 0, canJoin: false, - settings: { + settingsDto: { allowHandRaise: true, allowStudentChat: true, allowPrivateMessages: true, @@ -67,7 +69,15 @@ const ClassList: React.FC = () => { maxResultCount, }) - setClassList(result.data.items || []) + const items = (result.data.items || []).map((item) => ({ + ...item, + scheduledStartTime: item.scheduledStartTime + ? showDbDateAsIs(item.scheduledStartTime) + : null, + actualStartTime: item.actualStartTime ? showDbDateAsIs(item.actualStartTime) : null, + })) as ClassroomDto[] + + setClassList(items) } catch (error) { console.error('Error fetching classrooms:', error) } @@ -138,17 +148,12 @@ const ClassList: React.FC = () => { setClassroom(newClassEntity) } - const handleStartClass = (classSession: ClassroomDto) => { - const updatedClass = { - ...classSession, - isActive: true, - actualStartTime: new Date().toISOString(), - } - + const handleStartClass = async (classSession: ClassroomDto) => { + await startClassroom(classSession.id!) getClassroomList() - if (updatedClass.id) { - navigate(ROUTES_ENUM.protected.admin.classroom.classroom.replace(':id', updatedClass.id)) + if (classSession.id) { + navigate(ROUTES_ENUM.protected.admin.classroom.classroom.replace(':id', classSession.id)) } } @@ -186,16 +191,6 @@ const ClassList: React.FC = () => { return `${minutes}d kaldı` } - const formatDateTime = (dateString: string) => { - return new Date(dateString).toLocaleString('tr-TR', { - day: '2-digit', - month: '2-digit', - year: 'numeric', - hour: '2-digit', - minute: '2-digit', - }) - } - return ( {/* Main Content */} @@ -377,7 +372,7 @@ const ClassList: React.FC = () => {
- {formatDateTime(classSession.scheduledStartTime)} + {showDbDateAsIs(classSession.scheduledStartTime)}
@@ -536,12 +531,12 @@ const ClassList: React.FC = () => {