1-messages_mapper.php 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. <?php
  2. namespace cx_newsletter;
  3. class messages_mapper
  4. extends mapper
  5. implements mapper_interface {
  6. public function create(database_item $target) : database_item {
  7. if ($target->has_id()) {
  8. throw $this->get_has_id_exception();
  9. }
  10. $converter = new messages_converter();
  11. $converter->load_object($target);
  12. $result = $this->get_database()->insert(
  13. $this->get_tables()->messages(),
  14. $converter->get_array()
  15. );
  16. if ($result === false) {
  17. throw $this->get_exception('create');
  18. }
  19. return $this->complete(new message($this->get_database()->insert_id));
  20. }
  21. public function save(database_item $target) : database_item {
  22. if (!$target->has_id()) {
  23. throw $this->get_blank_id_exception();
  24. }
  25. $converter = new messages_converter();
  26. $converter->load_object($target);
  27. $condition = [];
  28. $condition['id'] = $target->get_id();
  29. $result = $this->get_database()->update(
  30. $this->get_tables()->messages(),
  31. $converter->get_array(),
  32. $condition
  33. );
  34. if ($result === false) {
  35. throw $this->get_exception('save');
  36. }
  37. return $this->complete($target);
  38. }
  39. public function load_all(array $filters = [], ?int $limit = null) : array {
  40. $query = new \cx_appengine\string_builder();
  41. $query->push('select id, title, content ');
  42. $query->push('from '.$this->get_tables()->messages().' ');
  43. $query->push($this->parse_filters($filters));
  44. $query->push($this->parse_limit($limit));
  45. $result = $this->get_database()->get_results($query->get(), ARRAY_A);
  46. if ($result === null) {
  47. throw $this->get_exception('find');
  48. }
  49. $messages = [];
  50. $converter = new messages_converter();
  51. foreach ($result as $row) {
  52. array_push($messages, $converter->load_array($row)->get_object());
  53. }
  54. return $messages;
  55. }
  56. public function complete(database_item $target) : database_item {
  57. if (!$target->has_id()) {
  58. throw $this->get_blank_id_exception();
  59. }
  60. $query = new \cx_appengine\string_builder();
  61. $query->push('select id, title, content ');
  62. $query->push('from '.$this->get_tables()->messages().' ');
  63. $query->push('where id=%d');
  64. $sql = $this->get_database()->prepare($query, $target->get_id());
  65. $row = $this->get_database()->get_row($sql, ARRAY_A);
  66. if ($row === null) {
  67. throw $this->get_exception('complete');
  68. }
  69. $converter = new messages_converter();
  70. $converter->load_array($row);
  71. return $converter->get_object();
  72. }
  73. public function remove(database_item $target) : void {
  74. if (!$target->has_id()) {
  75. throw $this->get_blank_id_exception();
  76. }
  77. $repository = new campaigns_repository(
  78. $this->get_database(),
  79. $this->get_tables()
  80. );
  81. $campaigns = $repository->load_all(
  82. [ 'message' => $target->get_id() ]
  83. );
  84. foreach ($campaigns as $campaign) {
  85. $this->get_database()->delete(
  86. $this->get_tables()->send_log(),
  87. [ 'campaign' => $campaign->get_id() ]
  88. );
  89. $this->get_database()->delete(
  90. $this->get_tables()->campaigns(),
  91. [ 'id' => $campaign->get_id() ]
  92. );
  93. }
  94. $result = $this->get_database()->delete(
  95. $this->get_tables()->messages(),
  96. [ 'id' => $target->get_id() ]
  97. );
  98. if ($result === false) {
  99. throw $this->get_exception('remove');
  100. }
  101. }
  102. public function count(array $filters = []) : int {
  103. $query = new \cx_appengine\string_builder();
  104. $query->push('select count(id) ');
  105. $query->push('from '.$this->get_tables()->messages().' ');
  106. $query->push($this->parse_filters($filters));
  107. $result = $this->get_database()->get_var($query->get());
  108. if ($result === null) {
  109. throw $this->get_exception('count');
  110. }
  111. return intval($result);
  112. }
  113. public function find(string $phrase, ?int $limit = null) : array {
  114. $columns = [
  115. 'title' => '%'.$phrase.'%',
  116. 'content' => '%'.$phrase.'%'
  117. ];
  118. $filters = $this->parse_filters(
  119. $columns,
  120. filter_type::like,
  121. filter_glue::single
  122. );
  123. $query = new \cx_appengine\string_builder();
  124. $query->push('select id, title, content ');
  125. $query->push('from '.$this->get_tables()->messages().' ');
  126. $query->push($filters);
  127. $query->push($this->parse_limit($limit));
  128. $result = $this->get_database()->get_results($query->get(), ARRAY_A);
  129. if ($result === null) {
  130. throw $this->get_exception('find');
  131. }
  132. $messages = [];
  133. $converter = new messages_converter();
  134. foreach ($result as $row) {
  135. array_push($messages, $converter->load_array($row)->get_object());
  136. }
  137. return $messages;
  138. }
  139. }