DishRepository.cs 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. using Npgsql;
  2. using RestaurantApp.Models;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Data;
  6. using System.Windows.Forms;
  7. namespace RestaurantApp.DAL
  8. {
  9. public class DishRepository
  10. {
  11. public List<Dish> GetAll(string search = "", int categoryId = 0, bool? available = null)
  12. {
  13. var list = new List<Dish>();
  14. using (var conn = Database.GetConnection())
  15. {
  16. var sql = @"SELECT d.dish_id, d.category_id, dc.name as cat_name,
  17. d.name, d.description, d.price, d.weight_g,
  18. d.cook_time_min, d.is_available
  19. FROM dish d
  20. JOIN dish_category dc ON dc.category_id = d.category_id
  21. WHERE 1=1 ";
  22. if (!string.IsNullOrWhiteSpace(search))
  23. sql += " AND (LOWER(d.name) LIKE LOWER(@search) OR LOWER(d.description) LIKE LOWER(@search))";
  24. if (categoryId > 0)
  25. sql += " AND d.category_id = @cat";
  26. if (available.HasValue)
  27. sql += " AND d.is_available = @avail";
  28. sql += " ORDER BY dc.name, d.name";
  29. using (var cmd = new NpgsqlCommand(sql, conn))
  30. {
  31. if (!string.IsNullOrWhiteSpace(search))
  32. cmd.Parameters.AddWithValue("search", $"%{search}%");
  33. if (categoryId > 0)
  34. cmd.Parameters.AddWithValue("cat", categoryId);
  35. if (available.HasValue)
  36. cmd.Parameters.AddWithValue("avail", available.Value);
  37. using (var r = cmd.ExecuteReader())
  38. {
  39. while (r.Read())
  40. list.Add(MapDish(r));
  41. }
  42. }
  43. }
  44. return list;
  45. }
  46. public Dish GetById(int id)
  47. {
  48. using (var conn = Database.GetConnection())
  49. using (var cmd = new NpgsqlCommand(
  50. @"SELECT d.dish_id, d.category_id, dc.name, d.name, d.description,
  51. d.price, d.weight_g, d.cook_time_min, d.is_available
  52. FROM dish d JOIN dish_category dc ON dc.category_id=d.category_id
  53. WHERE d.dish_id=@id", conn))
  54. {
  55. cmd.Parameters.AddWithValue("id", id);
  56. using (var r = cmd.ExecuteReader())
  57. if (r.Read()) return MapDish(r);
  58. }
  59. return null;
  60. }
  61. public void Insert(Dish d)
  62. {
  63. using (var conn = Database.GetConnection())
  64. using (var cmd = new NpgsqlCommand(
  65. @"INSERT INTO dish(category_id, name, description, price, weight_g, cook_time_min, is_available)
  66. VALUES(@cat, @name, @desc, @price, @w, @ct, @avail)", conn))
  67. {
  68. // Çäåñü ÍÅ äîëæíî áûòü ïàðàìåòðà dish_id
  69. cmd.Parameters.AddWithValue("cat", d.CategoryId);
  70. cmd.Parameters.AddWithValue("name", d.Name);
  71. cmd.Parameters.AddWithValue("desc", (object)d.Description ?? DBNull.Value);
  72. cmd.Parameters.AddWithValue("price", d.Price);
  73. cmd.Parameters.AddWithValue("w", d.WeightG.HasValue ? (object)d.WeightG.Value : DBNull.Value);
  74. cmd.Parameters.AddWithValue("ct", d.CookTimeMin.HasValue ? (object)d.CookTimeMin.Value : DBNull.Value);
  75. cmd.Parameters.AddWithValue("avail", d.IsAvailable);
  76. cmd.ExecuteNonQuery();
  77. }
  78. }
  79. public void Update(Dish d)
  80. {
  81. using (var conn = Database.GetConnection())
  82. using (var cmd = new NpgsqlCommand(
  83. @"UPDATE dish SET category_id=@cat,name=@name,description=@desc,price=@price,
  84. weight_g=@w,cook_time_min=@ct,is_available=@avail WHERE dish_id=@id", conn))
  85. {
  86. cmd.Parameters.AddWithValue("id", d.DishId);
  87. cmd.Parameters.AddWithValue("cat", d.CategoryId);
  88. cmd.Parameters.AddWithValue("name", d.Name);
  89. cmd.Parameters.AddWithValue("desc", (object)d.Description ?? DBNull.Value);
  90. cmd.Parameters.AddWithValue("price", d.Price);
  91. cmd.Parameters.AddWithValue("w", d.WeightG.HasValue ? (object)d.WeightG.Value : DBNull.Value);
  92. cmd.Parameters.AddWithValue("ct", d.CookTimeMin.HasValue ? (object)d.CookTimeMin.Value : DBNull.Value);
  93. cmd.Parameters.AddWithValue("avail", d.IsAvailable);
  94. cmd.ExecuteNonQuery();
  95. }
  96. }
  97. public void Delete(int id)
  98. {
  99. using (var conn = Database.GetConnection())
  100. {
  101. using (var checkCmd = new NpgsqlCommand(
  102. "SELECT COUNT(*) FROM order_item WHERE dish_id = @id", conn))
  103. {
  104. checkCmd.Parameters.AddWithValue("id", id);
  105. long count = (long)checkCmd.ExecuteScalar();
  106. if (count > 0)
  107. {
  108. using (var updateCmd = new NpgsqlCommand(
  109. "UPDATE dish SET is_available = false WHERE dish_id = @id", conn))
  110. {
  111. updateCmd.Parameters.AddWithValue("id", id);
  112. updateCmd.ExecuteNonQuery();
  113. }
  114. MessageBox.Show("Áëþäî èñïîëüçóåòñÿ â çàêàçàõ. Îíî ïîìå÷åíî êàê íåäîñòóïíîå.",
  115. "Èíôîðìàöèÿ", MessageBoxButtons.OK, MessageBoxIcon.Information);
  116. }
  117. else
  118. {
  119. using (var deleteCmd = new NpgsqlCommand(
  120. "DELETE FROM dish WHERE dish_id = @id", conn))
  121. {
  122. deleteCmd.Parameters.AddWithValue("id", id);
  123. deleteCmd.ExecuteNonQuery();
  124. }
  125. }
  126. }
  127. }
  128. }
  129. public DataTable GetCategories()
  130. {
  131. var dt = new DataTable();
  132. using (var conn = Database.GetConnection())
  133. using (var cmd = new NpgsqlCommand("SELECT category_id, name FROM dish_category ORDER BY name", conn))
  134. using (var da = new NpgsqlDataAdapter(cmd))
  135. da.Fill(dt);
  136. return dt;
  137. }
  138. private Dish MapDish(NpgsqlDataReader r) => new Dish
  139. {
  140. DishId = r.GetInt32(0),
  141. CategoryId = r.GetInt32(1),
  142. CategoryName = r.GetString(2),
  143. Name = r.GetString(3),
  144. Description = r.IsDBNull(4) ? "" : r.GetString(4),
  145. Price = r.GetDecimal(5),
  146. WeightG = r.IsDBNull(6) ? (int?)null : r.GetInt32(6),
  147. CookTimeMin = r.IsDBNull(7) ? (int?)null : r.GetInt32(7),
  148. IsAvailable = r.GetBoolean(8)
  149. };
  150. }
  151. }