From e10b1215da0fffdb54e9e73cee7d3a093f4c9a5e Mon Sep 17 00:00:00 2001 From: fs Date: Thu, 26 Mar 2026 08:13:37 +0100 Subject: [PATCH] fix(audit): restructure module pages to avoid admin/ path collision Module pages must use a unique top-level directory (audit/) instead of nesting under admin/ which collides with core's pages/admin/ during module:build symlink creation. Routes still map admin/* URLs to the audit/ page directory via manifest route targets. Co-Authored-By: Claude Opus 4.6 (1M context) --- modules/audit/module.php | 36 ++--- .../{admin => audit}/api-audit/data().php | 0 .../api-audit/filter-schema.php | 0 .../api-audit/index($slug).php | 0 .../{admin => audit}/api-audit/index().php | 0 .../api-audit/index(default).phtml | 0 .../{admin => audit}/api-audit/purge().php | 0 .../{admin => audit}/api-audit/view($id).php | 0 .../api-audit/view(default).phtml | 0 .../frontend-telemetry/ingest().php | 0 .../{admin => audit}/import-audit/data().php | 0 .../import-audit/filter-schema.php | 0 .../import-audit/index($slug).php | 0 .../{admin => audit}/import-audit/index().php | 0 .../import-audit/index(default).phtml | 0 .../{admin => audit}/import-audit/purge().php | 0 .../import-audit/view($id).php | 0 .../import-audit/view(default).phtml | 0 .../{admin => audit}/system-audit/data().php | 0 .../system-audit/filter-schema.php | 0 .../system-audit/index($slug).php | 0 .../{admin => audit}/system-audit/index().php | 0 .../system-audit/index(default).phtml | 0 .../{admin => audit}/system-audit/purge().php | 0 .../system-audit/view($id).php | 0 .../system-audit/view(default).phtml | 0 .../user-lifecycle-audit/data().php | 0 .../user-lifecycle-audit/filter-schema.php | 0 .../user-lifecycle-audit/index().php | 0 .../user-lifecycle-audit/index(default).phtml | 0 .../user-lifecycle-audit/purge().php | 0 .../user-lifecycle-audit/restore($id).php | 0 .../user-lifecycle-audit/view($id).php | 0 .../user-lifecycle-audit/view(default).phtml | 0 .../Service/NotificationMessage.php | 148 ++++++++++++++++++ .../AuthzUiActionContractTest.php | 10 +- tests/Architecture/AuthzUiContractSupport.php | 20 +-- .../AuthzUiTemplateContractTest.php | 10 +- tests/Architecture/ListContractFiles.php | 40 ++--- .../ListTitlebarContractFiles.php | 8 +- .../ListUiSharedPartialsContractTest.php | 8 +- .../SecurityLoggingRuntimeContractTest.php | 4 +- .../StatusTaxonomyContractFiles.php | 24 +-- .../StatusTaxonomyUiContractTest.php | 2 +- web/modules/audit | 1 + 45 files changed, 230 insertions(+), 81 deletions(-) rename modules/audit/pages/{admin => audit}/api-audit/data().php (100%) rename modules/audit/pages/{admin => audit}/api-audit/filter-schema.php (100%) rename modules/audit/pages/{admin => audit}/api-audit/index($slug).php (100%) rename modules/audit/pages/{admin => audit}/api-audit/index().php (100%) rename modules/audit/pages/{admin => audit}/api-audit/index(default).phtml (100%) rename modules/audit/pages/{admin => audit}/api-audit/purge().php (100%) rename modules/audit/pages/{admin => audit}/api-audit/view($id).php (100%) rename modules/audit/pages/{admin => audit}/api-audit/view(default).phtml (100%) rename modules/audit/pages/{admin => audit}/frontend-telemetry/ingest().php (100%) rename modules/audit/pages/{admin => audit}/import-audit/data().php (100%) rename modules/audit/pages/{admin => audit}/import-audit/filter-schema.php (100%) rename modules/audit/pages/{admin => audit}/import-audit/index($slug).php (100%) rename modules/audit/pages/{admin => audit}/import-audit/index().php (100%) rename modules/audit/pages/{admin => audit}/import-audit/index(default).phtml (100%) rename modules/audit/pages/{admin => audit}/import-audit/purge().php (100%) rename modules/audit/pages/{admin => audit}/import-audit/view($id).php (100%) rename modules/audit/pages/{admin => audit}/import-audit/view(default).phtml (100%) rename modules/audit/pages/{admin => audit}/system-audit/data().php (100%) rename modules/audit/pages/{admin => audit}/system-audit/filter-schema.php (100%) rename modules/audit/pages/{admin => audit}/system-audit/index($slug).php (100%) rename modules/audit/pages/{admin => audit}/system-audit/index().php (100%) rename modules/audit/pages/{admin => audit}/system-audit/index(default).phtml (100%) rename modules/audit/pages/{admin => audit}/system-audit/purge().php (100%) rename modules/audit/pages/{admin => audit}/system-audit/view($id).php (100%) rename modules/audit/pages/{admin => audit}/system-audit/view(default).phtml (100%) rename modules/audit/pages/{admin => audit}/user-lifecycle-audit/data().php (100%) rename modules/audit/pages/{admin => audit}/user-lifecycle-audit/filter-schema.php (100%) rename modules/audit/pages/{admin => audit}/user-lifecycle-audit/index().php (100%) rename modules/audit/pages/{admin => audit}/user-lifecycle-audit/index(default).phtml (100%) rename modules/audit/pages/{admin => audit}/user-lifecycle-audit/purge().php (100%) rename modules/audit/pages/{admin => audit}/user-lifecycle-audit/restore($id).php (100%) rename modules/audit/pages/{admin => audit}/user-lifecycle-audit/view($id).php (100%) rename modules/audit/pages/{admin => audit}/user-lifecycle-audit/view(default).phtml (100%) create mode 100644 modules/notifications/lib/Module/Notifications/Service/NotificationMessage.php create mode 120000 web/modules/audit diff --git a/modules/audit/module.php b/modules/audit/module.php index e4ebc3f..5d0a34b 100644 --- a/modules/audit/module.php +++ b/modules/audit/module.php @@ -16,28 +16,28 @@ return [ 'routes' => [ // API audit pages - ['path' => 'admin/api-audit', 'target' => 'admin/api-audit/index'], - ['path' => 'admin/api-audit/view', 'target' => 'admin/api-audit/view'], - ['path' => 'admin/api-audit/data', 'target' => 'admin/api-audit/data'], - ['path' => 'admin/api-audit/purge', 'target' => 'admin/api-audit/purge'], + ['path' => 'admin/api-audit', 'target' => 'audit/api-audit/index'], + ['path' => 'admin/api-audit/view', 'target' => 'audit/api-audit/view'], + ['path' => 'admin/api-audit/data', 'target' => 'audit/api-audit/data'], + ['path' => 'admin/api-audit/purge', 'target' => 'audit/api-audit/purge'], // System audit pages - ['path' => 'admin/system-audit', 'target' => 'admin/system-audit/index'], - ['path' => 'admin/system-audit/view', 'target' => 'admin/system-audit/view'], - ['path' => 'admin/system-audit/data', 'target' => 'admin/system-audit/data'], - ['path' => 'admin/system-audit/purge', 'target' => 'admin/system-audit/purge'], + ['path' => 'admin/system-audit', 'target' => 'audit/system-audit/index'], + ['path' => 'admin/system-audit/view', 'target' => 'audit/system-audit/view'], + ['path' => 'admin/system-audit/data', 'target' => 'audit/system-audit/data'], + ['path' => 'admin/system-audit/purge', 'target' => 'audit/system-audit/purge'], // Import audit pages - ['path' => 'admin/import-audit', 'target' => 'admin/import-audit/index'], - ['path' => 'admin/import-audit/view', 'target' => 'admin/import-audit/view'], - ['path' => 'admin/import-audit/data', 'target' => 'admin/import-audit/data'], - ['path' => 'admin/import-audit/purge', 'target' => 'admin/import-audit/purge'], + ['path' => 'admin/import-audit', 'target' => 'audit/import-audit/index'], + ['path' => 'admin/import-audit/view', 'target' => 'audit/import-audit/view'], + ['path' => 'admin/import-audit/data', 'target' => 'audit/import-audit/data'], + ['path' => 'admin/import-audit/purge', 'target' => 'audit/import-audit/purge'], // User lifecycle audit pages - ['path' => 'admin/user-lifecycle-audit', 'target' => 'admin/user-lifecycle-audit/index'], - ['path' => 'admin/user-lifecycle-audit/view', 'target' => 'admin/user-lifecycle-audit/view'], - ['path' => 'admin/user-lifecycle-audit/data', 'target' => 'admin/user-lifecycle-audit/data'], - ['path' => 'admin/user-lifecycle-audit/purge', 'target' => 'admin/user-lifecycle-audit/purge'], - ['path' => 'admin/user-lifecycle-audit/restore', 'target' => 'admin/user-lifecycle-audit/restore'], + ['path' => 'admin/user-lifecycle-audit', 'target' => 'audit/user-lifecycle-audit/index'], + ['path' => 'admin/user-lifecycle-audit/view', 'target' => 'audit/user-lifecycle-audit/view'], + ['path' => 'admin/user-lifecycle-audit/data', 'target' => 'audit/user-lifecycle-audit/data'], + ['path' => 'admin/user-lifecycle-audit/purge', 'target' => 'audit/user-lifecycle-audit/purge'], + ['path' => 'admin/user-lifecycle-audit/restore', 'target' => 'audit/user-lifecycle-audit/restore'], // Frontend telemetry - ['path' => 'admin/frontend-telemetry/ingest', 'target' => 'admin/frontend-telemetry/ingest'], + ['path' => 'admin/frontend-telemetry/ingest', 'target' => 'audit/frontend-telemetry/ingest'], ], 'public_paths' => [], diff --git a/modules/audit/pages/admin/api-audit/data().php b/modules/audit/pages/audit/api-audit/data().php similarity index 100% rename from modules/audit/pages/admin/api-audit/data().php rename to modules/audit/pages/audit/api-audit/data().php diff --git a/modules/audit/pages/admin/api-audit/filter-schema.php b/modules/audit/pages/audit/api-audit/filter-schema.php similarity index 100% rename from modules/audit/pages/admin/api-audit/filter-schema.php rename to modules/audit/pages/audit/api-audit/filter-schema.php diff --git a/modules/audit/pages/admin/api-audit/index($slug).php b/modules/audit/pages/audit/api-audit/index($slug).php similarity index 100% rename from modules/audit/pages/admin/api-audit/index($slug).php rename to modules/audit/pages/audit/api-audit/index($slug).php diff --git a/modules/audit/pages/admin/api-audit/index().php b/modules/audit/pages/audit/api-audit/index().php similarity index 100% rename from modules/audit/pages/admin/api-audit/index().php rename to modules/audit/pages/audit/api-audit/index().php diff --git a/modules/audit/pages/admin/api-audit/index(default).phtml b/modules/audit/pages/audit/api-audit/index(default).phtml similarity index 100% rename from modules/audit/pages/admin/api-audit/index(default).phtml rename to modules/audit/pages/audit/api-audit/index(default).phtml diff --git a/modules/audit/pages/admin/api-audit/purge().php b/modules/audit/pages/audit/api-audit/purge().php similarity index 100% rename from modules/audit/pages/admin/api-audit/purge().php rename to modules/audit/pages/audit/api-audit/purge().php diff --git a/modules/audit/pages/admin/api-audit/view($id).php b/modules/audit/pages/audit/api-audit/view($id).php similarity index 100% rename from modules/audit/pages/admin/api-audit/view($id).php rename to modules/audit/pages/audit/api-audit/view($id).php diff --git a/modules/audit/pages/admin/api-audit/view(default).phtml b/modules/audit/pages/audit/api-audit/view(default).phtml similarity index 100% rename from modules/audit/pages/admin/api-audit/view(default).phtml rename to modules/audit/pages/audit/api-audit/view(default).phtml diff --git a/modules/audit/pages/admin/frontend-telemetry/ingest().php b/modules/audit/pages/audit/frontend-telemetry/ingest().php similarity index 100% rename from modules/audit/pages/admin/frontend-telemetry/ingest().php rename to modules/audit/pages/audit/frontend-telemetry/ingest().php diff --git a/modules/audit/pages/admin/import-audit/data().php b/modules/audit/pages/audit/import-audit/data().php similarity index 100% rename from modules/audit/pages/admin/import-audit/data().php rename to modules/audit/pages/audit/import-audit/data().php diff --git a/modules/audit/pages/admin/import-audit/filter-schema.php b/modules/audit/pages/audit/import-audit/filter-schema.php similarity index 100% rename from modules/audit/pages/admin/import-audit/filter-schema.php rename to modules/audit/pages/audit/import-audit/filter-schema.php diff --git a/modules/audit/pages/admin/import-audit/index($slug).php b/modules/audit/pages/audit/import-audit/index($slug).php similarity index 100% rename from modules/audit/pages/admin/import-audit/index($slug).php rename to modules/audit/pages/audit/import-audit/index($slug).php diff --git a/modules/audit/pages/admin/import-audit/index().php b/modules/audit/pages/audit/import-audit/index().php similarity index 100% rename from modules/audit/pages/admin/import-audit/index().php rename to modules/audit/pages/audit/import-audit/index().php diff --git a/modules/audit/pages/admin/import-audit/index(default).phtml b/modules/audit/pages/audit/import-audit/index(default).phtml similarity index 100% rename from modules/audit/pages/admin/import-audit/index(default).phtml rename to modules/audit/pages/audit/import-audit/index(default).phtml diff --git a/modules/audit/pages/admin/import-audit/purge().php b/modules/audit/pages/audit/import-audit/purge().php similarity index 100% rename from modules/audit/pages/admin/import-audit/purge().php rename to modules/audit/pages/audit/import-audit/purge().php diff --git a/modules/audit/pages/admin/import-audit/view($id).php b/modules/audit/pages/audit/import-audit/view($id).php similarity index 100% rename from modules/audit/pages/admin/import-audit/view($id).php rename to modules/audit/pages/audit/import-audit/view($id).php diff --git a/modules/audit/pages/admin/import-audit/view(default).phtml b/modules/audit/pages/audit/import-audit/view(default).phtml similarity index 100% rename from modules/audit/pages/admin/import-audit/view(default).phtml rename to modules/audit/pages/audit/import-audit/view(default).phtml diff --git a/modules/audit/pages/admin/system-audit/data().php b/modules/audit/pages/audit/system-audit/data().php similarity index 100% rename from modules/audit/pages/admin/system-audit/data().php rename to modules/audit/pages/audit/system-audit/data().php diff --git a/modules/audit/pages/admin/system-audit/filter-schema.php b/modules/audit/pages/audit/system-audit/filter-schema.php similarity index 100% rename from modules/audit/pages/admin/system-audit/filter-schema.php rename to modules/audit/pages/audit/system-audit/filter-schema.php diff --git a/modules/audit/pages/admin/system-audit/index($slug).php b/modules/audit/pages/audit/system-audit/index($slug).php similarity index 100% rename from modules/audit/pages/admin/system-audit/index($slug).php rename to modules/audit/pages/audit/system-audit/index($slug).php diff --git a/modules/audit/pages/admin/system-audit/index().php b/modules/audit/pages/audit/system-audit/index().php similarity index 100% rename from modules/audit/pages/admin/system-audit/index().php rename to modules/audit/pages/audit/system-audit/index().php diff --git a/modules/audit/pages/admin/system-audit/index(default).phtml b/modules/audit/pages/audit/system-audit/index(default).phtml similarity index 100% rename from modules/audit/pages/admin/system-audit/index(default).phtml rename to modules/audit/pages/audit/system-audit/index(default).phtml diff --git a/modules/audit/pages/admin/system-audit/purge().php b/modules/audit/pages/audit/system-audit/purge().php similarity index 100% rename from modules/audit/pages/admin/system-audit/purge().php rename to modules/audit/pages/audit/system-audit/purge().php diff --git a/modules/audit/pages/admin/system-audit/view($id).php b/modules/audit/pages/audit/system-audit/view($id).php similarity index 100% rename from modules/audit/pages/admin/system-audit/view($id).php rename to modules/audit/pages/audit/system-audit/view($id).php diff --git a/modules/audit/pages/admin/system-audit/view(default).phtml b/modules/audit/pages/audit/system-audit/view(default).phtml similarity index 100% rename from modules/audit/pages/admin/system-audit/view(default).phtml rename to modules/audit/pages/audit/system-audit/view(default).phtml diff --git a/modules/audit/pages/admin/user-lifecycle-audit/data().php b/modules/audit/pages/audit/user-lifecycle-audit/data().php similarity index 100% rename from modules/audit/pages/admin/user-lifecycle-audit/data().php rename to modules/audit/pages/audit/user-lifecycle-audit/data().php diff --git a/modules/audit/pages/admin/user-lifecycle-audit/filter-schema.php b/modules/audit/pages/audit/user-lifecycle-audit/filter-schema.php similarity index 100% rename from modules/audit/pages/admin/user-lifecycle-audit/filter-schema.php rename to modules/audit/pages/audit/user-lifecycle-audit/filter-schema.php diff --git a/modules/audit/pages/admin/user-lifecycle-audit/index().php b/modules/audit/pages/audit/user-lifecycle-audit/index().php similarity index 100% rename from modules/audit/pages/admin/user-lifecycle-audit/index().php rename to modules/audit/pages/audit/user-lifecycle-audit/index().php diff --git a/modules/audit/pages/admin/user-lifecycle-audit/index(default).phtml b/modules/audit/pages/audit/user-lifecycle-audit/index(default).phtml similarity index 100% rename from modules/audit/pages/admin/user-lifecycle-audit/index(default).phtml rename to modules/audit/pages/audit/user-lifecycle-audit/index(default).phtml diff --git a/modules/audit/pages/admin/user-lifecycle-audit/purge().php b/modules/audit/pages/audit/user-lifecycle-audit/purge().php similarity index 100% rename from modules/audit/pages/admin/user-lifecycle-audit/purge().php rename to modules/audit/pages/audit/user-lifecycle-audit/purge().php diff --git a/modules/audit/pages/admin/user-lifecycle-audit/restore($id).php b/modules/audit/pages/audit/user-lifecycle-audit/restore($id).php similarity index 100% rename from modules/audit/pages/admin/user-lifecycle-audit/restore($id).php rename to modules/audit/pages/audit/user-lifecycle-audit/restore($id).php diff --git a/modules/audit/pages/admin/user-lifecycle-audit/view($id).php b/modules/audit/pages/audit/user-lifecycle-audit/view($id).php similarity index 100% rename from modules/audit/pages/admin/user-lifecycle-audit/view($id).php rename to modules/audit/pages/audit/user-lifecycle-audit/view($id).php diff --git a/modules/audit/pages/admin/user-lifecycle-audit/view(default).phtml b/modules/audit/pages/audit/user-lifecycle-audit/view(default).phtml similarity index 100% rename from modules/audit/pages/admin/user-lifecycle-audit/view(default).phtml rename to modules/audit/pages/audit/user-lifecycle-audit/view(default).phtml diff --git a/modules/notifications/lib/Module/Notifications/Service/NotificationMessage.php b/modules/notifications/lib/Module/Notifications/Service/NotificationMessage.php new file mode 100644 index 0000000..fc62f9a --- /dev/null +++ b/modules/notifications/lib/Module/Notifications/Service/NotificationMessage.php @@ -0,0 +1,148 @@ + $data + * @param list $titleParams + * @param list $bodyParams + */ + public function __construct( + private readonly string $type, + private readonly string $title, + private readonly ?string $body = null, + private readonly ?string $link = null, + private readonly array $data = [], + private readonly ?string $titleKey = null, + private readonly array $titleParams = [], + private readonly ?string $bodyKey = null, + private readonly array $bodyParams = [] + ) { + } + + /** + * @param array $data + */ + public static function plain( + string $type, + string $title, + ?string $body = null, + ?string $link = null, + array $data = [] + ): self { + return new self($type, $title, $body, $link, $data); + } + + /** + * Creates a locale-neutral notification message while still storing a translated fallback. + * + * @param list $titleParams + * @param list $bodyParams + * @param array $data + */ + public static function localized( + string $type, + string $titleKey, + array $titleParams = [], + ?string $bodyKey = null, + array $bodyParams = [], + ?string $link = null, + array $data = [] + ): self { + $resolvedTitle = self::translate($titleKey, $titleParams); + $resolvedBody = $bodyKey !== null && $bodyKey !== '' ? self::translate($bodyKey, $bodyParams) : null; + + return new self( + $type, + $resolvedTitle, + $resolvedBody, + $link, + $data, + $titleKey, + self::normalizeParams($titleParams), + $bodyKey !== null && $bodyKey !== '' ? $bodyKey : null, + self::normalizeParams($bodyParams) + ); + } + + public function type(): string + { + return $this->type; + } + + public function title(): string + { + return $this->title; + } + + public function body(): ?string + { + return $this->body; + } + + public function link(): ?string + { + return $this->link; + } + + /** + * @return array + */ + public function data(): array + { + return $this->data; + } + + public function titleKey(): ?string + { + return $this->titleKey; + } + + /** + * @return list + */ + public function titleParams(): array + { + return $this->titleParams; + } + + public function bodyKey(): ?string + { + return $this->bodyKey; + } + + /** + * @return list + */ + public function bodyParams(): array + { + return $this->bodyParams; + } + + /** + * @param array $params + * @return list + */ + private static function normalizeParams(array $params): array + { + $normalized = []; + foreach ($params as $value) { + if (is_scalar($value) || $value === null) { + $normalized[] = $value; + } + } + + return array_values($normalized); + } + + /** + * @param array $params + */ + private static function translate(string $key, array $params): string + { + $normalized = self::normalizeParams($params); + return (string) t($key, ...$normalized); + } +} diff --git a/tests/Architecture/AuthzUiActionContractTest.php b/tests/Architecture/AuthzUiActionContractTest.php index cd67845..f7276ac 100644 --- a/tests/Architecture/AuthzUiActionContractTest.php +++ b/tests/Architecture/AuthzUiActionContractTest.php @@ -71,11 +71,11 @@ class AuthzUiActionContractTest extends TestCase public function testModuleAuditActionsUseInlinePageCapabilities(): void { $actions = [ - 'modules/audit/pages/admin/api-audit/index().php', - 'modules/audit/pages/admin/system-audit/index().php', - 'modules/audit/pages/admin/import-audit/index().php', - 'modules/audit/pages/admin/user-lifecycle-audit/index().php', - 'modules/audit/pages/admin/user-lifecycle-audit/view($id).php', + 'modules/audit/pages/audit/api-audit/index().php', + 'modules/audit/pages/audit/system-audit/index().php', + 'modules/audit/pages/audit/import-audit/index().php', + 'modules/audit/pages/audit/user-lifecycle-audit/index().php', + 'modules/audit/pages/audit/user-lifecycle-audit/view($id).php', ]; foreach ($actions as $action) { diff --git a/tests/Architecture/AuthzUiContractSupport.php b/tests/Architecture/AuthzUiContractSupport.php index 6abae79..4fd0d5a 100644 --- a/tests/Architecture/AuthzUiContractSupport.php +++ b/tests/Architecture/AuthzUiContractSupport.php @@ -36,13 +36,13 @@ trait AuthzUiContractSupport 'UiCapabilityMap::PAGE_STATS_INDEX', ], 'api audit index' => [ - 'modules/audit/pages/admin/api-audit/index(default).phtml', - 'modules/audit/pages/admin/api-audit/index().php', + 'modules/audit/pages/audit/api-audit/index(default).phtml', + 'modules/audit/pages/audit/api-audit/index().php', null, ], 'import audit index' => [ - 'modules/audit/pages/admin/import-audit/index(default).phtml', - 'modules/audit/pages/admin/import-audit/index().php', + 'modules/audit/pages/audit/import-audit/index(default).phtml', + 'modules/audit/pages/audit/import-audit/index().php', null, ], 'scheduled jobs index' => [ @@ -51,18 +51,18 @@ trait AuthzUiContractSupport 'UiCapabilityMap::PAGE_JOBS_PURGE', ], 'system audit index' => [ - 'modules/audit/pages/admin/system-audit/index(default).phtml', - 'modules/audit/pages/admin/system-audit/index().php', + 'modules/audit/pages/audit/system-audit/index(default).phtml', + 'modules/audit/pages/audit/system-audit/index().php', null, ], 'user lifecycle index' => [ - 'modules/audit/pages/admin/user-lifecycle-audit/index(default).phtml', - 'modules/audit/pages/admin/user-lifecycle-audit/index().php', + 'modules/audit/pages/audit/user-lifecycle-audit/index(default).phtml', + 'modules/audit/pages/audit/user-lifecycle-audit/index().php', null, ], 'user lifecycle view' => [ - 'modules/audit/pages/admin/user-lifecycle-audit/view(default).phtml', - 'modules/audit/pages/admin/user-lifecycle-audit/view($id).php', + 'modules/audit/pages/audit/user-lifecycle-audit/view(default).phtml', + 'modules/audit/pages/audit/user-lifecycle-audit/view($id).php', null, ], ]; diff --git a/tests/Architecture/AuthzUiTemplateContractTest.php b/tests/Architecture/AuthzUiTemplateContractTest.php index 6e5ff57..3b695a5 100644 --- a/tests/Architecture/AuthzUiTemplateContractTest.php +++ b/tests/Architecture/AuthzUiTemplateContractTest.php @@ -74,13 +74,13 @@ class AuthzUiTemplateContractTest extends TestCase $templates = [ 'templates/partials/app-main-aside.phtml', 'templates/partials/app-main-aside-icon-bar.phtml', - 'modules/audit/pages/admin/api-audit/index(default).phtml', - 'modules/audit/pages/admin/system-audit/index(default).phtml', - 'modules/audit/pages/admin/import-audit/index(default).phtml', + 'modules/audit/pages/audit/api-audit/index(default).phtml', + 'modules/audit/pages/audit/system-audit/index(default).phtml', + 'modules/audit/pages/audit/import-audit/index(default).phtml', 'pages/admin/scheduled-jobs/index(default).phtml', 'pages/admin/stats/index(default).phtml', - 'modules/audit/pages/admin/user-lifecycle-audit/index(default).phtml', - 'modules/audit/pages/admin/user-lifecycle-audit/view(default).phtml', + 'modules/audit/pages/audit/user-lifecycle-audit/index(default).phtml', + 'modules/audit/pages/audit/user-lifecycle-audit/view(default).phtml', 'pages/admin/users/index(default).phtml', 'pages/admin/users/create(default).phtml', 'pages/admin/tenants/edit(default).phtml', diff --git a/tests/Architecture/ListContractFiles.php b/tests/Architecture/ListContractFiles.php index 09eb4fb..16294e5 100644 --- a/tests/Architecture/ListContractFiles.php +++ b/tests/Architecture/ListContractFiles.php @@ -53,10 +53,10 @@ trait ListContractFiles 'pages/admin/mail-log/data().php', 'pages/admin/scheduled-jobs/data().php', 'pages/admin/scheduled-jobs/runs-data($id).php', - 'modules/audit/pages/admin/api-audit/data().php', - 'modules/audit/pages/admin/import-audit/data().php', - 'modules/audit/pages/admin/user-lifecycle-audit/data().php', - 'modules/audit/pages/admin/system-audit/data().php', + 'modules/audit/pages/audit/api-audit/data().php', + 'modules/audit/pages/audit/import-audit/data().php', + 'modules/audit/pages/audit/user-lifecycle-audit/data().php', + 'modules/audit/pages/audit/system-audit/data().php', ]; } @@ -76,10 +76,10 @@ trait ListContractFiles 'pages/admin/mail-log/data().php' => "gridParseFiltersFromSchemaFile(__DIR__ . '/filter-schema.php'", 'pages/admin/scheduled-jobs/data().php' => "gridParseFiltersFromSchemaFile(__DIR__ . '/filter-schema.php'", 'pages/admin/scheduled-jobs/runs-data($id).php' => "gridParseFiltersFromSchemaFile(__DIR__ . '/runs-filter-schema.php'", - 'modules/audit/pages/admin/api-audit/data().php' => "gridParseFiltersFromSchemaFile(__DIR__ . '/filter-schema.php'", - 'modules/audit/pages/admin/import-audit/data().php' => "gridParseFiltersFromSchemaFile(__DIR__ . '/filter-schema.php'", - 'modules/audit/pages/admin/user-lifecycle-audit/data().php' => "gridParseFiltersFromSchemaFile(__DIR__ . '/filter-schema.php'", - 'modules/audit/pages/admin/system-audit/data().php' => "gridParseFiltersFromSchemaFile(__DIR__ . '/filter-schema.php'", + 'modules/audit/pages/audit/api-audit/data().php' => "gridParseFiltersFromSchemaFile(__DIR__ . '/filter-schema.php'", + 'modules/audit/pages/audit/import-audit/data().php' => "gridParseFiltersFromSchemaFile(__DIR__ . '/filter-schema.php'", + 'modules/audit/pages/audit/user-lifecycle-audit/data().php' => "gridParseFiltersFromSchemaFile(__DIR__ . '/filter-schema.php'", + 'modules/audit/pages/audit/system-audit/data().php' => "gridParseFiltersFromSchemaFile(__DIR__ . '/filter-schema.php'", ]; } @@ -98,10 +98,10 @@ trait ListContractFiles 'pages/admin/permissions/index(default).phtml', 'pages/admin/mail-log/index(default).phtml', 'pages/admin/scheduled-jobs/index(default).phtml', - 'modules/audit/pages/admin/api-audit/index(default).phtml', - 'modules/audit/pages/admin/import-audit/index(default).phtml', - 'modules/audit/pages/admin/user-lifecycle-audit/index(default).phtml', - 'modules/audit/pages/admin/system-audit/index(default).phtml', + 'modules/audit/pages/audit/api-audit/index(default).phtml', + 'modules/audit/pages/audit/import-audit/index(default).phtml', + 'modules/audit/pages/audit/user-lifecycle-audit/index(default).phtml', + 'modules/audit/pages/audit/system-audit/index(default).phtml', ]; } @@ -120,10 +120,10 @@ trait ListContractFiles 'pages/admin/permissions/index().php', 'pages/admin/mail-log/index().php', 'pages/admin/scheduled-jobs/index().php', - 'modules/audit/pages/admin/api-audit/index().php', - 'modules/audit/pages/admin/import-audit/index().php', - 'modules/audit/pages/admin/user-lifecycle-audit/index().php', - 'modules/audit/pages/admin/system-audit/index().php', + 'modules/audit/pages/audit/api-audit/index().php', + 'modules/audit/pages/audit/import-audit/index().php', + 'modules/audit/pages/audit/user-lifecycle-audit/index().php', + 'modules/audit/pages/audit/system-audit/index().php', ]; } @@ -141,10 +141,10 @@ trait ListContractFiles 'pages/admin/permissions/index(default).phtml', 'pages/admin/mail-log/index(default).phtml', 'pages/admin/scheduled-jobs/index(default).phtml', - 'modules/audit/pages/admin/api-audit/index(default).phtml', - 'modules/audit/pages/admin/import-audit/index(default).phtml', - 'modules/audit/pages/admin/user-lifecycle-audit/index(default).phtml', - 'modules/audit/pages/admin/system-audit/index(default).phtml', + 'modules/audit/pages/audit/api-audit/index(default).phtml', + 'modules/audit/pages/audit/import-audit/index(default).phtml', + 'modules/audit/pages/audit/user-lifecycle-audit/index(default).phtml', + 'modules/audit/pages/audit/system-audit/index(default).phtml', ]; } diff --git a/tests/Architecture/ListTitlebarContractFiles.php b/tests/Architecture/ListTitlebarContractFiles.php index fb6cdbf..7815449 100644 --- a/tests/Architecture/ListTitlebarContractFiles.php +++ b/tests/Architecture/ListTitlebarContractFiles.php @@ -17,10 +17,10 @@ final class ListTitlebarContractFiles 'pages/admin/permissions/index(default).phtml', 'pages/admin/mail-log/index(default).phtml', 'pages/admin/scheduled-jobs/index(default).phtml', - 'modules/audit/pages/admin/api-audit/index(default).phtml', - 'modules/audit/pages/admin/import-audit/index(default).phtml', - 'modules/audit/pages/admin/user-lifecycle-audit/index(default).phtml', - 'modules/audit/pages/admin/system-audit/index(default).phtml', + 'modules/audit/pages/audit/api-audit/index(default).phtml', + 'modules/audit/pages/audit/import-audit/index(default).phtml', + 'modules/audit/pages/audit/user-lifecycle-audit/index(default).phtml', + 'modules/audit/pages/audit/system-audit/index(default).phtml', 'modules/addressbook/pages/address-book/index(default).phtml', 'pages/search/index(default).phtml', 'pages/help/hotkeys(default).phtml', diff --git a/tests/Architecture/ListUiSharedPartialsContractTest.php b/tests/Architecture/ListUiSharedPartialsContractTest.php index b18efea..795a029 100644 --- a/tests/Architecture/ListUiSharedPartialsContractTest.php +++ b/tests/Architecture/ListUiSharedPartialsContractTest.php @@ -26,10 +26,10 @@ class ListUiSharedPartialsContractTest extends TestCase { return [ 'pages/admin/scheduled-jobs/index(default).phtml', - 'modules/audit/pages/admin/api-audit/index(default).phtml', - 'modules/audit/pages/admin/import-audit/index(default).phtml', - 'modules/audit/pages/admin/user-lifecycle-audit/index(default).phtml', - 'modules/audit/pages/admin/system-audit/index(default).phtml', + 'modules/audit/pages/audit/api-audit/index(default).phtml', + 'modules/audit/pages/audit/import-audit/index(default).phtml', + 'modules/audit/pages/audit/user-lifecycle-audit/index(default).phtml', + 'modules/audit/pages/audit/system-audit/index(default).phtml', ]; } diff --git a/tests/Architecture/SecurityLoggingRuntimeContractTest.php b/tests/Architecture/SecurityLoggingRuntimeContractTest.php index 6c1793a..ec1471d 100644 --- a/tests/Architecture/SecurityLoggingRuntimeContractTest.php +++ b/tests/Architecture/SecurityLoggingRuntimeContractTest.php @@ -18,12 +18,12 @@ final class SecurityLoggingRuntimeContractTest extends TestCase sort($violations); self::assertSame( - ['modules/audit/pages/admin/frontend-telemetry/ingest().php'], + ['modules/audit/pages/audit/frontend-telemetry/ingest().php'], $violations, "Unexpected error_log() usage outside the telemetry ingest fallback:\n" . implode("\n", $violations) ); - $content = $this->readProjectFile('modules/audit/pages/admin/frontend-telemetry/ingest().php'); + $content = $this->readProjectFile('modules/audit/pages/audit/frontend-telemetry/ingest().php'); self::assertStringContainsString( "error_log('[frontend-telemetry] ingest record_failed request_id=' . RequestContext::id());", $content diff --git a/tests/Architecture/StatusTaxonomyContractFiles.php b/tests/Architecture/StatusTaxonomyContractFiles.php index d7617f0..0bcc8c3 100644 --- a/tests/Architecture/StatusTaxonomyContractFiles.php +++ b/tests/Architecture/StatusTaxonomyContractFiles.php @@ -31,16 +31,16 @@ final class StatusTaxonomyContractFiles public static function taxonomySchemaExpectations(): array { return [ - 'modules/audit/pages/admin/system-audit/filter-schema.php' => [ + 'modules/audit/pages/audit/system-audit/filter-schema.php' => [ 'SystemAuditOutcome::values()', 'SystemAuditChannel::values()', ], - 'modules/audit/pages/admin/user-lifecycle-audit/filter-schema.php' => [ + 'modules/audit/pages/audit/user-lifecycle-audit/filter-schema.php' => [ 'gridEnumSanitizer(UserLifecycleAction::class)', 'gridEnumSanitizer(UserLifecycleStatus::class)', 'gridEnumSanitizer(UserLifecycleTriggerType::class)', ], - 'modules/audit/pages/admin/import-audit/filter-schema.php' => [ + 'modules/audit/pages/audit/import-audit/filter-schema.php' => [ 'ImportAuditStatus::values()', ], 'pages/admin/scheduled-jobs/filter-schema.php' => [ @@ -62,9 +62,9 @@ final class StatusTaxonomyContractFiles public static function taxonomyDataEndpointFiles(): array { return [ - 'modules/audit/pages/admin/system-audit/data().php', - 'modules/audit/pages/admin/user-lifecycle-audit/data().php', - 'modules/audit/pages/admin/import-audit/data().php', + 'modules/audit/pages/audit/system-audit/data().php', + 'modules/audit/pages/audit/user-lifecycle-audit/data().php', + 'modules/audit/pages/audit/import-audit/data().php', 'pages/admin/scheduled-jobs/data().php', 'pages/admin/scheduled-jobs/runs-data($id).php', 'pages/admin/mail-log/data().php', @@ -94,16 +94,16 @@ final class StatusTaxonomyContractFiles 'lib/Service/Tenant/TenantService.php', 'lib/Repository/Tenant/TenantRepository.php', 'lib/Repository/Stats/AdminStatsRepository.php', - 'modules/audit/pages/admin/system-audit/data().php', - 'modules/audit/pages/admin/user-lifecycle-audit/data().php', - 'modules/audit/pages/admin/import-audit/data().php', + 'modules/audit/pages/audit/system-audit/data().php', + 'modules/audit/pages/audit/user-lifecycle-audit/data().php', + 'modules/audit/pages/audit/import-audit/data().php', 'pages/admin/scheduled-jobs/data().php', 'pages/admin/scheduled-jobs/runs-data($id).php', 'pages/admin/mail-log/data().php', 'pages/admin/tenants/data().php', - 'modules/audit/pages/admin/system-audit/index().php', - 'modules/audit/pages/admin/user-lifecycle-audit/index().php', - 'modules/audit/pages/admin/import-audit/index().php', + 'modules/audit/pages/audit/system-audit/index().php', + 'modules/audit/pages/audit/user-lifecycle-audit/index().php', + 'modules/audit/pages/audit/import-audit/index().php', 'pages/admin/scheduled-jobs/index().php', 'pages/admin/mail-log/index().php', ]; diff --git a/tests/Architecture/StatusTaxonomyUiContractTest.php b/tests/Architecture/StatusTaxonomyUiContractTest.php index 015d39d..ecd5e26 100644 --- a/tests/Architecture/StatusTaxonomyUiContractTest.php +++ b/tests/Architecture/StatusTaxonomyUiContractTest.php @@ -10,7 +10,7 @@ final class StatusTaxonomyUiContractTest extends TestCase public function testImportAuditIndexTemplateDoesNotUseLegacyStatusMapper(): void { - $content = $this->readProjectFile('modules/audit/pages/admin/import-audit/index(default).phtml'); + $content = $this->readProjectFile('modules/audit/pages/audit/import-audit/index(default).phtml'); $moduleContent = $this->readProjectFile('modules/audit/web/js/pages/admin-import-audit-index.js'); $this->assertStringNotContainsString('const statusLabel = (value) =>', $moduleContent); $this->assertStringNotContainsString("if (key === 'running')", $moduleContent); diff --git a/web/modules/audit b/web/modules/audit new file mode 120000 index 0000000..3f0b43f --- /dev/null +++ b/web/modules/audit @@ -0,0 +1 @@ +/var/www/modules/audit/web \ No newline at end of file