2026-02-05 17:08:59 +03:00

181 lines
6.1 KiB
PHP

<?php
/**
* MainWP Database Logs.
*
* This file handles all interactions with the Client DB.
*
* @package MainWP/Dashboard
*/
namespace MainWP\Dashboard\Module\Log;
use MainWP\Dashboard\MainWP_DB;
/**
* Class Log_DB
*
* @package MainWP\Dashboard
*/
class Log_DB_Helper extends MainWP_DB {
/**
* Protected static variable to hold the single instance of the class.
*
* @var mixed Default null
*/
protected static $instance = null;
/**
* Return the single instance of the class.
*
* @return mixed $instance The single instance of the class.
*/
public static function instance() {
if ( is_null( static::$instance ) ) {
static::$instance = new self();
}
return static::$instance;
}
/**
* Method get_log_by_id().
*
* @param int $log_id Log id.
*
* @return object|false log.
*/
public function get_log_by_id( $log_id ) {
if ( empty( $log_id ) ) {
return false;
}
return $this->wpdb->get_row( $this->wpdb->prepare( 'SELECT * FROM ' . $this->table_name( 'wp_logs' ) . ' WHERE log_id = %d ', $log_id ) ); //phpcs:ignore -- ok.
}
/**
* Method update_log().
*
* @param array $data Log data.
*
* @return mixed
*/
public function update_log( $data ) {
if ( empty( $data ) || ! is_array( $data ) || empty( $data['log_id'] ) ) {
return false;
}
$log_id = $data['log_id'];
unset( $data['log_id'] );
return $this->wpdb->update( $this->table_name( 'wp_logs' ), $data, array( 'log_id' => $log_id ) );
}
/**
* Method remove_logs_by().
*
* @param int $site_id Site ID.
*
* @return void.
*/
public function remove_logs_by( $site_id ) { //phpcs:ignore -- NOSONAR -complex.
//phpcs:disable
$this->wpdb->query(
$this->wpdb->prepare(
'DELETE lo, me
FROM ' . $this->table_name( 'wp_logs' ) . ' lo
JOIN ' . $this->table_name( 'wp_logs_meta' ) . ' me ON lo.log_id = me.meta_log_id
WHERE lo.site_id = %d',
$site_id
)
);
//phpcs:enable
}
/**
* Method dismiss_all_changes().
*
* Handle dismiss all sites changes.
*
* @return mixed
*/
public function dismiss_all_changes() {
return $this->wpdb->update( $this->table_name( 'wp_logs' ), array( 'dismiss' => 1 ), array( 'dismiss' => 0 ) );
}
/**
* Method count_events().
*
* @return mixed Count events.
*/
public function count_events() {
return $this->wpdb->get_var( 'SELECT count(*) FROM ' . $this->table_name( 'wp_logs' ) . ' WHERE dismiss = 0 ' ); //phpcs:ignore -- ok.
}
/**
* Method get_logs_users().
*
* @return array Users list.
*/
public function get_logs_users() { //phpcs:ignore -- NOSONAR -complex.
$where = MainWP_DB::instance()->get_sql_where_allow_access_sites( 'wp' );
$sql = 'SELECT lo.log_id, lo.site_id, lo.user_id, lo.connector, wp.name, me.meta_log_id, me.meta_key, me.meta_value '
. ', CASE
WHEN connector != "non-mainwp-changes" THEN "dashboard"
ELSE "wpadmin"
END AS log_source '
. ' FROM ' . $this->table_name( 'wp_logs' ) . ' lo '
. ' LEFT JOIN ' . $this->table_name( 'wp' ) . ' wp ON lo.site_id = wp.id '
. ' LEFT JOIN ' . $this->table_name( 'wp_logs_meta' ) . ' me ON lo.log_id = me.meta_log_id '
. ' WHERE me.meta_key = "user_meta_json" '
. $where
. ' GROUP BY site_id, user_id, log_source ';
$users_sites_logs = $this->wpdb->get_results( $sql ); //phpcs:ignore -- ok.
if ( $users_sites_logs ) {
$logs_users = array();
$dash_users = array();
foreach ( $users_sites_logs as $item ) {
if ( ! empty( $item->site_id ) && ! empty( $item->name ) && ! empty( $item->meta_value ) ) {
$info = json_decode( $item->meta_value, true );
if ( is_array( $info ) ) {
if ( ! empty( $info['wp_user_id'] ) ) { // child site users.
$logs_users[ $item->log_id ] = array(
'id' => $item->user_id,
'site_id' => $item->site_id,
'login' => $info['action_user'],
'nicename' => $info['display_name'],
'source' => ! empty( $item->name ) ? $item->name : '',
'wp_user_id' => $info['wp_user_id'],
);
} elseif ( isset( $info['user_login'] ) ) { // dashboard users.
// to prevent add double dashboard users in the users selection.
if ( in_array( $item->user_id, $dash_users ) ) {
continue;
}
$dash_users[] = $item->user_id;
$nicename = ! empty( $info['user_login'] ) ? $info['user_login'] : '';
if ( empty( $nicename ) ) {
if ( ! empty( $info['agent'] ) ) {
$nicename = $info['agent'];
} else {
$nicename = 'N/A';
}
}
$logs_users[ $item->log_id ] = array(
'id' => (int) $item->user_id,
'site_id' => $item->site_id,
'login' => $info['user_login'],
'nicename' => $nicename,
'source' => 'dashboard',
);
}
}
}
}
return $logs_users;
}
return array();
}
}