using data.Exception; using data.RemoteData; using data.RemoteData.DAO; using data.Repository; using domain.Models; using Microsoft.EntityFrameworkCore; // Реализация интерфейса IGroupRepository для работы с группами в базе данных public class SQLGroupRepositoryImpl : IGroupRepository { private readonly RemoteDatabaseContext _remoteDatabaseContext; // Конструктор, принимающий контекст базы данных public SQLGroupRepositoryImpl(RemoteDatabaseContext remoteDatabaseContext) { _remoteDatabaseContext = remoteDatabaseContext; } // Добавление новой группы public int AddGroup(GroupDao group) { // Проверка на существование группы с таким именем if (_remoteDatabaseContext.Groups.Any(g => g.Name == group.Name)) return -1; // Возвращаем -1, если группа уже существует _remoteDatabaseContext.Groups.Add(group); _remoteDatabaseContext.SaveChanges(); return group.Id; // Возвращаем ID добавленной группы } // Обновление информации о группе по её ID public bool UpdateGroupById(int groupID, GroupLocalEntity updatedGroup) { var existingGroup = _remoteDatabaseContext.Groups.FirstOrDefault(g => g.Id == groupID); if (existingGroup == null) return false; // Возвращаем false, если группа не найдена existingGroup.Name = updatedGroup.Name; // Обновляем имя группы _remoteDatabaseContext.SaveChanges(); return true; // Возвращаем true, если обновление прошло успешно } // Удаление группы по её ID public bool RemoveGroupById(int groupID) { var existingGroup = _remoteDatabaseContext.Groups.FirstOrDefault(g => g.Id == groupID); if (existingGroup == null) return false; // Возвращаем false, если группа не найдена _remoteDatabaseContext.Groups.Remove(existingGroup); _remoteDatabaseContext.SaveChanges(); return true; // Возвращаем true, если удаление прошло успешно } // Получение группы по её ID public GroupLocalEntity? GetGroupById(int groupId) { var groupDao = _remoteDatabaseContext.Groups.FirstOrDefault(g => g.Id == groupId); return groupDao != null ? new GroupLocalEntity { Id = groupDao.Id, Name = groupDao.Name } : null; } // Получение всех групп public List GetAllGroup() { return _remoteDatabaseContext.Groups .Select(g => new GroupLocalEntity { Id = g.Id, Name = g.Name }) .ToList(); } // Получение всех групп с их студентами public List GetAllGroupWithStident() { // Загружаем группы вместе с пользователями return _remoteDatabaseContext.Groups .Include(g => g.Users) // Загружаем пользователей вместе с группами .ToList(); } // Удаление всех студентов из группы public void RemoveAllStudentsFromGroup(int groupId) { var group = _remoteDatabaseContext.Groups.Include(g => g.Users).FirstOrDefault(g => g.Id == groupId); if (group != null) { // Удаляем всех студентов из группы var userList = group.Users.ToList(); foreach (var user in userList) { _remoteDatabaseContext.Entry(user).State = EntityState.Deleted; // Удаляем каждого студента } _remoteDatabaseContext.SaveChanges(); } else { throw new ArgumentException($"Группа с ID {groupId} не найдена."); // Генерируем исключение, если группа не найдена } } // Добавление студента в группу public void AddStudentToGroup(int groupId, UserDao student) { var group = _remoteDatabaseContext.Groups.Include(g => g.Users).FirstOrDefault(g => g.Id == groupId); if (group != null) { // Проверка на уникальность студента if (group.Users.Any(u => u.Guid == student.Guid)) { throw new ArgumentException($"Студент с GUID {student.Guid} уже добавлен в эту группу."); // Генерируем исключение, если студент уже в группе } // Создаём нового студента и добавляем его в контекст _remoteDatabaseContext.Users.Add(student); // Добавляем нового студента в Users // Привязываем студента к группе student.GroupID = group.Id; // Устанавливаем внешний ключ (или ссылку на группу) // Сохраняем изменения в контексте _remoteDatabaseContext.SaveChanges(); } else { throw new ArgumentException($"Группа с ID {groupId} не найдена."); // Генерируем исключение, если группа не найдена } } // Метод для обновления группы public void UpdateGroup(GroupDao group) { var existingGroup = _remoteDatabaseContext.Groups.FirstOrDefault(g => g.Id == group.Id); if (existingGroup != null) { existingGroup.Name = group.Name; // Обновляем имя группы // Обновите другие свойства группы, если нужно _remoteDatabaseContext.SaveChanges(); } else { throw new ArgumentException("Group not found"); // Генерируем исключение, если группа не найдена } } // Удаление пользователя по его GUID public bool RemoveUserByGuid(Guid userGuid) { var user = _remoteDatabaseContext.Users.FirstOrDefault(u => u.Guid == userGuid); if (user == null) throw new UserNotFoundException(userGuid); // Генерируем исключение, если пользователь не найден _remoteDatabaseContext.Users.Remove(user); _remoteDatabaseContext.SaveChanges(); return true; // Возвращаем true, если удаление прошло успешно } // Обновление информации о пользователе public UserDao UpdateUser(Guid userGuid, string newFio, int groupId) { var existingUser = _remoteDatabaseContext.Users.FirstOrDefault(u => u.Guid == userGuid); if (existingUser == null) throw new UserNotFoundException(userGuid); // Генерируем исключение, если пользователь не найден // Обновляем поля существующего пользователя existingUser.FIO = newFio; // Обновляем ФИО пользователя existingUser.GroupID = groupId; // Обновляем ID группы _remoteDatabaseContext.SaveChanges(); return existingUser; // Возвращаем обновленного пользователя } }