BookRepository.cs 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. using Dapper;
  2. using LibraryManagementSystem.Console.Database;
  3. using LibraryManagementSystem.Console.Models;
  4. using Serilog;
  5. namespace LibraryManagementSystem.Console.Repositories;
  6. /// <summary>
  7. /// Создает экземпляр репозитория книг.
  8. /// </summary>
  9. /// <param name="databaseManager">
  10. /// Менеджер подключения к базе данных.
  11. /// </param>
  12. public class BookRepository : IBookRepository
  13. {
  14. private readonly DatabaseManager _databaseManager;
  15. public BookRepository(DatabaseManager databaseManager)
  16. {
  17. _databaseManager = databaseManager;
  18. }
  19. /// <summary>
  20. /// Добавляет книгу в базу данных.
  21. /// </summary>
  22. /// <param name="book">
  23. /// Объект книги.
  24. /// </param>
  25. /// <returns>
  26. /// ID созданной книги.
  27. /// </returns>
  28. /// <exception cref="Exception">
  29. /// Возникает при ошибке добавления книги.
  30. /// </exception>
  31. public int Create(Book book)
  32. {
  33. try
  34. {
  35. using var connection = _databaseManager.CreateConnection();
  36. string sql = """
  37. INSERT INTO books
  38. (
  39. title,
  40. author,
  41. publication_year,
  42. owner_id
  43. )
  44. VALUES
  45. (
  46. @Title,
  47. @Author,
  48. @PublicationYear,
  49. @OwnerId
  50. )
  51. RETURNING id;
  52. """;
  53. int id = connection.ExecuteScalar<int>(sql, book);
  54. Log.Information("Создана книга {Title}", book.Title);
  55. return id;
  56. }
  57. catch (Exception ex)
  58. {
  59. Log.Error(ex, "Ошибка создания книги");
  60. throw;
  61. }
  62. }
  63. /// <summary>
  64. /// Возвращает список всех книг.
  65. /// </summary>
  66. /// <returns>
  67. /// Коллекция книг.
  68. /// </returns>
  69. public IEnumerable<Book> GetAll()
  70. {
  71. using var connection = _databaseManager.CreateConnection();
  72. return connection.Query<Book>("SELECT * FROM books");
  73. }
  74. /// <summary>
  75. /// Возвращает книгу по ID.
  76. /// </summary>
  77. /// <param name="id">
  78. /// ID книги.
  79. /// </param>
  80. /// <returns>
  81. /// Найденная книга или null.
  82. /// </returns>
  83. public Book? GetById(int id)
  84. {
  85. using var connection = _databaseManager.CreateConnection();
  86. return connection.QueryFirstOrDefault<Book>(
  87. """
  88. SELECT *
  89. FROM books
  90. WHERE id = @Id
  91. """,
  92. new { Id = id }
  93. );
  94. }
  95. /// <summary>
  96. /// Обновляет данные книги.
  97. /// </summary>
  98. /// <param name="book">
  99. /// Обновленный объект книги.
  100. /// </param>
  101. /// <returns>
  102. /// true - обновление успешно.
  103. /// false - книга не найдена.
  104. /// </returns>
  105. public bool Update(Book book)
  106. {
  107. using var connection = _databaseManager.CreateConnection();
  108. int affectedRows = connection.Execute(
  109. """
  110. UPDATE books
  111. SET
  112. title = @Title,
  113. author = @Author,
  114. publication_year = @PublicationYear
  115. WHERE id = @Id
  116. """,
  117. book
  118. );
  119. return affectedRows > 0;
  120. }
  121. /// <summary>
  122. /// Удаляет книгу по ID.
  123. /// </summary>
  124. /// <param name="id">
  125. /// ID книги.
  126. /// </param>
  127. /// <returns>
  128. /// true - удаление успешно.
  129. /// false - книга не найдена.
  130. /// </returns>
  131. public bool Delete(int id)
  132. {
  133. using var connection = _databaseManager.CreateConnection();
  134. int affectedRows = connection.Execute(
  135. """
  136. DELETE FROM books
  137. WHERE id = @Id
  138. """,
  139. new { Id = id }
  140. );
  141. return affectedRows > 0;
  142. }
  143. }