Files
hub-insurance/wp-content/plugins/gravitysmtp/includes/models/class-suppressed-emails-model.php
T
2026-07-02 15:54:39 -06:00

268 lines
6.2 KiB
PHP

<?php
namespace Gravity_Forms\Gravity_SMTP\Models;
use Gravity_Forms\Gravity_SMTP\Enums\Suppression_Reason_Enum;
use Gravity_Forms\Gravity_SMTP\Users\Roles;
class Suppressed_Emails_Model {
protected $table_name = 'gravitysmtp_suppressed_emails';
protected $fillable = array(
'email',
'reason',
'notes',
);
protected function get_table_name() {
global $wpdb;
return $wpdb->prefix . $this->table_name;
}
public function suppress_email( $email, $reason, $notes = '' ) {
/**
* Allows third-parties to abort suppressing a given email based on the data.
*
* @since 1.5.1
*
* @param string $email
* @param string $reason
* @param string $notes
*
* @return boolean
*/
$skip = apply_filters( 'gravitysmtp_abort_email_suppression', false, $email, $reason, $notes );
if ( $skip ) {
return;
}
global $wpdb;
$table_name = $this->get_table_name();
$data = array(
'date_created' => current_time( 'mysql', true ),
'email' => $email,
'reason' => $reason,
'notes' => $notes,
);
$sql = $wpdb->prepare( "SELECT * FROM $table_name WHERE email = %s", $email );
$existing = $wpdb->get_results( $sql, ARRAY_A );
if ( ! empty( $existing ) ) {
$data = array(
'notes' => $notes,
);
$this->update( $email, array( 'notes' => $notes ) );
return $existing[0]['id'];
}
$wpdb->insert(
$table_name,
array(
'date_created' => current_time( 'mysql', true ),
'email' => $email,
'reason' => $reason,
'notes' => $notes,
)
);
$created_id = $wpdb->insert_id;
/**
* Allows third-parties to perform an action after an email is suppressed.
*
* @since 1.5.1
*
* @param string $email
* @param string $reason
* @param string $notes
*
* @return boolean
*/
do_action( 'gravitysmtp_after_email_suppressed', $created_id, $email, $reason, $notes );
return $created_id;
}
public function is_email_suppressed( $email ) {
global $wpdb;
$table_name = $this->get_table_name();
$sql = $wpdb->prepare( "SELECT * FROM $table_name WHERE email = %s", $email );
$results = $wpdb->get_results( $sql, ARRAY_A );
return ! empty( $results );
}
public function update( $email, $values ) {
global $wpdb;
$self = $this;
$values = array_filter( $values, function ( $key ) use ( $self ) {
return in_array( $key, $self->fillable );
}, ARRAY_FILTER_USE_KEY );
$wpdb->update(
$this->get_table_name(),
$values,
array( 'email' => $email )
);
}
public function reactivate_email( $email ) {
global $wpdb;
$wpdb->delete( $this->get_table_name(), array( 'email' => $email ) );
}
public function delete_all() {
global $wpdb;
$table_name = $this->get_table_name();
$wpdb->query( "TRUNCATE TABLE $table_name" );
}
public function all() {
global $wpdb;
$sql = 'SELECT * FROM %1$s ORDER BY %2$s ASC;';
$results = $wpdb->get_results( $wpdb->prepare( $sql, $this->get_table_name(), 'date_created' ), ARRAY_A );
return $results;
}
public function paginate( $page, $per_page, $search_term = null, $sort_by = null, $sort_order = null ) {
global $wpdb;
$table_name = $this->get_table_name();
$offset = ( $page - 1 ) * $per_page;
if ( empty( $sort_by ) ) {
$sort_by = 'date_created';
}
if ( empty( $sort_order ) ) {
$sort_order = 'DESC';
}
$search_clause = null;
if ( ! empty( $search_term ) ) {
$search_clause .= $wpdb->prepare( "WHERE email = %s", $search_term );
}
$prepared_sql = $wpdb->prepare(
"SELECT * FROM $table_name $search_clause ORDER BY `$sort_by` $sort_order LIMIT %d, %d",
$offset,
$per_page
);
$results = $wpdb->get_results( $prepared_sql, ARRAY_A );
return $results;
}
public function count( $search_term = null ) {
global $wpdb;
$table_name = $this->get_table_name();
$search_clause = null;
if ( ! empty( $search_term ) ) {
$search_clause = $wpdb->prepare( "WHERE MATCH(email,notes) AGAINST(%s IN NATURAL LANGUAGE MODE)", $search_term );
}
$sql = "SELECT COUNT(1) as 'count' FROM $table_name $search_clause;";
$results = $wpdb->get_row( $sql, ARRAY_A );
return $results['count'];
}
public function format_as_data_rows( $data ) {
$rows = array();
foreach ( $data as $row ) {
$grid_actions = $this->get_suppression_grid_actions( $row['id'] );
$row_data = array(
'id' => $row['id'],
'email' => array(
'component' => 'Text',
'props' => array(
'content' => $row['email'],
'size' => 'text-sm',
),
),
'reason' => array(
'component' => 'StatusIndicator',
'props' => array(
'label' => Suppression_Reason_Enum::label( $row['reason'] ),
'status' => Suppression_Reason_Enum::indicator( $row['reason'] ),
'hasDot' => false,
),
),
'date' => array(
'component' => 'Text',
'props' => array(
'content' => $this->convert_dates_to_timezone( $row['date_created'] ),
'size' => 'text-sm',
),
),
'notes' => array(
'component' => 'Text',
'props' => array(
'content' => $row['notes'],
'size' => 'text-sm',
),
),
'actions' => $grid_actions,
);
$rows[] = $row_data;
}
return $rows;
}
private function convert_dates_to_timezone( $date ) {
$gmt_time = new \DateTimeZone( 'UTC' );
$local_time = new \DateTimeZone( wp_timezone_string() );
$datetime = new \DateTime( $date, $gmt_time );
$datetime->setTimezone( $local_time );
return $datetime->format( 'F d, Y \a\t h:ia' );
}
private function get_suppression_grid_actions( $email_id ) {
$actions = array(
'component' => 'Box',
'components' => array(
array(
'component' => 'Button',
'props' => array(
'action' => 'reactivate',
'customAttributes' => array(
'title' => esc_html__( 'Reactivate', 'gravitysmtp' ),
),
'customClasses' => array( 'gravitysmtp-data-grid__action' ),
'icon' => 'reactivate',
'iconPrefix' => 'gravity-admin-icon',
'size' => 'size-height-s',
'type' => 'icon-white',
'data' => array(
'email_id' => $email_id,
),
),
),
),
);
return apply_filters( 'gravitysmtp_email_suppression_actions', $actions );
}
}