using Dapper; using LibraryManagementSystem.Console.Database; using LibraryManagementSystem.Console.Models; using Serilog; namespace LibraryManagementSystem.Console.Repositories; /// /// Выполняет CRUD операции для таблицы users. /// public class UserRepository : IUserRepository { private readonly DatabaseManager _databaseManager; /// /// Создает экземпляр репозитория пользователей. /// /// /// Менеджер подключения к БД. /// public UserRepository(DatabaseManager databaseManager) { _databaseManager = databaseManager; } /// /// Добавляет пользователя в БД. /// /// Объект пользователя. /// ID новой записи. public int Create(User user) { try { using var connection = _databaseManager.CreateConnection(); string sql = """ INSERT INTO users ( username, password_hash, email ) VALUES ( @Username, @PasswordHash, @Email ) RETURNING id; """; int id = connection.ExecuteScalar(sql, user); Log.Information( "Создан пользователь {Username}", user.Username ); return id; } catch (Exception ex) { Log.Error( ex, "Ошибка при создании пользователя" ); throw; } } /// /// Возвращает всех пользователей. /// /// Коллекция пользователей. public IEnumerable GetAll() { try { using var connection = _databaseManager.CreateConnection(); string sql = "SELECT * FROM users"; return connection.Query(sql); } catch (Exception ex) { Log.Error( ex, "Ошибка получения пользователей" ); throw; } } /// /// Возвращает пользователя по ID. /// /// ID пользователя. /// Пользователь или null. public User? GetById(int id) { try { using var connection = _databaseManager.CreateConnection(); string sql = """ SELECT * FROM users WHERE id = @Id """; return connection.QueryFirstOrDefault( sql, new { Id = id } ); } catch (Exception ex) { Log.Error( ex, "Ошибка получения пользователя" ); throw; } } /// /// Обновляет пользователя. /// /// Обновленный пользователь. /// /// true - успешно. /// false - запись не найдена. /// public bool Update(User user) { try { using var connection = _databaseManager.CreateConnection(); string sql = """ UPDATE users SET username = @Username, email = @Email WHERE id = @Id """; int affectedRows = connection.Execute(sql, user); return affectedRows > 0; } catch (Exception ex) { Log.Error( ex, "Ошибка обновления пользователя" ); throw; } } /// /// Удаляет пользователя. /// /// ID пользователя. /// /// true - успешно. /// false - запись не найдена. /// public bool Delete(int id) { try { using var connection = _databaseManager.CreateConnection(); string sql = """ DELETE FROM users WHERE id = @Id """; int affectedRows = connection.Execute( sql, new { Id = id } ); return affectedRows > 0; } catch (Exception ex) { Log.Error( ex, "Ошибка удаления пользователя" ); throw; } } }