ClientRepository.cs 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. using System;
  2. using System.Collections.Generic;
  3. using Npgsql;
  4. using RestaurantApp.Models;
  5. namespace RestaurantApp.DAL
  6. {
  7. public class ClientRepository
  8. {
  9. public List<Client> GetAll(string search = "")
  10. {
  11. var list = new List<Client>();
  12. using (var conn = Database.GetConnection())
  13. {
  14. var sql = @"SELECT client_id, first_name, last_name, phone, email,
  15. birth_date, bonus_points, registered_at
  16. FROM client WHERE 1=1 ";
  17. if (!string.IsNullOrWhiteSpace(search))
  18. sql += @" AND (LOWER(first_name) LIKE LOWER(@s) OR LOWER(last_name) LIKE LOWER(@s)
  19. OR phone LIKE @s OR email LIKE @s)";
  20. sql += " ORDER BY last_name, first_name";
  21. using (var cmd = new NpgsqlCommand(sql, conn))
  22. {
  23. if (!string.IsNullOrWhiteSpace(search))
  24. cmd.Parameters.AddWithValue("s", $"%{search}%");
  25. using (var r = cmd.ExecuteReader())
  26. while (r.Read()) list.Add(MapClient(r));
  27. }
  28. }
  29. return list;
  30. }
  31. public Client GetById(int id)
  32. {
  33. using (var conn = Database.GetConnection())
  34. using (var cmd = new NpgsqlCommand(
  35. "SELECT client_id, first_name, last_name, phone, email, birth_date, bonus_points, registered_at FROM client WHERE client_id=@id", conn))
  36. {
  37. cmd.Parameters.AddWithValue("id", id);
  38. using (var r = cmd.ExecuteReader())
  39. if (r.Read()) return MapClient(r);
  40. }
  41. return null;
  42. }
  43. public void Insert(Client c)
  44. {
  45. using (var conn = Database.GetConnection())
  46. using (var cmd = new NpgsqlCommand(
  47. @"INSERT INTO client(first_name, last_name, phone, email, birth_date, bonus_points)
  48. VALUES(@fn, @ln, @ph, @em, @bd, @bp)", conn))
  49. {
  50. cmd.Parameters.AddWithValue("fn", c.FirstName);
  51. cmd.Parameters.AddWithValue("ln", c.LastName);
  52. cmd.Parameters.AddWithValue("ph", string.IsNullOrEmpty(c.Phone) ? (object)DBNull.Value : c.Phone);
  53. cmd.Parameters.AddWithValue("em", string.IsNullOrEmpty(c.Email) ? (object)DBNull.Value : c.Email);
  54. cmd.Parameters.AddWithValue("bd", c.BirthDate.HasValue ? (object)c.BirthDate.Value : DBNull.Value);
  55. cmd.Parameters.AddWithValue("bp", c.BonusPoints);
  56. cmd.ExecuteNonQuery();
  57. }
  58. }
  59. public void Update(Client c)
  60. {
  61. using (var conn = Database.GetConnection())
  62. using (var cmd = new NpgsqlCommand(
  63. @"UPDATE client SET first_name=@fn, last_name=@ln, phone=@ph, email=@em,
  64. birth_date=@bd, bonus_points=@bp WHERE client_id=@id", conn))
  65. {
  66. cmd.Parameters.AddWithValue("id", c.ClientId);
  67. cmd.Parameters.AddWithValue("fn", c.FirstName);
  68. cmd.Parameters.AddWithValue("ln", c.LastName);
  69. cmd.Parameters.AddWithValue("ph", string.IsNullOrEmpty(c.Phone) ? (object)DBNull.Value : c.Phone);
  70. cmd.Parameters.AddWithValue("em", string.IsNullOrEmpty(c.Email) ? (object)DBNull.Value : c.Email);
  71. cmd.Parameters.AddWithValue("bd", c.BirthDate.HasValue ? (object)c.BirthDate.Value : DBNull.Value);
  72. cmd.Parameters.AddWithValue("bp", c.BonusPoints);
  73. cmd.ExecuteNonQuery();
  74. }
  75. }
  76. public void Delete(int id)
  77. {
  78. using (var conn = Database.GetConnection())
  79. {
  80. using (var checkCmd = new NpgsqlCommand(
  81. "SELECT COUNT(*) FROM reservation WHERE client_id = @id", conn))
  82. {
  83. checkCmd.Parameters.AddWithValue("id", id);
  84. long count = (long)checkCmd.ExecuteScalar();
  85. if (count > 0)
  86. {
  87. throw new Exception("Íåâîçìîæíî óäàëèòü êëèåíòà: ó íåãî åñòü áðîíèðîâàíèÿ");
  88. }
  89. else
  90. {
  91. using (var cmd = new NpgsqlCommand("DELETE FROM client WHERE client_id = @id", conn))
  92. {
  93. cmd.Parameters.AddWithValue("id", id);
  94. cmd.ExecuteNonQuery();
  95. }
  96. }
  97. }
  98. }
  99. }
  100. private Client MapClient(NpgsqlDataReader r) => new Client
  101. {
  102. ClientId = r.GetInt32(0),
  103. FirstName = r.GetString(1),
  104. LastName = r.GetString(2),
  105. Phone = r.IsDBNull(3) ? "" : r.GetString(3),
  106. Email = r.IsDBNull(4) ? "" : r.GetString(4),
  107. BirthDate = r.IsDBNull(5) ? (DateTime?)null : r.GetDateTime(5),
  108. BonusPoints = r.GetInt32(6),
  109. RegisteredAt = r.GetDateTime(7)
  110. };
  111. }
  112. }