Program.cs 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312
  1. using LibraryManagementSystem.Console.Database;
  2. using LibraryManagementSystem.Console.Models;
  3. using LibraryManagementSystem.Console.Repositories;
  4. using LibraryManagementSystem.Console.Utils;
  5. using Npgsql;
  6. LoggerConfigurator.Configure();
  7. DatabaseManager databaseManager = new();
  8. IUserRepository userRepository = new UserRepository(databaseManager);
  9. IBookRepository bookRepository = new BookRepository(databaseManager);
  10. while (true)
  11. {
  12. System.Console.WriteLine();
  13. System.Console.WriteLine("===== LIBRARY MENU =====");
  14. System.Console.WriteLine("1 - Add user");
  15. System.Console.WriteLine("2 - Show users");
  16. System.Console.WriteLine("3 - Update user");
  17. System.Console.WriteLine("4 - Delete user");
  18. System.Console.WriteLine("5 - Add book");
  19. System.Console.WriteLine("6 - Show books");
  20. System.Console.WriteLine("0 - Exit");
  21. System.Console.Write("Select: ");
  22. string? choice = System.Console.ReadLine();
  23. switch (choice)
  24. {
  25. case "1":
  26. AddUser(userRepository);
  27. break;
  28. case "2":
  29. ShowUsers(userRepository);
  30. break;
  31. case "3":
  32. UpdateUser(userRepository);
  33. break;
  34. case "4":
  35. DeleteUser(userRepository);
  36. break;
  37. case "5":
  38. AddBook(bookRepository);
  39. break;
  40. case "6":
  41. ShowBooks(bookRepository);
  42. break;
  43. case "0":
  44. return;
  45. default:
  46. System.Console.WriteLine("Invalid option.");
  47. break;
  48. }
  49. }
  50. /// <summary>
  51. /// Добавляет нового пользователя.
  52. /// </summary>
  53. /// <param name="repository">
  54. /// Репозиторий пользователей.
  55. /// </param>
  56. static void AddUser(IUserRepository repository)
  57. {
  58. try
  59. {
  60. System.Console.Write("Username: ");
  61. string username = System.Console.ReadLine()!;
  62. System.Console.Write("Password: ");
  63. string password = System.Console.ReadLine()!;
  64. System.Console.Write("Email: ");
  65. string email = System.Console.ReadLine()!;
  66. User user = new()
  67. {
  68. Username = username,
  69. PasswordHash = PasswordHasher.HashPassword(password),
  70. Email = email,
  71. };
  72. int id = repository.Create(user);
  73. System.Console.WriteLine($"User created. ID: {id}");
  74. }
  75. catch (PostgresException ex)
  76. {
  77. if (ex.SqlState == "23505")
  78. {
  79. System.Console.WriteLine("User with this username or email already exists.");
  80. }
  81. else
  82. {
  83. System.Console.WriteLine($"Database error: {ex.Message}");
  84. }
  85. }
  86. catch (Exception ex)
  87. {
  88. System.Console.WriteLine($"Unexpected error: {ex.Message}");
  89. }
  90. }
  91. /// <summary>
  92. /// Отображает список пользователей.
  93. /// </summary>
  94. /// <param name="repository">
  95. /// Репозиторий пользователей.
  96. /// </param>
  97. static void ShowUsers(IUserRepository repository)
  98. {
  99. try
  100. {
  101. var users = repository.GetAll();
  102. foreach (var user in users)
  103. {
  104. System.Console.WriteLine($"{user.Id} | " + $"{user.Username} | " + $"{user.Email}");
  105. }
  106. }
  107. catch (Exception ex)
  108. {
  109. System.Console.WriteLine($"Error loading users: {ex.Message}");
  110. }
  111. }
  112. /// <summary>
  113. /// Обновляет данные пользователя.
  114. /// </summary>
  115. /// <param name="repository">
  116. /// Репозиторий пользователей.
  117. /// </param>
  118. static void UpdateUser(IUserRepository repository)
  119. {
  120. try
  121. {
  122. System.Console.Write("User ID: ");
  123. if (!int.TryParse(System.Console.ReadLine(), out int id))
  124. {
  125. System.Console.WriteLine("Invalid ID format.");
  126. return;
  127. }
  128. var user = repository.GetById(id);
  129. if (user is null)
  130. {
  131. System.Console.WriteLine("User not found.");
  132. return;
  133. }
  134. System.Console.Write("New username: ");
  135. user.Username = System.Console.ReadLine()!;
  136. System.Console.Write("New email: ");
  137. user.Email = System.Console.ReadLine()!;
  138. bool success = repository.Update(user);
  139. System.Console.WriteLine(success ? "User updated." : "Update failed.");
  140. }
  141. catch (PostgresException ex)
  142. {
  143. if (ex.SqlState == "23505")
  144. {
  145. System.Console.WriteLine("Username or email already exists.");
  146. }
  147. else
  148. {
  149. System.Console.WriteLine($"Database error: {ex.Message}");
  150. }
  151. }
  152. catch (Exception ex)
  153. {
  154. System.Console.WriteLine($"Unexpected error: {ex.Message}");
  155. }
  156. }
  157. /// <summary>
  158. /// Удаляет пользователя.
  159. /// </summary>
  160. /// <param name="repository">
  161. /// Репозиторий пользователей.
  162. /// </param>
  163. static void DeleteUser(IUserRepository repository)
  164. {
  165. try
  166. {
  167. System.Console.Write("User ID: ");
  168. if (!int.TryParse(System.Console.ReadLine(), out int id))
  169. {
  170. System.Console.WriteLine("Invalid ID format.");
  171. return;
  172. }
  173. bool success = repository.Delete(id);
  174. System.Console.WriteLine(success ? "User deleted." : "User not found.");
  175. }
  176. catch (Exception ex)
  177. {
  178. System.Console.WriteLine($"Delete error: {ex.Message}");
  179. }
  180. }
  181. /// <summary>
  182. /// Добавляет новую книгу.
  183. /// </summary>
  184. /// <param name="repository">
  185. /// Репозиторий книг.
  186. /// </param>
  187. static void AddBook(IBookRepository repository)
  188. {
  189. try
  190. {
  191. System.Console.Write("Title: ");
  192. string title = System.Console.ReadLine()!;
  193. System.Console.Write("Author: ");
  194. string author = System.Console.ReadLine()!;
  195. System.Console.Write("Year: ");
  196. if (!int.TryParse(System.Console.ReadLine(), out int year))
  197. {
  198. System.Console.WriteLine("Invalid year format.");
  199. return;
  200. }
  201. System.Console.Write("Owner ID: ");
  202. if (!int.TryParse(System.Console.ReadLine(), out int ownerId))
  203. {
  204. System.Console.WriteLine("Invalid owner ID.");
  205. return;
  206. }
  207. Book book = new()
  208. {
  209. Title = title,
  210. Author = author,
  211. PublicationYear = year,
  212. OwnerId = ownerId,
  213. };
  214. int id = repository.Create(book);
  215. System.Console.WriteLine($"Book created. ID: {id}");
  216. }
  217. catch (PostgresException ex)
  218. {
  219. if (ex.SqlState == "23503")
  220. {
  221. System.Console.WriteLine("Owner with this ID does not exist.");
  222. }
  223. else
  224. {
  225. System.Console.WriteLine($"Database error: {ex.Message}");
  226. }
  227. }
  228. catch (Exception ex)
  229. {
  230. System.Console.WriteLine($"Unexpected error: {ex.Message}");
  231. }
  232. }
  233. /// <summary>
  234. /// Отображает список книг.
  235. /// </summary>
  236. /// <param name="repository">
  237. /// Репозиторий книг.
  238. /// </param>
  239. static void ShowBooks(IBookRepository repository)
  240. {
  241. try
  242. {
  243. var books = repository.GetAll();
  244. foreach (var book in books)
  245. {
  246. System.Console.WriteLine(
  247. $"{book.Id} | "
  248. + $"{book.Title} | "
  249. + $"{book.Author} | "
  250. + $"{book.PublicationYear}"
  251. );
  252. }
  253. }
  254. catch (Exception ex)
  255. {
  256. System.Console.WriteLine($"Error loading books: {ex.Message}");
  257. }
  258. }