VirtualClass -> Classroom

This commit is contained in:
Sedat ÖZTÜRK 2025-08-26 08:59:39 +03:00
parent 41f972c727
commit 217c68b853
18 changed files with 619 additions and 619 deletions

View file

@ -1,8 +1,8 @@
using System;
namespace Kurs.Platform.VirtualClassrooms;
namespace Kurs.Platform.Classrooms;
public class ChatMessageDto
public class ClassChatDto
{
public Guid Id { get; set; }
public Guid SessionId { get; set; }

View file

@ -0,0 +1,16 @@
using System;
namespace Kurs.Platform.Classrooms;
public class ClassParticipantDto
{
public Guid Id { get; set; }
public Guid SessionId { get; set; }
public Guid UserId { get; set; }
public string UserName { get; set; }
public string UserEmail { get; set; }
public bool IsTeacher { get; set; }
public bool IsAudioMuted { get; set; }
public bool IsVideoMuted { get; set; }
public DateTime JoinTime { get; set; }
}

View file

@ -1,9 +1,9 @@
using System;
using Volo.Abp.Application.Dtos;
namespace Kurs.Platform.VirtualClassrooms;
namespace Kurs.Platform.Classrooms;
public class ClassSessionDto : FullAuditedEntityDto<Guid>
public class ClassroomDto : FullAuditedEntityDto<Guid>
{
public string Name { get; set; }
public string Description { get; set; }
@ -21,7 +21,7 @@ public class ClassSessionDto : FullAuditedEntityDto<Guid>
public bool CanJoin { get; set; }
}
public class CreateClassSessionDto
public class CreateClassroomDto
{
public string Name { get; set; }
public string Description { get; set; }
@ -31,7 +31,7 @@ public class CreateClassSessionDto
public int MaxParticipants { get; set; } = 30;
}
public class UpdateClassSessionDto
public class UpdateClassroomDto
{
public string Name { get; set; }
public string Description { get; set; }
@ -41,13 +41,13 @@ public class UpdateClassSessionDto
public int MaxParticipants { get; set; }
}
public class GetClassSessionListDto : PagedAndSortedResultRequestDto
public class GetClassroomListDto : PagedAndSortedResultRequestDto
{
public bool? IsActive { get; set; }
public Guid? TeacherId { get; set; }
}
public class AttendanceRecordDto : EntityDto<Guid>
public class ClassAttendanceDto : EntityDto<Guid>
{
public Guid SessionId { get; set; }
public Guid StudentId { get; set; }

View file

@ -0,0 +1,21 @@
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
namespace Kurs.Platform.Classrooms;
public interface IClassroomAppService : IApplicationService
{
Task<ClassroomDto> CreateAsync(CreateClassroomDto input);
Task<PagedResultDto<ClassroomDto>> GetListAsync(GetClassroomListDto input);
Task<ClassroomDto> GetAsync(Guid id);
Task<ClassroomDto> UpdateAsync(Guid id, UpdateClassroomDto input);
Task DeleteAsync(Guid id);
Task<ClassroomDto> StartClassAsync(Guid id);
Task EndClassAsync(Guid id);
Task<ClassroomDto> JoinClassAsync(Guid id);
Task LeaveClassAsync(Guid id);
Task<List<ClassAttendanceDto>> GetAttendanceAsync(Guid sessionId);
}

View file

@ -1,21 +0,0 @@
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
namespace Kurs.Platform.VirtualClassrooms;
public interface IVirtualClassAppService : IApplicationService
{
Task<ClassSessionDto> CreateAsync(CreateClassSessionDto input);
Task<PagedResultDto<ClassSessionDto>> GetListAsync(GetClassSessionListDto input);
Task<ClassSessionDto> GetAsync(Guid id);
Task<ClassSessionDto> UpdateAsync(Guid id, UpdateClassSessionDto input);
Task DeleteAsync(Guid id);
Task<ClassSessionDto> StartClassAsync(Guid id);
Task EndClassAsync(Guid id);
Task<ClassSessionDto> JoinClassAsync(Guid id);
Task LeaveClassAsync(Guid id);
Task<List<AttendanceRecordDto>> GetAttendanceAsync(Guid sessionId);
}

View file

@ -1,16 +0,0 @@
using System;
namespace Kurs.Platform.VirtualClassrooms;
public class ParticipantDto
{
public Guid Id { get; set; }
public Guid SessionId { get; set; }
public Guid UserId { get; set; }
public string UserName { get; set; }
public string UserEmail { get; set; }
public bool IsTeacher { get; set; }
public bool IsAudioMuted { get; set; }
public bool IsVideoMuted { get; set; }
public DateTime JoinTime { get; set; }
}

View file

@ -7,28 +7,28 @@ using Microsoft.AspNetCore.Authorization;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Domain.Repositories;
namespace Kurs.Platform.VirtualClassrooms;
namespace Kurs.Platform.Classrooms;
[Authorize]
public class VirtualClassAppService : PlatformAppService, IVirtualClassAppService
public class ClassroomAppService : PlatformAppService, IClassroomAppService
{
private readonly IRepository<ClassSession, Guid> _classSessionRepository;
private readonly IRepository<Participant, Guid> _participantRepository;
private readonly IRepository<AttendanceRecord, Guid> _attendanceRepository;
private readonly IRepository<Classroom, Guid> _classSessionRepository;
private readonly IRepository<ClassParticipant, Guid> _participantRepository;
private readonly IRepository<ClassAttandance, Guid> _attendanceRepository;
public VirtualClassAppService(
IRepository<ClassSession, Guid> classSessionRepository,
IRepository<Participant, Guid> participantRepository,
IRepository<AttendanceRecord, Guid> attendanceRepository)
public ClassroomAppService(
IRepository<Classroom, Guid> classSessionRepository,
IRepository<ClassParticipant, Guid> participantRepository,
IRepository<ClassAttandance, Guid> attendanceRepository)
{
_classSessionRepository = classSessionRepository;
_participantRepository = participantRepository;
_attendanceRepository = attendanceRepository;
}
public async Task<ClassSessionDto> CreateAsync(CreateClassSessionDto input)
public async Task<ClassroomDto> CreateAsync(CreateClassroomDto input)
{
var classSession = new ClassSession(
var classSession = new Classroom(
GuidGenerator.Create(),
input.Name,
input.Description,
@ -43,10 +43,10 @@ public class VirtualClassAppService : PlatformAppService, IVirtualClassAppServic
await _classSessionRepository.InsertAsync(classSession);
await CurrentUnitOfWork.SaveChangesAsync();
return ObjectMapper.Map<ClassSession, ClassSessionDto>(classSession);
return ObjectMapper.Map<Classroom, ClassroomDto>(classSession);
}
public async Task<PagedResultDto<ClassSessionDto>> GetListAsync(GetClassSessionListDto input)
public async Task<PagedResultDto<ClassroomDto>> GetListAsync(GetClassroomListDto input)
{
var query = await _classSessionRepository.GetQueryableAsync();
@ -67,19 +67,19 @@ public class VirtualClassAppService : PlatformAppService, IVirtualClassAppServic
.Take(input.MaxResultCount)
.ToList();
return new PagedResultDto<ClassSessionDto>(
return new PagedResultDto<ClassroomDto>(
totalCount,
ObjectMapper.Map<List<ClassSession>, List<ClassSessionDto>>(items)
ObjectMapper.Map<List<Classroom>, List<ClassroomDto>>(items)
);
}
public async Task<ClassSessionDto> GetAsync(Guid id)
public async Task<ClassroomDto> GetAsync(Guid id)
{
var classSession = await _classSessionRepository.GetAsync(id);
return ObjectMapper.Map<ClassSession, ClassSessionDto>(classSession);
return ObjectMapper.Map<Classroom, ClassroomDto>(classSession);
}
public async Task<ClassSessionDto> UpdateAsync(Guid id, UpdateClassSessionDto input)
public async Task<ClassroomDto> UpdateAsync(Guid id, UpdateClassroomDto input)
{
var classSession = await _classSessionRepository.GetAsync(id);
@ -101,7 +101,7 @@ public class VirtualClassAppService : PlatformAppService, IVirtualClassAppServic
classSession.MaxParticipants = input.MaxParticipants;
await _classSessionRepository.UpdateAsync(classSession);
return ObjectMapper.Map<ClassSession, ClassSessionDto>(classSession);
return ObjectMapper.Map<Classroom, ClassroomDto>(classSession);
}
public async Task DeleteAsync(Guid id)
@ -121,7 +121,7 @@ public class VirtualClassAppService : PlatformAppService, IVirtualClassAppServic
await _classSessionRepository.DeleteAsync(id);
}
public async Task<ClassSessionDto> StartClassAsync(Guid id)
public async Task<ClassroomDto> StartClassAsync(Guid id)
{
var classSession = await _classSessionRepository.GetAsync(id);
@ -138,7 +138,7 @@ public class VirtualClassAppService : PlatformAppService, IVirtualClassAppServic
classSession.StartClass();
await _classSessionRepository.UpdateAsync(classSession);
return ObjectMapper.Map<ClassSession, ClassSessionDto>(classSession);
return ObjectMapper.Map<Classroom, ClassroomDto>(classSession);
}
public async Task EndClassAsync(Guid id)
@ -166,7 +166,7 @@ public class VirtualClassAppService : PlatformAppService, IVirtualClassAppServic
}
}
public async Task<ClassSessionDto> JoinClassAsync(Guid id)
public async Task<ClassroomDto> JoinClassAsync(Guid id)
{
var classSession = await _classSessionRepository.GetAsync(id);
@ -188,7 +188,7 @@ public class VirtualClassAppService : PlatformAppService, IVirtualClassAppServic
if (existingParticipant == null)
{
// Add participant
var participant = new Participant(
var participant = new ClassParticipant(
GuidGenerator.Create(),
id,
CurrentUser.Id,
@ -200,7 +200,7 @@ public class VirtualClassAppService : PlatformAppService, IVirtualClassAppServic
await _participantRepository.InsertAsync(participant);
// Create attendance record
var attendance = new AttendanceRecord(
var attendance = new ClassAttandance(
GuidGenerator.Create(),
id,
CurrentUser.Id,
@ -215,7 +215,7 @@ public class VirtualClassAppService : PlatformAppService, IVirtualClassAppServic
await _classSessionRepository.UpdateAsync(classSession);
}
return ObjectMapper.Map<ClassSession, ClassSessionDto>(classSession);
return ObjectMapper.Map<Classroom, ClassroomDto>(classSession);
}
public async Task LeaveClassAsync(Guid id)
@ -247,7 +247,7 @@ public class VirtualClassAppService : PlatformAppService, IVirtualClassAppServic
}
}
public async Task<List<AttendanceRecordDto>> GetAttendanceAsync(Guid sessionId)
public async Task<List<ClassAttendanceDto>> GetAttendanceAsync(Guid sessionId)
{
var classSession = await _classSessionRepository.GetAsync(sessionId);
@ -260,6 +260,6 @@ public class VirtualClassAppService : PlatformAppService, IVirtualClassAppServic
x => x.SessionId == sessionId
);
return ObjectMapper.Map<List<AttendanceRecord>, List<AttendanceRecordDto>>(attendanceRecords);
return ObjectMapper.Map<List<ClassAttandance>, List<ClassAttendanceDto>>(attendanceRecords);
}
}

View file

@ -0,0 +1,20 @@
using AutoMapper;
using Kurs.Platform.Entities;
namespace Kurs.Platform.Classrooms;
public class ClassroomAutoMapperProfile : Profile
{
public ClassroomAutoMapperProfile()
{
CreateMap<Classroom, ClassroomDto>()
.ForMember(dest => dest.CanJoin, opt => opt.MapFrom(src => src.CanJoin()));
CreateMap<CreateClassroomDto, Classroom>();
CreateMap<UpdateClassroomDto, Classroom>();
CreateMap<ClassAttandance, ClassAttendanceDto>();
CreateMap<ClassParticipant, ClassParticipantDto>();
CreateMap<ClassChat, ClassChatDto>();
}
}

View file

@ -1,20 +0,0 @@
using AutoMapper;
using Kurs.Platform.Entities;
namespace Kurs.Platform.VirtualClassrooms;
public class VirtualClassAutoMapperProfile : Profile
{
public VirtualClassAutoMapperProfile()
{
CreateMap<ClassSession, ClassSessionDto>()
.ForMember(dest => dest.CanJoin, opt => opt.MapFrom(src => src.CanJoin()));
CreateMap<CreateClassSessionDto, ClassSession>();
CreateMap<UpdateClassSessionDto, ClassSession>();
CreateMap<AttendanceRecord, AttendanceRecordDto>();
CreateMap<Participant, ParticipantDto>();
CreateMap<ChatMessage, ChatMessageDto>();
}
}

View file

@ -3,7 +3,7 @@ using Volo.Abp.Domain.Entities.Auditing;
namespace Kurs.Platform.Entities;
public class AttendanceRecord : FullAuditedEntity<Guid>
public class ClassAttandance : FullAuditedEntity<Guid>
{
public Guid SessionId { get; set; }
public Guid? StudentId { get; set; }
@ -13,13 +13,13 @@ public class AttendanceRecord : FullAuditedEntity<Guid>
public int TotalDurationMinutes { get; set; }
// Navigation properties
public virtual ClassSession Session { get; set; }
public virtual Classroom Session { get; set; }
protected AttendanceRecord()
protected ClassAttandance()
{
}
public AttendanceRecord(
public ClassAttandance(
Guid id,
Guid sessionId,
Guid? studentId,

View file

@ -3,7 +3,7 @@ using Volo.Abp.Domain.Entities.Auditing;
namespace Kurs.Platform.Entities;
public class ChatMessage : FullAuditedEntity<Guid>
public class ClassChat : FullAuditedEntity<Guid>
{
public Guid SessionId { get; set; }
public Guid SenderId { get; set; }
@ -13,13 +13,13 @@ public class ChatMessage : FullAuditedEntity<Guid>
public bool IsTeacher { get; set; }
// Navigation properties
public virtual ClassSession Session { get; set; }
public virtual Classroom Session { get; set; }
protected ChatMessage()
protected ClassChat()
{
}
public ChatMessage(
public ClassChat(
Guid id,
Guid sessionId,
Guid senderId,

View file

@ -3,7 +3,7 @@ using Volo.Abp.Domain.Entities.Auditing;
namespace Kurs.Platform.Entities;
public class Participant : FullAuditedEntity<Guid>
public class ClassParticipant : FullAuditedEntity<Guid>
{
public Guid SessionId { get; set; }
public Guid? UserId { get; set; }
@ -16,13 +16,13 @@ public class Participant : FullAuditedEntity<Guid>
public string ConnectionId { get; set; }
// Navigation properties
public virtual ClassSession Session { get; set; }
public virtual Classroom Session { get; set; }
protected Participant()
protected ClassParticipant()
{
}
public Participant(
public ClassParticipant(
Guid id,
Guid sessionId,
Guid? userId,

View file

@ -4,7 +4,7 @@ using Volo.Abp.Domain.Entities.Auditing;
namespace Kurs.Platform.Entities;
public class ClassSession : FullAuditedEntity<Guid>
public class Classroom : FullAuditedEntity<Guid>
{
public string Name { get; set; }
public string Description { get; set; }
@ -20,18 +20,18 @@ public class ClassSession : FullAuditedEntity<Guid>
public bool IsScheduled { get; set; }
public int ParticipantCount { get; set; }
public virtual ICollection<Participant> Participants { get; set; }
public virtual ICollection<AttendanceRecord> AttendanceRecords { get; set; }
public virtual ICollection<ChatMessage> ChatMessages { get; set; }
public virtual ICollection<ClassParticipant> Participants { get; set; }
public virtual ICollection<ClassAttandance> AttendanceRecords { get; set; }
public virtual ICollection<ClassChat> ChatMessages { get; set; }
protected ClassSession()
protected Classroom()
{
Participants = new HashSet<Participant>();
AttendanceRecords = new HashSet<AttendanceRecord>();
ChatMessages = new HashSet<ChatMessage>();
Participants = new HashSet<ClassParticipant>();
AttendanceRecords = new HashSet<ClassAttandance>();
ChatMessages = new HashSet<ClassChat>();
}
public ClassSession(
public Classroom(
Guid id,
string name,
string description,
@ -55,9 +55,9 @@ public class ClassSession : FullAuditedEntity<Guid>
IsScheduled = true;
ParticipantCount = 0;
Participants = new HashSet<Participant>();
AttendanceRecords = new HashSet<AttendanceRecord>();
ChatMessages = new HashSet<ChatMessage>();
Participants = new HashSet<ClassParticipant>();
AttendanceRecords = new HashSet<ClassAttandance>();
ChatMessages = new HashSet<ClassChat>();
}
public void StartClass()

View file

@ -97,10 +97,10 @@ public class PlatformDbContext :
public DbSet<Demo> Demos { get; set; }
public DbSet<Service> Services { get; set; }
public DbSet<ClassSession> ClassSessions { get; set; }
public DbSet<Participant> Participants { get; set; }
public DbSet<AttendanceRecord> AttendanceRecords { get; set; }
public DbSet<ChatMessage> ChatMessages { get; set; }
public DbSet<Classroom> ClassSessions { get; set; }
public DbSet<ClassParticipant> Participants { get; set; }
public DbSet<ClassAttandance> AttendanceRecords { get; set; }
public DbSet<ClassChat> ChatMessages { get; set; }
#region Entities from the modules
@ -882,9 +882,9 @@ public class PlatformDbContext :
});
// ClassSession
builder.Entity<ClassSession>(b =>
builder.Entity<Classroom>(b =>
{
b.ToTable(PlatformConsts.DbTablePrefix + nameof(ClassSession), PlatformConsts.DbSchema);
b.ToTable(PlatformConsts.DbTablePrefix + nameof(Classroom), PlatformConsts.DbSchema);
b.ConfigureByConvention();
b.Property(x => x.Name).IsRequired().HasMaxLength(200);
@ -914,9 +914,9 @@ public class PlatformDbContext :
});
// Participant
builder.Entity<Participant>(b =>
builder.Entity<ClassParticipant>(b =>
{
b.ToTable(PlatformConsts.DbTablePrefix + nameof(Participant), PlatformConsts.DbSchema);
b.ToTable(PlatformConsts.DbTablePrefix + nameof(ClassParticipant), PlatformConsts.DbSchema);
b.ConfigureByConvention();
b.Property(x => x.UserName).IsRequired().HasMaxLength(100);
@ -929,9 +929,9 @@ public class PlatformDbContext :
});
// AttendanceRecord
builder.Entity<AttendanceRecord>(b =>
builder.Entity<ClassAttandance>(b =>
{
b.ToTable(PlatformConsts.DbTablePrefix + nameof(AttendanceRecord), PlatformConsts.DbSchema);
b.ToTable(PlatformConsts.DbTablePrefix + nameof(ClassAttandance), PlatformConsts.DbSchema);
b.ConfigureByConvention();
b.Property(x => x.StudentName).IsRequired().HasMaxLength(100);
@ -942,9 +942,9 @@ public class PlatformDbContext :
});
// ChatMessage
builder.Entity<ChatMessage>(b =>
builder.Entity<ClassChat>(b =>
{
b.ToTable(PlatformConsts.DbTablePrefix + nameof(ChatMessage), PlatformConsts.DbSchema);
b.ToTable(PlatformConsts.DbTablePrefix + nameof(ClassChat), PlatformConsts.DbSchema);
b.ConfigureByConvention();
b.Property(x => x.SenderName).IsRequired().HasMaxLength(100);

View file

@ -13,7 +13,7 @@ using Volo.Abp.EntityFrameworkCore;
namespace Kurs.Platform.Migrations
{
[DbContext(typeof(PlatformDbContext))]
[Migration("20250826054655_Initial")]
[Migration("20250826055306_Initial")]
partial class Initial
{
/// <inheritdoc />
@ -852,72 +852,6 @@ namespace Kurs.Platform.Migrations
b.ToTable("PApiMigration", (string)null);
});
modelBuilder.Entity("Kurs.Platform.Entities.AttendanceRecord", b =>
{
b.Property<Guid>("Id")
.HasColumnType("uniqueidentifier");
b.Property<DateTime>("CreationTime")
.HasColumnType("datetime2")
.HasColumnName("CreationTime");
b.Property<Guid?>("CreatorId")
.HasColumnType("uniqueidentifier")
.HasColumnName("CreatorId");
b.Property<Guid?>("DeleterId")
.HasColumnType("uniqueidentifier")
.HasColumnName("DeleterId");
b.Property<DateTime?>("DeletionTime")
.HasColumnType("datetime2")
.HasColumnName("DeletionTime");
b.Property<bool>("IsDeleted")
.ValueGeneratedOnAdd()
.HasColumnType("bit")
.HasDefaultValue(false)
.HasColumnName("IsDeleted");
b.Property<DateTime>("JoinTime")
.HasColumnType("datetime2");
b.Property<DateTime?>("LastModificationTime")
.HasColumnType("datetime2")
.HasColumnName("LastModificationTime");
b.Property<Guid?>("LastModifierId")
.HasColumnType("uniqueidentifier")
.HasColumnName("LastModifierId");
b.Property<DateTime?>("LeaveTime")
.HasColumnType("datetime2");
b.Property<Guid>("SessionId")
.HasColumnType("uniqueidentifier");
b.Property<Guid?>("StudentId")
.HasColumnType("uniqueidentifier");
b.Property<string>("StudentName")
.IsRequired()
.HasMaxLength(100)
.HasColumnType("nvarchar(100)");
b.Property<int>("TotalDurationMinutes")
.HasColumnType("int");
b.HasKey("Id");
b.HasIndex("JoinTime");
b.HasIndex("SessionId");
b.HasIndex("StudentId");
b.ToTable("PAttendanceRecord", (string)null);
});
modelBuilder.Entity("Kurs.Platform.Entities.BackgroundWorker", b =>
{
b.Property<Guid>("Id")
@ -1563,7 +1497,135 @@ namespace Kurs.Platform.Migrations
b.ToTable("PChart", (string)null);
});
modelBuilder.Entity("Kurs.Platform.Entities.ChatMessage", b =>
modelBuilder.Entity("Kurs.Platform.Entities.City", b =>
{
b.Property<Guid>("Id")
.HasColumnType("uniqueidentifier");
b.Property<string>("Code")
.IsRequired()
.HasMaxLength(16)
.HasColumnType("nvarchar(16)");
b.Property<string>("CountryCode")
.IsRequired()
.HasMaxLength(8)
.HasColumnType("nvarchar(8)");
b.Property<DateTime>("CreationTime")
.HasColumnType("datetime2")
.HasColumnName("CreationTime");
b.Property<Guid?>("CreatorId")
.HasColumnType("uniqueidentifier")
.HasColumnName("CreatorId");
b.Property<Guid?>("DeleterId")
.HasColumnType("uniqueidentifier")
.HasColumnName("DeleterId");
b.Property<DateTime?>("DeletionTime")
.HasColumnType("datetime2")
.HasColumnName("DeletionTime");
b.Property<bool>("IsDeleted")
.ValueGeneratedOnAdd()
.HasColumnType("bit")
.HasDefaultValue(false)
.HasColumnName("IsDeleted");
b.Property<DateTime?>("LastModificationTime")
.HasColumnType("datetime2")
.HasColumnName("LastModificationTime");
b.Property<Guid?>("LastModifierId")
.HasColumnType("uniqueidentifier")
.HasColumnName("LastModifierId");
b.Property<string>("Name")
.IsRequired()
.HasMaxLength(128)
.HasColumnType("nvarchar(128)");
b.Property<string>("PlateCode")
.HasMaxLength(20)
.HasColumnType("nvarchar(20)");
b.HasKey("Id");
b.HasIndex("CountryCode", "Code")
.IsUnique();
b.ToTable("PCity", (string)null);
});
modelBuilder.Entity("Kurs.Platform.Entities.ClassAttandance", b =>
{
b.Property<Guid>("Id")
.HasColumnType("uniqueidentifier");
b.Property<DateTime>("CreationTime")
.HasColumnType("datetime2")
.HasColumnName("CreationTime");
b.Property<Guid?>("CreatorId")
.HasColumnType("uniqueidentifier")
.HasColumnName("CreatorId");
b.Property<Guid?>("DeleterId")
.HasColumnType("uniqueidentifier")
.HasColumnName("DeleterId");
b.Property<DateTime?>("DeletionTime")
.HasColumnType("datetime2")
.HasColumnName("DeletionTime");
b.Property<bool>("IsDeleted")
.ValueGeneratedOnAdd()
.HasColumnType("bit")
.HasDefaultValue(false)
.HasColumnName("IsDeleted");
b.Property<DateTime>("JoinTime")
.HasColumnType("datetime2");
b.Property<DateTime?>("LastModificationTime")
.HasColumnType("datetime2")
.HasColumnName("LastModificationTime");
b.Property<Guid?>("LastModifierId")
.HasColumnType("uniqueidentifier")
.HasColumnName("LastModifierId");
b.Property<DateTime?>("LeaveTime")
.HasColumnType("datetime2");
b.Property<Guid>("SessionId")
.HasColumnType("uniqueidentifier");
b.Property<Guid?>("StudentId")
.HasColumnType("uniqueidentifier");
b.Property<string>("StudentName")
.IsRequired()
.HasMaxLength(100)
.HasColumnType("nvarchar(100)");
b.Property<int>("TotalDurationMinutes")
.HasColumnType("int");
b.HasKey("Id");
b.HasIndex("JoinTime");
b.HasIndex("SessionId");
b.HasIndex("StudentId");
b.ToTable("PClassAttandance", (string)null);
});
modelBuilder.Entity("Kurs.Platform.Entities.ClassChat", b =>
{
b.Property<Guid>("Id")
.HasColumnType("uniqueidentifier");
@ -1628,23 +1690,17 @@ namespace Kurs.Platform.Migrations
b.HasIndex("Timestamp");
b.ToTable("PChatMessage", (string)null);
b.ToTable("PClassChat", (string)null);
});
modelBuilder.Entity("Kurs.Platform.Entities.City", b =>
modelBuilder.Entity("Kurs.Platform.Entities.ClassParticipant", b =>
{
b.Property<Guid>("Id")
.HasColumnType("uniqueidentifier");
b.Property<string>("Code")
.IsRequired()
.HasMaxLength(16)
.HasColumnType("nvarchar(16)");
b.Property<string>("CountryCode")
.IsRequired()
.HasMaxLength(8)
.HasColumnType("nvarchar(8)");
b.Property<string>("ConnectionId")
.HasMaxLength(100)
.HasColumnType("nvarchar(100)");
b.Property<DateTime>("CreationTime")
.HasColumnType("datetime2")
@ -1662,12 +1718,24 @@ namespace Kurs.Platform.Migrations
.HasColumnType("datetime2")
.HasColumnName("DeletionTime");
b.Property<bool>("IsAudioMuted")
.HasColumnType("bit");
b.Property<bool>("IsDeleted")
.ValueGeneratedOnAdd()
.HasColumnType("bit")
.HasDefaultValue(false)
.HasColumnName("IsDeleted");
b.Property<bool>("IsTeacher")
.HasColumnType("bit");
b.Property<bool>("IsVideoMuted")
.HasColumnType("bit");
b.Property<DateTime>("JoinTime")
.HasColumnType("datetime2");
b.Property<DateTime?>("LastModificationTime")
.HasColumnType("datetime2")
.HasColumnName("LastModificationTime");
@ -1676,24 +1744,35 @@ namespace Kurs.Platform.Migrations
.HasColumnType("uniqueidentifier")
.HasColumnName("LastModifierId");
b.Property<string>("Name")
.IsRequired()
.HasMaxLength(128)
.HasColumnType("nvarchar(128)");
b.Property<Guid>("SessionId")
.HasColumnType("uniqueidentifier");
b.Property<string>("PlateCode")
.HasMaxLength(20)
.HasColumnType("nvarchar(20)");
b.Property<string>("UserEmail")
.HasMaxLength(200)
.HasColumnType("nvarchar(200)");
b.Property<Guid?>("UserId")
.HasColumnType("uniqueidentifier");
b.Property<string>("UserName")
.IsRequired()
.HasMaxLength(100)
.HasColumnType("nvarchar(100)");
b.HasKey("Id");
b.HasIndex("CountryCode", "Code")
.IsUnique();
b.HasIndex("SessionId");
b.ToTable("PCity", (string)null);
b.HasIndex("UserId");
b.HasIndex("SessionId", "UserId")
.IsUnique()
.HasFilter("[UserId] IS NOT NULL");
b.ToTable("PClassParticipant", (string)null);
});
modelBuilder.Entity("Kurs.Platform.Entities.ClassSession", b =>
modelBuilder.Entity("Kurs.Platform.Entities.Classroom", b =>
{
b.Property<Guid>("Id")
.HasColumnType("uniqueidentifier");
@ -1781,7 +1860,7 @@ namespace Kurs.Platform.Migrations
b.HasIndex("TeacherId");
b.ToTable("PClassSession", (string)null);
b.ToTable("PClassroom", (string)null);
});
modelBuilder.Entity("Kurs.Platform.Entities.Contact", b =>
@ -3277,85 +3356,6 @@ namespace Kurs.Platform.Migrations
b.ToTable("PMenu", (string)null);
});
modelBuilder.Entity("Kurs.Platform.Entities.Participant", b =>
{
b.Property<Guid>("Id")
.HasColumnType("uniqueidentifier");
b.Property<string>("ConnectionId")
.HasMaxLength(100)
.HasColumnType("nvarchar(100)");
b.Property<DateTime>("CreationTime")
.HasColumnType("datetime2")
.HasColumnName("CreationTime");
b.Property<Guid?>("CreatorId")
.HasColumnType("uniqueidentifier")
.HasColumnName("CreatorId");
b.Property<Guid?>("DeleterId")
.HasColumnType("uniqueidentifier")
.HasColumnName("DeleterId");
b.Property<DateTime?>("DeletionTime")
.HasColumnType("datetime2")
.HasColumnName("DeletionTime");
b.Property<bool>("IsAudioMuted")
.HasColumnType("bit");
b.Property<bool>("IsDeleted")
.ValueGeneratedOnAdd()
.HasColumnType("bit")
.HasDefaultValue(false)
.HasColumnName("IsDeleted");
b.Property<bool>("IsTeacher")
.HasColumnType("bit");
b.Property<bool>("IsVideoMuted")
.HasColumnType("bit");
b.Property<DateTime>("JoinTime")
.HasColumnType("datetime2");
b.Property<DateTime?>("LastModificationTime")
.HasColumnType("datetime2")
.HasColumnName("LastModificationTime");
b.Property<Guid?>("LastModifierId")
.HasColumnType("uniqueidentifier")
.HasColumnName("LastModifierId");
b.Property<Guid>("SessionId")
.HasColumnType("uniqueidentifier");
b.Property<string>("UserEmail")
.HasMaxLength(200)
.HasColumnType("nvarchar(200)");
b.Property<Guid?>("UserId")
.HasColumnType("uniqueidentifier");
b.Property<string>("UserName")
.IsRequired()
.HasMaxLength(100)
.HasColumnType("nvarchar(100)");
b.HasKey("Id");
b.HasIndex("SessionId");
b.HasIndex("UserId");
b.HasIndex("SessionId", "UserId")
.IsUnique()
.HasFilter("[UserId] IS NOT NULL");
b.ToTable("PParticipant", (string)null);
});
modelBuilder.Entity("Kurs.Platform.Entities.PaymentMethod", b =>
{
b.Property<string>("Id")
@ -6520,17 +6520,6 @@ namespace Kurs.Platform.Migrations
b.Navigation("Entity");
});
modelBuilder.Entity("Kurs.Platform.Entities.AttendanceRecord", b =>
{
b.HasOne("Kurs.Platform.Entities.ClassSession", "Session")
.WithMany("AttendanceRecords")
.HasForeignKey("SessionId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Session");
});
modelBuilder.Entity("Kurs.Platform.Entities.BankAccount", b =>
{
b.HasOne("Kurs.Platform.Entities.Bank", "Bank")
@ -6559,17 +6548,6 @@ namespace Kurs.Platform.Migrations
b.Navigation("Category");
});
modelBuilder.Entity("Kurs.Platform.Entities.ChatMessage", b =>
{
b.HasOne("Kurs.Platform.Entities.ClassSession", "Session")
.WithMany("ChatMessages")
.HasForeignKey("SessionId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Session");
});
modelBuilder.Entity("Kurs.Platform.Entities.City", b =>
{
b.HasOne("Kurs.Platform.Entities.Country", "Country")
@ -6582,6 +6560,39 @@ namespace Kurs.Platform.Migrations
b.Navigation("Country");
});
modelBuilder.Entity("Kurs.Platform.Entities.ClassAttandance", b =>
{
b.HasOne("Kurs.Platform.Entities.Classroom", "Session")
.WithMany("AttendanceRecords")
.HasForeignKey("SessionId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Session");
});
modelBuilder.Entity("Kurs.Platform.Entities.ClassChat", b =>
{
b.HasOne("Kurs.Platform.Entities.Classroom", "Session")
.WithMany("ChatMessages")
.HasForeignKey("SessionId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Session");
});
modelBuilder.Entity("Kurs.Platform.Entities.ClassParticipant", b =>
{
b.HasOne("Kurs.Platform.Entities.Classroom", "Session")
.WithMany("Participants")
.HasForeignKey("SessionId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Session");
});
modelBuilder.Entity("Kurs.Platform.Entities.Country", b =>
{
b.HasOne("Kurs.Platform.Entities.CountryGroup", null)
@ -6633,17 +6644,6 @@ namespace Kurs.Platform.Migrations
.IsRequired();
});
modelBuilder.Entity("Kurs.Platform.Entities.Participant", b =>
{
b.HasOne("Kurs.Platform.Entities.ClassSession", "Session")
.WithMany("Participants")
.HasForeignKey("SessionId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Session");
});
modelBuilder.Entity("Kurs.Platform.Entities.ReportGenerated", b =>
{
b.HasOne("Kurs.Platform.Entities.ReportTemplate", "Template")
@ -6905,7 +6905,7 @@ namespace Kurs.Platform.Migrations
b.Navigation("Districts");
});
modelBuilder.Entity("Kurs.Platform.Entities.ClassSession", b =>
modelBuilder.Entity("Kurs.Platform.Entities.Classroom", b =>
{
b.Navigation("AttendanceRecords");

View file

@ -787,7 +787,7 @@ namespace Kurs.Platform.Migrations
});
migrationBuilder.CreateTable(
name: "PClassSession",
name: "PClassroom",
columns: table => new
{
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
@ -814,7 +814,7 @@ namespace Kurs.Platform.Migrations
},
constraints: table =>
{
table.PrimaryKey("PK_PClassSession", x => x.Id);
table.PrimaryKey("PK_PClassroom", x => x.Id);
});
migrationBuilder.CreateTable(
@ -1922,7 +1922,7 @@ namespace Kurs.Platform.Migrations
});
migrationBuilder.CreateTable(
name: "PAttendanceRecord",
name: "PClassAttandance",
columns: table => new
{
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
@ -1942,17 +1942,17 @@ namespace Kurs.Platform.Migrations
},
constraints: table =>
{
table.PrimaryKey("PK_PAttendanceRecord", x => x.Id);
table.PrimaryKey("PK_PClassAttandance", x => x.Id);
table.ForeignKey(
name: "FK_PAttendanceRecord_PClassSession_SessionId",
name: "FK_PClassAttandance_PClassroom_SessionId",
column: x => x.SessionId,
principalTable: "PClassSession",
principalTable: "PClassroom",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateTable(
name: "PChatMessage",
name: "PClassChat",
columns: table => new
{
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
@ -1972,17 +1972,17 @@ namespace Kurs.Platform.Migrations
},
constraints: table =>
{
table.PrimaryKey("PK_PChatMessage", x => x.Id);
table.PrimaryKey("PK_PClassChat", x => x.Id);
table.ForeignKey(
name: "FK_PChatMessage_PClassSession_SessionId",
name: "FK_PClassChat_PClassroom_SessionId",
column: x => x.SessionId,
principalTable: "PClassSession",
principalTable: "PClassroom",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateTable(
name: "PParticipant",
name: "PClassParticipant",
columns: table => new
{
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
@ -2005,11 +2005,11 @@ namespace Kurs.Platform.Migrations
},
constraints: table =>
{
table.PrimaryKey("PK_PParticipant", x => x.Id);
table.PrimaryKey("PK_PClassParticipant", x => x.Id);
table.ForeignKey(
name: "FK_PParticipant_PClassSession_SessionId",
name: "FK_PClassParticipant_PClassroom_SessionId",
column: x => x.SessionId,
principalTable: "PClassSession",
principalTable: "PClassroom",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
});
@ -2954,21 +2954,6 @@ namespace Kurs.Platform.Migrations
table: "PApiMigration",
column: "EntityId");
migrationBuilder.CreateIndex(
name: "IX_PAttendanceRecord_JoinTime",
table: "PAttendanceRecord",
column: "JoinTime");
migrationBuilder.CreateIndex(
name: "IX_PAttendanceRecord_SessionId",
table: "PAttendanceRecord",
column: "SessionId");
migrationBuilder.CreateIndex(
name: "IX_PAttendanceRecord_StudentId",
table: "PAttendanceRecord",
column: "StudentId");
migrationBuilder.CreateIndex(
name: "IX_MailQueueTableFormat",
table: "PBackgroundWorker_MailQueueTableFormat",
@ -3000,21 +2985,6 @@ namespace Kurs.Platform.Migrations
table: "PBlogPost",
column: "Slug");
migrationBuilder.CreateIndex(
name: "IX_PChatMessage_SenderId",
table: "PChatMessage",
column: "SenderId");
migrationBuilder.CreateIndex(
name: "IX_PChatMessage_SessionId",
table: "PChatMessage",
column: "SessionId");
migrationBuilder.CreateIndex(
name: "IX_PChatMessage_Timestamp",
table: "PChatMessage",
column: "Timestamp");
migrationBuilder.CreateIndex(
name: "IX_PCity_CountryCode_Code",
table: "PCity",
@ -3022,18 +2992,65 @@ namespace Kurs.Platform.Migrations
unique: true);
migrationBuilder.CreateIndex(
name: "IX_PClassSession_IsActive",
table: "PClassSession",
name: "IX_PClassAttandance_JoinTime",
table: "PClassAttandance",
column: "JoinTime");
migrationBuilder.CreateIndex(
name: "IX_PClassAttandance_SessionId",
table: "PClassAttandance",
column: "SessionId");
migrationBuilder.CreateIndex(
name: "IX_PClassAttandance_StudentId",
table: "PClassAttandance",
column: "StudentId");
migrationBuilder.CreateIndex(
name: "IX_PClassChat_SenderId",
table: "PClassChat",
column: "SenderId");
migrationBuilder.CreateIndex(
name: "IX_PClassChat_SessionId",
table: "PClassChat",
column: "SessionId");
migrationBuilder.CreateIndex(
name: "IX_PClassChat_Timestamp",
table: "PClassChat",
column: "Timestamp");
migrationBuilder.CreateIndex(
name: "IX_PClassParticipant_SessionId",
table: "PClassParticipant",
column: "SessionId");
migrationBuilder.CreateIndex(
name: "IX_PClassParticipant_SessionId_UserId",
table: "PClassParticipant",
columns: new[] { "SessionId", "UserId" },
unique: true,
filter: "[UserId] IS NOT NULL");
migrationBuilder.CreateIndex(
name: "IX_PClassParticipant_UserId",
table: "PClassParticipant",
column: "UserId");
migrationBuilder.CreateIndex(
name: "IX_PClassroom_IsActive",
table: "PClassroom",
column: "IsActive");
migrationBuilder.CreateIndex(
name: "IX_PClassSession_ScheduledStartTime",
table: "PClassSession",
name: "IX_PClassroom_ScheduledStartTime",
table: "PClassroom",
column: "ScheduledStartTime");
migrationBuilder.CreateIndex(
name: "IX_PClassSession_TeacherId",
table: "PClassSession",
name: "IX_PClassroom_TeacherId",
table: "PClassroom",
column: "TeacherId");
migrationBuilder.CreateIndex(
@ -3115,23 +3132,6 @@ namespace Kurs.Platform.Migrations
table: "POrderItem",
column: "OrderId");
migrationBuilder.CreateIndex(
name: "IX_PParticipant_SessionId",
table: "PParticipant",
column: "SessionId");
migrationBuilder.CreateIndex(
name: "IX_PParticipant_SessionId_UserId",
table: "PParticipant",
columns: new[] { "SessionId", "UserId" },
unique: true,
filter: "[UserId] IS NOT NULL");
migrationBuilder.CreateIndex(
name: "IX_PParticipant_UserId",
table: "PParticipant",
column: "UserId");
migrationBuilder.CreateIndex(
name: "IX_PReportCategory_Name",
table: "PReportCategory",
@ -3283,9 +3283,6 @@ namespace Kurs.Platform.Migrations
migrationBuilder.DropTable(
name: "PApiMigration");
migrationBuilder.DropTable(
name: "PAttendanceRecord");
migrationBuilder.DropTable(
name: "PBackgroundWorker");
@ -3311,7 +3308,13 @@ namespace Kurs.Platform.Migrations
name: "PChart");
migrationBuilder.DropTable(
name: "PChatMessage");
name: "PClassAttandance");
migrationBuilder.DropTable(
name: "PClassChat");
migrationBuilder.DropTable(
name: "PClassParticipant");
migrationBuilder.DropTable(
name: "PContact");
@ -3382,9 +3385,6 @@ namespace Kurs.Platform.Migrations
migrationBuilder.DropTable(
name: "POrderItem");
migrationBuilder.DropTable(
name: "PParticipant");
migrationBuilder.DropTable(
name: "PPaymentMethod");
@ -3445,6 +3445,9 @@ namespace Kurs.Platform.Migrations
migrationBuilder.DropTable(
name: "PBlogCategory");
migrationBuilder.DropTable(
name: "PClassroom");
migrationBuilder.DropTable(
name: "PCustomEntity");
@ -3463,9 +3466,6 @@ namespace Kurs.Platform.Migrations
migrationBuilder.DropTable(
name: "POrder");
migrationBuilder.DropTable(
name: "PClassSession");
migrationBuilder.DropTable(
name: "PReportTemplate");

View file

@ -849,72 +849,6 @@ namespace Kurs.Platform.Migrations
b.ToTable("PApiMigration", (string)null);
});
modelBuilder.Entity("Kurs.Platform.Entities.AttendanceRecord", b =>
{
b.Property<Guid>("Id")
.HasColumnType("uniqueidentifier");
b.Property<DateTime>("CreationTime")
.HasColumnType("datetime2")
.HasColumnName("CreationTime");
b.Property<Guid?>("CreatorId")
.HasColumnType("uniqueidentifier")
.HasColumnName("CreatorId");
b.Property<Guid?>("DeleterId")
.HasColumnType("uniqueidentifier")
.HasColumnName("DeleterId");
b.Property<DateTime?>("DeletionTime")
.HasColumnType("datetime2")
.HasColumnName("DeletionTime");
b.Property<bool>("IsDeleted")
.ValueGeneratedOnAdd()
.HasColumnType("bit")
.HasDefaultValue(false)
.HasColumnName("IsDeleted");
b.Property<DateTime>("JoinTime")
.HasColumnType("datetime2");
b.Property<DateTime?>("LastModificationTime")
.HasColumnType("datetime2")
.HasColumnName("LastModificationTime");
b.Property<Guid?>("LastModifierId")
.HasColumnType("uniqueidentifier")
.HasColumnName("LastModifierId");
b.Property<DateTime?>("LeaveTime")
.HasColumnType("datetime2");
b.Property<Guid>("SessionId")
.HasColumnType("uniqueidentifier");
b.Property<Guid?>("StudentId")
.HasColumnType("uniqueidentifier");
b.Property<string>("StudentName")
.IsRequired()
.HasMaxLength(100)
.HasColumnType("nvarchar(100)");
b.Property<int>("TotalDurationMinutes")
.HasColumnType("int");
b.HasKey("Id");
b.HasIndex("JoinTime");
b.HasIndex("SessionId");
b.HasIndex("StudentId");
b.ToTable("PAttendanceRecord", (string)null);
});
modelBuilder.Entity("Kurs.Platform.Entities.BackgroundWorker", b =>
{
b.Property<Guid>("Id")
@ -1560,7 +1494,135 @@ namespace Kurs.Platform.Migrations
b.ToTable("PChart", (string)null);
});
modelBuilder.Entity("Kurs.Platform.Entities.ChatMessage", b =>
modelBuilder.Entity("Kurs.Platform.Entities.City", b =>
{
b.Property<Guid>("Id")
.HasColumnType("uniqueidentifier");
b.Property<string>("Code")
.IsRequired()
.HasMaxLength(16)
.HasColumnType("nvarchar(16)");
b.Property<string>("CountryCode")
.IsRequired()
.HasMaxLength(8)
.HasColumnType("nvarchar(8)");
b.Property<DateTime>("CreationTime")
.HasColumnType("datetime2")
.HasColumnName("CreationTime");
b.Property<Guid?>("CreatorId")
.HasColumnType("uniqueidentifier")
.HasColumnName("CreatorId");
b.Property<Guid?>("DeleterId")
.HasColumnType("uniqueidentifier")
.HasColumnName("DeleterId");
b.Property<DateTime?>("DeletionTime")
.HasColumnType("datetime2")
.HasColumnName("DeletionTime");
b.Property<bool>("IsDeleted")
.ValueGeneratedOnAdd()
.HasColumnType("bit")
.HasDefaultValue(false)
.HasColumnName("IsDeleted");
b.Property<DateTime?>("LastModificationTime")
.HasColumnType("datetime2")
.HasColumnName("LastModificationTime");
b.Property<Guid?>("LastModifierId")
.HasColumnType("uniqueidentifier")
.HasColumnName("LastModifierId");
b.Property<string>("Name")
.IsRequired()
.HasMaxLength(128)
.HasColumnType("nvarchar(128)");
b.Property<string>("PlateCode")
.HasMaxLength(20)
.HasColumnType("nvarchar(20)");
b.HasKey("Id");
b.HasIndex("CountryCode", "Code")
.IsUnique();
b.ToTable("PCity", (string)null);
});
modelBuilder.Entity("Kurs.Platform.Entities.ClassAttandance", b =>
{
b.Property<Guid>("Id")
.HasColumnType("uniqueidentifier");
b.Property<DateTime>("CreationTime")
.HasColumnType("datetime2")
.HasColumnName("CreationTime");
b.Property<Guid?>("CreatorId")
.HasColumnType("uniqueidentifier")
.HasColumnName("CreatorId");
b.Property<Guid?>("DeleterId")
.HasColumnType("uniqueidentifier")
.HasColumnName("DeleterId");
b.Property<DateTime?>("DeletionTime")
.HasColumnType("datetime2")
.HasColumnName("DeletionTime");
b.Property<bool>("IsDeleted")
.ValueGeneratedOnAdd()
.HasColumnType("bit")
.HasDefaultValue(false)
.HasColumnName("IsDeleted");
b.Property<DateTime>("JoinTime")
.HasColumnType("datetime2");
b.Property<DateTime?>("LastModificationTime")
.HasColumnType("datetime2")
.HasColumnName("LastModificationTime");
b.Property<Guid?>("LastModifierId")
.HasColumnType("uniqueidentifier")
.HasColumnName("LastModifierId");
b.Property<DateTime?>("LeaveTime")
.HasColumnType("datetime2");
b.Property<Guid>("SessionId")
.HasColumnType("uniqueidentifier");
b.Property<Guid?>("StudentId")
.HasColumnType("uniqueidentifier");
b.Property<string>("StudentName")
.IsRequired()
.HasMaxLength(100)
.HasColumnType("nvarchar(100)");
b.Property<int>("TotalDurationMinutes")
.HasColumnType("int");
b.HasKey("Id");
b.HasIndex("JoinTime");
b.HasIndex("SessionId");
b.HasIndex("StudentId");
b.ToTable("PClassAttandance", (string)null);
});
modelBuilder.Entity("Kurs.Platform.Entities.ClassChat", b =>
{
b.Property<Guid>("Id")
.HasColumnType("uniqueidentifier");
@ -1625,23 +1687,17 @@ namespace Kurs.Platform.Migrations
b.HasIndex("Timestamp");
b.ToTable("PChatMessage", (string)null);
b.ToTable("PClassChat", (string)null);
});
modelBuilder.Entity("Kurs.Platform.Entities.City", b =>
modelBuilder.Entity("Kurs.Platform.Entities.ClassParticipant", b =>
{
b.Property<Guid>("Id")
.HasColumnType("uniqueidentifier");
b.Property<string>("Code")
.IsRequired()
.HasMaxLength(16)
.HasColumnType("nvarchar(16)");
b.Property<string>("CountryCode")
.IsRequired()
.HasMaxLength(8)
.HasColumnType("nvarchar(8)");
b.Property<string>("ConnectionId")
.HasMaxLength(100)
.HasColumnType("nvarchar(100)");
b.Property<DateTime>("CreationTime")
.HasColumnType("datetime2")
@ -1659,12 +1715,24 @@ namespace Kurs.Platform.Migrations
.HasColumnType("datetime2")
.HasColumnName("DeletionTime");
b.Property<bool>("IsAudioMuted")
.HasColumnType("bit");
b.Property<bool>("IsDeleted")
.ValueGeneratedOnAdd()
.HasColumnType("bit")
.HasDefaultValue(false)
.HasColumnName("IsDeleted");
b.Property<bool>("IsTeacher")
.HasColumnType("bit");
b.Property<bool>("IsVideoMuted")
.HasColumnType("bit");
b.Property<DateTime>("JoinTime")
.HasColumnType("datetime2");
b.Property<DateTime?>("LastModificationTime")
.HasColumnType("datetime2")
.HasColumnName("LastModificationTime");
@ -1673,24 +1741,35 @@ namespace Kurs.Platform.Migrations
.HasColumnType("uniqueidentifier")
.HasColumnName("LastModifierId");
b.Property<string>("Name")
.IsRequired()
.HasMaxLength(128)
.HasColumnType("nvarchar(128)");
b.Property<Guid>("SessionId")
.HasColumnType("uniqueidentifier");
b.Property<string>("PlateCode")
.HasMaxLength(20)
.HasColumnType("nvarchar(20)");
b.Property<string>("UserEmail")
.HasMaxLength(200)
.HasColumnType("nvarchar(200)");
b.Property<Guid?>("UserId")
.HasColumnType("uniqueidentifier");
b.Property<string>("UserName")
.IsRequired()
.HasMaxLength(100)
.HasColumnType("nvarchar(100)");
b.HasKey("Id");
b.HasIndex("CountryCode", "Code")
.IsUnique();
b.HasIndex("SessionId");
b.ToTable("PCity", (string)null);
b.HasIndex("UserId");
b.HasIndex("SessionId", "UserId")
.IsUnique()
.HasFilter("[UserId] IS NOT NULL");
b.ToTable("PClassParticipant", (string)null);
});
modelBuilder.Entity("Kurs.Platform.Entities.ClassSession", b =>
modelBuilder.Entity("Kurs.Platform.Entities.Classroom", b =>
{
b.Property<Guid>("Id")
.HasColumnType("uniqueidentifier");
@ -1778,7 +1857,7 @@ namespace Kurs.Platform.Migrations
b.HasIndex("TeacherId");
b.ToTable("PClassSession", (string)null);
b.ToTable("PClassroom", (string)null);
});
modelBuilder.Entity("Kurs.Platform.Entities.Contact", b =>
@ -3274,85 +3353,6 @@ namespace Kurs.Platform.Migrations
b.ToTable("PMenu", (string)null);
});
modelBuilder.Entity("Kurs.Platform.Entities.Participant", b =>
{
b.Property<Guid>("Id")
.HasColumnType("uniqueidentifier");
b.Property<string>("ConnectionId")
.HasMaxLength(100)
.HasColumnType("nvarchar(100)");
b.Property<DateTime>("CreationTime")
.HasColumnType("datetime2")
.HasColumnName("CreationTime");
b.Property<Guid?>("CreatorId")
.HasColumnType("uniqueidentifier")
.HasColumnName("CreatorId");
b.Property<Guid?>("DeleterId")
.HasColumnType("uniqueidentifier")
.HasColumnName("DeleterId");
b.Property<DateTime?>("DeletionTime")
.HasColumnType("datetime2")
.HasColumnName("DeletionTime");
b.Property<bool>("IsAudioMuted")
.HasColumnType("bit");
b.Property<bool>("IsDeleted")
.ValueGeneratedOnAdd()
.HasColumnType("bit")
.HasDefaultValue(false)
.HasColumnName("IsDeleted");
b.Property<bool>("IsTeacher")
.HasColumnType("bit");
b.Property<bool>("IsVideoMuted")
.HasColumnType("bit");
b.Property<DateTime>("JoinTime")
.HasColumnType("datetime2");
b.Property<DateTime?>("LastModificationTime")
.HasColumnType("datetime2")
.HasColumnName("LastModificationTime");
b.Property<Guid?>("LastModifierId")
.HasColumnType("uniqueidentifier")
.HasColumnName("LastModifierId");
b.Property<Guid>("SessionId")
.HasColumnType("uniqueidentifier");
b.Property<string>("UserEmail")
.HasMaxLength(200)
.HasColumnType("nvarchar(200)");
b.Property<Guid?>("UserId")
.HasColumnType("uniqueidentifier");
b.Property<string>("UserName")
.IsRequired()
.HasMaxLength(100)
.HasColumnType("nvarchar(100)");
b.HasKey("Id");
b.HasIndex("SessionId");
b.HasIndex("UserId");
b.HasIndex("SessionId", "UserId")
.IsUnique()
.HasFilter("[UserId] IS NOT NULL");
b.ToTable("PParticipant", (string)null);
});
modelBuilder.Entity("Kurs.Platform.Entities.PaymentMethod", b =>
{
b.Property<string>("Id")
@ -6517,17 +6517,6 @@ namespace Kurs.Platform.Migrations
b.Navigation("Entity");
});
modelBuilder.Entity("Kurs.Platform.Entities.AttendanceRecord", b =>
{
b.HasOne("Kurs.Platform.Entities.ClassSession", "Session")
.WithMany("AttendanceRecords")
.HasForeignKey("SessionId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Session");
});
modelBuilder.Entity("Kurs.Platform.Entities.BankAccount", b =>
{
b.HasOne("Kurs.Platform.Entities.Bank", "Bank")
@ -6556,17 +6545,6 @@ namespace Kurs.Platform.Migrations
b.Navigation("Category");
});
modelBuilder.Entity("Kurs.Platform.Entities.ChatMessage", b =>
{
b.HasOne("Kurs.Platform.Entities.ClassSession", "Session")
.WithMany("ChatMessages")
.HasForeignKey("SessionId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Session");
});
modelBuilder.Entity("Kurs.Platform.Entities.City", b =>
{
b.HasOne("Kurs.Platform.Entities.Country", "Country")
@ -6579,6 +6557,39 @@ namespace Kurs.Platform.Migrations
b.Navigation("Country");
});
modelBuilder.Entity("Kurs.Platform.Entities.ClassAttandance", b =>
{
b.HasOne("Kurs.Platform.Entities.Classroom", "Session")
.WithMany("AttendanceRecords")
.HasForeignKey("SessionId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Session");
});
modelBuilder.Entity("Kurs.Platform.Entities.ClassChat", b =>
{
b.HasOne("Kurs.Platform.Entities.Classroom", "Session")
.WithMany("ChatMessages")
.HasForeignKey("SessionId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Session");
});
modelBuilder.Entity("Kurs.Platform.Entities.ClassParticipant", b =>
{
b.HasOne("Kurs.Platform.Entities.Classroom", "Session")
.WithMany("Participants")
.HasForeignKey("SessionId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Session");
});
modelBuilder.Entity("Kurs.Platform.Entities.Country", b =>
{
b.HasOne("Kurs.Platform.Entities.CountryGroup", null)
@ -6630,17 +6641,6 @@ namespace Kurs.Platform.Migrations
.IsRequired();
});
modelBuilder.Entity("Kurs.Platform.Entities.Participant", b =>
{
b.HasOne("Kurs.Platform.Entities.ClassSession", "Session")
.WithMany("Participants")
.HasForeignKey("SessionId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Session");
});
modelBuilder.Entity("Kurs.Platform.Entities.ReportGenerated", b =>
{
b.HasOne("Kurs.Platform.Entities.ReportTemplate", "Template")
@ -6902,7 +6902,7 @@ namespace Kurs.Platform.Migrations
b.Navigation("Districts");
});
modelBuilder.Entity("Kurs.Platform.Entities.ClassSession", b =>
modelBuilder.Entity("Kurs.Platform.Entities.Classroom", b =>
{
b.Navigation("AttendanceRecords");

View file

@ -12,16 +12,16 @@ namespace Kurs.Platform.SignalR.Hubs;
[Authorize]
public class ClassroomHub : Hub
{
private readonly IRepository<ClassSession, Guid> _classSessionRepository;
private readonly IRepository<Participant, Guid> _participantRepository;
private readonly IRepository<ChatMessage, Guid> _chatMessageRepository;
private readonly IRepository<Classroom, Guid> _classSessionRepository;
private readonly IRepository<ClassParticipant, Guid> _participantRepository;
private readonly IRepository<ClassChat, Guid> _chatMessageRepository;
private readonly ILogger<ClassroomHub> _logger;
private readonly IGuidGenerator _guidGenerator;
public ClassroomHub(
IRepository<ClassSession, Guid> classSessionRepository,
IRepository<Participant, Guid> participantRepository,
IRepository<ChatMessage, Guid> chatMessageRepository,
IRepository<Classroom, Guid> classSessionRepository,
IRepository<ClassParticipant, Guid> participantRepository,
IRepository<ClassChat, Guid> chatMessageRepository,
ILogger<ClassroomHub> logger,
IGuidGenerator guidGenerator)
{
@ -91,7 +91,7 @@ public class ClassroomHub : Hub
var isTeacher = participant?.IsTeacher ?? false;
// Save message to database
var chatMessage = new ChatMessage(
var chatMessage = new ClassChat(
_guidGenerator.Create(),
sessionId,
userId,