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) <noreply@anthropic.com>
This commit is contained in:
2026-03-26 08:13:37 +01:00
parent 0c351f6aff
commit e10b1215da
45 changed files with 230 additions and 81 deletions

View File

@@ -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) {

View File

@@ -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,
],
];

View File

@@ -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',

View File

@@ -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',
];
}

View File

@@ -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',

View File

@@ -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',
];
}

View File

@@ -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

View File

@@ -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',
];

View File

@@ -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);