Files
igny8/plugins/wordpress/source/igny8-wp-bridge/includes/class-igny8-webhook-logs.php
2026-01-09 22:45:30 +00:00

148 lines
3.7 KiB
PHP

<?php
/**
* Webhook Activity Logs
*
* Logs webhook activity for auditing and debugging
*
* @package Igny8Bridge
*/
// Prevent direct access
if (!defined('ABSPATH')) {
exit;
}
/**
* Log webhook activity
*
* @param array $data Log data
* @return string|false Log ID or false on failure
*/
function igny8_log_webhook_activity($data) {
$logs = get_option('igny8_webhook_logs', array());
$log_entry = array(
'id' => uniqid('webhook_', true),
'event' => sanitize_text_field($data['event'] ?? 'unknown'),
'data' => $data['data'] ?? null,
'ip' => sanitize_text_field($data['ip'] ?? ''),
'user_agent' => sanitize_text_field($data['user_agent'] ?? ''),
'status' => sanitize_text_field($data['status'] ?? 'received'),
'response' => $data['response'] ?? null,
'error' => sanitize_text_field($data['error'] ?? ''),
'received_at' => current_time('mysql'),
'processed_at' => $data['processed_at'] ?? null
);
$logs[] = $log_entry;
// Keep only last 500 logs
if (count($logs) > 500) {
$logs = array_slice($logs, -500);
}
update_option('igny8_webhook_logs', $logs);
return $log_entry['id'];
}
/**
* Update webhook log entry
*
* @param string $log_id Log ID
* @param array $updates Updates to apply
* @return bool Success
*/
function igny8_update_webhook_log($log_id, $updates) {
$logs = get_option('igny8_webhook_logs', array());
foreach ($logs as $key => $log) {
if ($log['id'] === $log_id) {
foreach ($updates as $field => $value) {
if ($field === 'status') {
$logs[$key][$field] = sanitize_text_field($value);
} elseif ($field === 'response') {
$logs[$key][$field] = $value;
} elseif ($field === 'processed_at') {
$logs[$key][$field] = sanitize_text_field($value);
} else {
$logs[$key][$field] = $value;
}
}
update_option('igny8_webhook_logs', $logs);
return true;
}
}
return false;
}
/**
* Get webhook logs
*
* @param array $args Query arguments
* @return array Logs
*/
function igny8_get_webhook_logs($args = array()) {
$defaults = array(
'limit' => 50,
'event' => null,
'status' => null
);
$args = wp_parse_args($args, $defaults);
$logs = get_option('igny8_webhook_logs', array());
// Reverse to get newest first
$logs = array_reverse($logs);
// Filter by event
if ($args['event']) {
$logs = array_filter($logs, function($log) use ($args) {
return $log['event'] === $args['event'];
});
}
// Filter by status
if ($args['status']) {
$logs = array_filter($logs, function($log) use ($args) {
return $log['status'] === $args['status'];
});
}
// Limit results
if ($args['limit'] > 0) {
$logs = array_slice($logs, 0, $args['limit']);
}
return array_values($logs);
}
/**
* Clear old webhook logs
*
* @param int $days_old Delete logs older than this many days
* @return int Number of logs deleted
*/
function igny8_clear_old_webhook_logs($days_old = 30) {
$logs = get_option('igny8_webhook_logs', array());
$cutoff = strtotime("-{$days_old} days");
$deleted = 0;
foreach ($logs as $key => $log) {
$log_time = strtotime($log['received_at']);
if ($log_time < $cutoff) {
unset($logs[$key]);
$deleted++;
}
}
if ($deleted > 0) {
update_option('igny8_webhook_logs', array_values($logs));
}
return $deleted;
}