has_id()) { throw $this->get_has_id_exception(); } $converter = new messages_converter(); $converter->load_object($target); $result = $this->get_database()->insert( $this->get_tables()->messages(), $converter->get_array() ); if ($result === false) { throw $this->get_exception('create'); } return $this->complete(new message($this->get_database()->insert_id)); } public function save(database_item $target) : database_item { if (!$target->has_id()) { throw $this->get_blank_id_exception(); } $converter = new messages_converter(); $converter->load_object($target); $condition = []; $condition['id'] = $target->get_id(); $result = $this->get_database()->update( $this->get_tables()->messages(), $converter->get_array(), $condition ); if ($result === false) { throw $this->get_exception('save'); } return $this->complete($target); } public function load_all(array $filters = [], ?int $limit = null) : array { $query = new \cx_appengine\string_builder(); $query->push('select id, title, content '); $query->push('from '.$this->get_tables()->messages().' '); $query->push($this->parse_filters($filters)); $query->push($this->parse_limit($limit)); $result = $this->get_database()->get_results($query->get(), ARRAY_A); if ($result === null) { throw $this->get_exception('find'); } $messages = []; $converter = new messages_converter(); foreach ($result as $row) { array_push($messages, $converter->load_array($row)->get_object()); } return $messages; } public function complete(database_item $target) : database_item { if (!$target->has_id()) { throw $this->get_blank_id_exception(); } $query = new \cx_appengine\string_builder(); $query->push('select id, title, content '); $query->push('from '.$this->get_tables()->messages().' '); $query->push('where id=%d'); $sql = $this->get_database()->prepare($query, $target->get_id()); $row = $this->get_database()->get_row($sql, ARRAY_A); if ($row === null) { throw $this->get_exception('complete'); } $converter = new messages_converter(); $converter->load_array($row); return $converter->get_object(); } public function remove(database_item $target) : void { if (!$target->has_id()) { throw $this->get_blank_id_exception(); } $repository = new campaigns_repository( $this->get_database(), $this->get_tables() ); $campaigns = $repository->load_all( [ 'message' => $target->get_id() ] ); foreach ($campaigns as $campaign) { $this->get_database()->delete( $this->get_tables()->send_log(), [ 'campaign' => $campaign->get_id() ] ); $this->get_database()->delete( $this->get_tables()->campaigns(), [ 'id' => $campaign->get_id() ] ); } $result = $this->get_database()->delete( $this->get_tables()->messages(), [ 'id' => $target->get_id() ] ); if ($result === false) { throw $this->get_exception('remove'); } } public function count(array $filters = []) : int { $query = new \cx_appengine\string_builder(); $query->push('select count(id) '); $query->push('from '.$this->get_tables()->messages().' '); $query->push($this->parse_filters($filters)); $result = $this->get_database()->get_var($query->get()); if ($result === null) { throw $this->get_exception('count'); } return intval($result); } public function find(string $phrase, ?int $limit = null) : array { $columns = [ 'title' => '%'.$phrase.'%', 'content' => '%'.$phrase.'%' ]; $filters = $this->parse_filters( $columns, filter_type::like, filter_glue::single ); $query = new \cx_appengine\string_builder(); $query->push('select id, title, content '); $query->push('from '.$this->get_tables()->messages().' '); $query->push($filters); $query->push($this->parse_limit($limit)); $result = $this->get_database()->get_results($query->get(), ARRAY_A); if ($result === null) { throw $this->get_exception('find'); } $messages = []; $converter = new messages_converter(); foreach ($result as $row) { array_push($messages, $converter->load_array($row)->get_object()); } return $messages; } }