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