refactor(audit): remove factory chain and repository interfaces

Remove AuditRepositoryFactory and AuditServicesFactory — two-layer
factory chain replaced by direct DI container wiring. Delete 4
single-consumer repository interfaces. Register all 4 repositories
and SystemAuditRedactionService directly in container. Update all
service constructors to type-hint concrete classes. Fix architecture
test and documentation references to deleted factories.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-03-26 12:33:59 +01:00
parent 4bf871b640
commit 570e3923b7
22 changed files with 68 additions and 247 deletions

View File

@@ -2,7 +2,7 @@
namespace MintyPHP\Tests\Module\Audit\Service;
use MintyPHP\Module\Audit\Repository\UserLifecycleAuditRepositoryInterface;
use MintyPHP\Module\Audit\Repository\UserLifecycleAuditRepository;
use MintyPHP\Module\Audit\Service\UserLifecycleAuditService;
use MintyPHP\Support\Crypto;
use PHPUnit\Framework\TestCase;
@@ -52,7 +52,7 @@ class UserLifecycleAuditServiceTest extends TestCase
public function testLogDeactivateCallsRepoCreateWithCorrectRow(): void
{
$repo = $this->createMock(UserLifecycleAuditRepositoryInterface::class);
$repo = $this->createMock(UserLifecycleAuditRepository::class);
$repo->expects($this->once())
->method('create')
->with($this->callback(static function (array $row): bool {
@@ -87,7 +87,7 @@ class UserLifecycleAuditServiceTest extends TestCase
public function testLogDeactivateReturnsFalseOnRepoException(): void
{
$repo = $this->createMock(UserLifecycleAuditRepositoryInterface::class);
$repo = $this->createMock(UserLifecycleAuditRepository::class);
$repo->method('create')->willThrowException(new \RuntimeException('db error'));
$service = new UserLifecycleAuditService($repo);
@@ -98,7 +98,7 @@ class UserLifecycleAuditServiceTest extends TestCase
public function testLogDeactivateReturnsFalseWhenRepoReturnsFalse(): void
{
$repo = $this->createMock(UserLifecycleAuditRepositoryInterface::class);
$repo = $this->createMock(UserLifecycleAuditRepository::class);
$repo->method('create')->willReturn(false);
$service = new UserLifecycleAuditService($repo);
@@ -122,7 +122,7 @@ class UserLifecycleAuditServiceTest extends TestCase
$targetUser['id'] = 5;
$targetUser['extra_field'] = 'should_be_excluded';
$repo = $this->createMock(UserLifecycleAuditRepositoryInterface::class);
$repo = $this->createMock(UserLifecycleAuditRepository::class);
$repo->expects($this->once())
->method('create')
->with($this->callback(static function (array $row): bool {
@@ -149,7 +149,7 @@ class UserLifecycleAuditServiceTest extends TestCase
$targetUser = ['id' => 5, 'uuid' => 'u5', 'email' => 'e@example.com', 'extra' => 'no'];
$capturedRow = null;
$repo = $this->createMock(UserLifecycleAuditRepositoryInterface::class);
$repo = $this->createMock(UserLifecycleAuditRepository::class);
$repo->expects($this->once())
->method('create')
->with($this->callback(static function (array $row) use (&$capturedRow): bool {
@@ -176,7 +176,7 @@ class UserLifecycleAuditServiceTest extends TestCase
// cause the try/catch to fire. We cannot easily override static Crypto, but we
// know that if APP_CRYPTO_KEY were missing, encryptString would throw.
// Since we defined a valid key, let's test the repo exception path instead.
$repo = $this->createMock(UserLifecycleAuditRepositoryInterface::class);
$repo = $this->createMock(UserLifecycleAuditRepository::class);
$repo->method('create')->willThrowException(new \RuntimeException('db error'));
$service = new UserLifecycleAuditService($repo);
@@ -189,7 +189,7 @@ class UserLifecycleAuditServiceTest extends TestCase
public function testLogRestoreCallsRepoWithRestoreAction(): void
{
$repo = $this->createMock(UserLifecycleAuditRepositoryInterface::class);
$repo = $this->createMock(UserLifecycleAuditRepository::class);
$repo->expects($this->once())
->method('create')
->with($this->callback(static function (array $row): bool {
@@ -207,7 +207,7 @@ class UserLifecycleAuditServiceTest extends TestCase
public function testLogRestoreReturnsFalseOnException(): void
{
$repo = $this->createMock(UserLifecycleAuditRepositoryInterface::class);
$repo = $this->createMock(UserLifecycleAuditRepository::class);
$repo->method('create')->willThrowException(new \RuntimeException('fail'));
$service = new UserLifecycleAuditService($repo);
@@ -227,7 +227,7 @@ class UserLifecycleAuditServiceTest extends TestCase
$original = ['uuid' => 'test-uuid', 'email' => 'test@example.com'];
$encrypted = Crypto::encryptString(json_encode($original));
$repo = $this->createMock(UserLifecycleAuditRepositoryInterface::class);
$repo = $this->createMock(UserLifecycleAuditRepository::class);
$service = new UserLifecycleAuditService($repo);
$result = $service->decryptSnapshot(['snapshot_enc' => $encrypted]);
@@ -236,7 +236,7 @@ class UserLifecycleAuditServiceTest extends TestCase
public function testDecryptSnapshotReturnsNullForEmptyPayload(): void
{
$repo = $this->createMock(UserLifecycleAuditRepositoryInterface::class);
$repo = $this->createMock(UserLifecycleAuditRepository::class);
$service = new UserLifecycleAuditService($repo);
$this->assertNull($service->decryptSnapshot([]));
@@ -246,7 +246,7 @@ class UserLifecycleAuditServiceTest extends TestCase
public function testDecryptSnapshotReturnsNullForInvalidPayload(): void
{
$repo = $this->createMock(UserLifecycleAuditRepositoryInterface::class);
$repo = $this->createMock(UserLifecycleAuditRepository::class);
$service = new UserLifecycleAuditService($repo);
$result = $service->decryptSnapshot(['snapshot_enc' => 'not-valid-encrypted-data']);
@@ -257,7 +257,7 @@ class UserLifecycleAuditServiceTest extends TestCase
public function testMarkDeleteEventRestoredDelegatesToRepo(): void
{
$repo = $this->createMock(UserLifecycleAuditRepositoryInterface::class);
$repo = $this->createMock(UserLifecycleAuditRepository::class);
$repo->expects($this->once())
->method('markRestored')
->with(1, 99, 200)
@@ -269,7 +269,7 @@ class UserLifecycleAuditServiceTest extends TestCase
public function testMarkDeleteEventRestoredReturnsFalseOnException(): void
{
$repo = $this->createMock(UserLifecycleAuditRepositoryInterface::class);
$repo = $this->createMock(UserLifecycleAuditRepository::class);
$repo->method('markRestored')->willThrowException(new \RuntimeException('fail'));
$service = new UserLifecycleAuditService($repo);
@@ -280,7 +280,7 @@ class UserLifecycleAuditServiceTest extends TestCase
public function testPurgeExpiredDelegatesToRepoWith365Days(): void
{
$repo = $this->createMock(UserLifecycleAuditRepositoryInterface::class);
$repo = $this->createMock(UserLifecycleAuditRepository::class);
$repo->expects($this->once())
->method('purgeOlderThanDays')
->with(365)
@@ -294,7 +294,7 @@ class UserLifecycleAuditServiceTest extends TestCase
public function testBuildBaseRowNormalizesInvalidTriggerTypeToDefault(): void
{
$repo = $this->createMock(UserLifecycleAuditRepositoryInterface::class);
$repo = $this->createMock(UserLifecycleAuditRepository::class);
$repo->expects($this->once())
->method('create')
->with($this->callback(static function (array $row): bool {
@@ -308,7 +308,7 @@ class UserLifecycleAuditServiceTest extends TestCase
public function testBuildBaseRowNormalizesInvalidStatusToFailed(): void
{
$repo = $this->createMock(UserLifecycleAuditRepositoryInterface::class);
$repo = $this->createMock(UserLifecycleAuditRepository::class);
$repo->expects($this->once())
->method('create')
->with($this->callback(static function (array $row): bool {
@@ -322,7 +322,7 @@ class UserLifecycleAuditServiceTest extends TestCase
public function testBuildBaseRowNormalizesNullActorToNull(): void
{
$repo = $this->createMock(UserLifecycleAuditRepositoryInterface::class);
$repo = $this->createMock(UserLifecycleAuditRepository::class);
$repo->expects($this->once())
->method('create')
->with($this->callback(static function (array $row): bool {
@@ -336,7 +336,7 @@ class UserLifecycleAuditServiceTest extends TestCase
public function testBuildBaseRowNormalizesZeroActorToNull(): void
{
$repo = $this->createMock(UserLifecycleAuditRepositoryInterface::class);
$repo = $this->createMock(UserLifecycleAuditRepository::class);
$repo->expects($this->once())
->method('create')
->with($this->callback(static function (array $row): bool {
@@ -350,7 +350,7 @@ class UserLifecycleAuditServiceTest extends TestCase
public function testBuildBaseRowSetsNegativePolicyDaysToZero(): void
{
$repo = $this->createMock(UserLifecycleAuditRepositoryInterface::class);
$repo = $this->createMock(UserLifecycleAuditRepository::class);
$repo->expects($this->once())
->method('create')
->with($this->callback(static function (array $row): bool {