API
3 years ago
Builder
2 months ago
Control
3 weeks ago
Data
2 months ago
Endpoints
1 month ago
Exceptions
1 year ago
Integration
11 months ago
Mappers
9 months ago
Storage
1 month ago
Templates
2 years ago
Utils
8 months ago
Validation
2 months ago
Engine.php
1 month ago
Exceptions.php
1 month ago
Hooks.php
2 months ago
Integration.php
4 years ago
Registry.php
2 months ago
WordPress.php
2 months ago
index.php
3 years ago
Exceptions.php
316 lines
| 1 | <?php declare(strict_types = 1); |
| 2 | |
| 3 | namespace MailPoet\Automation\Engine; |
| 4 | |
| 5 | if (!defined('ABSPATH')) exit; |
| 6 | |
| 7 | |
| 8 | use MailPoet\Automation\Engine\Data\Step; |
| 9 | use MailPoet\Automation\Engine\Exceptions\InvalidStateException; |
| 10 | use MailPoet\Automation\Engine\Exceptions\NotFoundException; |
| 11 | use MailPoet\Automation\Engine\Exceptions\UnexpectedValueException; |
| 12 | use MailPoet\Automation\Engine\Utils\Json; |
| 13 | |
| 14 | class Exceptions { |
| 15 | private const DATABASE_ERROR = 'mailpoet_automation_database_error'; |
| 16 | private const JSON_NOT_OBJECT = 'mailpoet_automation_json_not_object'; |
| 17 | private const AUTOMATION_NOT_FOUND = 'mailpoet_automation_not_found'; |
| 18 | private const AUTOMATION_VERSION_NOT_FOUND = 'mailpoet_automation_version_not_found'; |
| 19 | private const AUTOMATION_NOT_ACTIVE = 'mailpoet_automation_not_active'; |
| 20 | private const AUTOMATION_RUN_NOT_FOUND = 'mailpoet_automation_run_not_found'; |
| 21 | private const AUTOMATION_STEP_NOT_FOUND = 'mailpoet_automation_step_not_found'; |
| 22 | private const AUTOMATION_TRIGGER_NOT_FOUND = 'mailpoet_automation_trigger_not_found'; |
| 23 | private const AUTOMATION_RUN_NOT_RUNNING = 'mailpoet_automation_run_not_running'; |
| 24 | private const SUBJECT_NOT_FOUND = 'mailpoet_automation_subject_not_found'; |
| 25 | private const SUBJECT_LOAD_FAILED = 'mailpoet_automation_subject_load_failed'; |
| 26 | private const SUBJECT_DATA_NOT_FOUND = 'mailpoet_automation_subject_data_not_found'; |
| 27 | private const MULTIPLE_SUBJECTS_FOUND = 'mailpoet_automation_multiple_subjects_found'; |
| 28 | private const PAYLOAD_NOT_FOUND = 'mailpoet_automation_payload_not_found'; |
| 29 | private const MULTIPLE_PAYLOADS_FOUND = 'mailpoet_automation_multiple_payloads_found'; |
| 30 | private const FIELD_NOT_FOUND = 'mailpoet_automation_field_not_found'; |
| 31 | private const FIELD_LOAD_FAILED = 'mailpoet_automation_field_load_failed'; |
| 32 | private const FILTER_NOT_FOUND = 'mailpoet_automation_filter_not_found'; |
| 33 | private const NEXT_STEP_NOT_FOUND = 'mailpoet_next_step_not_found'; |
| 34 | private const NEXT_STEP_NOT_SCHEDULED = 'mailpoet_next_step_not_scheduled'; |
| 35 | private const AUTOMATION_STRUCTURE_MODIFICATION_NOT_SUPPORTED = 'mailpoet_automation_structure_modification_not_supported'; |
| 36 | private const AUTOMATION_TRIGGER_MODIFICATION_NOT_SUPPORTED = 'mailpoet_automation_trigger_modification_not_supported'; |
| 37 | private const AUTOMATION_STRUCTURE_NOT_VALID = 'mailpoet_automation_structure_not_valid'; |
| 38 | private const AUTOMATION_STEP_MODIFIED_WHEN_UNKNOWN = 'mailpoet_automation_step_modified_when_unknown'; |
| 39 | private const AUTOMATION_NOT_VALID = 'mailpoet_automation_not_valid'; |
| 40 | private const MISSING_REQUIRED_SUBJECTS = 'mailpoet_automation_missing_required_subjects'; |
| 41 | private const AUTOMATION_NOT_TRASHED = 'mailpoet_automation_not_trashed'; |
| 42 | private const AUTOMATION_TEMPLATE_NOT_FOUND = 'mailpoet_automation_template_not_found'; |
| 43 | private const AUTOMATION_TEMPLATE_EMAIL_PATTERN_NOT_FOUND = 'mailpoet_automation_template_email_pattern_not_found'; |
| 44 | private const AUTOMATION_STEP_NOT_STARTED = 'mailpoet_automation_step_not_started'; |
| 45 | private const AUTOMATION_STEP_NOT_RUNNING = 'mailpoet_automation_step_not_running'; |
| 46 | private const AUTOMATION_STEP_ACTION_PROCESSED = 'mailpoet_automation_step_action_processed'; |
| 47 | |
| 48 | public function __construct() { |
| 49 | throw new InvalidStateException( |
| 50 | "This is a static factory class. Use it via 'Exception::someError()' factories." |
| 51 | ); |
| 52 | } |
| 53 | |
| 54 | public static function databaseError(string $error): InvalidStateException { |
| 55 | return InvalidStateException::create() |
| 56 | ->withErrorCode(self::DATABASE_ERROR) |
| 57 | // translators: %s is the error message. |
| 58 | ->withMessage(sprintf(__('Database error: %s', 'mailpoet'), $error)); |
| 59 | } |
| 60 | |
| 61 | public static function jsonNotObject(string $json): UnexpectedValueException { |
| 62 | return UnexpectedValueException::create() |
| 63 | ->withErrorCode(self::JSON_NOT_OBJECT) |
| 64 | // translators: %s is the mentioned JSON string. |
| 65 | ->withMessage(sprintf(__("JSON string '%s' doesn't encode an object.", 'mailpoet'), $json)); |
| 66 | } |
| 67 | |
| 68 | public static function automationNotFound(int $id): NotFoundException { |
| 69 | return NotFoundException::create() |
| 70 | ->withErrorCode(self::AUTOMATION_NOT_FOUND) |
| 71 | // translators: %d is the ID of the automation. |
| 72 | ->withMessage(sprintf(__("Automation with ID '%d' not found.", 'mailpoet'), $id)); |
| 73 | } |
| 74 | |
| 75 | public static function automationNotFoundInTimeSpan(int $id): NotFoundException { |
| 76 | return NotFoundException::create() |
| 77 | ->withErrorCode(self::AUTOMATION_NOT_FOUND) |
| 78 | // translators: %d is the ID of the automation. |
| 79 | ->withMessage(sprintf(__("Automation with ID '%d' not found in selected time span.", 'mailpoet'), $id)); |
| 80 | } |
| 81 | |
| 82 | public static function automationVersionNotFound(int $automation, int $version): NotFoundException { |
| 83 | return NotFoundException::create() |
| 84 | ->withErrorCode(self::AUTOMATION_VERSION_NOT_FOUND) |
| 85 | // translators: %1$s is the ID of the automation, %2$s the version. |
| 86 | ->withMessage(sprintf(__('Automation with ID "%1$s" in version "%2$s" not found.', 'mailpoet'), $automation, $version)); |
| 87 | } |
| 88 | |
| 89 | public static function automationNotActive(int $automation): InvalidStateException { |
| 90 | return InvalidStateException::create() |
| 91 | ->withErrorCode(self::AUTOMATION_NOT_ACTIVE) |
| 92 | // translators: %1$s is the ID of the automation. |
| 93 | ->withMessage(sprintf(__('Automation with ID "%1$s" is no longer active.', 'mailpoet'), $automation)); |
| 94 | } |
| 95 | |
| 96 | public static function automationRunNotFound(int $id): NotFoundException { |
| 97 | return NotFoundException::create() |
| 98 | ->withErrorCode(self::AUTOMATION_RUN_NOT_FOUND) |
| 99 | // translators: %d is the ID of the automation run. |
| 100 | ->withMessage(sprintf(__("Automation run with ID '%d' not found.", 'mailpoet'), $id)); |
| 101 | } |
| 102 | |
| 103 | public static function automationStepNotFound(string $key): NotFoundException { |
| 104 | return NotFoundException::create() |
| 105 | ->withErrorCode(self::AUTOMATION_STEP_NOT_FOUND) |
| 106 | // translators: %s is the key of the automation step. |
| 107 | ->withMessage(sprintf(__("Automation step with key '%s' not found.", 'mailpoet'), $key)); |
| 108 | } |
| 109 | |
| 110 | public static function automationTriggerNotFound(int $automationId, string $key): NotFoundException { |
| 111 | return NotFoundException::create() |
| 112 | ->withErrorCode(self::AUTOMATION_TRIGGER_NOT_FOUND) |
| 113 | // translators: %1$s is the key, %2$d is the automation ID. |
| 114 | ->withMessage(sprintf(__('Automation trigger with key "%1$s" not found in automation ID "%2$d".', 'mailpoet'), $key, $automationId)); |
| 115 | } |
| 116 | |
| 117 | public static function automationRunNotRunning(int $id, string $status): InvalidStateException { |
| 118 | return InvalidStateException::create() |
| 119 | ->withErrorCode(self::AUTOMATION_RUN_NOT_RUNNING) |
| 120 | // translators: %1$d is the ID of the automation run, %2$s its current status. |
| 121 | ->withMessage(sprintf(__('Automation run with ID "%1$d" is not running. Status: %2$s', 'mailpoet'), $id, $status)); |
| 122 | } |
| 123 | |
| 124 | public static function subjectNotFound(string $key): NotFoundException { |
| 125 | return NotFoundException::create() |
| 126 | ->withErrorCode(self::SUBJECT_NOT_FOUND) |
| 127 | // translators: %s is the key of the subject not found. |
| 128 | ->withMessage(sprintf(__("Subject with key '%s' not found.", 'mailpoet'), $key)); |
| 129 | } |
| 130 | |
| 131 | public static function subjectClassNotFound(string $class): NotFoundException { |
| 132 | return NotFoundException::create() |
| 133 | ->withErrorCode(self::SUBJECT_NOT_FOUND) |
| 134 | // translators: %s is the class name of the subject not found. |
| 135 | ->withMessage(sprintf(__("Subject of class '%s' not found.", 'mailpoet'), $class)); |
| 136 | } |
| 137 | |
| 138 | public static function subjectLoadFailed(string $key, array $args): InvalidStateException { |
| 139 | return InvalidStateException::create() |
| 140 | ->withErrorCode(self::SUBJECT_LOAD_FAILED) |
| 141 | // translators: %1$s is the name of the key, %2$s the arguments. |
| 142 | ->withMessage(sprintf(__('Subject with key "%1$s" and args "%2$s" failed to load.', 'mailpoet'), $key, Json::encode($args))); |
| 143 | } |
| 144 | |
| 145 | public static function subjectDataNotFound(string $key, int $automationRunId): NotFoundException { |
| 146 | return NotFoundException::create() |
| 147 | ->withErrorCode(self::SUBJECT_DATA_NOT_FOUND) |
| 148 | // translators: %1$s is the key of the subject, %2$d is automation run ID. |
| 149 | ->withMessage( |
| 150 | sprintf(__("Subject data for subject with key '%1\$s' not found for automation run with ID '%2\$d'.", 'mailpoet'), $key, $automationRunId) |
| 151 | ); |
| 152 | } |
| 153 | |
| 154 | public static function multipleSubjectsFound(string $key, int $automationRunId): InvalidStateException { |
| 155 | return InvalidStateException::create() |
| 156 | ->withErrorCode(self::MULTIPLE_SUBJECTS_FOUND) |
| 157 | // translators: %1$s is the key of the subject, %2$d is automation run ID. |
| 158 | ->withMessage( |
| 159 | sprintf(__("Multiple subjects with key '%1\$s' found for automation run with ID '%2\$d', only one expected.", 'mailpoet'), $key, $automationRunId) |
| 160 | ); |
| 161 | } |
| 162 | |
| 163 | public static function payloadNotFound(string $class, int $automationRunId): NotFoundException { |
| 164 | return NotFoundException::create() |
| 165 | ->withErrorCode(self::PAYLOAD_NOT_FOUND) |
| 166 | // translators: %1$s is the class of the payload, %2$d is automation run ID. |
| 167 | ->withMessage( |
| 168 | sprintf(__("Payload of class '%1\$s' not found for automation run with ID '%2\$d'.", 'mailpoet'), $class, $automationRunId) |
| 169 | ); |
| 170 | } |
| 171 | |
| 172 | public static function multiplePayloadsFound(string $class, int $automationRunId): NotFoundException { |
| 173 | return NotFoundException::create() |
| 174 | ->withErrorCode(self::MULTIPLE_PAYLOADS_FOUND) |
| 175 | // translators: %1$s is the class of the payloads, %2$d is automation run ID. |
| 176 | ->withMessage( |
| 177 | sprintf(__("Multiple payloads of class '%1\$s' found for automation run with ID '%2\$d'.", 'mailpoet'), $class, $automationRunId) |
| 178 | ); |
| 179 | } |
| 180 | |
| 181 | public static function fieldNotFound(string $key): NotFoundException { |
| 182 | return NotFoundException::create() |
| 183 | ->withErrorCode(self::FIELD_NOT_FOUND) |
| 184 | // translators: %s is the key of the field not found. |
| 185 | ->withMessage(sprintf(__("Field with key '%s' not found.", 'mailpoet'), $key)); |
| 186 | } |
| 187 | |
| 188 | public static function fieldLoadFailed(string $key, array $args): InvalidStateException { |
| 189 | return InvalidStateException::create() |
| 190 | ->withErrorCode(self::FIELD_LOAD_FAILED) |
| 191 | // translators: %1$s is the key of the field, %2$s its arguments. |
| 192 | ->withMessage(sprintf(__('Field with key "%1$s" and args "%2$s" failed to load.', 'mailpoet'), $key, Json::encode($args))); |
| 193 | } |
| 194 | |
| 195 | public static function filterNotFound(string $fieldType): NotFoundException { |
| 196 | return NotFoundException::create() |
| 197 | ->withErrorCode(self::FILTER_NOT_FOUND) |
| 198 | // translators: %s is the type of the field for which a filter was not found. |
| 199 | ->withMessage(sprintf(__("Filter for field of type '%s' not found.", 'mailpoet'), $fieldType)); |
| 200 | } |
| 201 | |
| 202 | public static function nextStepNotFound(string $stepId, int $nextStepId): InvalidStateException { |
| 203 | return InvalidStateException::create() |
| 204 | ->withErrorCode(self::NEXT_STEP_NOT_FOUND) |
| 205 | // translators: %1$d is the ID of the automation step, %2$s is the ID of the next step. |
| 206 | ->withMessage(sprintf(__("Automation step with ID '%1\$s' doesn't have a next step with index '%2\$d'.", 'mailpoet'), $stepId, $nextStepId)); |
| 207 | } |
| 208 | |
| 209 | public static function nextStepNotScheduled(string $stepId): InvalidStateException { |
| 210 | return InvalidStateException::create() |
| 211 | ->withErrorCode(self::NEXT_STEP_NOT_SCHEDULED) |
| 212 | // translators: %1$d is the ID of the automation step, %2$s is the ID of the next step. |
| 213 | ->withMessage(sprintf(__("Automation step with ID '%s' did not schedule a specific next step, even though multiple next steps are possible.", 'mailpoet'), $stepId)); |
| 214 | } |
| 215 | |
| 216 | public static function automationStructureModificationNotSupported(): UnexpectedValueException { |
| 217 | return UnexpectedValueException::create() |
| 218 | ->withErrorCode(self::AUTOMATION_STRUCTURE_MODIFICATION_NOT_SUPPORTED) |
| 219 | ->withMessage(__('Automation structure modification not supported.', 'mailpoet')); |
| 220 | } |
| 221 | |
| 222 | public static function automationTriggerModificationNotSupported(): UnexpectedValueException { |
| 223 | return UnexpectedValueException::create() |
| 224 | ->withErrorCode(self::AUTOMATION_TRIGGER_MODIFICATION_NOT_SUPPORTED) |
| 225 | ->withMessage(__('Changing the trigger of an existing automation is not supported. You can edit its settings or filters instead.', 'mailpoet')); |
| 226 | } |
| 227 | |
| 228 | public static function automationStructureNotValid(string $detail, string $ruleId): UnexpectedValueException { |
| 229 | return UnexpectedValueException::create() |
| 230 | ->withErrorCode(self::AUTOMATION_STRUCTURE_NOT_VALID) |
| 231 | // translators: %s is a detailed information |
| 232 | ->withMessage(sprintf(__("Invalid automation structure: %s", 'mailpoet'), $detail)) |
| 233 | ->withErrors(['rule_id' => $ruleId]); |
| 234 | } |
| 235 | |
| 236 | public static function automationStepModifiedWhenUnknown(Step $step): UnexpectedValueException { |
| 237 | return UnexpectedValueException::create() |
| 238 | ->withErrorCode(self::AUTOMATION_STEP_MODIFIED_WHEN_UNKNOWN) |
| 239 | // translators: %1$s is the key of the step, %2$s is the type of the step, %3\$s is its ID. |
| 240 | ->withMessage( |
| 241 | sprintf( |
| 242 | __("Modification of step '%1\$s' of type '%2\$s' with ID '%3\$s' is not supported when the related plugin is not active.", 'mailpoet'), |
| 243 | $step->getKey(), |
| 244 | $step->getType(), |
| 245 | $step->getId() |
| 246 | ) |
| 247 | ); |
| 248 | } |
| 249 | |
| 250 | public static function automationNotValid(string $detail, array $errors): UnexpectedValueException { |
| 251 | return UnexpectedValueException::create() |
| 252 | ->withErrorCode(self::AUTOMATION_NOT_VALID) |
| 253 | // translators: %s is a detailed information |
| 254 | ->withMessage(sprintf(__("Automation validation failed: %s", 'mailpoet'), $detail)) |
| 255 | ->withErrors($errors); |
| 256 | } |
| 257 | |
| 258 | public static function missingRequiredSubjects(Step $step, array $missingSubjectKeys): UnexpectedValueException { |
| 259 | return UnexpectedValueException::create() |
| 260 | ->withErrorCode(self::MISSING_REQUIRED_SUBJECTS) |
| 261 | // translators: %1$s is the key of the step, %2$s are the missing subject keys. |
| 262 | ->withMessage( |
| 263 | sprintf( |
| 264 | __("Step with ID '%1\$s' is missing required subjects with keys: %2\$s", 'mailpoet'), |
| 265 | $step->getId(), |
| 266 | implode(', ', $missingSubjectKeys) |
| 267 | ) |
| 268 | ) |
| 269 | ->withErrors( |
| 270 | ['general' => __('This step can not be used with the selected trigger.', 'mailpoet')] |
| 271 | ); |
| 272 | } |
| 273 | |
| 274 | public static function automationNotTrashed(int $id): UnexpectedValueException { |
| 275 | return UnexpectedValueException::create() |
| 276 | ->withErrorCode(self::AUTOMATION_NOT_TRASHED) |
| 277 | // translators: %d is the ID of the automation. |
| 278 | ->withMessage(sprintf(__("Can't delete automation with ID '%d' because it was not trashed.", 'mailpoet'), $id)); |
| 279 | } |
| 280 | |
| 281 | public static function automationTemplateNotFound(string $id): NotFoundException { |
| 282 | return NotFoundException::create() |
| 283 | ->withErrorCode(self::AUTOMATION_TEMPLATE_NOT_FOUND) |
| 284 | // translators: %d is the ID of the automation template. |
| 285 | ->withMessage(sprintf(__("Automation template with ID '%d' not found.", 'mailpoet'), $id)); |
| 286 | } |
| 287 | |
| 288 | public static function automationTemplateEmailPatternNotFound(string $pattern): NotFoundException { |
| 289 | return NotFoundException::create() |
| 290 | ->withErrorCode(self::AUTOMATION_TEMPLATE_EMAIL_PATTERN_NOT_FOUND) |
| 291 | // translators: %s is the name of the automation template email pattern. |
| 292 | ->withMessage(sprintf(__("Automation template email pattern '%s' not found.", 'mailpoet'), $pattern)); |
| 293 | } |
| 294 | |
| 295 | public static function stepNotStarted(string $id, int $runId): InvalidStateException { |
| 296 | return InvalidStateException::create() |
| 297 | ->withErrorCode(self::AUTOMATION_STEP_NOT_STARTED) |
| 298 | // translators: %1$s is the ID of the automation step, %2$d is the automation run ID. |
| 299 | ->withMessage(sprintf(__("Automation step with ID '%1\$s' was not started in automation run with ID '%2\$d'.", 'mailpoet'), $id, $runId)); |
| 300 | } |
| 301 | |
| 302 | public static function stepNotRunning(string $id, string $status, int $runId): InvalidStateException { |
| 303 | return InvalidStateException::create() |
| 304 | ->withErrorCode(self::AUTOMATION_STEP_NOT_RUNNING) |
| 305 | // translators: %1$s is the ID of the automation step, %2$s its current status, %3$d is the automation run ID. |
| 306 | ->withMessage(sprintf(__("Automation step with ID '%1\$s' is not running in automation run with ID '%2\$d'. Status: '%3\$s'", 'mailpoet'), $id, $runId, $status)); |
| 307 | } |
| 308 | |
| 309 | public static function stepActionProcessed(string $id, int $runId, int $runNumber): InvalidStateException { |
| 310 | return InvalidStateException::create() |
| 311 | ->withErrorCode(self::AUTOMATION_STEP_ACTION_PROCESSED) |
| 312 | // translators: %1$d is the automation run ID, %2$s is the ID of the automation step, %3$d is the run number. |
| 313 | ->withMessage(sprintf(__("Automation run with ID '%1\$d' already has a processed action for step with ID '%2\$s' and run number '%3\$d'.", 'mailpoet'), $runId, $id, $runNumber)); |
| 314 | } |
| 315 | } |
| 316 |