PluginProbe
Media Cloud Sync / 1.3.0
Media Cloud Sync v1.3.0
1.4.0 1.3.12 1.3.11 1.3.10 trunk 1.0.0 1.0.1 1.0.2 1.0.3 1.1.0 1.1.1 1.2.0 1.2.10 1.2.11 1.2.12 1.2.13 1.2.2 1.2.3 1.2.4 1.2.5 1.2.6 1.2.7 1.2.8 1.2.9 1.3.0 All 34 releases
media-cloud-sync / includes / base / logger.php

logger.php in Media Cloud Sync 1.3.0, at includes/base/logger.php

175 lines 4.9 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 namespace Dudlewebs\WPMCS;
3
4 defined('ABSPATH') || exit;
5
6 class Logger {
7 private static $instance = null;
8 private $log_dir;
9 private $log_file;
10
11 private function __construct() {
12 $upload_dir = wp_upload_dir();
13 $this->log_dir = trailingslashit($upload_dir['basedir']) . Schema::getConstant('UPLOADS');
14
15 if (!file_exists($this->log_dir)) {
16 wp_mkdir_p($this->log_dir);
17 }
18
19 $this->log_file = $this->log_dir . '/sync-log.json';
20 }
21
22 /**
23 * Singleton instance
24 */
25 public static function instance() {
26 if (self::$instance === null) {
27 self::$instance = new self();
28 }
29 return self::$instance;
30 }
31
32 /**
33 * Add or update a log entry
34 */
35 public function add_log($type, $media_id, $source_type, $log = []) {
36 $entry = [
37 'time' => current_time('mysql'),
38 'type' => $type,
39 'media_id' => $media_id,
40 'source_type' => $source_type,
41 ];
42
43 $this->append_log($entry, $log);
44 }
45
46 /**
47 * Append log using file-based indexing
48 */
49 private function append_log($entry, $log=[]) {
50 $logs = [];
51
52 if (file_exists($this->log_file)) {
53 $content = file_get_contents($this->log_file);
54 $logs = json_decode($content, true) ?: [];
55 }
56
57 // Unique key per media/type/source
58 $key = $entry['media_id'] . '|' . $entry['type'] . '|' . $entry['source_type'];
59
60 if (isset($logs[$key])) {
61 if (!isset($logs[$key]['logs']) || !is_array($logs[$key]['logs'])) {
62 $logs[$key]['logs'] = [];
63 }
64 $logs[$key]['logs'][] = $log;
65 $logs[$key]['time'] = $entry['time'] ?? current_time('mysql');
66 } else {
67 $logs[$key] = $entry;
68 $logs[$key]['logs'][] = $log;
69 }
70
71 file_put_contents($this->log_file, wp_json_encode($logs));
72 }
73
74 /**
75 * Get log by media ID, type, and source type
76 */
77 public function get_log($type, $media_id, $source_type) {
78 $key = $media_id . '|' . $type . '|' . $source_type;
79 return json_decode(file_get_contents($this->log_file), true)[$key] ?? [];
80 }
81
82 /**
83 * Get all logs (numeric array, supports pagination)
84 */
85 public function get_all_logs($page = null, $per_page = null) {
86 if (!file_exists($this->log_file)) return [];
87
88 $logs = array_values(json_decode(file_get_contents($this->log_file), true) ?: []);
89
90 if ($page === null || $per_page === null) return $logs;
91
92 $total = count($logs);
93 $total_pages = (int) ceil($total / $per_page);
94 $page = max(1, (int) $page);
95 $offset = ($page - 1) * $per_page;
96
97 return [
98 'logs' => array_slice($logs, $offset, $per_page),
99 'total' => $total,
100 'total_pages' => $total_pages,
101 'page' => $page,
102 'per_page' => $per_page,
103 ];
104 }
105
106 /**
107 * Get logs by type (supports pagination)
108 */
109 public function get_logs_by_type($type, $page = null, $per_page = null) {
110 $all_logs = json_decode(file_get_contents($this->log_file) ?: '[]', true) ?: [];
111
112 $logs = array_values(array_filter($all_logs, function($log) use ($type) {
113 return isset($log['type']) && $log['type'] === $type;
114 }));
115
116 if ($page === null || $per_page === null) return $logs;
117
118 $total = count($logs);
119 $total_pages = (int) ceil($total / $per_page);
120 $page = max(1, (int) $page);
121 $offset = ($page - 1) * $per_page;
122
123 return [
124 'logs' => array_slice($logs, $offset, $per_page),
125 'total' => $total,
126 'total_pages' => $total_pages,
127 'page' => $page,
128 'per_page' => $per_page,
129 ];
130 }
131
132
133 /**
134 * Remove logs by type
135 */
136 public function remove_logs_by_type($type) {
137 if (!file_exists($this->log_file)) return;
138
139 $logs = json_decode(file_get_contents($this->log_file), true) ?: [];
140
141 foreach ($logs as $key => $log) {
142 if (isset($log['type']) && $log['type'] === $type) {
143 unset($logs[$key]);
144 }
145 }
146
147 file_put_contents($this->log_file, wp_json_encode($logs));
148 }
149
150 /**
151 * Remove logs by media ID, type, and source type
152 */
153 public function remove_log($type, $media_id, $source_type) {
154 if (!file_exists($this->log_file)) return;
155
156 $logs = json_decode(file_get_contents($this->log_file), true) ?: [];
157
158 $key = $media_id . '|' . $type . '|' . $source_type;
159
160 if (isset($logs[$key])) {
161 unset($logs[$key]);
162 }
163
164 file_put_contents($this->log_file, wp_json_encode($logs));
165 }
166
167 /**
168 * Clear all logs
169 */
170 public function clear_logs() {
171 if (file_exists($this->log_file)) {
172 unlink($this->log_file);
173 }
174 }
175 }