1
0
Files
breadcrumb-the-shire/modules/audit/module.php
fs 0c351f6aff refactor(audit): extract audit domain into self-contained module
Move the entire audit subsystem (system audit, API audit, import audit,
user lifecycle audit, frontend telemetry) from core into modules/audit/.

Core decoupling via interface-based injection:
- AuditRecorderInterface replaces SystemAuditService in 10+ core services
- UserLifecycleAuditInterface / ImportAuditInterface for specialized flows
- NullAuditRecorder fallback when audit module is disabled
- ApiBootstrap/ApiResponse use null-safe callable resolvers

Module structure (modules/audit/):
- Manifest with routes, permissions, scheduler jobs, authorization policy
- 9 services, 8 repositories, 6 domain enums, 4 job handlers
- 33 page files, 4 JS files, 8 test files, migration scripts, i18n

Core cleanup:
- OperationsAuthorizationPolicy, UiCapabilityMap, PermissionService
  surgically cleaned of audit-specific constants
- Sidebar template cleared of hardcoded audit navigation
- AuditModuleIsolationContractTest ensures no future core→module coupling

All quality gates pass: 1346 tests (19,276 assertions), PHPStan level 5
clean, architecture contracts verified.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-25 21:12:49 +01:00

186 lines
7.3 KiB
PHP

<?php
/**
* Audit module manifest.
*
* Provides four audit streams: system audit, API audit, import audit,
* and user lifecycle audit. Includes frontend telemetry ingestion,
* PII redaction, encrypted snapshots, and retention-based cleanup.
*/
return [
'id' => 'audit',
'version' => '1.0.0',
'enabled_by_default' => true,
'load_order' => 5,
'requires' => [],
'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'],
// 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'],
// 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'],
// 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'],
// Frontend telemetry
['path' => 'admin/frontend-telemetry/ingest', 'target' => 'admin/frontend-telemetry/ingest'],
],
'public_paths' => [],
'container_registrars' => [
\MintyPHP\Module\Audit\AuditContainerRegistrar::class,
],
'ui_slots' => [
'sidebar.admin_nav_item' => [
[
'key' => 'audit-api-audit',
'group' => 'admin-logs',
'label' => 'API audit',
'path' => 'admin/api-audit',
'permission' => 'audit.api.view',
'order' => 200,
],
[
'key' => 'audit-system-audit',
'group' => 'admin-logs',
'label' => 'System audit logs',
'path' => 'admin/system-audit',
'permission' => 'audit.system.view',
'order' => 210,
],
[
'key' => 'audit-import-audit',
'group' => 'admin-logs',
'label' => 'Import logs',
'path' => 'admin/import-audit',
'permission' => 'audit.imports.view',
'order' => 220,
],
[
'key' => 'audit-user-lifecycle-audit',
'group' => 'admin-logs',
'label' => 'User lifecycle logs',
'path' => 'admin/user-lifecycle-audit',
'permission' => 'audit.user_lifecycle.view',
'order' => 230,
],
],
],
'authorization_policies' => [
\MintyPHP\Module\Audit\AuditAuthorizationPolicy::class,
],
'permissions' => [
[
'key' => 'audit.api.view',
'description' => 'View API audit logs',
],
[
'key' => 'audit.system.view',
'description' => 'View system audit logs',
],
[
'key' => 'audit.system.purge',
'description' => 'Purge system audit logs',
],
[
'key' => 'audit.imports.view',
'description' => 'View import audit logs',
],
[
'key' => 'audit.user_lifecycle.view',
'description' => 'View user lifecycle audit logs',
],
[
'key' => 'audit.user_lifecycle.restore',
'description' => 'Restore deleted users from lifecycle audit',
],
],
'scheduler_jobs' => [
[
'job_key' => 'audit_system_purge',
'handler' => \MintyPHP\Module\Audit\Handler\SystemAuditPurgeJobHandler::class,
'label' => 'System audit log cleanup',
'description' => 'Purges system audit log entries older than the configured retention period',
'default_enabled' => 1,
'default_timezone' => 'UTC',
'default_schedule_type' => 'daily',
'default_schedule_interval' => 1,
'default_schedule_time' => '03:00',
'default_schedule_weekdays_csv' => null,
'default_catchup_once' => 1,
'allowed_schedule_types' => ['daily', 'weekly'],
],
[
'job_key' => 'audit_api_purge',
'handler' => \MintyPHP\Module\Audit\Handler\ApiAuditPurgeJobHandler::class,
'label' => 'API audit log cleanup',
'description' => 'Purges API audit log entries older than 90 days',
'default_enabled' => 1,
'default_timezone' => 'UTC',
'default_schedule_type' => 'daily',
'default_schedule_interval' => 1,
'default_schedule_time' => '03:15',
'default_schedule_weekdays_csv' => null,
'default_catchup_once' => 1,
'allowed_schedule_types' => ['daily', 'weekly'],
],
[
'job_key' => 'audit_import_purge',
'handler' => \MintyPHP\Module\Audit\Handler\ImportAuditPurgeJobHandler::class,
'label' => 'Import audit log cleanup',
'description' => 'Purges import audit run records older than 90 days',
'default_enabled' => 1,
'default_timezone' => 'UTC',
'default_schedule_type' => 'daily',
'default_schedule_interval' => 1,
'default_schedule_time' => '03:30',
'default_schedule_weekdays_csv' => null,
'default_catchup_once' => 1,
'allowed_schedule_types' => ['daily', 'weekly'],
],
[
'job_key' => 'audit_user_lifecycle_purge',
'handler' => \MintyPHP\Module\Audit\Handler\UserLifecycleAuditPurgeJobHandler::class,
'label' => 'User lifecycle audit log cleanup',
'description' => 'Purges user lifecycle audit entries older than 365 days',
'default_enabled' => 1,
'default_timezone' => 'UTC',
'default_schedule_type' => 'daily',
'default_schedule_interval' => 1,
'default_schedule_time' => '03:45',
'default_schedule_weekdays_csv' => null,
'default_catchup_once' => 1,
'allowed_schedule_types' => ['daily', 'weekly'],
],
],
'layout_context_providers' => [
\MintyPHP\Module\Audit\Providers\AuditLayoutProvider::class,
],
'session_providers' => [],
'event_listeners' => [],
'search_resources' => [],
'asset_groups' => [],
'migrations_path' => 'db/updates',
'i18n_path' => 'i18n',
];