ldc-arcadia-api/src/Infra/Adapters/Directories/EloquentClientAuditLogDirectory.php

79 lines
2.5 KiB
PHP

<?php
declare(strict_types=1);
namespace Infra\Adapters\Directories;
use Application\Security\Models\Entities\SecurityAuditLogEntry;
use Application\Security\Models\ValueObjects\Entities\SecurityAuditLogDetails;
use Application\Security\Models\ValueObjects\Entities\SecurityAuditLogEntryId;
use Application\Security\Ports\Directories\ClientAuditLogDirectory;
use Illuminate\Database\Eloquent\Builder;
use Infra\Database\Models\ClientAuditLog;
use Override;
final class EloquentClientAuditLogDirectory implements ClientAuditLogDirectory
{
#[Override]
public function find(SecurityAuditLogEntryId $id): ?SecurityAuditLogEntry
{
$record = ClientAuditLog::query()
->where('id', $id->identifier->toString())
->first();
if ($record === null) {
return null;
}
return $this->toDomainEntity($record);
}
#[Override]
public function findLogs(
\DateTimeImmutable $since,
?\DateTimeImmutable $to = null,
?string $clientIdentifier = null,
?string $eventType = null,
): array {
/** @var Builder<ClientAuditLog> $query */
$query = ClientAuditLog::query()
->where('created_at', '>=', $since->format('Y-m-d H:i:s'));
if ($to !== null) {
$query->where('created_at', '<=', $to->format('Y-m-d H:i:s'));
}
if ($clientIdentifier !== null && trim($clientIdentifier) !== '') {
$trimmed = trim($clientIdentifier);
$query->where(function (Builder $subQuery) use ($trimmed): void {
$subQuery->where('client_identifier', $trimmed)
->orWhere('client_id', $trimmed);
});
}
if ($eventType !== null && trim($eventType) !== '') {
$query->where('event_type', trim($eventType));
}
$records = $query
->orderBy('created_at', 'desc')
->get();
/** @var list<SecurityAuditLogEntry> */
return array_map(
[$this, 'toDomainEntity'],
$records->all()
);
}
private function toDomainEntity(ClientAuditLog $record): SecurityAuditLogEntry
{
return new SecurityAuditLogEntry(
id: new SecurityAuditLogEntryId($record->id),
clientId: $record->client_id,
clientIdentifier: $record->client_identifier->value,
eventType: $record->event_type,
details: $record->details ?? SecurityAuditLogDetails::empty(),
);
}
}