Files
wp-prometheus/src/Admin/DashboardProvider.php

152 lines
3.6 KiB
PHP
Raw Normal View History

<?php
/**
* Dashboard provider class.
*
* @package WP_Prometheus
*/
namespace Magdev\WpPrometheus\Admin;
// Prevent direct file access.
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
/**
* DashboardProvider class.
*
* Provides Grafana dashboard templates for download.
*/
class DashboardProvider {
/**
* Dashboard directory path.
*
* @var string
*/
private string $dashboard_dir;
/**
* Available dashboard definitions.
*
* @var array
*/
private array $dashboards = array();
/**
* Constructor.
*/
public function __construct() {
$this->dashboard_dir = WP_PROMETHEUS_PATH . 'assets/dashboards/';
$this->dashboards = array(
'wordpress-overview' => array(
'title' => __( 'WordPress Overview', 'wp-prometheus' ),
'description' => __( 'General WordPress metrics including users, posts, comments, and plugins.', 'wp-prometheus' ),
'file' => 'wordpress-overview.json',
'icon' => 'dashicons-wordpress',
),
'wordpress-runtime' => array(
'title' => __( 'Runtime Performance', 'wp-prometheus' ),
'description' => __( 'HTTP request metrics, database query performance, and response times.', 'wp-prometheus' ),
'file' => 'wordpress-runtime.json',
'icon' => 'dashicons-performance',
),
'wordpress-woocommerce' => array(
'title' => __( 'WooCommerce Store', 'wp-prometheus' ),
'description' => __( 'WooCommerce metrics including products, orders, revenue, and customers.', 'wp-prometheus' ),
'file' => 'wordpress-woocommerce.json',
'icon' => 'dashicons-cart',
),
);
}
/**
* Get list of available dashboards.
*
* @return array
*/
public function get_available(): array {
$available = array();
foreach ( $this->dashboards as $slug => $dashboard ) {
$file_path = $this->dashboard_dir . $dashboard['file'];
if ( file_exists( $file_path ) ) {
$available[ $slug ] = $dashboard;
}
}
return $available;
}
/**
* Get dashboard content by slug.
*
* @param string $slug Dashboard slug.
* @return string|null JSON content or null if not found.
*/
public function get_dashboard( string $slug ): ?string {
// Validate slug to prevent directory traversal.
$slug = sanitize_file_name( $slug );
if ( ! isset( $this->dashboards[ $slug ] ) ) {
return null;
}
$file_path = $this->dashboard_dir . $this->dashboards[ $slug ]['file'];
// Security: Ensure file is within dashboard directory.
$real_path = realpath( $file_path );
$real_dir = realpath( $this->dashboard_dir );
if ( false === $real_path || false === $real_dir || strpos( $real_path, $real_dir ) !== 0 ) {
return null;
}
if ( ! file_exists( $file_path ) || ! is_readable( $file_path ) ) {
return null;
}
// phpcs:ignore WordPress.WP.AlternativeFunctions.file_get_contents_file_get_contents
$content = file_get_contents( $file_path );
if ( false === $content ) {
return null;
}
return $content;
}
/**
* Get dashboard metadata by slug.
*
* @param string $slug Dashboard slug.
* @return array|null Dashboard metadata or null if not found.
*/
public function get_metadata( string $slug ): ?array {
$slug = sanitize_file_name( $slug );
if ( ! isset( $this->dashboards[ $slug ] ) ) {
return null;
}
return $this->dashboards[ $slug ];
}
/**
* Get filename for download.
*
* @param string $slug Dashboard slug.
* @return string|null Filename or null if not found.
*/
public function get_filename( string $slug ): ?string {
$slug = sanitize_file_name( $slug );
if ( ! isset( $this->dashboards[ $slug ] ) ) {
return null;
}
return $this->dashboards[ $slug ]['file'];
}
}