using Dapper;
using LibraryManagementSystem.Console.Database;
using LibraryManagementSystem.Console.Models;
using Serilog;
namespace LibraryManagementSystem.Console.Repositories;
///
/// Создает экземпляр репозитория книг.
///
///
/// Менеджер подключения к базе данных.
///
public class BookRepository : IBookRepository
{
private readonly DatabaseManager _databaseManager;
public BookRepository(DatabaseManager databaseManager)
{
_databaseManager = databaseManager;
}
///
/// Добавляет книгу в базу данных.
///
///
/// Объект книги.
///
///
/// ID созданной книги.
///
///
/// Возникает при ошибке добавления книги.
///
public int Create(Book book)
{
try
{
using var connection = _databaseManager.CreateConnection();
string sql = """
INSERT INTO books
(
title,
author,
publication_year,
owner_id
)
VALUES
(
@Title,
@Author,
@PublicationYear,
@OwnerId
)
RETURNING id;
""";
int id = connection.ExecuteScalar(sql, book);
Log.Information("Создана книга {Title}", book.Title);
return id;
}
catch (Exception ex)
{
Log.Error(ex, "Ошибка создания книги");
throw;
}
}
///
/// Возвращает список всех книг.
///
///
/// Коллекция книг.
///
public IEnumerable GetAll()
{
using var connection = _databaseManager.CreateConnection();
return connection.Query("SELECT * FROM books");
}
///
/// Возвращает книгу по ID.
///
///
/// ID книги.
///
///
/// Найденная книга или null.
///
public Book? GetById(int id)
{
using var connection = _databaseManager.CreateConnection();
return connection.QueryFirstOrDefault(
"""
SELECT *
FROM books
WHERE id = @Id
""",
new { Id = id }
);
}
///
/// Обновляет данные книги.
///
///
/// Обновленный объект книги.
///
///
/// true - обновление успешно.
/// false - книга не найдена.
///
public bool Update(Book book)
{
using var connection = _databaseManager.CreateConnection();
int affectedRows = connection.Execute(
"""
UPDATE books
SET
title = @Title,
author = @Author,
publication_year = @PublicationYear
WHERE id = @Id
""",
book
);
return affectedRows > 0;
}
///
/// Удаляет книгу по ID.
///
///
/// ID книги.
///
///
/// true - удаление успешно.
/// false - книга не найдена.
///
public bool Delete(int id)
{
using var connection = _databaseManager.CreateConnection();
int affectedRows = connection.Execute(
"""
DELETE FROM books
WHERE id = @Id
""",
new { Id = id }
);
return affectedRows > 0;
}
}