UserRepository.cs 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. using Dapper;
  2. using LibraryManagementSystem.Console.Database;
  3. using LibraryManagementSystem.Console.Models;
  4. using Serilog;
  5. namespace LibraryManagementSystem.Console.Repositories;
  6. /// <summary>
  7. /// Выполняет CRUD операции для таблицы users.
  8. /// </summary>
  9. public class UserRepository : IUserRepository
  10. {
  11. private readonly DatabaseManager _databaseManager;
  12. /// <summary>
  13. /// Создает экземпляр репозитория пользователей.
  14. /// </summary>
  15. /// <param name="databaseManager">
  16. /// Менеджер подключения к БД.
  17. /// </param>
  18. public UserRepository(DatabaseManager databaseManager)
  19. {
  20. _databaseManager = databaseManager;
  21. }
  22. /// <summary>
  23. /// Добавляет пользователя в БД.
  24. /// </summary>
  25. /// <param name="user">Объект пользователя.</param>
  26. /// <returns>ID новой записи.</returns>
  27. public int Create(User user)
  28. {
  29. try
  30. {
  31. using var connection = _databaseManager.CreateConnection();
  32. string sql =
  33. """
  34. INSERT INTO users
  35. (
  36. username,
  37. password_hash,
  38. email
  39. )
  40. VALUES
  41. (
  42. @Username,
  43. @PasswordHash,
  44. @Email
  45. )
  46. RETURNING id;
  47. """;
  48. int id = connection.ExecuteScalar<int>(sql, user);
  49. Log.Information(
  50. "Создан пользователь {Username}",
  51. user.Username
  52. );
  53. return id;
  54. }
  55. catch (Exception ex)
  56. {
  57. Log.Error(
  58. ex,
  59. "Ошибка при создании пользователя"
  60. );
  61. throw;
  62. }
  63. }
  64. /// <summary>
  65. /// Возвращает всех пользователей.
  66. /// </summary>
  67. /// <returns>Коллекция пользователей.</returns>
  68. public IEnumerable<User> GetAll()
  69. {
  70. try
  71. {
  72. using var connection = _databaseManager.CreateConnection();
  73. string sql = "SELECT * FROM users";
  74. return connection.Query<User>(sql);
  75. }
  76. catch (Exception ex)
  77. {
  78. Log.Error(
  79. ex,
  80. "Ошибка получения пользователей"
  81. );
  82. throw;
  83. }
  84. }
  85. /// <summary>
  86. /// Возвращает пользователя по ID.
  87. /// </summary>
  88. /// <param name="id">ID пользователя.</param>
  89. /// <returns>Пользователь или null.</returns>
  90. public User? GetById(int id)
  91. {
  92. try
  93. {
  94. using var connection = _databaseManager.CreateConnection();
  95. string sql =
  96. """
  97. SELECT *
  98. FROM users
  99. WHERE id = @Id
  100. """;
  101. return connection.QueryFirstOrDefault<User>(
  102. sql,
  103. new { Id = id }
  104. );
  105. }
  106. catch (Exception ex)
  107. {
  108. Log.Error(
  109. ex,
  110. "Ошибка получения пользователя"
  111. );
  112. throw;
  113. }
  114. }
  115. /// <summary>
  116. /// Обновляет пользователя.
  117. /// </summary>
  118. /// <param name="user">Обновленный пользователь.</param>
  119. /// <returns>
  120. /// true - успешно.
  121. /// false - запись не найдена.
  122. /// </returns>
  123. public bool Update(User user)
  124. {
  125. try
  126. {
  127. using var connection = _databaseManager.CreateConnection();
  128. string sql =
  129. """
  130. UPDATE users
  131. SET
  132. username = @Username,
  133. email = @Email
  134. WHERE id = @Id
  135. """;
  136. int affectedRows = connection.Execute(sql, user);
  137. return affectedRows > 0;
  138. }
  139. catch (Exception ex)
  140. {
  141. Log.Error(
  142. ex,
  143. "Ошибка обновления пользователя"
  144. );
  145. throw;
  146. }
  147. }
  148. /// <summary>
  149. /// Удаляет пользователя.
  150. /// </summary>
  151. /// <param name="id">ID пользователя.</param>
  152. /// <returns>
  153. /// true - успешно.
  154. /// false - запись не найдена.
  155. /// </returns>
  156. public bool Delete(int id)
  157. {
  158. try
  159. {
  160. using var connection = _databaseManager.CreateConnection();
  161. string sql =
  162. """
  163. DELETE FROM users
  164. WHERE id = @Id
  165. """;
  166. int affectedRows = connection.Execute(
  167. sql,
  168. new { Id = id }
  169. );
  170. return affectedRows > 0;
  171. }
  172. catch (Exception ex)
  173. {
  174. Log.Error(
  175. ex,
  176. "Ошибка удаления пользователя"
  177. );
  178. throw;
  179. }
  180. }
  181. }