PluginProbe ʕ •ᴥ•ʔ
MailPoet – Newsletters, Email Marketing, and Automation / 5.34.2
MailPoet – Newsletters, Email Marketing, and Automation v5.34.2
5.34.2 5.34.1 5.34.0 5.33.1 5.33.0 5.32.0 5.31.0 5.30.0 5.29.0 5.28.1 5.28.0 5.27.0 5.26.0 5.26.1 5.25.0 5.24.0 4.43.0 4.43.1 4.44.0 4.44.1 4.45.0 4.46.0 4.47.0 4.48.0 4.48.1 4.48.2 4.49.0 4.49.1 4.5.0 4.5.1 4.5.2 4.50.0 4.50.1 4.51.0 4.51.1 4.51.2 4.52.0 4.53.0 4.54.0 4.55.0 4.56.0 4.57.0 4.58.0 4.58.1 4.58.2 4.6.0 4.6.1 4.6.2 4.7.0 4.7.1 4.8.0 4.8.1 4.9.0 5.0.0 5.0.1 5.0.2 5.1.0 5.1.1 5.10.0 5.10.1 5.11.0 5.12.0 5.12.1 5.12.10 5.12.11 5.12.12 5.12.13 5.12.2 5.12.3 5.12.4 5.12.5 5.12.6 5.12.7 5.12.8 5.12.9 5.13.0 5.13.1 5.13.2 5.14.0 5.14.1 5.14.2 5.14.3 5.15.0 5.15.1 5.16.0 5.16.1 5.16.2 5.16.3 5.16.4 5.17.0 5.17.1 5.17.2 5.17.3 5.17.4 5.17.5 5.17.6 5.18.0 5.19.0 5.2.0 5.2.1 5.2.2 5.2.3 5.20.0 5.21.0 5.21.1 5.21.2 5.21.3 5.22.0 5.22.1 5.22.2 5.22.3 5.22.4 5.23.0 5.23.1 5.23.2 5.3.0 5.3.1 5.3.2 5.3.3 5.3.4 5.3.5 5.3.6 5.3.7 5.4.0 5.4.1 5.4.2 5.5.0 5.5.1 5.5.2 5.6.0 5.6.1 5.6.2 5.6.3 5.6.4 5.7.0 5.7.1 5.8.0 5.8.1 5.9.0 3.0.0-beta.15 3.7.1 3.0.0-beta.16 3.7.2 3.0.0-beta.17 3.7.3 3.0.0-beta.18 3.7.4 3.0.0-beta.19 3.7.5 3.0.0-beta.2 3.7.6 3.0.0-beta.20 3.7.8 3.0.0-beta.21 3.70.0 3.0.0-beta.22 3.71.0 3.0.0-beta.23 3.71.1 3.0.0-beta.23.1 3.71.2 3.0.0-beta.23.2 3.71.3 3.0.0-beta.24 3.72.0 3.0.0-beta.25 3.73.0 3.0.0-beta.26 3.73.1 3.0.0-beta.27 3.73.2 3.0.0-beta.28 3.74.0 3.0.0-beta.29 3.74.1 3.0.0-beta.3 3.74.2 3.0.0-beta.30 3.74.3 3.0.0-beta.31 3.75.0 3.0.0-beta.32 3.75.1 3.0.0-beta.33 3.76.0 3.0.0-beta.33.1 3.77.0 3.0.0-beta.34.0.0 3.77.1 3.0.0-beta.36.0.0 3.78.0 3.0.0-beta.36.0.1 3.79.0 3.0.0-beta.36.2.0 3.8 3.0.0-beta.36.3.0 3.8.1 3.0.0-beta.36.3.1 3.8.2 3.0.0-beta.37.0.0 3.8.3 3.0.0-beta.4 3.8.4 3.0.0-beta.5 3.8.5 3.0.0-beta.6 3.8.6 3.0.0-beta.7 3.80.0 3.0.0-beta.7.1 3.81.0 3.0.0-beta.8 3.82.0 3.0.0-beta.9 3.83.0 3.0.0-rc.1.0.0 3.84.0 3.0.0-rc.1.0.1 3.84.1 3.0.0-rc.1.0.2 3.85.0 3.0.0-rc.1.0.3 3.85.1 3.0.0-rc.1.0.4 3.86.0 3.0.0-rc.2.0.0 3.87.0 3.0.0-rc.2.0.1 3.87.1 3.0.0-rc.2.0.2 3.87.2 3.0.0-rc.2.0.3 3.88.0 3.0.1 3.88.1 3.0.2 3.88.2 3.0.3 3.89.0 3.0.4 3.89.1 3.0.5 3.89.2 3.0.6 3.89.3 3.0.7 3.89.4 3.0.8 3.9.0 3.0.9 3.9.1 3.1.0 3.90.0 3.10 3.90.1 3.10.1 3.90.2 3.100.0 3.91.0 3.100.1 3.91.1 3.100.2 3.92.0 3.101.0 3.92.1 3.101.1 3.93.0 3.102.0 3.93.1 3.102.1 3.94.0 3.103.0 3.95.0 3.103.1 3.95.1 3.11.0 3.96.0 3.11.1 3.96.1 3.11.2 3.97.0 3.11.3 3.98.0 3.11.4 3.98.1 3.11.5 3.99.0 3.12.0 3.99.1 3.12.1 4.0.0 3.13.0 4.0.1 3.14.0 4.1.0 3.14.1 4.1.1 3.15.0 4.10.0 3.16.0 4.11.0 3.16.1 4.11.1 3.16.2 4.12.0 3.16.3 4.12.1 3.17.0 4.12.2 3.17.1 4.13.0 3.17.2 4.14.0 3.18.0 4.15.0 3.18.1 4.16.0 3.18.2 4.17.0 3.19.0 4.17.1 3.19.1 4.18.0 3.19.2 4.18.1 3.19.3 4.19.0 3.2.0 4.2.0 3.2.1 4.20.0 3.2.2 4.20.1 3.2.3 4.20.2 3.2.4 4.21.0 3.2.5 4.22.0 3.20.0 4.22.1 3.21.0 4.22.2 3.21.1 4.23.0 3.22.0 4.24.0 3.23.0 4.25.0 3.23.1 4.26.0 3.23.2 4.26.1 3.24.0 4.27.0 3.25.0 4.28.0 3.25.1 4.29.0 3.26.0 4.3.0 3.26.1 4.3.1 3.27.0 4.30.0 3.28.0 4.31.0 3.29.0 4.31.1 3.3.0 4.32.0 3.3.1 4.33.0 3.3.2 4.34.0 3.3.3 4.35.0 3.3.4 4.35.1 3.3.5 4.36.0 3.3.6 4.37.0 3.30.0 4.38.0 3.31.0 4.39.0 3.31.1 4.4.0 3.32.0 4.40.0 3.32.1 4.41.0 3.32.2 4.41.1 3.33.0 4.41.2 3.34.0 4.41.3 3.34.1 4.42.0 3.34.2 4.42.1 3.34.3 3.34.4 3.35.0 3.35.1 3.35.3 3.35.4 3.36.0 3.37.0 3.37.1 3.37.2 3.37.3 3.38.0 3.38.1 3.39.0 3.39.1 3.39.2 3.4.0 3.4.1 3.4.2 3.4.3 3.4.4 3.40.0 3.40.1 3.41.0 3.41.1 3.41.2 3.42.0 3.42.1 3.42.2 3.42.3 3.43.0 3.43.1 3.44.0 3.45.0 3.45.1 3.46.0 3.46.1 3.46.10 3.46.11 3.46.12 3.46.13 3.46.14 3.46.2 3.46.3 3.46.4 3.46.5 3.46.6 3.46.7 3.46.8 3.46.9 3.47.0 3.47.1 3.47.10 3.47.11 3.47.2 3.47.3 3.47.5 3.47.6 3.47.7 3.47.9 3.48.0 3.48.1 3.49.0 3.49.1 3.5.0 3.5.1 3.50.0 3.51.0 3.51.1 3.51.2 3.52.0 3.53.0 3.54.0 3.54.1 3.54.2 3.54.3 3.55.0 3.55.1 3.56.0 3.56.1 3.56.2 3.57.0 3.57.1 3.58.0 3.59.0 3.59.1 3.59.2 3.6.0 3.6.1 3.6.2 3.6.3 3.6.4 3.6.5 3.6.6 3.6.7 3.60.0 3.60.1 3.60.10 3.60.11 3.60.12 3.60.2 3.60.3 3.60.4 3.60.6 3.60.7 3.60.8 3.60.9 3.61.0 3.62.0 3.62.1 3.63.0 3.64.0 3.64.1 3.64.2 3.64.3 3.65.0 trunk 3.65.1 3.0.0 3.66.0 3.0.0-beta.1 3.67.0 3.0.0-beta.10 3.67.1 3.0.0-beta.11 3.68.0 3.0.0-beta.12 3.69.0 3.0.0-beta.13 3.69.1 3.0.0-beta.14 3.7.0
mailpoet / lib / Automation / Engine / Data / AutomationRunLog.php
mailpoet / lib / Automation / Engine / Data Last commit date
Automation.php 2 months ago AutomationRun.php 1 year ago AutomationRunLog.php 1 year ago AutomationStatistics.php 9 months ago AutomationTemplate.php 6 months ago AutomationTemplateCategory.php 2 years ago Field.php 2 years ago Filter.php 3 years ago FilterGroup.php 2 months ago Filters.php 2 months ago NextStep.php 2 years ago Step.php 2 months ago StepRunArgs.php 2 years ago StepValidationArgs.php 3 years ago Subject.php 3 years ago SubjectEntry.php 3 years ago index.php 3 years ago
AutomationRunLog.php
217 lines
1 <?php declare(strict_types = 1);
2
3 namespace MailPoet\Automation\Engine\Data;
4
5 if (!defined('ABSPATH')) exit;
6
7
8 use DateTimeImmutable;
9 use InvalidArgumentException;
10 use MailPoet\Automation\Engine\Utils\Json;
11 use Throwable;
12
13 class AutomationRunLog {
14 public const STATUS_RUNNING = 'running';
15 public const STATUS_COMPLETE = 'complete';
16 public const STATUS_FAILED = 'failed';
17
18 public const STATUS_ALL = [
19 self::STATUS_RUNNING,
20 self::STATUS_COMPLETE,
21 self::STATUS_FAILED,
22 ];
23
24 public const TYPE_ACTION = 'action';
25 public const TYPE_TRIGGER = 'trigger';
26
27 public const KEY_UNKNOWN = 'unknown';
28
29 /** @var int */
30 private $id;
31
32 /** @var int */
33 private $automationRunId;
34
35 /** @var string */
36 private $stepId;
37
38 /** @var string */
39 private $stepType;
40
41 /** @var string */
42 private $stepKey;
43
44 /** @var string */
45 private $status;
46
47 /** @var DateTimeImmutable */
48 private $startedAt;
49
50 /** @var DateTimeImmutable */
51 private $updatedAt;
52
53 /** @var int */
54 private $runNumber = 1;
55
56 /** @var array */
57 private $data = [];
58
59 /** @var array|null */
60 private $error;
61
62 public function __construct(
63 int $automationRunId,
64 string $stepId,
65 string $stepType,
66 ?int $id = null
67 ) {
68 $this->automationRunId = $automationRunId;
69 $this->stepId = $stepId;
70 $this->stepType = $stepType;
71 $this->stepKey = self::KEY_UNKNOWN;
72 $this->status = self::STATUS_RUNNING;
73
74 $now = new DateTimeImmutable();
75 $this->startedAt = $now;
76 $this->updatedAt = $now;
77
78 if ($id) {
79 $this->id = $id;
80 }
81 }
82
83 public function getId(): ?int {
84 return $this->id;
85 }
86
87 public function getAutomationRunId(): int {
88 return $this->automationRunId;
89 }
90
91 public function getStepId(): string {
92 return $this->stepId;
93 }
94
95 public function getStepType(): string {
96 return $this->stepType;
97 }
98
99 public function getStepKey(): string {
100 return $this->stepKey;
101 }
102
103 public function setStepKey(string $stepKey): void {
104 $this->stepKey = $stepKey;
105 $this->updatedAt = new DateTimeImmutable();
106 }
107
108 public function getStatus(): string {
109 return $this->status;
110 }
111
112 public function setStatus(string $status): void {
113 if (!in_array($status, self::STATUS_ALL, true)) {
114 throw new InvalidArgumentException("Invalid status '$status'.");
115 }
116 $this->status = $status;
117 $this->updatedAt = new DateTimeImmutable();
118 }
119
120 public function getStartedAt(): DateTimeImmutable {
121 return $this->startedAt;
122 }
123
124 public function getUpdatedAt(): DateTimeImmutable {
125 return $this->updatedAt;
126 }
127
128 public function getRunNumber(): int {
129 return $this->runNumber;
130 }
131
132 public function setRunNumber(int $runNumber): void {
133 $this->runNumber = $runNumber;
134 }
135
136 public function setUpdatedAt(DateTimeImmutable $updatedAt): void {
137 $this->updatedAt = $updatedAt;
138 }
139
140 public function getData(): array {
141 return $this->data;
142 }
143
144 /** @param mixed $value */
145 public function setData(string $key, $value): void {
146 if (!$this->isDataStorable($value)) {
147 throw new InvalidArgumentException("Invalid data provided for key '$key'. Only scalar values and arrays of scalar values are allowed.");
148 }
149 $this->data[$key] = $value;
150 $this->updatedAt = new DateTimeImmutable();
151 }
152
153 public function getError(): ?array {
154 return $this->error;
155 }
156
157 public function toArray(): array {
158 return [
159 'id' => $this->id,
160 'automation_run_id' => $this->automationRunId,
161 'step_id' => $this->stepId,
162 'step_type' => $this->stepType,
163 'step_key' => $this->stepKey,
164 'status' => $this->status,
165 'started_at' => $this->startedAt->format(DateTimeImmutable::W3C),
166 'updated_at' => $this->updatedAt->format(DateTimeImmutable::W3C),
167 'run_number' => $this->runNumber,
168 'data' => Json::encode($this->data),
169 'error' => $this->error ? Json::encode($this->error) : null,
170 ];
171 }
172
173 public function setError(Throwable $error): void {
174 // Normalize all nested objects in error trace to associative arrays.
175 // Empty objects would then get decoded to "[]" instead of "{}".
176 $trace = Json::decode(Json::encode($error->getTrace()));
177 $this->error = [
178 'message' => $error->getMessage(),
179 'errorClass' => get_class($error),
180 'code' => $error->getCode(),
181 'trace' => $trace,
182 ];
183 $this->updatedAt = new DateTimeImmutable();
184 }
185
186 public static function fromArray(array $data): self {
187 $log = new AutomationRunLog((int)$data['automation_run_id'], $data['step_id'], $data['step_type']);
188 $log->id = (int)$data['id'];
189 $log->stepKey = $data['step_key'];
190 $log->status = $data['status'];
191 $log->startedAt = new DateTimeImmutable($data['started_at']);
192 $log->updatedAt = new DateTimeImmutable($data['updated_at']);
193 $log->runNumber = (int)$data['run_number'];
194 $log->data = Json::decode($data['data']);
195 $log->error = isset($data['error']) ? Json::decode($data['error']) : null;
196 return $log;
197 }
198
199 /** @param mixed $data */
200 private function isDataStorable($data): bool {
201 if (is_scalar($data)) {
202 return true;
203 }
204
205 if (!is_array($data)) {
206 return false;
207 }
208
209 foreach ($data as $value) {
210 if (!$this->isDataStorable($value)) {
211 return false;
212 }
213 }
214 return true;
215 }
216 }
217