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;
}
}
}