Files
roi-theme/wp-content/plugins/thrive-product-manager/thrive-dashboard/inc/webhooks/class-td-webhooks-logger.php
root a22573bf0b Commit inicial - WordPress Análisis de Precios Unitarios
- WordPress core y plugins
- Tema Twenty Twenty-Four configurado
- Plugin allow-unfiltered-html.php simplificado
- .gitignore configurado para excluir wp-config.php y uploads

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-03 21:04:30 -06:00

90 lines
3.0 KiB
PHP
Executable File

<?php
/**
* Thrive Themes - https://thrivethemes.com
*
* @package thrive-dashboard
*/
namespace TVE\Dashboard\Webhooks;
if ( ! defined( 'ABSPATH' ) ) {
exit; // Silence is golden!
}
/**
* Lightweight logger for per-webhook execution entries stored in options.
*
* Option shape (td_webhooks_logs):
* - [ webhook_id => [ entry, entry, ... ] ] with newest entries first
* - entry: { timestamp, webhook_id, status_code, duration_ms, request, response, trigger_when, ... }
*/
class TD_Webhooks_Logger {
/**
* Append a log entry for a webhook id with retention and TTL enforcement.
*
* @param int $webhook_id
* @param array $entry { status_code, duration_ms, request, response, trigger_when, ... }
* @return void
*/
public static function log( int $webhook_id, array $entry ): void {
// Load bucket storage
$all = get_option( 'td_webhooks_logs', [] );
if ( ! is_array( $all ) ) {
$all = [];
}
// Normalize entry structure
$entry['timestamp'] = current_time( 'mysql' );
$entry['webhook_id'] = $webhook_id;
$entry['request'] = isset( $entry['request'] ) && is_array( $entry['request'] ) ? $entry['request'] : [];
$entry['response'] = isset( $entry['response'] ) && is_array( $entry['response'] ) ? $entry['response'] : [];
// Ensure bucket for this webhook
if ( empty( $all[ $webhook_id ] ) || ! is_array( $all[ $webhook_id ] ) ) {
$all[ $webhook_id ] = [];
}
// Prepend new entry (newest first)
array_unshift( $all[ $webhook_id ], $entry );
// Retention: keep only the newest N
$limit = (int) TD_Webhooks_Settings::get( 'retention_per_id', 100 );
if ( $limit > 0 && count( $all[ $webhook_id ] ) > $limit ) {
$all[ $webhook_id ] = array_slice( $all[ $webhook_id ], 0, $limit );
}
// TTL: drop entries older than N days
$ttl_days = (int) TD_Webhooks_Settings::get( 'ttl_days', 0 );
if ( $ttl_days > 0 ) {
$cutoff = strtotime( '-' . $ttl_days . ' days' );
$all[ $webhook_id ] = self::filter_recent_by_cutoff( $all[ $webhook_id ], $cutoff );
}
// Persist storage
update_option( 'td_webhooks_logs', $all, 'no' );
}
/**
* Return only rows newer than the provided cutoff timestamp.
*
* @param array $bucket
* @param int $cutoff Unix timestamp cutoff
* @return array
*/
private static function filter_recent_by_cutoff( array $bucket, int $cutoff ): array {
$kept = [];
foreach ( $bucket as $row ) {
$timestamp = isset( $row['timestamp'] ) ? strtotime( (string) $row['timestamp'] ) : time();
// If the timestamp is newer than the cutoff, add the row to the kept array.
if ( $timestamp >= $cutoff ) {
$kept[] = $row;
}
}
// Reset the array keys.
return array_values( $kept );
}
}