2-messages_send_endpoint.php 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. <?php
  2. namespace cx_newsletter;
  3. use \wp_rest_request;
  4. use \exception;
  5. class messages_send_endpoint
  6. extends rest_endpoint
  7. implements rest_endpoint_interface {
  8. use rest_endpoint_with_apikey;
  9. public function get_method() : string {
  10. return 'POST';
  11. }
  12. public function get_route() : string {
  13. return '/message/send/';
  14. }
  15. public function action(wp_rest_request $request) : array {
  16. if (!$this->check_request_apikey($request)) {
  17. return $this->bad_apikey_response();
  18. }
  19. $response = new response_builder();
  20. $params = $request->get_json_params();
  21. if (!is_array($params)) {
  22. return $response
  23. ->set_code(response_code::ERROR)
  24. ->set_status(response_status::INCOMPLETE)
  25. ->set_message('Request must be JSON')
  26. ->build();
  27. }
  28. if (!array_key_exists('PhoneNumber', $params)) {
  29. return $response
  30. ->set_code(response_code::NO_PHONE_NUMBER)
  31. ->set_status(response_status::INCOMPLETE)
  32. ->set_message('Phone number must be specified in the request.')
  33. ->build();
  34. }
  35. if (!array_key_exists('Campaign', $params)) {
  36. return $response
  37. ->set_code(response_code::NO_PHONE_NUMBER)
  38. ->set_status(response_status::INCOMPLETE)
  39. ->set_message('Campaign must be specified in the request.')
  40. ->build();
  41. }
  42. try {
  43. $this->prepare();
  44. $phone_number = $params['PhoneNumber'];
  45. $campaign = intval($params['Campaign']);
  46. $this->send($phone_number, $campaign);
  47. } catch (exception $exception) {
  48. return $response
  49. ->set_code(response_code::ERROR)
  50. ->set_status(response_status::ERROR)
  51. ->set_message($exception->getMessage())
  52. ->build();
  53. }
  54. return $response
  55. ->set_code(response_code::SUCCESS)
  56. ->set_status(response_status::SUCCESS)
  57. ->set_message('Successfull saved messages in send log.')
  58. ->set_content('')
  59. ->build();
  60. }
  61. private function send(string $phone_number, int $campaign_id) : void {
  62. $filter = [ 'phone_number' => $phone_number ];
  63. $customers = $this->customers_mapper->load_all($filter);
  64. if (empty($customers)) {
  65. throw new exception('Customer with phone number does not exists.');
  66. }
  67. $customer = $customers[0];
  68. $campaign = new campaign($campaign_id);
  69. $this->campaigns_repository->complete($campaign);
  70. $this->send_log_repository->mark_send($campaign, $customer);
  71. }
  72. private function prepare() : void {
  73. $this->campaigns_repository = new campaigns_repository(
  74. $this->get_database(),
  75. $this->get_tables()
  76. );
  77. $this->send_log_repository = new send_log_repository(
  78. $this->get_database(),
  79. $this->get_tables()
  80. );
  81. $this->customers_mapper = new customers_mapper(
  82. $this->get_database(),
  83. $this->get_tables()
  84. );
  85. $this->messages_mapper = new messages_mapper(
  86. $this->get_database(),
  87. $this->get_tables()
  88. );
  89. }
  90. private campaigns_repository $campaigns_repository;
  91. private send_log_repository $send_log_repository;
  92. private customers_mapper $customers_mapper;
  93. private messages_mapper $messages_mapper;
  94. }