feedback_query = $feedback_query;
$this->feedback_storage = $feedback_storage;
$this->message_storage = $message_storage;
$this->tp_client_factory = $tp_client_factory;
}
/**
* @param int $feedback_id
* @param array $args
*
* @return null|WPML_TF_Feedback
*
* @throws WPML_TF_Feedback_Update_Exception
*/
public function update( $feedback_id, array $args ) {
$feedback = $this->feedback_query->get_one( $feedback_id );
if ( $feedback ) {
$this->update_feedback_content( $feedback, $args );
$this->add_message_to_feedback( $feedback, $args );
$this->assign_feedback_to_reviewer( $feedback, $args );
$this->update_feedback_status( $feedback, $args );
$this->feedback_storage->persist( $feedback );
$feedback = $this->feedback_query->get_one( $feedback_id, true );
}
return $feedback;
}
/**
* @param WPML_TF_Feedback $feedback
* @param array $args
*/
private function update_feedback_content( WPML_TF_Feedback $feedback, array $args ) {
if ( isset( $args['feedback_content'] ) && $this->is_admin_user() ) {
$feedback->set_content( $args['feedback_content'] );
}
}
/**
* @param WPML_TF_Feedback $feedback
* @param array $args
*/
private function add_message_to_feedback( WPML_TF_Feedback $feedback, array $args ) {
if ( isset( $args['message_content'] ) ) {
$message_args = array(
'feedback_id' => $feedback->get_id(),
'content' => $args['message_content'],
'author_id' => get_current_user_id(),
);
$message = new WPML_TF_Message( $message_args );
$feedback->add_message( $message );
$this->message_storage->persist( $message );
}
}
/**
* @param WPML_TF_Feedback $feedback
* @param array $args
*/
private function assign_feedback_to_reviewer( WPML_TF_Feedback $feedback, array $args ) {
if ( isset( $args['feedback_reviewer_id'] ) && $this->is_admin_user() ) {
$feedback->set_reviewer( $args['feedback_reviewer_id'] );
}
}
/**
* @param WPML_TF_Feedback $feedback
* @param array $args
*/
private function update_feedback_status( WPML_TF_Feedback $feedback, array $args ) {
if ( isset( $args['feedback_status'] )
&& in_array( $args['feedback_status'], $this->get_feedback_statuses(), true )
) {
if ( 'sent_to_translator' === $args['feedback_status'] && ! $feedback->is_local_translation() ) {
$this->send_feedback_to_tp( $feedback );
} elseif ( 'sent_to_ts_api' === $args['feedback_status'] ) {
$this->update_feedback_status_from_tp( $feedback );
} else {
$feedback->set_status( $args['feedback_status'] );
}
}
}
/**
* @param int $feedback_id
*
* @return bool
*/
public function delete( $feedback_id ) {
if ( $this->is_admin_user() ) {
$this->feedback_storage->delete( $feedback_id );
return true;
}
return false;
}
/** @return bool */
private function is_admin_user() {
return current_user_can( 'manage_options' );
}
/** @return array */
private function get_feedback_statuses() {
return array(
'pending',
'sent_to_translator',
'translator_replied',
'admin_replied',
'fixed',
'sent_to_ts_api',
);
}
/**
* @param WPML_TF_Feedback $feedback
*
* @throws WPML_TF_Feedback_Update_Exception
*/
private function send_feedback_to_tp( WPML_TF_Feedback $feedback ) {
$current_user = wp_get_current_user();
$args = array(
'email' => $current_user->user_email,
);
$tp_feedback_id = $this->get_tp_client()->feedback()->send( $feedback, $args );
if ( ! $tp_feedback_id ) {
throw new WPML_TF_Feedback_Update_Exception( $this->get_communication_error_message( 'send' ) );
}
$feedback->get_tp_responses()->set_feedback_id( $tp_feedback_id );
$active_service = $this->get_tp_client()->services()->get_active();
$feedback->get_tp_responses()->set_feedback_forward_method( $active_service->get_feedback_forward_method() );
$new_status = 'sent_to_ts_' . $active_service->get_feedback_forward_method();
$feedback->set_status( $new_status );
}
/**
* @param WPML_TF_Feedback $feedback
*
* @throws WPML_TF_Feedback_Update_Exception
*/
private function update_feedback_status_from_tp( WPML_TF_Feedback $feedback ) {
$tp_feedback_status = $this->get_tp_client()->feedback()->status( $feedback );
if ( ! $tp_feedback_status ) {
throw new WPML_TF_Feedback_Update_Exception( $this->get_communication_error_message( 'status' ) );
} elseif ( 'closed' === $tp_feedback_status ) {
$feedback->set_status( 'fixed' );
}
}
/**
* @param string $endpoint
*
* @return string
*/
private function get_communication_error_message( $endpoint ) {
$active_service = $this->get_tp_client()->services()->get_active();
$service_name = isset( $active_service->name ) ? $active_service->name : esc_html( 'Translation Service', 'sitepress' );
if ( 'send' === $endpoint ) {
$error_message = sprintf(
esc_html__( 'Could not send the report to %s.', 'sitepress' ),
$service_name
);
$error_message .= ' ' . sprintf(
esc_html__( "This means that %s isn't yet aware of the problem in the translation and cannot fix it.", 'sitepress' ),
$service_name
);
} else {
$error_message = sprintf(
esc_html__( 'Could not fetch the status from %s.', 'sitepress' ),
$service_name
);
}
$error_message .= ' ' . sprintf(
esc_html__( "Let's get it working for you. Please contact %1sWPML support%2s and give them the following error details:", 'sitepress' ),
'',
''
);
$error_message .= '