From 63e2daaa9b9d261113fbab8a908fa31f3b61e2dc Mon Sep 17 00:00:00 2001 From: Adrian Stephens Date: Thu, 23 Apr 2026 14:29:15 +0100 Subject: [PATCH] Completing the PDF download and review recipients pages. Refactored. --- AGENTS.md | 39 + dist/feca_mailshots_plugin-0.1.92.zip | Bin 0 -> 113233 bytes docs/requirements_review_2026-04-23.md | 49 + .../feca_mailshots_plugin.php | 2 +- .../src/Admin/AdminRequestHelpers.php | 254 +++++ .../src/Admin/AttachmentsAdminPage.php | 153 +-- .../src/Admin/DataSourcesAdminPage.php | 83 +- .../src/Admin/DownloadPdfAdminPage.php | 425 +++++++++ .../src/Admin/MailshotTestAdminPage.php | 217 ++++- .../src/Admin/MailshotsAdminPage.php | 517 ++++++----- .../src/Admin/PdfAssetsAdminPage.php | 167 ++-- .../src/Admin/ProfileAdminPage.php | 104 ++- .../src/Admin/ReviewRecipientsAdminPage.php | 240 +++++ .../src/Admin/RunMailshotAdminPage.php | 35 +- .../src/Admin/SetupAdminPage.php | 10 +- .../src/Application/AttachmentService.php | 41 +- .../src/Application/DataSourceService.php | 106 ++- .../src/Application/DslCompiler.php | 35 + .../src/Application/MailshotRunService.php | 877 +++++++++++++++++- .../src/Application/MailshotService.php | 7 +- .../src/Application/PdfAssetService.php | 32 +- .../src/Application/SmtpSender.php | 3 +- .../src/Application/TemplateRenderer.php | 178 +++- .../src/Infrastructure/BasicSmtpSender.php | 72 +- .../DatabaseSourceMetadataProvider.php | 36 +- .../src/Infrastructure/PhpImapAppender.php | 110 ++- feca_mailshots_plugin/src/Plugin.php | 18 +- .../src/Repository/AttachmentRepository.php | 84 ++ .../Repository/MailCredentialRepository.php | 68 +- .../src/Repository/PdfAssetRepository.php | 34 + .../src/WordPress/FixtureWordPressFacade.php | 64 +- .../WordPress/ProductionWordPressFacade.php | 18 +- .../src/WordPress/WordPressFacade.php | 1 + feca_mailshots_plugin/src/bootstrap.php | 17 +- formats/renewals_v1.html | 301 ++++++ formats/renewals_v2.html | 266 ++++++ formats/renewals_v3.html | 288 ++++++ formats/renewals_v4.html | 299 ++++++ playwright.config.mjs | 8 +- requirements/mailshot.md | 2 +- requirements/mailshot_data_source.md | 9 +- requirements/renewal_views.md | 238 +++++ requirements/third_party_software.md | 25 + requirements/top-level.md | 15 + requirements/ui_design.md | 5 + results/fallback_scan_2026-04-22.md | 85 ++ samples/test attachment.docx | Bin 0 -> 5122 bytes samples/test attachment.odt | Bin 0 -> 10009 bytes samples/test attachment.pdf | Bin 0 -> 13723 bytes scripts/cleanup_testing_artefacts.sh | 250 +++++ scripts/deploy_remote.sh | 47 +- scripts/package_plugin.sh | 103 ++ scripts/sql/create_renewal_views.sql | 191 ++++ tests/e2e/README.md | 21 +- tests/e2e/global-setup.mjs | 116 +++ tests/e2e/run.sh | 29 +- tests/e2e/specs/download-pdf-renewal.spec.mjs | 175 ++++ .../specs/download-pdf-ui-feedback.spec.mjs | 49 + tests/e2e/specs/mailshots-editor.spec.mjs | 201 +++- tests/e2e/specs/modal-regressions.spec.mjs | 260 ++++++ tests/e2e/specs/run-test-pages.spec.mjs | 17 +- tests/fixture/bootstrap.php | 2 + tests/fixture/wp-admin/admin.php | 2 + tests/fixture/wp_shim.php | 7 + .../test_access_control_policy.php | 68 ++ .../integration/test_phase3_admin_crud_ui.php | 15 + tests/integration/test_phase3_db_access.php | 1 - tests/integration/test_phase4_run_flow.php | 89 +- tests/unit/test_basic_smtp_sender_mime.php | 64 ++ tests/unit/test_dsl_accounts_picklists.php | 54 ++ .../test_production_wp_facade_unslash.php | 39 + .../unit/test_template_renderer_pdf_asset.php | 58 ++ 72 files changed, 6808 insertions(+), 687 deletions(-) create mode 100644 AGENTS.md create mode 100644 dist/feca_mailshots_plugin-0.1.92.zip create mode 100644 docs/requirements_review_2026-04-23.md create mode 100644 feca_mailshots_plugin/src/Admin/AdminRequestHelpers.php create mode 100644 feca_mailshots_plugin/src/Admin/DownloadPdfAdminPage.php create mode 100644 feca_mailshots_plugin/src/Admin/ReviewRecipientsAdminPage.php create mode 100644 formats/renewals_v1.html create mode 100644 formats/renewals_v2.html create mode 100644 formats/renewals_v3.html create mode 100644 formats/renewals_v4.html create mode 100644 requirements/renewal_views.md create mode 100644 requirements/third_party_software.md create mode 100644 results/fallback_scan_2026-04-22.md create mode 100644 samples/test attachment.docx create mode 100644 samples/test attachment.odt create mode 100644 samples/test attachment.pdf create mode 100755 scripts/cleanup_testing_artefacts.sh create mode 100755 scripts/package_plugin.sh create mode 100644 scripts/sql/create_renewal_views.sql create mode 100644 tests/e2e/global-setup.mjs create mode 100644 tests/e2e/specs/download-pdf-renewal.spec.mjs create mode 100644 tests/e2e/specs/download-pdf-ui-feedback.spec.mjs create mode 100644 tests/e2e/specs/modal-regressions.spec.mjs create mode 100644 tests/integration/test_access_control_policy.php create mode 100644 tests/unit/test_basic_smtp_sender_mime.php create mode 100644 tests/unit/test_dsl_accounts_picklists.php create mode 100644 tests/unit/test_production_wp_facade_unslash.php create mode 100644 tests/unit/test_template_renderer_pdf_asset.php diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..0f37f3c --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,39 @@ +# Wordpress coding rules + +- Escape every rendered variable. +- Never trust request data. +- Validate first, sanitize second. +- Use nonces + capability checks for state changes. +- Use WordPress APIs before custom code. +- Use `$wpdb->prepare()` for dynamic SQL. +- Prefix all identifiers. +- Wrap user-facing strings in i18n functions. +- Keep templates dumb. +- Prefer readable, hook-friendly code. +- Trap all possible errors for on-screen display. Do not allow Wordpress Cricital Errors to occur. +- Interact with third-party software via well-known interfaces, not custom DOM probing. +- Don't embed magic numbers in the code - such as known memory limits for a particular operation. +- All production configuration is via admin setup page (or user's profile page for per-user setup) + +# Project Rules + +Provide user error feedback on the pane/modal that was enabling user-interaction. +Prevent exiting the page with an error that causes loss of data already entered, instead +require that the user fix the error or "Quit" the page. + +Obey rules in requirements/environment.md + +# Generated JS/PHP Quoting Safety Rules + +1. Never hand-escape JS strings inside PHP string literals when avoidable. +2. When emitting JS from PHP, pass dynamic string values via `json_encode(..., JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE)` and assign them to JS variables. +3. Prefer PHP `nowdoc`/`heredoc` blocks for inline JS/HTML over long concatenated quoted strings. +4. Do not use JS regex literals inside PHP-quoted JS when a non-regex alternative exists (`split/join`, `replaceAll`, explicit loops). +5. If regex is required, construct with `new RegExp(...)` from safely encoded string parts, not literal `/.../` in PHP-quoted code. +6. Avoid nested quote composition (`"\'` or `\\"` chains). Build tokens with template variables + encoded parts. +7. For Twig token generation, standardize one helper function and reuse it everywhere; do not duplicate escaping logic. +8. After any change to embedded JS in PHP, run: + - `php -l ` + - project-wide PHP lint for plugin files before finishing. +9. If a change touches emitted JS, include a runtime sanity check step: open affected admin page and confirm browser console has no syntax errors. +10. In fixes for syntax/runtime issues, prefer minimal reversible changes first, then refactor for cleanliness only after recovery. diff --git a/dist/feca_mailshots_plugin-0.1.92.zip b/dist/feca_mailshots_plugin-0.1.92.zip new file mode 100644 index 0000000000000000000000000000000000000000..662d4b4929493e3b25a60bb725a776c155533657 GIT binary patch literal 113233 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

A(q`QffkElzKmg=qkJO%T=vCc4Mt&+iLL)L_I; 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

;I2RH6aU~7Mg(_%D+ZI3ZEkt4FpL{;)6 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 literal 0 HcmV?d00001 diff --git a/docs/requirements_review_2026-04-23.md b/docs/requirements_review_2026-04-23.md new file mode 100644 index 0000000..086d139 --- /dev/null +++ b/docs/requirements_review_2026-04-23.md @@ -0,0 +1,49 @@ +# Requirements Review - 2026-04-23 + +## Scope +- Reviewed files under `requirements/` against current implementation in `feca_mailshots_plugin/`. + +## Findings + +### 1) High: Packaging script requirement not implemented +- Requirement: + - `requirements/environment.md` states `scripts/` must contain a packaging script that creates an uploadable WordPress plugin package. + - Reference: `/home/adrians/persistent/nosnap/development/mailshots-plugin/requirements/environment.md:62` +- Current implementation: + - `scripts/` currently contains: + - `cleanup_testing_artefacts.sh` + - `deploy_remote.sh` + - `mysql_tunnel.sh` + - `run_fixture_server.sh` + - `sql/` + - No packaging script is present. +- Gap: + - Requirement is unmet. + +### 2) High: Data source REST capability split requirement not implemented +- Requirement: + - Data source API auth/capabilities require: + - create/update/delete => management capability (e.g. `manage_mailshots`) + - read/preview/validate => read capability (e.g. `read_mailshots`) + - References: + - `/home/adrians/persistent/nosnap/development/mailshots-plugin/requirements/mailshot_data_source.md:427` + - `/home/adrians/persistent/nosnap/development/mailshots-plugin/requirements/mailshot_data_source.md:428` +- Current implementation: + - `DataSourcesAdminPage` defines one capability only: + - `private const CAPABILITY = 'edit_pages';` + - `/home/adrians/persistent/nosnap/development/mailshots-plugin/feca_mailshots_plugin/src/Admin/DataSourcesAdminPage.php:13` + - Both REST permission callbacks use the same capability: + - `restCanRead()` -> `currentUserCan(self::CAPABILITY)` + - `/home/adrians/persistent/nosnap/development/mailshots-plugin/feca_mailshots_plugin/src/Admin/DataSourcesAdminPage.php:584` + - `restCanManage()` -> `currentUserCan(self::CAPABILITY)` + - `/home/adrians/persistent/nosnap/development/mailshots-plugin/feca_mailshots_plugin/src/Admin/DataSourcesAdminPage.php:589` +- Gap: + - Requirement for separate read/manage capability model is unmet. + +## Notes +- This review focused on direct, verifiable requirement-to-code mismatches. +- Files reviewed include: + - `requirements/environment.md` + - `requirements/mailshot_data_source.md` + - `requirements/third_party_software.md` + - `feca_mailshots_plugin/src/Admin/DataSourcesAdminPage.php` diff --git a/feca_mailshots_plugin/feca_mailshots_plugin.php b/feca_mailshots_plugin/feca_mailshots_plugin.php index 9a48ea1..7ae4147 100644 --- a/feca_mailshots_plugin/feca_mailshots_plugin.php +++ b/feca_mailshots_plugin/feca_mailshots_plugin.php @@ -3,7 +3,7 @@ * Plugin Name: FECA Mailshots * Plugin URI: https://fenedge.co.uk/ * Description: FECA mailshots plugin. - * Version: 0.1.26 + * Version: 0.1.93 * Requires at least: 6.0 * Requires PHP: 7.4 * Author: FECA diff --git a/feca_mailshots_plugin/src/Admin/AdminRequestHelpers.php b/feca_mailshots_plugin/src/Admin/AdminRequestHelpers.php new file mode 100644 index 0000000..ccca06e --- /dev/null +++ b/feca_mailshots_plugin/src/Admin/AdminRequestHelpers.php @@ -0,0 +1,254 @@ +wp->requestParam($name, $default) ?? $default); + } + + private function requestInt(string $name, int $default = 0): int + { + return (int) ($this->wp->requestParam($name, (string) $default) ?? (string) $default); + } + + private function requestOptionalInt(string $name = 'id'): ?int + { + $raw = trim($this->requestString($name, '')); + return $raw === '' ? null : (int) $raw; + } + + private function enforceCapabilityOrJson(string $capability): bool + { + if ($this->wp->currentUserCan($capability)) { + return true; + } + $this->wp->sendJson(['ok' => false, 'error' => 'Permission denied'], 403); + return false; + } + + private function enforcePostOrJson(): bool + { + if ($this->requestMethod() === 'POST') { + return true; + } + $this->wp->sendJson(['ok' => false, 'error' => 'Method not allowed. Use POST.'], 405); + return false; + } + + private function enforceNonceOrJson(string $nonceAction): bool + { + $nonce = trim($this->requestString('_wpnonce', '')); + if ($nonce !== '' && $this->wp->verifyNonce($nonce, $nonceAction)) { + return true; + } + $this->wp->sendJson(['ok' => false, 'error' => 'Invalid or missing nonce.'], 403); + return false; + } + + private function enforceMutationGuardOrJson(string $capability, string $nonceAction): bool + { + if ($this->mutationGuardValid($capability, $nonceAction)) { + return true; + } + if (!$this->wp->currentUserCan($capability)) { + $this->wp->sendJson(['ok' => false, 'error' => 'Permission denied'], 403); + return false; + } + if ($this->requestMethod() !== 'POST') { + $this->wp->sendJson(['ok' => false, 'error' => 'Method not allowed. Use POST.'], 405); + return false; + } + $this->wp->sendJson(['ok' => false, 'error' => 'Invalid or missing nonce.'], 403); + return false; + } + + private function mutationGuardValid(string $capability, string $nonceAction): bool + { + if (!$this->wp->currentUserCan($capability)) { + return false; + } + if ($this->requestMethod() !== 'POST') { + return false; + } + $nonce = trim($this->requestString('_wpnonce', '')); + if ($nonce === '') { + return false; + } + return $this->wp->verifyNonce($nonce, $nonceAction); + } + + private function hiddenNonceField(string $nonceAction): string + { + return ''; + } + + private function redirectTo(string $url): void + { + if (!headers_sent()) { + header('Location: ' . $url, true, 302); + exit; + } + } + + private function redirectToAdminPage(string $page, ?int $editId = null): void + { + $url = $this->wp->adminUrl('admin.php?page=' . $page . ($editId !== null && $editId > 0 ? '&edit_id=' . $editId : '')); + $this->redirectTo($url); + } + + private function uploadedFileToBase64(string $fileField): ?string + { + if (!isset($_FILES[$fileField]) || !is_array($_FILES[$fileField])) { + return null; + } + + $error = (int) ($_FILES[$fileField]['error'] ?? UPLOAD_ERR_NO_FILE); + if ($error === UPLOAD_ERR_NO_FILE) { + return null; + } + if ($error !== UPLOAD_ERR_OK) { + throw new \RuntimeException('File upload failed for "' . $fileField . '" with error code ' . $error . '.'); + } + + $tmp = (string) ($_FILES[$fileField]['tmp_name'] ?? ''); + if ($tmp === '' || !is_file($tmp)) { + throw new \RuntimeException('Uploaded file for "' . $fileField . '" is not available.'); + } + + $bytes = file_get_contents($tmp); + if ($bytes === false) { + throw new \RuntimeException('Unable to read uploaded file for "' . $fileField . '".'); + } + + return base64_encode($bytes); + } + + /** @return array|null */ + private function consumeOptionArray(string $optionKey): ?array + { + $raw = $this->wp->getOption($optionKey, null); + $this->wp->deleteOption($optionKey); + return is_array($raw) ? $raw : null; + } + + /** + * Persists result banner payload and draft state in a consistent way: + * - always stores result payload + * - clears draft on success + * - stores draft on failure when provided + * @param array $result + * @param array|null $draft + */ + private function persistResultAndDraft(string $resultOptionKey, string $draftOptionKey, array $result, ?array $draft): void + { + $this->wp->updateOption($resultOptionKey, $result); + if (!empty($result['ok'])) { + $this->wp->deleteOption($draftOptionKey); + return; + } + if (is_array($draft)) { + $this->wp->updateOption($draftOptionKey, $draft); + } + } + + /** @param array|null $result */ + private function modalErrorHtml(?array $result): string + { + if ($result === null || !empty($result['ok']) || empty($result['errors']) || !is_array($result['errors'])) { + return ''; + } + $html = '
'; + $html .= 'Please fix the following:
    '; + foreach ($result['errors'] as $error) { + $html .= '
  • ' . htmlspecialchars((string) $error) . '
  • '; + } + $html .= '
'; + return $html; + } + + /** + * @param callable():array $list + * @param callable():array $save + * @param callable():array $delete + */ + private function handleBasicCrudApi(string $op, callable $list, callable $save, callable $delete): void + { + if ($op === 'list') { + $this->wp->sendJson($list()); + return; + } + if ($op === 'save') { + $this->wp->sendJson($save()); + return; + } + if ($op === 'delete') { + $this->wp->sendJson($delete()); + return; + } + $this->wp->sendJson(['ok' => false, 'error' => 'Unknown operation'], 400); + } + + /** + * @param list $fieldIds + */ + private function modalEditorScript( + string $modalId, + string $openButtonId, + string $closeButtonId, + string $formId, + string $editorIdFieldId, + array $fieldIds, + bool $hasEdit, + bool $hasDraft, + bool $hasResult, + bool $resultOk, + ?string $defaultSelectFieldId = null, + ?string $defaultSelectValue = null, + ?string $uploadFieldId = null, + ?string $fileNameFieldId = null + ): string { + $cfg = [ + 'modalId' => $modalId, + 'openButtonId' => $openButtonId, + 'closeButtonId' => $closeButtonId, + 'formId' => $formId, + 'editorIdFieldId' => $editorIdFieldId, + 'fieldIds' => array_values($fieldIds), + 'hasEdit' => $hasEdit, + 'hasDraft' => $hasDraft, + 'hasResult' => $hasResult, + 'resultOk' => $resultOk, + 'defaultSelectFieldId' => $defaultSelectFieldId, + 'defaultSelectValue' => $defaultSelectValue, + 'uploadFieldId' => $uploadFieldId, + 'fileNameFieldId' => $fileNameFieldId, + ]; + return ''; + } +} diff --git a/feca_mailshots_plugin/src/Admin/AttachmentsAdminPage.php b/feca_mailshots_plugin/src/Admin/AttachmentsAdminPage.php index 8e4212d..642ce32 100644 --- a/feca_mailshots_plugin/src/Admin/AttachmentsAdminPage.php +++ b/feca_mailshots_plugin/src/Admin/AttachmentsAdminPage.php @@ -9,8 +9,13 @@ use FecaMailshots\WordPress\WordPressFacade; final class AttachmentsAdminPage { + use AdminRequestHelpers; + private const CAPABILITY = 'edit_pages'; private const RESULT_OPTION_KEY = 'feca_mailshots_attachments_ui_result'; + private const DRAFT_OPTION_KEY = 'feca_mailshots_attachments_ui_draft'; + private const PAGE_SLUG = 'feca-mailshots-attachments'; + private const NONCE_ACTION = 'feca_mailshots_attachments'; /** @var callable(): AttachmentService */ private $serviceFactory; private WordPressFacade $wp; @@ -32,7 +37,7 @@ final class AttachmentsAdminPage public function registerMenu(): void { - $this->wp->addSubmenuPage('feca-mailshot', 'Attachments', 'Attachments', self::CAPABILITY, 'feca-mailshots-attachments', [$this, 'render']); + $this->wp->addSubmenuPage('feca-mailshot', 'Attachments', 'Attachments', self::CAPABILITY, self::PAGE_SLUG, [$this, 'render']); } public function render(): void @@ -42,7 +47,11 @@ final class AttachmentsAdminPage return; } $items = $this->service()->list(); + $draft = $this->consumeOptionArray(self::DRAFT_OPTION_KEY); $editId = (int) ($this->wp->requestParam('edit_id', '0') ?? '0'); + if ($editId <= 0 && is_array($draft) && isset($draft['id'])) { + $editId = (int) $draft['id']; + } $editItem = null; foreach ($items as $row) { if ((int) ($row['id'] ?? 0) === $editId) { @@ -50,11 +59,16 @@ final class AttachmentsAdminPage break; } } - $result = $this->result(); + $result = $this->consumeOptionArray(self::RESULT_OPTION_KEY); $action = htmlspecialchars($this->wp->adminUrl('admin-post.php')); $name = (string) ($editItem['name'] ?? ''); $fileName = (string) ($editItem['file_name'] ?? ''); - $mime = (string) ($editItem['mime_type'] ?? 'application/octet-stream'); + $base64 = ''; + if (is_array($draft)) { + $name = (string) ($draft['name'] ?? $name); + $fileName = (string) ($draft['file_name'] ?? $fileName); + $base64 = (string) ($draft['file_bytes_base64'] ?? ''); + } echo '

Attachments

'; if ($result !== null) { @@ -76,7 +90,9 @@ final class AttachmentsAdminPage echo '

'; echo '
'; echo '

' . ($editId > 0 ? 'Edit Attachment' : 'New Attachment') . '

'; + echo $this->modalErrorHtml($result); echo ''; + echo $this->hiddenNonceField(self::NONCE_ACTION); if ($editId > 0) { echo ''; } else { @@ -85,13 +101,12 @@ final class AttachmentsAdminPage echo ''; echo ''; echo ''; - echo ''; echo ''; - echo ''; + echo ''; echo ''; echo '

'; if ($editId > 0) { - echo 'Cancel Edit'; + echo 'Cancel Edit'; } echo '

'; echo '
'; @@ -110,6 +125,7 @@ final class AttachmentsAdminPage echo 'Edit '; echo '
'; echo ''; + echo $this->hiddenNonceField(self::NONCE_ACTION); echo ''; echo ''; echo '
'; @@ -119,54 +135,49 @@ final class AttachmentsAdminPage echo 'No attachments found.'; } echo ''; - echo ''; + echo $this->modalEditorScript( + 'att-editor-modal', + 'att-open-new', + 'att-close-editor', + 'att-editor-form', + 'att-editor-id', + ['att_name', 'att_file_name', 'att_base64'], + $editId > 0, + is_array($draft), + $result !== null, + !empty($result['ok']), + null, + null, + 'att_file_upload', + 'att_file_name' + ); echo ''; } public function handleUiSave(): void { - if (!$this->wp->currentUserCan(self::CAPABILITY)) { - $this->wp->sendJson(['ok' => false, 'error' => 'Permission denied'], 403); + if (!$this->enforceMutationGuardOrJson(self::CAPABILITY, self::NONCE_ACTION)) { return; } - $idRaw = trim((string) ($this->wp->requestParam('id', '') ?? '')); - $id = $idRaw === '' ? null : (int) $idRaw; - $base64 = (string) ($this->wp->requestParam('file_bytes_base64', '') ?? ''); - if ($base64 === '' && isset($_FILES['file_upload']) && is_array($_FILES['file_upload']) && (int) ($_FILES['file_upload']['error'] ?? UPLOAD_ERR_NO_FILE) === UPLOAD_ERR_OK) { - $tmp = (string) ($_FILES['file_upload']['tmp_name'] ?? ''); - if ($tmp !== '' && is_file($tmp)) { - $bytes = file_get_contents($tmp); - if ($bytes !== false) { - $base64 = base64_encode($bytes); - } - } - } - $payload = [ - 'name' => (string) ($this->wp->requestParam('name', '') ?? ''), - 'file_name' => (string) ($this->wp->requestParam('file_name', '') ?? ''), - 'mime_type' => (string) ($this->wp->requestParam('mime_type', 'application/octet-stream') ?? 'application/octet-stream'), - 'file_bytes_base64' => $base64, - ]; + $id = $this->requestOptionalInt('id'); + $uploadedBase64 = $this->uploadedFileToBase64('file_upload'); + $base64 = $uploadedBase64 !== null ? $uploadedBase64 : $this->requestString('file_bytes_base64', ''); + $payload = $this->attachmentPayload($base64); $result = $this->service()->save($id, $payload); - $this->wp->updateOption(self::RESULT_OPTION_KEY, $result); + $this->persistResultAndDraft(self::RESULT_OPTION_KEY, self::DRAFT_OPTION_KEY, $result, ['id' => $id] + $payload); $editId = $id; if (!empty($result['ok']) && isset($result['id'])) { $editId = (int) $result['id']; } - $url = $this->wp->adminUrl('admin.php?page=feca-mailshots-attachments' . ($editId !== null && $editId > 0 ? '&edit_id=' . $editId : '')); - if (!headers_sent()) { - header('Location: ' . $url, true, 302); - exit; - } + $this->redirectToAdminPage(self::PAGE_SLUG, $editId); } public function handleUiDelete(): void { - if (!$this->wp->currentUserCan(self::CAPABILITY)) { - $this->wp->sendJson(['ok' => false, 'error' => 'Permission denied'], 403); + if (!$this->enforceMutationGuardOrJson(self::CAPABILITY, self::NONCE_ACTION)) { return; } - $id = (int) ($this->wp->requestParam('id', '0') ?? '0'); + $id = $this->requestInt('id', 0); $result = ['ok' => true]; try { if ($id > 0) { @@ -176,48 +187,38 @@ final class AttachmentsAdminPage $result = ['ok' => false, 'errors' => [$e->getMessage()]]; } $this->wp->updateOption(self::RESULT_OPTION_KEY, $result); - if (!headers_sent()) { - header('Location: ' . $this->wp->adminUrl('admin.php?page=feca-mailshots-attachments'), true, 302); - exit; - } + $this->redirectToAdminPage(self::PAGE_SLUG); } public function handleApi(): void { - if (!$this->wp->currentUserCan(self::CAPABILITY)) { - $this->wp->sendJson(['ok' => false, 'error' => 'Permission denied'], 403); + if (!$this->enforceCapabilityOrJson(self::CAPABILITY)) { return; } - $op = (string) ($this->wp->requestParam('op', 'list') ?? 'list'); + $op = $this->requestString('op', 'list'); try { - if ($op === 'list') { - $this->wp->sendJson(['ok' => true, 'items' => $this->service()->list()]); - return; - } - - if ($op === 'save') { - $idRaw = $this->wp->requestParam('id', ''); - $id = $idRaw === '' ? null : (int) $idRaw; - $payload = [ - 'name' => (string) ($this->wp->requestParam('name', '') ?? ''), - 'file_name' => (string) ($this->wp->requestParam('file_name', '') ?? ''), - 'mime_type' => (string) ($this->wp->requestParam('mime_type', 'application/octet-stream') ?? 'application/octet-stream'), - 'file_bytes_base64' => (string) ($this->wp->requestParam('file_bytes_base64', '') ?? ''), - ]; - $this->wp->sendJson($this->service()->save($id, $payload)); - return; - } - - if ($op === 'delete') { - $id = (int) ($this->wp->requestParam('id', '0') ?? '0'); - $this->service()->delete($id); - $this->wp->sendJson(['ok' => true]); - return; - } - - $this->wp->sendJson(['ok' => false, 'error' => 'Unknown operation'], 400); + $this->handleBasicCrudApi( + $op, + fn(): array => ['ok' => true, 'items' => $this->service()->list()], + function (): array { + if (!$this->mutationGuardValid(self::CAPABILITY, self::NONCE_ACTION)) { + return ['ok' => false, 'error' => 'Mutation guard rejected request.']; + } + $id = $this->requestOptionalInt('id'); + $payload = $this->attachmentPayload($this->requestString('file_bytes_base64', '')); + return $this->service()->save($id, $payload); + }, + function (): array { + if (!$this->mutationGuardValid(self::CAPABILITY, self::NONCE_ACTION)) { + return ['ok' => false, 'error' => 'Mutation guard rejected request.']; + } + $id = $this->requestInt('id', 0); + $this->service()->delete($id); + return ['ok' => true]; + } + ); } catch (\Throwable $e) { $this->wp->sendJson(['ok' => false, 'error' => $e->getMessage()], 500); } @@ -228,11 +229,15 @@ final class AttachmentsAdminPage return ($this->serviceFactory)(); } - /** @return array|null */ - private function result(): ?array + /** @return array{name:string,file_name:string,mime_type:string,file_bytes_base64:string} */ + private function attachmentPayload(string $base64): array { - $raw = $this->wp->getOption(self::RESULT_OPTION_KEY, null); - $this->wp->deleteOption(self::RESULT_OPTION_KEY); - return is_array($raw) ? $raw : null; + return [ + 'name' => $this->requestString('name', ''), + 'file_name' => $this->requestString('file_name', ''), + 'mime_type' => $this->requestString('mime_type', ''), + 'file_bytes_base64' => $base64, + ]; } + } diff --git a/feca_mailshots_plugin/src/Admin/DataSourcesAdminPage.php b/feca_mailshots_plugin/src/Admin/DataSourcesAdminPage.php index f5730e9..c82f286 100644 --- a/feca_mailshots_plugin/src/Admin/DataSourcesAdminPage.php +++ b/feca_mailshots_plugin/src/Admin/DataSourcesAdminPage.php @@ -8,8 +8,12 @@ use FecaMailshots\WordPress\WordPressFacade; final class DataSourcesAdminPage { + use AdminRequestHelpers; + private const CAPABILITY = 'edit_pages'; private const RESULT_OPTION_KEY = 'feca_mailshots_data_sources_ui_result'; + private const DRAFT_OPTION_KEY = 'feca_mailshots_data_sources_ui_draft'; + private const NONCE_ACTION = 'feca_mailshots_data_sources'; /** @var callable(): \FecaMailshots\Application\DataSourceService */ private $serviceFactory; @@ -72,7 +76,11 @@ final class DataSourcesAdminPage } $items = $this->filteredAndSortedItems($this->service()->list(), $filter, $sort); + $draft = $this->consumeOptionArray(self::DRAFT_OPTION_KEY); $editId = (int) ($this->wp->requestParam('edit_id', '0') ?? '0'); + if ($editId <= 0 && is_array($draft) && isset($draft['id'])) { + $editId = (int) $draft['id']; + } $editItem = null; foreach ($items as $row) { if ((int) ($row['ID'] ?? 0) === $editId) { @@ -82,7 +90,11 @@ final class DataSourcesAdminPage } $name = is_array($editItem) ? (string) ($editItem['name'] ?? '') : ''; $dsl = is_array($editItem) ? (string) ($editItem['dsl_text'] ?? '') : ''; - $result = $this->result(); + if (is_array($draft)) { + $name = (string) ($draft['name'] ?? $name); + $dsl = (string) ($draft['dsl_text'] ?? $dsl); + } + $result = $this->consumeOptionArray(self::RESULT_OPTION_KEY); $sourceFieldsMap = $this->service()->sourceFields(); $schemaList = $this->service()->listSchemas(); @@ -116,14 +128,22 @@ final class DataSourcesAdminPage echo '
'; echo ''; - echo ' '; - echo '